แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - MAKI

หน้า: [1] 2
1
เพิ่มโค้ดอีกนิดใช้การเช็คปีของการลงข้อมูลด้วยครับ

พอมันไปเจอปีใหม่ข้อมูลก็จะรันกลับมา 1 ใหม่ครับ
โค๊ด: [Select]
Sub AutoRunnumber()
Dim MaxNum As Integer
MaxNum = Nz(DMax("ID", "tb_คำสั่ง", "[ปีงบ] = '" & CStr(Format(วันที่ลง, "YYYY")) & "'"))
If MaxNum = 0 Then
MaxNum = 1
Else
MaxNum = MaxNum + 1
End If
Me.ID = MaxNum
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

2
ไม่แน่ใจแบบนี้ไหมนะครับ
เวลาจะดูข้อมูล จะกำหนดวันที่มาทำงานก่อน

ปล.จากฐานข้อมูลแนะนำให้ทำ ข้อมูลทั้ง In และ Out ให้อยู่แถวเดียวกันเพื่อไม่ให้เกิดปัญหาครับลองดูตัวอย่างการสร้างจาก
https://www.youtube.com/watch?v=aLpeCWOYmDU link  ระบบบันทึกเวลาเข้าออก ของอาจารย์ TTT


หรือถ้าสร้าง ตารางแยกจากกันแบบในตัวอย่างของผม(ลองเลียนแบบจากชุดข้อมูลของคุณ Maki

ควรสร้าง ID หลักไว้ 1 อันไว้เพื่อใช้ในการ อ้างอิงความสัมพันธ์ของข้อมูล In กับ Out อันนี้ลองไปคิดดูว่าสร้างจากส่วนไหนได้บ้าง
เช่น เมื่อแสกนเข้าให้เก็บ ช่วงเวร และ ID อาจจะใช้ จากวันที่เริ่มทำงาน + กับ รหัสพนักงาน เช่น วันเดือนปี-รหัสพนักงาน ตัวอย่าง 01012563-001 เป็นต้น
มาทำ ID เพื่อต้องการให้ ID ทั้ง In และ Out คืออันเดียวกัน

ถ้ากรณีที่มี 2 ตาราง คือตารางIN และ ตาราง Out

ในตาราง In
           ID            ชื่อ              วันที่มา       เวลามา   ช่วงกะ
เช่น 01012020-001  /   นายก   / 01/01/2563 /  16.30 / บ่าย
ในตาราง Out
             ID            ชื่อ              วันที่ออก       เวลาออก   ช่วงกะ
เช่น 01012020-001  /   นายก   / 02/02/2563 /  08.30 / บ่าย

โดยกำหนดให้เมื่อถึงเวลาออกจากการทำงานที่เป็นเวรบ่ายคือ 08.30
เรากำหนดให้ ID = Right("00" & Trim(Str(Day(Date()))-1),2)+Right("00" & Trim(Str(Month(Date()))),2) & Trim(Str(Year(Date()))) & "-" & EmpID จะได้วันที่เดียวกับ วันที่มา ก็จะได้ ID เดียวกันนั้นเอง

แต่ถ้าเป็นเวรเช้า 
เรากำหนดให้ ID = Right("00" & Trim(Str(Day(Date()))),2)+Right("00" & Trim(Str(Month(Date()))),2) & Trim(Str(Year(Date()))) & "-" & EmpID  ได้เลยเพราะอยู่ในวันเดียวกัน


ข้อมูลทั้ง 2 ส่วนนี้ก็จะเชื่อมกันได้จาก ตารางOut.ID   Join กับ  ตารางIn.ID ได้เลย
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

3
อาจารย์คะ หนูบอกความต้องการผิดค่ะ  :ouch: :ouch:

ที่ต้องการคือ ถ้า txttime มากกว่า 9.00 Am แต่ไม่เกิน 1.00 Pm then
รบกวนอาจารย์อีกครั้งนะคะ  :cry: :cry:

If  TimeValue(Me.txttime) > #9:00 AM#  and TimeValue(Me.txttime) < #1:00 PM# then

หรือ If  TimeValue(Me.txttime) >= #9:00 AM#  and TimeValue(Me.txttime) <= #1:00 PM# then
กรณีที่นับรวม 9 โมงเช้า กับ บ่ายโมงด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

4
If #9:00 AM# < TimeValue(Me.txttime) and TimeValue(Me.txttime) < #4:00 PM# then
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

5
ล็อคแล้วคะ แต่ไม่สามารถ รับค่าจากเครื่องอ่านบัตรได้

น่าจะต้องสร้าง textbox 2 ตัวนะครับ
ตัวแรกไว้รับค่าจากเครื่องแสกน (เอาไปแอบๆไว้)ครับ ชื่อ txtfromscan
ตัวต่อมาคือตัวที่แสดงบนฟอร์มชื่อ txtPersonalID สถานะ Locked = true นะครับ

แนวทางคือรับค่าจาก txtfromscan  แล้วมาแสดงที่ txtPersonalID ที่มีสถานะ Locked ครับ
โค้ด
Private Sub Command6_Click()
Me.txtFromScan.SetFocus  'โค้ดที่ปุ่มเพื่อรับข้อมูลใหม่
End Sub

Private Sub txtFromScan_AfterUpdate() 'หลังจากเสียบบัตรแสกนแล้ว Cursor วิ่งไป textbox ต่อไปให้แสดงเลขประชาชนใน textbox ชื่อ txtPersonalID
Dim StrPersonalID 'สร้างตัวแปรเก็บรหัสประชาชน
If Not IsNull(Me.txtFromScan) Then
StrPersonalID = Me.txtFromScan
If Len(StrPersonalID) = 13 Then 'ใช้ Len เช็คว่าตัวเลขครบ 13 หลักหรือไม่ ถ้าไม่ใช่เราจะไม่แสดงรหัสประชาชน
Me.txtPersonalID = StrPersonalID
Else
MsgBox "รหัสประจำตัวประชาชนไม่ถูกต้อง", vbInformation, "แจ้งเตือน!!"
End If
End If
End Sub

Private Sub txtFromScan_GotFocus()
Me.txtFromScan = Null 'กำหนดให้เมื่อ Cursor ชี้ที่ textbox นี้ให้เป็นค่าว่างรอรับรหัสประชาชนใหม่
End Sub

โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

6
ห้อง MS Access / : Combo box Date picker
« เมื่อ: 03 ก.ค. 63 , 22:37:11 »
ผมได้ทำฟอร์มตัวอย่างแสดงการเลือก Date Picker ตามลักษณะที่ต้องการ โดยมีการตรวจสอบความถูกต้องของวันที่ระหว่างการเลือก แต่ผมไม่การันตีว่าจะตรวจสอบได้ถูกต้อง 100% หรือมีที่ผิดพลาดที่ไหนหรือไม่นะครับ ลองดูรายละเอียดการทำงานใน comment ภายในโค้ดที่ผมได้เขียนอธิบายไว้แล้วครับ

แก้บัก : ใน Private Sub cbMonth_AfterUpdate() บรรทัดต่อจาก Case 2 ให้แก้เป็น If Me.cbDay >= 29 Then
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

7
ไม่แน่ใจว่าใกล้เคียงที่ต้องการหรือไม่ มีตัวอย่างล็อคอินผู้ใช้แล้วแสดงเมนูเฉพาะของตนเองครับ https://www.thai-access.com/index.php?topic=932.0 แต่ทุกคนที่ใช้ฟอร์มนั้นๆได้ จะมีสิทธิ์เท่ากันทุกอย่าง ถ้าจะกำหนดว่าผู้ใช้คนนี้จะทำอะไรได้บ้างในหน้าฟอร์มนั้นๆ เช่น ดูได้อย่างเดียว หรือแก้ไขได้ด้วย แนะนำว่าเพิ่มเทเบิลของกลุ่มผู้ใช้ซึ่งจะเก็บว่ากลุ่มนี้มีใครบ้าง (คนนึงสามารถอยู่ได้หลายๆกลุ่ม) และเพิ่มเทเบิลสิทธิ์ของกลุ่มนี้ที่มีต่อฟอร์มนั้นๆว่า กลุ่มนี้เมื่อใช้ฟอร์มนั้นแล้ว จะมีสิทธิ์ชื่อว่าอะไรบ้าง เช่น ชื่อสิทธิ์ว่า "AE" (หมายถึง Add และ Edit ได้)   เมื่อเปิดฟอร์มที่ใช้งานขึ้นมา ก็เขียนโค้ดหาจากเทเบิลว่านาย ก. อยู่กลุ่มผู้ใช้ไหนบ้าง และรวมแต่ละกลุ่มที่พบแล้ว นาย ก. มีสิทธิ์รวมทั้งสิ้นอะไรที่ใช้กับฟอร์มนั้นได้บ้าง เมื่อฟอร์มจะทำการรับการป้อนเรคอร์ดใหม่ ก็ตรวจเลยว่าถ้าไม่มีสิทธิ์ A ก็ไม่ให้ทำ อย่างนี้เป็นต้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

8
ต้องใช้ 7-Zip แยกไฟล์ ตอนนี้สามารถเปิดไฟล์ตัวอย่างได้แล้วค่ะอาจารย์
ขอขอบคุณ @Maki ด้วยนะคะ
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

9
รบกวนขอไฟล์ตัวอย่างไว้ศึกษาเพื่อเป็นความรู้ค่ะ
ไฟล์ตัวอย่างที่คุณ Maki โพสไว้นั้น โหลดไปแล้วเปิดไม่ได้ค่ะ(ไฟล์เสีย)
ใช้ โปรแกรม 7-Zip แตกไฟล์ครับ

https://www.7-zip.org/ link
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

10
รบกวนขอไฟล์ตัวอย่างไว้ศึกษาเพื่อเป็นความรู้ค่ะ
ไฟล์ตัวอย่างที่คุณ Maki โพสไว้นั้น โหลดไปแล้วเปิดไม่ได้ค่ะ(ไฟล์เสีย)
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

11
คุณ MAKI รบกวนขอตัวอย่างด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

12
หนูใช้เครื่องอ่านบัตร กับโปรแกรม Siam id รับค่าลง Access ได้ปกติ
(ลงใน textbox)
แต่ เลขประชาชน 13 หลักจะเข้ามาแบบ 1 2222 33333 11 1จะมีเว้นวรรค
อยากให้มันมาแบบ ติดๆกัน 1222233333111 แบบนี้คะ พอมีวิธีบ้างไหม

ตั้งค่าจากเครื่องผมไม่ทราบนะครับ รออาจารย์ท่านอื่นมาเสริม

แต่ถ้าแก้แบบง่ายๆ คือสรา้งตัวแปลมาเก็บค่า และแก้ไขก่อนให้แสดงบน textbox ชื่อ txtPersonalID เช่น
Dim strPersonalID as string
strPersonalID = ค่าที่มาจากเครื่องแสกน
strPersonalID = Replace([strPersonalID]," ","")
txtPersonalID = strPersonalID

หรือวิธีอื่นๆ เช่นใช้คิวรี่ก็ใส่ Replace([strPersonalID]," ","") ได้เลยครับ

วิธีนี้ใช้การ Replace ช่องว่างให้ ไม่มีช่องว่างครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

13
ลืมบอกไป กรณีใส่ตัวอักษรต่อท้ายบ้านเลขที่เดียวกัน ให้เพิ่มค่า N ต่อท้ายการเรียงลำดับอีกที

select * from T order by val(replace(N,"/",".")), N
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

14
ถ้า T เป็นชื่อเทเบิล และ N เป็นเลขที่บ้าน ก็ต้องสร้างคิวรี่เพื่อเรียงข้อมูลดังนี้

select * from T order by val(replace(N,"/","."))

หลักการคือเปลี่ยน / เป็นจุดทศนิยมแทน แล้วตีความเป็นค่าตัวเลข ดังนั้น 1/1 ก็กลายเป็น 1.1 แล้วการเรียงก็จะเป็นตามที่ต้องการ  แต่ใช้ไม่ได้กับบ้านที่มีตัวอักษรซึ่งผมไม่แน่ใจว่าจะมีประเภท 123ก, 123ข หรือเปล่า แต่ถ้ามี ระบบอาจเลือกตัวไหนขึ้นมาแสดงก่อนก็ได้ เพราะตีค่าเป็น 123 เหมือนๆกัน
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

15
เท่าที่ลองดู ถ้ากำหนด Text Format property ของเท็กซ์บ็อกซ์เป็น Rich Text มันจะแสดงได้ในโหมด Print Preview ซึ่งเป็นภาพจริงที่จะเกิดตอนพิมพ์ ผมลองพิมพ์ไปเป็น pdf ไฟล์ ก็เห็นจัดให้ครับ แต่ถ้าไม่กำหนด มันจะไม่จัดให้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

16
กำหนดรูปแบบวันที่ของ text2 เพิ่มเข้าไปตามตัวอย่างครับ
โค๊ด: [Select]
=[text1] & Format([Text2]," d mmmm yyyy")
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

หน้า: [1] 2