เพิ่มไปอีก 6 เดือน
กระทู้เก่าบอร์ด อ.Yeadram

 4,460   21
URL.หัวข้อ / URL
เพิ่มไปอีก 6 เดือน

รบกวนสอบถาม อ.yeadram และผู้รู้ทุกท่านครับ
table1 มีข้อมูลดังนี้ครับ

Product_Year                   Product_Month                     QTY
2009                                             1                                  10
2009                                             2                                    5
..                                                  ..                                    ..
2009                                           12                                  20

2010                                              1                                   15
..                                                  ..                                    ..
2010                                             12                                  20


ถ้าระบุเลือกช่วงข้อมูล   ปี 2009    เดือน 1 ก็ให้เลือกช่วงข้อมูลดังนี้ครับ
ปี 2009   เดือน 1
ปี 2009   เดือน 2
ปี 2009   เดือน 3
ปี 2009   เดือน 4
ปี 2009   เดือน 5
ปี 2009   เดือน 6

ถ้าระบุเลือกช่วงข้อมูล   ปี 2009 เดือน 9 ก็ให้เลือกช่วงข้อมูลดังนี้ครับ
ปี 2009   เดือน 9
ปี 2009   เดือน 10
ปี 2009   เดือน 11
ปี 2009   เดือน 12
ปี 2010   เดือน 1
ปี 2010   เดือน 2

ขอบคุณมากครับ

21 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R08046
เพิ่มเติมอีกนิดครับ

Product        Product_Year             Product_Month                     QTY
AA                   2009                                  1                                  10
BB                   2009                                  2                                    5
..                        ..                                    ..                                    ...
ZZ                   2009                                12                                  20
AAA               2010                                  1                                   15
BBB                   ..                                    ..                                    ..
CCC               2010                                 12                                  20

พอเลือกช่วงเดือนได้แล้ว ต้องการนำมาแสดงแบบ crosstab query
Product        2009 - 1       2009 - 2 ..
AA                      10                    
BB                                           5
...

ประมาณนี้ครับ แต่ติดปัญหาคือ
1. ปี-เดือน ไม่เรียงใน crosstab query
2. ช่วงปี-เดือน ไม่ตายตัว ครับ เวลาดึงจาก crosstab query มาออกรายงาน หรือ ในฟอร์ม มีปัญหา

ขอบพระคุณมากๆ ครับ
2 @R08051
SELECT product, Product_year & "-" & format(Product_month,"00") as Period, Qty
FROM table1
WHERE (datediff("yyyy",Dateserial(mid([ระบุเดือนปีที่ต้องการ 'mmyyyy'],3),left([ระบุเดือนปีที่ต้องการ 'mmyyyy'],2),1),DateSerial(Product_year, Product_month, 1)) < = 6)
AND (datediff("yyyy",Dateserial(mid([ระบุเดือนปีที่ต้องการ 'mmyyyy'],3),left([ระบุเดือนปีที่ต้องการ 'mmyyyy'],2),1),DateSerial(Product_year, Product_month, 1)) >=0)
ORDER BY Product_year & "-" & format(Product_month,"00");



ลองเอาคิวรี่นี้ไปรัน
ถ้ารันได้ตามต้องการแล้วให้เซฟคิวรี่นี้ไว้ จากนั้นให้สร้างคิวรี่ Cross Tab จากคิวรี่นี้อีกทีครับ

**** เขียนสด ไม่ได้ทดลอง ****
3 @R08053
ใน crosstab query ถ้าเราอยากให้มีคอลัมอะไรเราสามารถกำหนดได้ สามารถเรียงลำดับได้ครับ
เช่น เราอยากให้เรียงตามปีงบประมาณ คือ เดือน ต.ค.53 พ.ย.53 ธ.ค.53 ม.ค.54.........
เราก็ไปกำหนดใน คุณสมบัติของช่องคอลัมในคิวรี โดยใช้ ; เป็นตัวคั่น

ลองทำดูก่อนนะครับ ถ้าบอกยังไม่ละเอียด เดี๋ยวมาบอกต่อครับ
4 @R08054
ขอบคุณ อ.yeadram มากครับ

ขอแก้นิดหนึ่งในส่วน datediff("yyyy", เปลี่ยนเป็น datediff("m",
ก็จะได้ข้อมูลตามต้องการ

- แต่ติดปัญหา หลังจากนำมาสร้าง Cross Tab แล้วพอจะดึงไปแสดงที่ฟอร์ม หรือ รายงาน มันจะมีปัญหาในการอ้างอิง เพราะในส่วนของ ปีเดือน ที่เป็นคอลัมน์นั้นมันเปลี่ยนแปลงอยู่ตลอดตามที่เรา เลือกช่วง
ไม่ทราบว่า จะสามารถแก้ปัญหาในส่วนนี้ได้อย่างไรบ้างครับ

ขอบคุณมากครับ
5 @R08055
ตามที่คุณ Un บอกนะครับ ให้เรากำหนดคำที่ตายตัวไว้เลยครับ อย่าให้มันตั้งเองอัตโนมัติ

อย่างงานของคุณ มีหัวคอลัมน์ (ที่เปลี่ยนแปลงบ่อยๆ อยู่ 6 คอลัมน์)
คุณก็กำหนดให้มันเป็นคำคงที่เลยครับ 6 คำ

กำหนดเป็นไหมครับ บอกเผื่อไว้ก็แล้วกันครับ
-เปิด Cross TAb ในมุมมองออกแบบ
-คลิ๊กขวา ที่ฟิลด์ column header > เลือก คุณสมบัติ
-คุณจะเห็นมีบรรทัดหนึ่ง ที่มีโปรยคำเอาไว้ ให้คุณไปกำหนดให้มันใหม่เลยครับ เช่นอาจจะกำหนดว่า
"เดือนที่ 1"; "เดือนที่ 2"; "เดือนที่ 3", .....
คืออย่าให้มันกำหนดเองว่าเป็น "ม.ค."; "ก,พ."..
- แล้วก็เซฟ Crosstab ตัวนั้นครับ
- อาจต้องไปแก้ไขการอ้างอิง ในรายงานนะครับ
6 @R08056
- คุณจะเห็นมีบรรทัดหนึ่ง ที่มีโปรยคำเอาไว้ ให้คุณไปกำหนดให้มันใหม่เลยครับ เช่นอาจจะกำหนดว่า // รบกวนหน่อยครับ หาบรรทัดนี้ไม่เจอครับ

ขอบคุณครับ
7 @R08057
ตามที่ลองดูน่าจะเป็นในส่วนของ column headings ใช่ไหมครับ
แต่พอผมกำหนดค่าลงไป ปรากฎว่า ไม่มีข้อมูลเลย แต่ถ้าลบออก หรือกำหนดให้ตรงกับชื่อที่ crosstab กำหนดมาให้ มันจึงจะแสดง
ไม่ทราบว่าต้องแก้ตรงไหนครับ

ขอบคุณมากครับ
8 @R08058
ต้องกำหนดให้ตรงกับ หัวฟิลด์ของเราด้วยครับ
9 @R08059
ขอบคุณครับที่ตอบคำถาม

ถ้าแบบนี้ เราก็ตั้งเป็นชื่ออื่น ที่เป็นค่าตายตัวไม่ได้ใช่ไหมครับ เช่นตั้ง
1,2,3,4,5,6
10 @R08060
ไม่ได้ครับ
ต้องตังให้ตรงกับผลลับที่ออกมาด้วย ถ้าตั้ง 1,2,3,4,5,6 ผลลัพธ์ คือ 1,2,3,4,5,6 ซึ่งไม่มีข้อมูลจริง ให้ดูที่หัวคอลัมเลยครับว่าออกมาอย่างไร
มันไม่ีค่อยยืดหยุ่นมาก แต่ก็ดีที่เรียงได้ และสำคัญถ้าจะเอา Query นี้ไปเป็น Query ต่อ เพราะว่า Fix หัวฟิลด์ได้
11 @R08061
ดู
http://thai-access.com/yeadram_view.php?topic_id=581&page=1
เผื่อว่าจะมีประโยชน์ จำเป็นเหมือนกันที่บางครั้งต้อง เขียน SQL เอาเอง
เพื่อให้ยืดหยุ่น
12 @R08062
เอาอย่างนี้เลยดีกว่า
ลืมคำตอบเก่าๆ ที่ผมเคยตอบไปทั้งหมดก่อน

- ออกแบบรายงาน ประมาณนี้


- Label ทั้ง 6 คอลัมน์ ให้ตั้งชื่อตามลำดับ ว่า Label1, Label2, .....
- รายงานนี้ไม่ต้องมีแหล่งข้อมูล
- แหล่งข้อมูลต้นทางของโค้ดชุดนี้คือ table1 ไปเปลี่ยนชื่อเป็นชื่อตารางของคุณด้วยนะครับ
- รายงานนี้ ฝังโค้ดเพียง sub เดียว ดังนี้

Private Sub Report_Open(Cancel As Integer)

Dim Criteria As String
Dim sql As String

Criteria = InputBox("ระบุเดือนปีที่ต้องการ 'mmyyyy'", "ระบุเงื่อนไขให้รายงาน")
If Criteria = "" Or IsNull(Criteria) Then
Cancel = True
Exit Sub
End If

sql = "PARAMETERS mPara Text ( 6 );" & _
TRANSFORM Sum(table1.QTY) AS SumOfQTY & _
SELECT table1.Product & _
FROM table1 & _
WHERE (((DateDiff('m',DateSerial(Mid(mPara,3),Left(mPara,2),1),DateSerial([Product_year],[Product_month],1)))=0)) & _
GROUP BY table1.Product & _
PIVOT 'Mnt' & [Product_month]-Val(Left(mPara,2))+1 In ('Mnt1','Mnt2','Mnt3','Mnt4','Mnt5','Mnt6');


For i = 0 To 5
Me("Label" & i + 1).Caption = Format(Val(Left(Criteria, 2)) + i, "00") & "-" & Mid(Criteria, 3)
Next

Me.RecordSource = sql
SendKeys Criteria
SendKeys "{ENTER}"
End Sub


ทดสอบดูครับ
13 @R08070
ขอบคุณครับ อ.yeadram

ลองดูแล้ว ตรง label พอ 12-2009 อันต่อไป เป็น 13-2009, 14-2009

ขอบคุณครับ
14 @R08073
ปรับแก้เพิ่มเติม ตรงที่การวนลูป เพื่อโปรยคำ ครับ

dim y, m as long
y=clng(Mid(Criteria, 3))
m=clng(left(Criteria,2))

For i = 0 To 5
m=m+i
if m>12 then
m=1
y=y+1
end if

Me("Label" & i + 1).Caption = Format(m, "00") & "-" & y
Next
15 @R08077
ขอบคุณมากครับ

แต่ผมลองทำตามที่ อ.yeadram บอกแล้ว ค่า m มันจะได้แบบนี้ครับ

1, 2, 4, 7, 11, 1

ขอบคุณมากครับ

16 @R08085
อืมม ผิดจริงๆ ด้วย อิอิ
งั้นเอาใหม่ครับ

dim y, m as long
y=clng(Mid(Criteria, 3))
m=clng(left(Criteria,2))

For i = 0 To 5
Me("Label" & i + 1).Caption = Format(m+i, "00") & "-" & y
if (m+i)=12 then
     m=(0-i)
     y=y+1
end if
Next
17 @R08088
ขอบคุณ อ.yeadram มากครับ
แสดงรายละเอียดใน label ได้ถูกต้องแล้ว

แต่ยังติดปัญหาส่วนนี้ [Product_month]-Val(Left(mPara,2))+1
ถ้าเราเลือกช่วงระหว่างมีเหมือนจะมีปัญหานะครับ เช่น เลือก 112009 ข้อมูลจะไม่แสดงเนื่องจากค่า m มันผิด


ขอบคุณมากครับ
18 @R08098
เริ่มงงแล้วครับ มันติดหลายอย่าง ทำให้มีความซับซ้อน ในจินตนาการเกินไป

ขอตัวอย่างงานสัก เดือนละ 3-4 เรคคอร์ด
รวมประมาณ 8เดือน
พร้อมกับฝั้งโค้ดและ/ หรือ วิธิการล่าสุดที่เราได้ร่วมปรึกษากันมาแล้ว ลงไปด้วย

ส่งไฟล์ตัวอย่างเข้ามาดูหน่อยครับ
19 @R08106
รบกวน อ.yeadram ด้วยครับ
ผมได้ส่งไปที่เมล accboard@gmail.com แล้วครับ

ขอบคุณมากครับ
20 @R08148
เปลี่ยนสายอักขระนิดหน่อยนะครับ
ตรงบรรทัดสุดท้าย Pivot ของเก่ามันหลวมไปหน่อยไม่รัดกุมพอครับ ทำให้หลุดเมื่อเจอค่า Null

sql = "PARAMETERS mPara Text ( 255 );"
sql = sql & " TRANSFORM Sum(table1.QTY) AS SumOfQTY"
sql = sql & " SELECT table1.Product"
sql = sql & " FROM table1"
sql = sql & " WHERE (((DateDiff('m',DateSerial(Mid([mPara],3),Left([mPara],2),1),DateSerial([Product_year],[Product_month],1)))<=5" & _
" And (DateDiff('m',DateSerial(Mid([mPara],3),Left([mPara],2),1),DateSerial([Product_year],[Product_month],1)))>=0))"
sql = sql & " GROUP BY table1.Product"
sql = sql & " PIVOT 'Mnt' & DateDiff('m',DateSerial(Mid([mPara],3),Left([mPara],2),1),DateSerial([Product_year],[Product_month],1))+1" & _
" In ('Mnt1','Mnt2','Mnt3','Mnt4','Mnt5','Mnt6');"
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3109s