กระทู้เก่าบอร์ด อ.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
ขอบคุณมากครับ
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
2 @R08051
ลองเอาคิวรี่นี้ไปรัน
ถ้ารันได้ตามต้องการแล้วให้เซฟคิวรี่นี้ไว้ จากนั้นให้สร้างคิวรี่ Cross Tab จากคิวรี่นี้อีกทีครับ
**** เขียนสด ไม่ได้ทดลอง ****
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.........
เราก็ไปกำหนดใน คุณสมบัติของช่องคอลัมในคิวรี โดยใช้ ; เป็นตัวคั่น
ลองทำดูก่อนนะครับ ถ้าบอกยังไม่ละเอียด เดี๋ยวมาบอกต่อครับ
เช่น เราอยากให้เรียงตามปีงบประมาณ คือ เดือน ต.ค.53 พ.ย.53 ธ.ค.53 ม.ค.54.........
เราก็ไปกำหนดใน คุณสมบัติของช่องคอลัมในคิวรี โดยใช้ ; เป็นตัวคั่น
ลองทำดูก่อนนะครับ ถ้าบอกยังไม่ละเอียด เดี๋ยวมาบอกต่อครับ
4 @R08054
ขอบคุณ อ.yeadram มากครับ
ขอแก้นิดหนึ่งในส่วน datediff("yyyy", เปลี่ยนเป็น datediff("m",
ก็จะได้ข้อมูลตามต้องการ
- แต่ติดปัญหา หลังจากนำมาสร้าง Cross Tab แล้วพอจะดึงไปแสดงที่ฟอร์ม หรือ รายงาน มันจะมีปัญหาในการอ้างอิง เพราะในส่วนของ ปีเดือน ที่เป็นคอลัมน์นั้นมันเปลี่ยนแปลงอยู่ตลอดตามที่เรา เลือกช่วง
ไม่ทราบว่า จะสามารถแก้ปัญหาในส่วนนี้ได้อย่างไรบ้างครับ
ขอบคุณมากครับ
ขอแก้นิดหนึ่งในส่วน datediff("yyyy", เปลี่ยนเป็น datediff("m",
ก็จะได้ข้อมูลตามต้องการ
- แต่ติดปัญหา หลังจากนำมาสร้าง Cross Tab แล้วพอจะดึงไปแสดงที่ฟอร์ม หรือ รายงาน มันจะมีปัญหาในการอ้างอิง เพราะในส่วนของ ปีเดือน ที่เป็นคอลัมน์นั้นมันเปลี่ยนแปลงอยู่ตลอดตามที่เรา เลือกช่วง
ไม่ทราบว่า จะสามารถแก้ปัญหาในส่วนนี้ได้อย่างไรบ้างครับ
ขอบคุณมากครับ
5 @R08055
ตามที่คุณ Un บอกนะครับ ให้เรากำหนดคำที่ตายตัวไว้เลยครับ อย่าให้มันตั้งเองอัตโนมัติ
อย่างงานของคุณ มีหัวคอลัมน์ (ที่เปลี่ยนแปลงบ่อยๆ อยู่ 6 คอลัมน์)
คุณก็กำหนดให้มันเป็นคำคงที่เลยครับ 6 คำ
กำหนดเป็นไหมครับ บอกเผื่อไว้ก็แล้วกันครับ
-เปิด Cross TAb ในมุมมองออกแบบ
-คลิ๊กขวา ที่ฟิลด์ column header > เลือก คุณสมบัติ
-คุณจะเห็นมีบรรทัดหนึ่ง ที่มีโปรยคำเอาไว้ ให้คุณไปกำหนดให้มันใหม่เลยครับ เช่นอาจจะกำหนดว่า
"เดือนที่ 1"; "เดือนที่ 2"; "เดือนที่ 3", .....
คืออย่าให้มันกำหนดเองว่าเป็น "ม.ค."; "ก,พ."..
- แล้วก็เซฟ Crosstab ตัวนั้นครับ
- อาจต้องไปแก้ไขการอ้างอิง ในรายงานนะครับ
อย่างงานของคุณ มีหัวคอลัมน์ (ที่เปลี่ยนแปลงบ่อยๆ อยู่ 6 คอลัมน์)
คุณก็กำหนดให้มันเป็นคำคงที่เลยครับ 6 คำ
กำหนดเป็นไหมครับ บอกเผื่อไว้ก็แล้วกันครับ
-เปิด Cross TAb ในมุมมองออกแบบ
-คลิ๊กขวา ที่ฟิลด์ column header > เลือก คุณสมบัติ
-คุณจะเห็นมีบรรทัดหนึ่ง ที่มีโปรยคำเอาไว้ ให้คุณไปกำหนดให้มันใหม่เลยครับ เช่นอาจจะกำหนดว่า
"เดือนที่ 1"; "เดือนที่ 2"; "เดือนที่ 3", .....
คืออย่าให้มันกำหนดเองว่าเป็น "ม.ค."; "ก,พ."..
- แล้วก็เซฟ Crosstab ตัวนั้นครับ
- อาจต้องไปแก้ไขการอ้างอิง ในรายงานนะครับ
6 @R08056
- คุณจะเห็นมีบรรทัดหนึ่ง ที่มีโปรยคำเอาไว้ ให้คุณไปกำหนดให้มันใหม่เลยครับ เช่นอาจจะกำหนดว่า // รบกวนหน่อยครับ หาบรรทัดนี้ไม่เจอครับ
ขอบคุณครับ
ขอบคุณครับ
7 @R08057
ตามที่ลองดูน่าจะเป็นในส่วนของ column headings ใช่ไหมครับ
แต่พอผมกำหนดค่าลงไป ปรากฎว่า ไม่มีข้อมูลเลย แต่ถ้าลบออก หรือกำหนดให้ตรงกับชื่อที่ crosstab กำหนดมาให้ มันจึงจะแสดง
ไม่ทราบว่าต้องแก้ตรงไหนครับ
ขอบคุณมากครับ
แต่พอผมกำหนดค่าลงไป ปรากฎว่า ไม่มีข้อมูลเลย แต่ถ้าลบออก หรือกำหนดให้ตรงกับชื่อที่ crosstab กำหนดมาให้ มันจึงจะแสดง
ไม่ทราบว่าต้องแก้ตรงไหนครับ
ขอบคุณมากครับ
8 @R08058
ต้องกำหนดให้ตรงกับ หัวฟิลด์ของเราด้วยครับ
9 @R08059
ขอบคุณครับที่ตอบคำถาม
ถ้าแบบนี้ เราก็ตั้งเป็นชื่ออื่น ที่เป็นค่าตายตัวไม่ได้ใช่ไหมครับ เช่นตั้ง
1,2,3,4,5,6
ถ้าแบบนี้ เราก็ตั้งเป็นชื่ออื่น ที่เป็นค่าตายตัวไม่ได้ใช่ไหมครับ เช่นตั้ง
1,2,3,4,5,6
10 @R08060
ไม่ได้ครับ
ต้องตังให้ตรงกับผลลับที่ออกมาด้วย ถ้าตั้ง 1,2,3,4,5,6 ผลลัพธ์ คือ 1,2,3,4,5,6 ซึ่งไม่มีข้อมูลจริง ให้ดูที่หัวคอลัมเลยครับว่าออกมาอย่างไร
มันไม่ีค่อยยืดหยุ่นมาก แต่ก็ดีที่เรียงได้ และสำคัญถ้าจะเอา Query นี้ไปเป็น Query ต่อ เพราะว่า Fix หัวฟิลด์ได้
ต้องตังให้ตรงกับผลลับที่ออกมาด้วย ถ้าตั้ง 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 เอาเอง
เพื่อให้ยืดหยุ่น
http://thai-access.com/yeadram_view.php?topic_id=581&page=1
เผื่อว่าจะมีประโยชน์ จำเป็นเหมือนกันที่บางครั้งต้อง เขียน SQL เอาเอง
เพื่อให้ยืดหยุ่น
12 @R08062
เอาอย่างนี้เลยดีกว่า
ลืมคำตอบเก่าๆ ที่ผมเคยตอบไปทั้งหมดก่อน
- ออกแบบรายงาน ประมาณนี้
- Label ทั้ง 6 คอลัมน์ ให้ตั้งชื่อตามลำดับ ว่า Label1, Label2, .....
- รายงานนี้ไม่ต้องมีแหล่งข้อมูล
- แหล่งข้อมูลต้นทางของโค้ดชุดนี้คือ table1 ไปเปลี่ยนชื่อเป็นชื่อตารางของคุณด้วยนะครับ
- รายงานนี้ ฝังโค้ดเพียง sub เดียว ดังนี้
ทดสอบดูครับ
ลืมคำตอบเก่าๆ ที่ผมเคยตอบไปทั้งหมดก่อน
- ออกแบบรายงาน ประมาณนี้
- 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
ขอบคุณครับ
ลองดูแล้ว ตรง 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
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
ขอบคุณมากครับ
แต่ผมลองทำตามที่ อ.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
งั้นเอาใหม่ครับ
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 มันผิด
ขอบคุณมากครับ
แสดงรายละเอียดใน label ได้ถูกต้องแล้ว
แต่ยังติดปัญหาส่วนนี้ [Product_month]-Val(Left(mPara,2))+1
ถ้าเราเลือกช่วงระหว่างมีเหมือนจะมีปัญหานะครับ เช่น เลือก 112009 ข้อมูลจะไม่แสดงเนื่องจากค่า m มันผิด
ขอบคุณมากครับ
18 @R08098
เริ่มงงแล้วครับ มันติดหลายอย่าง ทำให้มีความซับซ้อน ในจินตนาการเกินไป
ขอตัวอย่างงานสัก เดือนละ 3-4 เรคคอร์ด
รวมประมาณ 8เดือน
พร้อมกับฝั้งโค้ดและ/ หรือ วิธิการล่าสุดที่เราได้ร่วมปรึกษากันมาแล้ว ลงไปด้วย
ส่งไฟล์ตัวอย่างเข้ามาดูหน่อยครับ
ขอตัวอย่างงานสัก เดือนละ 3-4 เรคคอร์ด
รวมประมาณ 8เดือน
พร้อมกับฝั้งโค้ดและ/ หรือ วิธิการล่าสุดที่เราได้ร่วมปรึกษากันมาแล้ว ลงไปด้วย
ส่งไฟล์ตัวอย่างเข้ามาดูหน่อยครับ
19 @R08106
รบกวน อ.yeadram ด้วยครับ
ผมได้ส่งไปที่เมล accboard@gmail.com แล้วครับ
ขอบคุณมากครับ
ผมได้ส่งไปที่เมล accboard@gmail.com แล้วครับ
ขอบคุณมากครับ
20 @R08148
เปลี่ยนสายอักขระนิดหน่อยนะครับ
ตรงบรรทัดสุดท้าย Pivot ของเก่ามันหลวมไปหน่อยไม่รัดกุมพอครับ ทำให้หลุดเมื่อเจอค่า Null
ตรงบรรทัดสุดท้าย 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');"
Time: 0.3109s
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 มาออกรายงาน หรือ ในฟอร์ม มีปัญหา
ขอบพระคุณมากๆ ครับ