กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
402 14
URL.หัวข้อ /
URL
Previous Month
ขอรบกวนถามครับ คือผมมี Table ที่ภายในประกอบด้วย
Project Date Percent
A 01/01/02 20%
B 02/05/02 50%
A 05/02/02 30%
ถ้าผมต้องการทำ Query ในออกมาในลักษณะนี้จะต้องทำอย่างไรบ้างครับ
Project Previous Month(%) This Month(%) Total (%)
Project Date Percent
A 01/01/02 20%
B 02/05/02 50%
A 05/02/02 30%
ถ้าผมต้องการทำ Query ในออกมาในลักษณะนี้จะต้องทำอย่างไรบ้างครับ
Project Previous Month(%) This Month(%) Total (%)
14 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R00235
ก่อนอื่นคงต้องขอแนะนำก่อนนะครับ
1. ไม่ควรตั้งชื่อฟีลด์ว่า Date เพราะจะไปซ้ำกับฟังก์ชันของ Access คือ Date()
2. ฟีลด์ Percent ควรจะกำหนดให้เป็นแบบ Integer Type นะครับ ถึงจะนำมาคำนวณได้
ผมได้ลองเปลี่ยนข้อมูลให้มีค่าของเดือนปัจจุบันในตารางด้วย ดังนี้
Project MyDate Percent
A 1/1/2002 20
B 2/5/2002 50
A 5/4/1459 30
มาถึงการสร้าง Query ให้เป็นไปดังที่ต้องการ
Project PreviousMonth ThisMonth
A 20 30
B 50 0
ผมได้สร้างฟังก์ชัน 2 ตัวดังนี้
Function MyPrevious(strProject As String) As Integer
MyPrevious = Nz(DSum("[Percent]", "[Table2]", "[Project] = '" & strProject & "'"), 0)
End Function
Function MyThis(strProject As String) As Integer
MyThis = Nz(DSum("[Percent]", "[Table2]", "[Project] = '" & strProject & "' And Format([Mydate],'m')=Format(Now(),'m')"), 0)
End Function
จะเห็นว่าผมใช้ DSUM() และ Format() เข้ามาช่วย
เมื่อมาสร้าง Query จะได้ SQL ดังนี้
SELECT Table2.Project, MyPrevious([Table2].[Project])-[ThisMonth] AS PreviousMonth, MyThis([Table2].[Project]) AS ThisMonth
FROM Table2
GROUP BY Table2.Project;
ตัวอย่างจริงอยู่ที่ http://agserver.kku.ac.th/basiceng/previous.zip ครับ
2 @R00236
ขอบคุณมากครับคุณ สุภาพ ที่ให้คำแนะนำอย่างละเอียดเลยครับ แต่ผมติดอยู่นิดนึงคือ field Project ของผมนั้น Date type มันเป็น Number เนื่องจากผมมี Table ที่เก็บชื่อ Project ตั้งหาก เวลาใช้ก็เลือกชื่อ Project ที่ต้องการเข้ามาเก็บที่ Table นี้ ดังนั้นเมื่อผม Run Query มันจึงขึ้นว่า Runtime error '3464' Data type mismatch in criteria expression ผมต้องไปแก้ที่ Modul ตรงส่วนไหนครับ
3 @R00237
ให้ไปเอา ' ' ออกดังนี้
Function MyPrevious(strProject As String) As Integer
MyPrevious = Nz(DSum("[Percent]", "[Table2]", "[Project] = " & strProject & ""), 0)
End Function
Function MyThis(strProject As String) As Integer
MyThis = Nz(DSum("[Percent]", "[Table2]", "[Project] = " & strProject & " And Format([Mydate],'m')=Format(Now(),'m')"), 0)
End Function
4 @R00241
สวัสดีครับ คุณ สุภาพ ผมได้ทำตามที่แนะแล้วใช้ได้ดีเลยครับ แต่ในส่วนของ PreviousMonth ผมไม่ต้องการให้มันบวกค่าให้คือต้องการค่า PreviousMonth ของเดือนที่แล้วอย่างเดียว ผมได้ลองแก้ Modul โดยการลบ Dsum มัน Error ก็เลยรบกวนถามอีกครั้งครับ ขอบคุณมากครับสำหรับคำแนะนำ
5 @R00242
ยังไม่เข้าใจความต้องการครับ ตรง ไม่ต้องการให้มันบวกค่าให้คือต้องการค่า PreviousMonth ของเดือนที่แล้วอย่างเดียว ช่วยอธิบายอีกหน่อยครับ ถ้ามีตัวอย่างด้วยก็จะดีมากเลย
6 @R00250
ที่ Table มีค่าดังนี้
Project MyDate Percent
A 01/Jan/02 20
A 20/Mar/02 5
A 05/Apr/02 30
B 02/May/02 50
ที่ Query ได้ค่าดังนี้ (ซึ่ง PreviousMonth ผมต้องการแค่ค่าของเดือน Mar เท่านั้นครับโดยที่ไม่ต้องเอาค่าของเดือน Jan มาบวกด้วยครับ ซึ่งผมต้องการที่จะดูค่าของเดือนปัจจุบัน กับค่าที่ย้อนหลังไป 1 เดือนเท่านั้นครับดังนั้นค่าของ PreviousMonth ก็คือ 5 ไม่ใช่ 25 ครับ)
Project PreviousMonth ThisMonth
A 25 30
B 50 0
ขอบคุณมากครับที่สละเวลามาให้ความรู้ไม่ทราบว่าหนังสือจะออกเมื่อไรครับสนใจมากครับ
7 @R00252
ให้เปลี่ยน MyPrevious ดังนี้
Function MyPrevious(strProject As String) As Integer
MyPrevious = Nz(DSum("[Percent]", "[Table2]", "[Project] = '" & strProject & "'And Format([Mydate],'m')=Format(Now(),'m')-1"), 0)
End Function
8 @R00253
รบกวนอีกครั้งครับ คือที่ อ.สุภาพ ให้มานั้นสำหรับ Data type ที่เป็น Text ผมได้ลองทำแล้วใช้ได้ครับ แต่ว่า Data Type ของผมเป็น Number มันยัง Error อยู่ผมก็ได้ลองแก้ไขตามที่ อ. สุภาพ เคยบอกมาโดยลบเครื่องหมาย ' ' ออกไป มันก็ยัง Error ก็เลยไม่เข้าใจว่าเครื่องหมาย ' " จะต้องใส่เมื่อไร
อ. สุภาพช่วยแนะนำหนังสือที่สอนการเขียน Code ให้ด้วยครับเพราะไม่มีพื้นฐานเกี่ยวกับการเขียน code เลยไม่รู้จะเริ่มอย่างไร ขอบคุณ อ. สุภาพ มากครับที่ให้คำแนะนำ
9 @R00254
ให้ใส่เครื่องหมาย # แทน ' ดังนี้
MyDate = #" & ตัวแปรวันที่ & "#"
ลองดูครับ ถ้ามีปัญหาก็ให้ post มาต่อได้
สำหรับหนังสือสอนการเขียนโค้ดนั้น ให้ลองดูหนังสือ Access ที่ขายตามร้านหนังสือ แล้วให้ดูส่วน VBA หรือ Module จะมีการสอนเกี่ยวกับการเขียนโค้ดไว้ด้วย ให้เปิดดูว่าเล่มไหนที่มีบ้าง ลองอ่านดู ถ้าอ่านเข้าใจง่าย ก็ซื้อมาอ่านดูนะครับ และถ้ามีปัญหาก็ให้แจ้งเข้ามาได้ครับ
10 @R00256
ช่วยดูให้ด้วยครับแก้อย่างไร
MyPrevious = Nz(DSum("[ProgressSch]", "[Project]", "[ProjectNameID] = '" & strProject & "'And Format([CheckDate],'mmm,yy')=Format(Now(),'mmm,yy')-1"), 0)
11 @R00257
แก้เป็น
MyPrevious = Nz(DSum("[ProgressSch]", "[Project]", "[ProjectNameID] = " & strProject & " And Format([CheckDate],'mmm,yy')=Format(Now(),'mmm,yy')-1"), 0)
ครับ
12 @R00258
แก้ตามที่บอกแล้วครับแต่มันขี้น
Run-time error '3464'
Data type mismatch in criteria expression.
ขอบคุณมากครับสำหรับคำตอบ
13 @R00259
ให้ส่งไฟล์นั้น โดยการ zip ก่อน แล้วส่งมาให้ผมที่ kaeg_chaiya@hotmail.com ผมจะดูให้ครับ หรือส่งเฉพาะตารางเป้าหมายมาให้ผมก็ได้ โดย zip ก่อนเช่นกันครับ
14 @R00261
ขออภัย ผมโพสต์ผิดหัวข้อครับ
ใช้ตัวนี้ครับ
Function MyPrevious(strProject As String) As Integer
Dim dte As Date, intM As Integer, intYr As Integer
dte = DateAdd("m", -1, Now)
intM = Format(dte, "M")
intYr = Format(dte, "YYYY")
Debug.Print intM & " " & intYr
MyPrevious = Nz(DSum("[ProgressSch]", "[Project]", "[ProjectNameID] = " & strProject & "And (Format([CheckDate],'m')=" & intM & " And Format([CheckDate],'yyyy')=" & intYr & ")"), 0)
End Function
โดย DateAdd() จะใช้ในการบวกลบวันเดือนปีที่ต้องการได้ และจะแก้ไขปัญหาเดือนปัจจุบันที่เป็นเดือนมกราคมได้ โดยจะได้ previous month เป็นธันวาคม
ลองดูครับ ผมได้ส่งเมลล์กลับให้แล้ว
Time: 0.1832s