กระทู้เก่าบอร์ด อ.สุภาพ ไชยา
451 12
URL.หัวข้อ /
URL
crosstab query มีปัญหา
สวัสดีค่ะ คือว่า ต้องการแปลงข้อมูล text file จากเครื่องตอกบัตรค่ะ
มี field รหัส วัน-เวลา แล้วก็สถานะ (เข้า-ออก) แล้วก็ต้องการทำเป็น crosstab query เพื่อให้
เวลาเข้า กับ ออก ลบ กัน จะได้ ทราบว่า พนักงานมาทำงานตรงเวลา หรือว่า สายกี่นาทีน่ะค่ะ แล้วเดือนนึง
ก็ sum ออกมา แต่ไม่ทราบว่าทำไม crosstab แล้ว เวลามันออกมาไม่ตรงกันคะ แถม ข้อมูลก็ไม่รู้ว่าหายไปไหนหมด ใน table มีสามพันกว่า record พอเป็น crosstab แล้วก็น่าจะ มี พันกว่า แต่ทำไมมี
แค่ 91 ก็ไม่ทราบค่ะ อาจารย์ช่วยหน่อยนะคะ
งง จัง
มี field รหัส วัน-เวลา แล้วก็สถานะ (เข้า-ออก) แล้วก็ต้องการทำเป็น crosstab query เพื่อให้
เวลาเข้า กับ ออก ลบ กัน จะได้ ทราบว่า พนักงานมาทำงานตรงเวลา หรือว่า สายกี่นาทีน่ะค่ะ แล้วเดือนนึง
ก็ sum ออกมา แต่ไม่ทราบว่าทำไม crosstab แล้ว เวลามันออกมาไม่ตรงกันคะ แถม ข้อมูลก็ไม่รู้ว่าหายไปไหนหมด ใน table มีสามพันกว่า record พอเป็น crosstab แล้วก็น่าจะ มี พันกว่า แต่ทำไมมี
แค่ 91 ก็ไม่ทราบค่ะ อาจารย์ช่วยหน่อยนะคะ
งง จัง
12 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R02301
ขอบคุณอาจารย์ มากๆเลยค่ะ
ถามต่ออีกนิดนะคะ คือว่า ถ้าต้องการให้เช็คเวลาว่าสายกี่นาที ออกก่อนกี่นาที
ต้องใส่ code ยังไงค่ะ
คือถ้าเวลาเข้าหลัง 8.00 am ให้คำนวณว่าสาย กี่นาที
และก็ถ้าออกก่อน 5.00 pm ให้คำนวณว่ากี่นาทีน่ะค่ะ คือว่าต้องสรุปเป็นเดือนๆ
ว่าคนๆนี้มาทำงานสายกี่นาทีน่ะค่ะ
รบกวนหน่อยนะคะ
ถามต่ออีกนิดนะคะ คือว่า ถ้าต้องการให้เช็คเวลาว่าสายกี่นาที ออกก่อนกี่นาที
ต้องใส่ code ยังไงค่ะ
คือถ้าเวลาเข้าหลัง 8.00 am ให้คำนวณว่าสาย กี่นาที
และก็ถ้าออกก่อน 5.00 pm ให้คำนวณว่ากี่นาทีน่ะค่ะ คือว่าต้องสรุปเป็นเดือนๆ
ว่าคนๆนี้มาทำงานสายกี่นาทีน่ะค่ะ
รบกวนหน่อยนะคะ
3 @R02302
คงต้องใช้ DateDiff() เข้าช่วยครับ
ผมได้เขียนฟังก์ชันขึ้นมาตัวหนึ่งเพื่อใช้ในการหาผลต่างของเวลา
แล้วให้ดูตัวอย่างใน Query1 และ 2 ดูครับ
ยังงัยก็ประยุกต์ใช้จากตรงนี้ต่อไปได้เลย
ผมได้เขียนฟังก์ชันขึ้นมาตัวหนึ่งเพื่อใช้ในการหาผลต่างของเวลา
แล้วให้ดูตัวอย่างใน Query1 และ 2 ดูครับ
ยังงัยก็ประยุกต์ใช้จากตรงนี้ต่อไปได้เลย
4 @R02307
ขอบคุณมากค่ะ ใช้ได้แล้วค่ะ
5 @R02309
ถามต่อนิดนะคะ แล้วถ้าแต่ละคนเข้าทำงานในเวลาไม่พร้อมกันล่ะคะ มีการ
ทำงานเป็นกะ คือเรากำหนดข้อมูลใน table2 ว่าเค้าต้องเข้ากี่โมง ออกกี่โมง ซึ่งแต่ละคนไม่เหมือนกัน เราจะแก้ source code ยังไงคะ ให้มันไปหักลบกับเวลาที่เรา
กำหนดให้เข้า ให้ออก น่ะค่ะ
ทำงานเป็นกะ คือเรากำหนดข้อมูลใน table2 ว่าเค้าต้องเข้ากี่โมง ออกกี่โมง ซึ่งแต่ละคนไม่เหมือนกัน เราจะแก้ source code ยังไงคะ ให้มันไปหักลบกับเวลาที่เรา
กำหนดให้เข้า ให้ออก น่ะค่ะ
6 @R02316
คงต้องถามต่อว่า แต่ละคนจะมีการ fixed เวลาทำงานตลอดหรือไม่
หรือมีการเปลี่ยนไปแต่ละเดือนไม่เหมือนกัน แต่ดูจากตัวอย่างในตารางที่ 2 จะเหมือนกันหมด ซึ่งจะไม่เกิดประโยชน์ที่จะดึงเวลาเข้าออกจากตารางที่เลย
ถ้ามีการเปลี่ยนแปลงไปเรื่อยๆ ก็ต้องมีอีกฟีลด์หนึ่งเป็นตัวกำหนดในตารางที่ 2 ว่าเป็นของช่วงเดือนไหนด้วย จึงจะทำให้การดึงข้อมูลเวลาเข้าออกได้ถูกต้องครับ
หรือมีการเปลี่ยนไปแต่ละเดือนไม่เหมือนกัน แต่ดูจากตัวอย่างในตารางที่ 2 จะเหมือนกันหมด ซึ่งจะไม่เกิดประโยชน์ที่จะดึงเวลาเข้าออกจากตารางที่เลย
ถ้ามีการเปลี่ยนแปลงไปเรื่อยๆ ก็ต้องมีอีกฟีลด์หนึ่งเป็นตัวกำหนดในตารางที่ 2 ว่าเป็นของช่วงเดือนไหนด้วย จึงจะทำให้การดึงข้อมูลเวลาเข้าออกได้ถูกต้องครับ
7 @R02336
คือแต่ละคนมีเวลาเข้าออกไม่เหมือนกันค่ะ เช่น พนักงานรายเดือนทั้งหมด 200 คน
ทำ 8.00-17.00 ประมาณ120 คนและก็คงที่อยู่อย่างนั้นไปตลอด ส่วนที่เหลือจะเป็นพนักงานเข้ากะ และจะวนกะกันในแต่ละเดือนค่ะ เช่น เดือนนี้ทำงาน 8.00-17.00 เดือนหน้าอาจจะเป็น 17.00-03.00 ก้อได้ค่ะ
ทำ 8.00-17.00 ประมาณ120 คนและก็คงที่อยู่อย่างนั้นไปตลอด ส่วนที่เหลือจะเป็นพนักงานเข้ากะ และจะวนกะกันในแต่ละเดือนค่ะ เช่น เดือนนี้ทำงาน 8.00-17.00 เดือนหน้าอาจจะเป็น 17.00-03.00 ก้อได้ค่ะ
8 @R02337
ฉะนั้นในตารางที่ 2 จะต้องมีการระบุด้วยว่าเป็นของเดือนไหนด้วยนะครับ
เพราะการคำนวณอาจจะต้องย้อนไปดูของเดือนที่แล้ว
หรือว่าจะไม่เก็บเวลาเข้าออกของเดือนที่ผ่านมา แต่เก็บเป็นเดือนๆ ไปครับ
ถ้าเป็นเช่นนี้ ลองเปลี่ยน SQL ของ Query1 ให้เป็น
SELECT Table1.Code, Table1.DateTime, IIf([status]="I",CalLate([table1].[datetime],[table2].[timein],[status]),CalLate([table1].[datetime],[table2].[timeout],[status])) AS LateIn
FROM table2 INNER JOIN Table1 ON table2.Code = Table1.Code;
และเปลี่ยนโค้ดของฟังก์ชัน CalDate() ให้เป็น
Function CalLate(dte As Date, TimeInOut As Date, strType As String) As Integer
Dim MyDate As Date
MyDate = DateSerial(Year(dte), Month(dte), Day(dte))
MyDate = MyDate + TimeInOut
If strType = "I" Then
CalLate = DateDiff("n", dte, MyDate)
Else
CalLate = DateDiff("n", MyDate, dte)
End If
End Function
ลองดูครับ
เพราะการคำนวณอาจจะต้องย้อนไปดูของเดือนที่แล้ว
หรือว่าจะไม่เก็บเวลาเข้าออกของเดือนที่ผ่านมา แต่เก็บเป็นเดือนๆ ไปครับ
ถ้าเป็นเช่นนี้ ลองเปลี่ยน SQL ของ Query1 ให้เป็น
SELECT Table1.Code, Table1.DateTime, IIf([status]="I",CalLate([table1].[datetime],[table2].[timein],[status]),CalLate([table1].[datetime],[table2].[timeout],[status])) AS LateIn
FROM table2 INNER JOIN Table1 ON table2.Code = Table1.Code;
และเปลี่ยนโค้ดของฟังก์ชัน CalDate() ให้เป็น
Function CalLate(dte As Date, TimeInOut As Date, strType As String) As Integer
Dim MyDate As Date
MyDate = DateSerial(Year(dte), Month(dte), Day(dte))
MyDate = MyDate + TimeInOut
If strType = "I" Then
CalLate = DateDiff("n", dte, MyDate)
Else
CalLate = DateDiff("n", MyDate, dte)
End If
End Function
ลองดูครับ
9 @R02340
ลองดูแล้วค่ะ แต่ว่าทำไม พอกำหนดตรง lateIn ให้มัน <0 (จะได้ sum เวลาที่มา
สาย) มันขึ้นว่า Data type mismatch in criteria expression คะ แล้วพอ
กด ok ก็ขึ้น #Name? เต็มไปหมดทุก field เลยคะ
สาย) มันขึ้นว่า Data type mismatch in criteria expression คะ แล้วพอ
กด ok ก็ขึ้น #Name? เต็มไปหมดทุก field เลยคะ
10 @R02343
เพราะว่า คนที่รหัส 04146001 ไม่มีเวลาเข้าออก ในตารางที่ 2 ครับ
ซึ่งไม่ควรจะเกิด ให้เติมเข้าไปปัญหาน่าจะหาครับ
ซึ่งไม่ควรจะเกิด ให้เติมเข้าไปปัญหาน่าจะหาครับ
11 @R02364
ขอบคุณมากๆเลยค่ะ
12 @R03192
คุณ nuch หรือ อาจารย์สุภาพ ยังไงช่วยส่งไฟล์เช็กเวลาเข้าออก มาให้ผมในรูปแบบ access 97 ได้ไหมครับที่ L_S20@hotmail.com
Time: 0.1213s
TRANSFORM First(Table1.DateTime) AS FirstOfDateTime
SELECT Table1.Code, CDate(Format([DateTime],"d mmm yy")) AS [Working Date]
FROM Table1
GROUP BY Table1.Code, CDate(Format([DateTime],"d mmm yy"))
ORDER BY Table1.Code, CDate(Format([DateTime],"d mmm yy"))
PIVOT Table1.Status;
จะได้
Code Working Date I O
01133060 1/3/2546 1/3/2546 7:54:59 1/3/2546 17:06:04
01133060 3/3/2546 3/3/2546 7:52:13 3/3/2546 17:05:21
01133060 4/3/2546 4/3/2546 7:48:44
01133060 5/3/2546 5/3/2546 7:49:54 5/3/2546 17:06:34
01133060 6/3/2546 6/3/2546 7:49:15
01133060 7/3/2546 7/3/2546 7:47:17 7/3/2546 17:02:29
01133060 8/3/2546 8/3/2546 7:50:25 8/3/2546 17:02:56
...