แสดงกระทู้

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 - PNR

หน้า: 1 2 [3] 4 5 6 ... 46
37
แก้ไขโค้ดในการตัด กรณี อายุแค่ 1 วัน ก็ให้แสดงว่า 1 วัน ไม่ใช่  0 ปี 0 เดือน 1 วัน
โค๊ด: [Select]
Public Function CalAge(FieldDateOfBirth) As String
Dim DayOfBirth As String
Dim MonthOfBirth As String
Dim YearOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalAge = ""
Else
DayOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date) - 1, [FieldDateOfBirth]), Date), DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date))
MonthOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) Mod 12, DateDiff("m", [FieldDateOfBirth], Date) Mod 12)
YearOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) \ 12, DateDiff("m", [FieldDateOfBirth], Date) \ 12)
CalAge = IIf(Left(YearOfBirth, 1) = 0, "", YearOfBirth & "ปี ") & IIf(Left(MonthOfBirth, 1) = 0, "", MonthOfBirth & "เดือน ") & IIf(Left(DayOfBirth, 1) = 0, "", DayOfBirth & "วัน")
End If
End Function



Public Function CalDay(FieldDateOfBirth) As String
Dim DayOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalDay = ""
Else
DayOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date) - 1, [FieldDateOfBirth]), Date), DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date))
CalDay = DayOfBirth & " วัน "
End If
End Function

Public Function CalMonth(FieldDateOfBirth) As String
Dim MonthOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalMonth = ""
Else
MonthOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) Mod 12, DateDiff("m", [FieldDateOfBirth], Date) Mod 12)
CalMonth = MonthOfBirth & " เดือน "
End If
End Function

Public Function CalYear(FieldDateOfBirth) As String
Dim YearOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalYear = ""
Else
YearOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) \ 12, DateDiff("m", [FieldDateOfBirth], Date) \ 12)
CalYear = YearOfBirth & " ปี "
End If
End Function

38
ท่านดูในโค้ดที่ copy มาว่า เป็นภาษาไทยมาครบไหม

บ้างที่เรา copy Code มาจากเว็บ ภาษาไทยจะเพี้ยน วิธีแก้่คือ
1.กด Copy Code จาก เว็บมา
2.เปิด Excel ขึ้นมา เลือกที่ Cell ได้ก็ได้กดคลิ๊กขวา  >> วางแบบพิเศษ >> มันจะมี ข้อความ Unicode กับ ข้อความ
3.ให้เลือก ข้อความ  แล้วดูว่าโค๊ดที่เรา copy มา เป็นภาษาไทย ถูกต้องหรือไม่
4.ถ้าถูกต้องแล้ว ให้ Copy โค๊ดนี้ไปวาง ในโปรแกรมเรา

39
สร้าง Module ใส่โค๊ดดังนี้

โค๊ด: [Select]
Public Function CalAge(FieldDateOfBirth) As String
Dim DayOfBirth As String
Dim MonthOfBirth As String
Dim YearOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalAge = ""
Else
DayOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date) - 1, [FieldDateOfBirth]), Date), DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date))
MonthOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) Mod 12, DateDiff("m", [FieldDateOfBirth], Date) Mod 12)
YearOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) \ 12, DateDiff("m", [FieldDateOfBirth], Date) \ 12)
CalAge = IIf(Left(DayOfBirth, 1) = 0, "", DayOfBirth & "ปี ") & IIf(Left(MonthOfBirth, 1) = 0, "", MonthOfBirth & "เดือน ") & IIf(Left(DayOfBirth, 1) = 0, "", DayOfBirth & "วัน")
End If
End Function



Public Function CalDay(FieldDateOfBirth) As String
Dim DayOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalDay = ""
Else
DayOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date) - 1, [FieldDateOfBirth]), Date), DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date))
CalDay = DayOfBirth & " วัน "
End If
End Function

Public Function CalMonth(FieldDateOfBirth) As String
Dim MonthOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalMonth = ""
Else
MonthOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) Mod 12, DateDiff("m", [FieldDateOfBirth], Date) Mod 12)
CalMonth = MonthOfBirth & " เดือน "
End If
End Function

Public Function CalYear(FieldDateOfBirth) As String
Dim YearOfBirth As String
If IsNull(FieldDateOfBirth) Then
CalYear = ""
Else
YearOfBirth = IIf(DateDiff("d", DateAdd("m", DateDiff("m", [FieldDateOfBirth], Date), [FieldDateOfBirth]), Date) < 0, (DateDiff("m", [FieldDateOfBirth], Date) - 1) \ 12, DateDiff("m", [FieldDateOfBirth], Date) \ 12)
CalYear = YearOfBirth & " ปี "
End If
End Function

ที่คิวรี่ใส่ SQL
SELECT DOB, CalAge([DOB]) AS Age, CalDay([DOB]) AS [Day], CalYear([DOB]) AS [YEAR], CalMonth([DOB]) AS [Month]
FROM MyTable;

สามารถใช้ชื่อฟังชั่นในการ แสดงผลได้เลยเช่น

ต้องการอายุจากวันเกิดก็ใส่
คำนวนอายุ: CalAge([ชื่อฟิลล์วันเกิด])
ส่วนหาวัน CalDay([ชื่อฟิลล์วันเกิด])
หาเดือน CalMonth([ชื่อฟิลล์วันเกิด])
หาปี CalYear([ชื่อฟิลล์วันเกิด])

40


อันนี้เป็นการหาอายุครับ ถ้าไม่กรอกวันมันจะขึ้น Error 4 ช่องเลยเพราะใส่โค้ดทั้ง 4 ช่อง ถ้าหากเราไม่ใส่วันแต่อยากให้มันไม่ขึ้น Error ได้ไหมครับ พอรู้ว่าใช้ iif เงื่อนไข else ให้เป็น "" แต่โค้ดค่อนข้าง งง ครับ(ดูมาจาก Youtube อีกที) เลยไม่แน่ใจว่าจะเติมตรงไหนดี สับสนวงเล็บ เลยอบากสอบถามว่ามีวิธีอื่นทีไม่ได้ไปเติม iif ไหมครับ
ถ้าไม่ใช้ IIF เช็ค ก็จะใช้การสร้าง Function ขึ้นมาแล้วกำหนดให้เป็น "" ใน Function เลยก็ได้
แต่ต้องดูว่า โค๊ดคำนวนอายุนั้น ทำไว้แบบไหน
คุณควรโพสโค้ดการคำนวนอายุลงมาด้วยเพื่อจะได้ หาวิธีให้ได้ครับ

41


เปิด form มาต้องมานั่ง Sort ใหม่ตลอดเลยครับ ใน Query ก็ Sort แล้ว ใน Subform ที่เป็นไฟล์แยกก็ Sort แล้ว

ที่ Recordsource ของฟอร์ม กดเข้าไปกำหนดที่เครื่องหมาย ... และตั้งค่าให้ฟอร์ม เหมือนต้องค่าคิวรี่นั้นแหละ
แล้วกำหนด sort ไว้ก่อนได้เลยครับ


42
ต้องการ Requery ใน ComboBox ทุกครั้งที่เปลี่ยน Records ต้องใส่ใน Event ตัวไหนใน Form ครับ

ท่านกดเปลี่ยน Record ตรงไหน ก็ใส่โค้ดตรงนั้นได้เลยครับ

ถ้าท่านสร้างปุ่มสำหรับเปลี่ยน Record ขึ้นมาก็ใช้แบบนี้ได้เลย
สมมุติปุ่มชื่อ BtnNext
โค๊ด: [Select]
Private Sub Btn_Next_Click()
DoCmd.GoToRecord , , acNext
Me.ComboboxName.Requery
End Sub

สามารถ ใช้ได้หลายแบบนะครับ ลองนำไปปรับใช้ดูครับ

DoCmd.GoToRecord , , acNewRec  ไปยัง Record ใหม่
DoCmd.GoToRecord , ,acFirst ไปยัง Record แรก
DoCmd.GoToRecord , , acLast ไปยัง Record สุดท้าย
DoCmd.GoToRecord , , acNext ไปยัง Record ถัดไป
DoCmd.GoToRecord , ,acPrevious ไปยัง Record ก่อนหน้า






43
ลองปรับโค๊ดเป็นแบบนี้แล้วทดสอบดูนะครับ

โค๊ด: [Select]
Dim strNum, strBarCode As String
Dim I, amount   As Long
Dim db As Database
Dim rs As Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("table1", DB_OPEN_DYNASET)
    For I = Me.txtBeginNumber To Me.txtEndNumber
     strNum = Right("0000" & I, 4)
     strBarCode = Trim(Me.txtModel) & Trim(Me.Text15) & Trim(strNum) & "R2"
    If DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'") > 0 Then
        MsgBox "มีการลงทะเบียน Barcode นี้แล้ว", vbInformation, "Status"
        Exit Sub
    End If
    If Nz(amount, 0) = 0 Then
    amount = DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'")
    Else
    amount = amount + DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'")
    End If
 Next I

  'เช็คเงื่อนไขการซ้ำให้เสร็จ แล้วตามด้วย ถ้าไม่มีข้อมูลซ้ำ amount = 0 ก็ทำการบันทึก
 If amount = 0 Then
    For I = Me.txtBeginNumber To Me.txtEndNumber
    strNum = Right("0000" & I, 4)

     rs.AddNew
        rs![Barcode] = Trim(Me.txtModel) & Trim(Me.Text15) & Trim(strNum) & "R2"
       
     rs.Update
     Next
     MsgBox "บันทึกสำเร็จ", vbInformation, "การบันทึก"
rs.Close
db.Close
Set rs = Nothing: Set db = Nothing
End If

44
รูปแบบการเช็คยังไงนะครับ

สมมุติมีการลงข้อมูลไป 20 ครั้งเช่น
1122880804K2608210001R2   ถึง 1122880804K2608210020R2

แบบที่ 1
กรณีเราไปกำหนดซ้ำให้แจ้งเตือนและไม่มีการเพิ่มข้อมูล ถ้าเจอว่ามีรหัสใดๆ ระหว่าง 0001 ถึง 0020 อยู่ แม้ว่าจะไม่มี 0019 อยู่ในตารางก็ห้ามเพิ่มข้อมูล

แบบที่ 2
  ถ้าเรากำหนดช่วง 1 - 20 เหมือนเดิม แต่เจอว่า ถ้าเจอว่ารหัสใดๆ ระหว่าง 0001 ถึง 0020 นั้นยังไม่มีการเพิ่มมาก่อน เช่น 0015  0019 ยังไม่มีการเพิ่มเข้ามา หรือเกิดจากการลบ record แล้วทำให้รหัสนี้ยังว่างอยู่ก็ให้ เพิ่ม 0015  0019 ลงไปด้วย เพื่อให้ครบ 0001 ถึง 0020

แบบที่ 3
  ถ้าเรากำหนดช่วง 1 - 20 เหมือนเดิม แต่เจอว่า ถ้าเจอว่ารหัสใดๆ ระหว่าง 0001 ถึง 0020 นั้นยังไม่มีการเพิ่มมาก่อน เช่น 0015  0019 ยังไม่มีการเพิ่มเข้ามา หรือเกิดจากการลบ record แล้วทำให้รหัสนี้ยังว่างอยู่ก็ให้ เพิ่ม 0015  0019 ลงไปด้วย ส่วนอันไหนซ้ำให้ เก็บบันทึกลงในตารางอีกตารางเพื่อแสดงรายการที่ซ้ำ  หรือ แสดง msgbox แสดง ลำดับทั้งหมดที่ซ้ำ ซึ่งอาจจะแจ้งว่า รหัส 1,5,7 ซ้ำ เป็นต้น เพื่อให้ครบ 0001 ถึง 0020

แบบที่ 1 , 2 หรือ 3 ครับ

45
ดูจากการออกแบบข้อมูลตอนแรกแล้ว เห็นสร้างไว้ 3 ชุด
Crosstab มันจะจำกัดจำนวน คอลัมน์อยู่นะครับ
การแสดงข้อมูลนั้นถ้า คอลัมน์ไม่เยอะจะแสดงได้หมด แต่ถ้าเยอะ คอลัมน์บางส่วนจะหายไปนะครับ

เราต้องวางแผนไว้ให้ดีๆ ว่าข้อมูลการแสดงผลของแต่ละคนจะต้องไม่หลายครั้งจนเกินไป
ถ้าเยอะมากๆ เช่นหลายๆ คอลัมน์เลยเป็นร้อยคอลัมน์การแสดงผลก็ต้องเป็นแบบอื่น


46
ผมสมมุติ Formหลักชื่อ FrmMain
           SubForm ทางซ้ายชื่อ SubForm1
           SubForm ทางขวาชื่อ Subform2
           Table ของข้อมูลทางซ้าย ชื่อ EM มีฟิลล์ [รหัสพนักงาน] , [F3]
           Table ของข้อมูลทางขวา ชื่อ NEWEM  มีฟิลล์ [CODEEM] , [EM]
วิธีทำ
1.สร้างคิวรี่ขึ้นมา ใช้ Append Query ใส่ SQL และตั้งชื่อคิวรี่ตามต้องการเช่น QueryAppendToNewEm

INSERT INTO NEWEM ( CODEEM, EM )
SELECT EM.[รหัสพนักงาน], EM.F3
FROM EM
WHERE EM.[รหัสพนักงาน]=[forms]![FrmMain]![SubForm1].[Form]![รหัสพนักงาน];

2.ที่ปุ่มใส่โค้ดไปว่า

DoCmd.SetWarnings False
DoCmd.OpenQuery "QueryAppendToNewEm"
DoCmd.SetWarnings True
[Forms]![FrmMain]![Subform2].[Form].Requery

47


ตรง Date ผมใช้ Date() และ Time ใช้ Time() ปรากฏว่าเวลาเพิ่ม Row ไปใหม่ มันจะให้ทุก Row เป็นเวลาตอนนี้เลย
ถ้าอยากให้มันเป็นวัน,เวลา บอกเฉพาะ Row ไปว่าเพิ่มมาวันไหนเวลาไหน ไม่ทราบว่าต้องทำอย่างไรครับ
วิธีทำต้องมีฟิลล์ในตาราง เช่น TimeStamp ชนิดข้อมูล date/time
และมีเมื่อการอัพเดทข้อมูล ในฟอร์มกำหนดให้อัพเดทฟิลล์ timestamp  = NOW()  มันจะได้ทั้งวันที่และเวลา มาเลยครับ
เราจะได้ไม่ต้องสร้าง 2 ฟิลล์

หมายเหตุถ้าเมื่อมีการเพิ่มฟิลล์ใหม่กำหนดให้บันทึกเวลาด้วย
ให้กำหนด default Value ของฟิลล์นี้ในตาราง = Now() ไว้ได้เลย

48
มัน Error ตรงนี้ครับ ผมพยายามแก้ชื่ออะไรแล้วแต่ยังไม่ได้ซักทีครับ




Private Sub Check_AfterUpdate()
Me.Dirty = False
Forms!form1![ฟอร์มย่อย QueryCheck].Form.Requery
End Sub
เกิดจาก system locate ไม่ได้รับรองภาษาไทย แต่แก้ไขให้แล้วครับ

49
Anydesk ไปดูให้คับ

50
ไม่ค่อยเข้าใจความต้องการเท่าไร แต่ดูจากรูปแบบที่คุณกำลังทำแล้ว ลองดูตัวอย่างนี้นะครับ

1.วิธีคือเมื่อเลือกชื่อของพนักงานที่ต้องการแล้ว มาระบุวันที่ด้านล่าง

2.เมื่อเรากดปุ่ม Go ให้ดูที่ ตาราง AddDateByName ครับ ที่ Field Sequence จะมีลำดับการเพิ่มของวันที่อยู่ครับ ลำดับจะรันไปเรื่อยๆ ตามจำนวนของการเพิ่มวันที่ในฟอร์ม ได้แบบไม่จำกัด


3.ให้ดูผลลัพท์ ในคิวรี่ชื่อ CrossTabSeq


ที่หัวคอลัมน์ ที่เป็นตัวเลขคือ วันที่ในแต่ละ ครั้งที่เพิ่มเข้าไป  ของพนักงานแต่ละคนครับ


51
ส่งฟอร์มตัวอย่างนี้มา เดี่ยวผมเพิ่มให้


52
ตรงแก้ไขชื่อฟิวล์ ทำก่อนเลยในคิวรี่แบบที่คุณ UnKnown บอกครับ เนื่องจากเครื่องคุณไม่ได้ตั้งค่าให้รองรับภาษาไทย


แถมวิธีที่แสดงในคิวรี่เฉยๆ ชื่อที่แสดง: [ชื่อฟิลด์] เช่น ไอดี:[ID] , เลขบัตร:[ID_Card] , รหัส:[Code ]

53
check นามสกุลที่คุณกำหนดจะ export ดีๆนะครับ

ถ้าจะ export เป็น XLSX 
ตรงกับสั่ง EXport ต้องเป็น AcFormatXLSX ครับ

sFilename = "E:\ExportedResults1.xls"
    DoCmd.OutputTo acOutputQuery, "ชื่อตาราง", acFormatXLS, sFilename

ถ้า XLSX

sFilename = "E:\ExportedResults1.xlsx"
    DoCmd.OutputTo acOutputQuery, "ชื่อตาราง", acFormatXLSX, sFilename

54
แถมวิธีที่แสดงในคิวรี่เฉยๆ ชื่อที่แสดง: [ชื่อฟิลด์] เช่น ไอดี:[ID] , เลขบัตร:[ID_Card] , รหัส:[Code ]

ปกติถ้า export จากคิวรี่สามารถสร้าง ชื่อฟิลล์ที่ต้องการได้ตามที่คุณ UnKnown แนะนำมาครับ

หน้า: 1 2 [3] 4 5 6 ... 46