แสดงกระทู้

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

หน้า: 1 2 3 [4] 5
55
ขอบคุณท่าน PNR มากๆครับ ที่ช่วยรวม Code ให้ผม ทั้งสองกรณีครับ

สำหรับ Code เมื่อวานนี้ ที่ท่านรวมให้ผม แล้วได้หน้าตาประมาณนี้ โดยใช้ Before Update ผมเอาไปลอง แล้วก็ใช้ได้อยู่นะครับ
แต่ผมจะส่งตัวอย่างให้ครับ ตามที่ท่านต้องการ(ตามไฟล์แนบ) เพื่อที่จะอยากทราบว่า ถ้าเปนท่าน ถ้าไม่ใช้ Before Update ท่านจะทำอย่างไร
ผมเองก็อยากได้ไอเดียอีกไอเดียเช่นกันครับ

ปล.เปิด Form ที่ชื่อ frmEditWork ก่อนนะครับ โดยตัว Code จริงๆจะอยู่ที่ frmSubEditWork2(เป็น SubForm ของ frmEditWork) ตรง Before Update

ปล. ไฟล์ผมมันจะเละๆหน่อยนะครับ โดยเฉพาะมี Code ที่ Comment ไว้เยอะ แต่ยังไม่ได้ลบออก

ขอบคุณมากๆครับท่าน



โค๊ด: [Select]
Private Sub Form_BeforeUpdate(Cancel As Integer)
   Dim ctl As Control
   Dim msg As String
   On Error GoTo Err_BeforeUpdate
   If Me.Dirty Then
   msg = (MsgBox("คุณต้องการบันทึกหรือไม่?", vbYesNo + vbQuestion, "Save Record"))
   If msg = vbNo Then
         Me.Undo
    End If
   If msg = vbYes Then
         Modified = Now()
         ModifiedBy = CurrentUser()
      End If
   End If
Exit_BeforeUpdate:
   Exit Sub
Err_BeforeUpdate:
   MsgBox Err.Number & " " & Err.Description
   Resume Exit_BeforeUpdate
End Sub


ยุบรวมกัน เมื่อเราตอบ Yes ครับ
โดย จากโค้ดนี้ ต้องมี textbox  Modified และ ModifiedBy ไว้รับค่าด้วยนะ
         Modified = Now()   คือ Modified จะจัดเก็บวันที่และเวลาตอนนั้นไว้
         ModifiedBy = CurrentUser() คือ ModifiedBy จะจัดเก็บUser ที่ทำการบันทึก

แต่ปกติผมไม่ค่อยใช้ Event BeforeUpdate ครับ
ถ้ามีตัวอย่างผมเพิ่มเติมให้ได้ครับ

57
ขอบคุณมากๆครับ มีอีก Code ที่ต้องการรวมครับ
โจทย์คือ ต้องการรวมทั้งสองโค้ด เพื่อให้มีเช็คก่อน Save(INSERT INTO) ว่า NationalID ที่กรอกใน txtNationalID1 ซ้ำกับของที่มีอยู่เดิม
ในตาราง tblContractor หรือไม่ ยาวหน่อยนะครับ อิอิ

 Code แรก: โค้ด Save

Private Sub cmdSave_Click()
Dim ctrl As Control
Dim mSave As Boolean
str = Empty

'---------------------------------------------------------------------------------------------
' Copy Part 2 = Part 1

        Me.txtNationalID2 = Me.txtNationalID1
        Me.txtNamePrefixThai2 = Me.txtNamePrefixThai1
        Me.txtFirstNameThai2 = Me.txtFirstNameThai1
        Me.txtLastNameThai2 = Me.txtLastNameThai1
        Me.txtNamePrefixEng2 = Me.txtNamePrefixEng1
        Me.txtFirstNameEng2 = Me.txtFirstNameEng1
        Me.txtLastNameEng2 = Me.txtLastNameEng1
        Me.txtNickName2 = Me.txtNickName1
        Me.txtAddessNo2 = Me.txtAddessNo1
        Me.txtVillageNo2 = Me.txtVillageNo1
        Me.txtRoad2 = Me.txtRoad1
        Me.txtSubDistrict2 = Me.txtSubDistrict1
        Me.txtDistrict2 = Me.txtDistrict1
        Me.txtProvince2 = Me.txtProvince1
        Me.txtPostcode2 = Me.txtPostcode1
        Me.txtTelephoneMobile2 = Me.txtTelephoneMobile1
'---------------------------------------------------------------------------------------------
' Check IsNullOrEmpty

For Each ctrl In Me.Controls
    If TypeOf ctrl Is TextBox Then
        If isnullorEmptyTbx(ctrl) Then
            ctrl.BackColor = RGB(119, 192, 212)
            ctrl.BorderColor = RGB(157, 187, 97)
            str = str & ctrl.Tag & vbNewLine
        Else
            ctrl.BackColor = vbWhite
            ctrl.BorderColor = RGB(192, 192, 192)
        End If
    End If
    Next ctrl
   
For Each ctrl In Me.Controls
    If TypeOf ctrl Is ComboBox Then
        If isnullorEmptyCbx(ctrl) Then
            ctrl.BackColor = RGB(119, 192, 212)
            ctrl.BorderColor = RGB(157, 187, 97)
            str = str & ctrl.Tag & vbNewLine
        Else
            ctrl.BackColor = vbWhite
            ctrl.BorderColor = RGB(192, 192, 192)
        End If
    End If
    Next ctrl
   
    If IsNull(str) Or str = "" Then
'---------------------------------------------------------------------------------------------
' Insert into table

        If MsgBox("Are you sure you want to save?", vbQuestion + vbYesNo, "Save Confirmation") = vbYes Then
            mSave = True
            On Error Resume Next
            DoCmd.SetWarnings False
   
            DoCmd.RunSQL "INSERT INTO tblContractor([NationalID],[NamePrefixThai],[FirstNameThai],[LastNameThai],[NamePrefixEng],[FirstNameEng],[LastNameEng],[NickName],[BirthDate],[BloodGroup],[AddessNo],[VillageNo],[Road],[SubDistrict],[District],[Province],[Postcode],[TelephoneMobile],[ImagePath])" & _
            "Values ('" & Me.txtNationalID1 & "', '" & Me.txtNamePrefixThai1 & "', '" & Me.txtFirstNameThai1 & "', '" & Me.txtLastNameThai1 & "', '" & Me.txtNamePrefixEng1 & "', '" & Me.txtFirstNameEng1 & "', '" & Me.txtLastNameEng1 & "', '" & Me.txtNickName1 & "', '" & Me.txtBirthDate & "', '" & _
            Me.txtBloodGroup & "', '" & Me.txtAddessNo1 & "', '" & Me.txtVillageNo1 & "', '" & Me.txtRoad1 & "', '" & Me.txtSubDistrict1 & "', '" & Me.txtDistrict1 & "', '" & Me.txtProvince1 & "', '" & Me.txtPostcode1 & "', '" & Me.txtTelephoneMobile1 & "', '" & Me.txtImagePath & "');"
   
            DoCmd.RunSQL "INSERT INTO tblWork([NationalID],[NamePrefixThai],[FirstNameThai],[LastNameThai],[NamePrefixEng],[FirstNameEng],[LastNameEng],[NickName],[AddessNo],[VillageNo],[Road],[SubDistrict],[District],[Province],[Postcode],[TelephoneMobile],[CompanyID],[PlantID],[DepartmentID],[SectionID],[SubSectionName],[JobAreaName]," & _
            "[WorkDetail],[ContractType],[WorkContractID],[CompanyHiringDate],[JobAreaEntryDate])" & _
            "Values ('" & Me.txtNationalID2 & "', '" & Me.txtNamePrefixThai2 & "', '" & Me.txtFirstNameThai2 & "', '" & Me.txtLastNameThai2 & "', '" & Me.txtNamePrefixEng2 & "', '" & Me.txtFirstNameEng2 & "', '" & Me.txtLastNameEng2 & "', '" & Me.txtNickName2 & "', '" & Me.txtAddessNo2 & "', '" & _
            Me.txtVillageNo2 & "', '" & Me.txtRoad2 & "', '" & Me.txtSubDistrict2 & "', '" & Me.txtDistrict2 & "', '" & Me.txtProvince2 & "', '" & Me.txtPostcode2 & "', '" & Me.txtTelephoneMobile2 & "', '" & Me.txtCompanyID & "', '" & Me.txtPlantID & "', '" & Me.txtDepartmentID & "', '" & _
            Me.txtSectionID & "', '" & Me.txtSubSectionName & "', '" & Me.txtJobAreaName & "', '" & Me.txtWorkDetail & "', '" & Me.txtContractType & "', '" & Me.txtWorkContractID & "', '" & Me.txtCompanyHiringDate & "', '" & Me.txtJobAreaEntryDate & "');"

            MsgBox ("Your record has been successfully saved!")
           
'---------------------------------------------------------------------------------------------
' Clear Textbox

            Me.txtNationalID1 = ""
            Me.txtNamePrefixThai1 = ""
            Me.txtFirstNameThai1 = ""
            Me.txtLastNameThai1 = ""
            Me.txtNickName1 = ""
            Me.txtNamePrefixEng1 = ""
            Me.txtFirstNameEng1 = ""
            Me.txtLastNameEng1 = ""
            Me.txtBirthDate = ""
            Me.txtBloodGroup = ""
            Me.txtAddessNo1 = ""
            Me.txtVillageNo1 = ""
            Me.txtRoad1 = ""
            Me.txtSubDistrict1 = ""
            Me.txtDistrict1 = ""
            Me.txtProvince1 = ""
            Me.txtPostcode1 = ""
            Me.txtTelephoneMobile1 = ""
            Me.txtImagePath = ""
           
            Me.txtNationalID2 = ""
            Me.txtNamePrefixThai2 = ""
            Me.txtFirstNameThai2 = ""
            Me.txtLastNameThai2 = ""
            Me.txtNamePrefixEng2 = ""
            Me.txtFirstNameEng2 = ""
            Me.txtLastNameEng2 = ""
            Me.txtNickName2 = ""
            Me.txtAddessNo2 = ""
            Me.txtVillageNo2 = ""
            Me.txtRoad2 = ""
            Me.txtSubDistrict2 = ""
            Me.txtDistrict2 = ""
            Me.txtProvince2 = ""
            Me.txtPostcode2 = ""
            Me.txtTelephoneMobile2 = ""
            Me.txtCompanyID = ""
            Me.txtPlantID = ""
            Me.txtDepartmentID = ""
            Me.txtSectionID = ""
            Me.txtSubSectionName = ""
            Me.txtJobAreaName = ""
            Me.txtWorkDetail = ""
            Me.txtContractType = ""
            Me.txtWorkContractID = ""
            Me.txtCompanyHiringDate = ""
            Me.txtJobAreaEntryDate = ""
       
            Me.Requery
        Else
            mSave = False
            Me.Undo
           
            Exit Sub
        End If
        Else
'            MsgBox "Please enter data for all the required fields below" & vbNewLine & _
'            String(52, "-") & vbCrLf & str, vbInformation + vbOKOnly, "Form is not fullfilled completly"
            MsgBox "Please enter data for all the required fields", vbInformation + vbOKOnly, "Form is not fullfilled completly"
        Exit Sub
       
     End If
End Sub




Code สอง: เช็คว่าชื่อ NationalID ซ้ำหรือไม่ก่อน Save
        Dim DontDuplicate As String
        Dim str1 As String
       
        DontDuplicate = Me.txtNationalID1.Value
        str1 = "[National]=" & "'" & DontDuplicate & "'"
       
        If Me.txtNationalID1 = DLookup("[NationalID]", "tblContractor", str1) Then
        MsgBox "A record " & txtNationalID1 & " is duplicate. " & "Please check record.", vbInformation
        Me.Undo

58
ขอบคุณมากครับท่าน ท่านมีตัวอย่างเรื่องการย้าย เป็นคลิปไหมครับ ถ้ามีโปรดโพสให้ผมนะครับ
ขอบคุณมากครับ

59
สวัสดีครับทุกท่าน ผมมี Code สองตัวนี้ครับ ต้องการที่จะรวมกัน ตามโจทย์ผมด้านล่างนี้ จะมีวิธีการรวมอย่างไรครับ
ตัวแรก: เป็น Code PromptUserSaving ก็คือถ้าหน้าฟอร์มมีการแก้ไข อัพเดต ลบ แล้วเราจะเลื่อนไปหน้าอื่น หรือกดปิดฟอร์ม ระบบก็จะฟ้องขึ้นมาว่าจะ Save หรือไม่
ตัวสอง: หลังจากที่เราตอบ Save จากข้อที่ 1 ให้บันทึกลงไปที่ Field เลยว่า Record นี้ถูกแก้ไข Update วันไหน กี่โมง

Code แรก:
Private Sub Form_BeforeUpdate(Cancel As Integer)

   ' This procedure checks to see if the data on the form has
   ' changed. If the data has changed, the procedure prompts the
   ' user to continue with the save operation or to cancel it. Then
   ' the action that triggered the BeforeUpdate event is completed.

   Dim ctl As Control

   On Error GoTo Err_BeforeUpdate

   ' The Dirty property is True if the record has been changed.
   If Me.Dirty Then
      ' Prompt to confirm the save operation.
      If MsgBox("Do you want to save?", vbYesNo + vbQuestion, _
              "Save Record") = vbNo Then
         Me.Undo
      End If
   End If

Exit_BeforeUpdate:
   Exit Sub

Err_BeforeUpdate:
   MsgBox Err.Number & " " & Err.Description
   Resume Exit_BeforeUpdate
End Sub

Code สอง:
'------------------------------------------------------------
' Form_BeforeUpdate
'
'------------------------------------------------------------
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Form_BeforeUpdate_Err

    Modified = Now()
    ModifiedBy = CurrentUser()


Form_BeforeUpdate_Exit:
    Exit Sub

Form_BeforeUpdate_Err:
    MsgBox Error$
    Resume Form_BeforeUpdate_Exit

End Sub

ตามโจทย์ข้างต้น วอนท่านผู้รู้ ช่วยเขียน Code สองตัวนี้รวมกันหน่อยครับ ผมพยายามแล้ว ทำไม่ได้เลยครับ

ขอบคุณครับ

60
สวัสดีครับ ขอสอบถามทุกท่านตามหัวข้อเลยครับว่า หากย้าย Database จาก Access ไป SQL
พวก Coding ต่างๆที่เราเขียนไว้ เช่น Query,Module,Expression,Event และอื่นๆ จะหายไหมครับ
ถ้าหาย จะมีวิธีแก้อย่างไร ใครมีวิธีแก้รบกวนขอคำแนะนำด้วยนะครับ

ขอบคุณมากครับ

ปล.ถ้าใครมีวิธีการย้าย Database จาก Access ไป SQL โปรดโพสให้ด้วย จะขอบพระคุณยิ่งครับ  :love: :miao:

61
แนะนำดังนี้นะครับ
1. ที่เครื่อง Client ให้ติดตั้งโปรแกรม Access Runtime ซึ่งเป็นตัวใช้งานฟรี เพียงเท่านี้ก็จะล็อคไม่ให้ User เห็นอะไรที่เราไม่ต้องการให้เห็นได้แล้วครับ จะเปิดได้เฉพาะฟอร์มที่เรายอมแล้วครับ (แต่ Client ห้ามลงตัวโปรแกรม Access นะครับ)
2. การ Split Database เป็นการแยกตัว UI ออกจาก DB เพื่อให้เกิดความปลอดภัยกับข้อมูล เพราะตัวที่มักเกิดปัญหาน่ะคือ UI แล้วบ่อยครั้งที่ UI เสียหายแล้วพาเอา DB ไปกับมันด้วย (UI ไม่ยอมตายเดี่ยว) ก็เลยควรแยก UI กับ DB
3. เมื่อทำ Split Database ก็ Copy Shortcut จาก Server ไปวางที่ Client ครับ

ขอบคุณมากๆครับผม

62
สวัสดีทุกท่านครับ

ขออนุญาตถามคำถามเกี่ยวกับการใช้งาน Database ร่วมกันครับ

หากผมมีโปรแกรมตัวนึงที่ต้องการแบ่งสิทธิ์ให้คนอื่นใช้ร่วมกัน โดยผมต้องการให้สิทธิ์กับเครื่อง Client กรอกข้อมูลที่ตนรับผิดชอบเข้ามา โดย

1. ตัวโปรแกรมจะอยู่ที่เครื่อง Server ที่ผมเป็นผู้รับผิดชอบ เป็น Admin มีสิทธิ์แก้ไขได้ทุกอย่าง
2. ตัวผู้กรอกข้อมูลจะมีเครื่อง Client ไว้กรอกข้อมูลเข้า แก้ไขข้อมูลผ่าน Form เท่านั้น ไม่มีสิทธิ์เข้าถึง Data Table และ Queries ด้านหลัง(เข้าถึงได้เฉพาะ Front End)


วิธีการแบบนี้เรียกว่าอะไร(Split Database ใช่หรือไม่) สามารถทำได้ไหม และมีวิธีการทำไหมครับ
(เข้าใจว่าต้องมีขั้นตอนเชื่อมต่อ ตั้งค่า กำหนดสิทธิ์อะไรสักอย่างบนคอมพิวเตอร์เรากับเครื่อง Client แน่ๆ)

รบกวนทุกท่านด้วยครับ หากส่งเป็นคลิปในยูทูปมาด้วยก็จะดีมากครับ

ขอบคุณมากๆครับผม

63
ขอเพิ่มเติมจาก อ. OddyWriter หน่อยครับ

อ้างถึง
แนวทางการออกแบบ Databased ที่ผมทำมานี้ เหมาะสมแล้วหรือไม่? ถ้าไม่ ผมควรจะออกแบบอย่างไรเพื่อให้ได้ตามโจทย์ที่ผมต้องการ?
เท่าที่เห็นตอนนี้
- ในระบบมีเทเบิลที่มี 2 ฟิลด์เยอะทีเดียว บางตัวจำเป็นหรือไม่ อย่างเช่นเทเบิล tblBlood ถ้าเป็นผม ผมจะกำหนดตัวเลือกลงในส่วนของ Lookup tab ของฟิลด์ tblContractor.BloodID ไปเลยว่ามีอะไรให้เลือกบ้าง เพราะ 1)กรุ๊ปเลือดตายตัวอยู่แล้ว มีไม่กี่กรุ๊ป (A, A+, A-, ...)  2)ระบบของเราไม่มีความจำเป็นต้องเก็บรายละเอียดอะไรของกรุ๊ปเลือดนั้นอีก เช่น กรุ๊ปนั้นมีแอนติเจ้น A,B,D หรือเปล่า การแยกเทเบิลออกไปในกรณีนี้ เป็นภาระแก่ระบบที่ต้องมาลิงค์ไปยังเทเบิล tblBlood อีกต่างหาก 3)ถ้าตั้งค่า BloodID เป็นอะไรที่ไม่สื่อความหมาย เช่น ตัวเลข ดังนั้นเวลาเปิดดูเทเบิล tblContractor ก็จะต้องมานั่งนึกอีกว่ามันคือเลือดกรุ๊ปอะไรกันแน่ ส่วนเทเบิลอื่นเช่น tblPlant คุณคิดว่าโรงงานจะสร้างเพิ่ม/เปลี่ยนแปลงบ่อยขนาดไหน ถ้าไม่ เมื่อไหร่ที่มีก็ค่อยมาเพิ่มใน Lookup tab ก็ได้
- เข้าใจว่าฟิลด์ xxxID ในทุกเทเบิลจะเป็น Primary Key แต่เราใช้ฟิลด์อื่นๆที่เหมาะสมกว่าเป็น Primary Key ก็ดีกว่าเพราะมัน unique คือมีค่าเดียวไม่ซ้ำกันอยู่แล้ว เช่น tblContractor เราเป็นบุคคลทั้งหมด เราก็ใช้เลขประจำตัวประชาชน (เข้าใจว่าคือฟิลด์ NationalID) มาใช้แทน
- ในความสัมพันธ์ระหว่างเทเบิล (Database Tools - Relationships) ดูความเหมาะสมว่าควรกำหนด Referential Integrity, Cascade Update, Cascade Delete ด้วยหรือไม่  (ส่วนมากผมกำหนด Referential Integrity)

อ้างถึง
Subform โดยให้เป็น Unbound SubForm
- ไม่รู้ว่าทำไมกำหนดเป็น Unbound  ถ้าจะเป็น Unbound ซึ่งเราต้องควบคุมการเขียนลงเทเบิลอื่นๆอีกที ก็ย้ายเท็กซ์บ็อกซ์และคอนโทรลต่างๆใน Unbound SubForm มาไว้บน MainForm แล้วตีกรอบเพื่อแสดงเป็นนัยว่าเป็นข้อมูลที่แยกต่างหากจาก Session ไปเลยน่าจะดูเรียบง่ายกว่า หรือจะนำมาใส่ใน Tab control บน MainForm อีกที ก็สื่อเป็นหมวดหมู่ดี

อ้างถึง
ซึ่งผมเขียน Expression ที่ txtWorkID โดยเมื่อ Dropdown เลือก NationalID เมื่อไหร่ ระบบจะไปดึง Last WorkID ของพนง.คนนั้น ๆ มาจากtblWork(Transaction Table) มาโชว์ / เกิด Error ใน Subform
- ต้องเอาโค้ดที่ทำการดึงและแปะลงฟิลด์ที่เกิด #Error นั้นมาดูครับ

อ้างถึง
การทำแบบฟอร์มเพื่อคีย์หลักสูตรที่แต่ละตำแหน่งต้องอบรมให้ครบตามกฎหมาย
- ก็ต้องมีเทเบิลหลักสูตร (tbSubject หรือเปล่า ?) ,เทเบิลตำแหน่ง (อันนี้ผมไม่รู้เทเบิลไหน สมมุติชื่อ tbP หรือเป็นแค่ฟิลด์ในเทเบิล tbWork ? สมมุติชื่อฟิลด์ F) และสร้างเทเบิลหลักสูตรที่ต้องอบรม (สมมุติชื่อ tbC) ที่มีทั้งฟิลด์ Primary Key ของเทเบิลหลักสูตรและ Primary Key ของเทเบิลตำแหน่ง(หรือแค่ฟิลด์ F ถ้าคุณไม่ได้มีเทเบิลตำแหน่งแยกออกมาต่างหาก) มานำมาตั้งเป็น Primary Key ของ tbC ดังนั้นคุณก็สร้างฟอร์มที่มี Mainform เป็น tbP และมี Subform เป็น tbC เพื่อป้อนหลักสูตรที่ต้องอบรมตามกฎหมายได้แล้ว

หมายเหตุ : Database ไม่ต้องใส่ d ต่อท้ายครับ

ขอบคุณมากๆครับ
เดี๋ยวผมจะลองทำตามที่แนะนำนะครับ ถ้าติดขัดอะไร เดี๋ยวจะโพสถามต่อนะครับ :D

64
ขอปรึกษาและสอบถามท่านผู้รู้ครับ

ผมได้รับโจทย์จากทางนาย ให้เขียนโปรแกรมเพื่อเก็บข้อมูลพนง.รับเหมาในโรงงาน โดยเก็บข้อมูลดังนี้
1. ชื่อสกุลพนักงาน
2. ที่อยู่พนักงาน
3. สังกัด(ตำแหน่ง แผนก ส่วน ฝ่าย โรงงาน บริษัทต้นสังกัดของพนง.รับเหมา รูปแบบการจ้างเหมา ฯลฯ)
4. ประวัติการถูกลงโทษ
5. ประวัติการอบรม

โดยทั้งหมด ผมได้ออกแบบ Databased ตาม ER Diagram ตามภาพที่ 1 แบ่งเป็นฝั่งซ้ายและฝั่งขวา

ข้อ 1-4 ผมได้ออกแบบ Databsed เพื่อใช้เก็บข้อมูลในฝั่งซ้าย(ตารางพื้นที่สีเขียวเก็บข้อ 1-3 ส่วนตารางพื้นที่สีน้ำเงินเก็บข้อมูลข้อ 4)
ซึ่งผมทำ Databased ให้ออกมาเป็นรูปแบบที่ตั้งใจ นำไปออกแบบฟอร์มกรอกข้อมูลเพิ่มเข้าได้ ตามที่ตั้งใจไว้แล้วครับ
แต่ที่ติดปัญหาคือข้อ 5 คือ เรื่องประวัติการฝึกอบรมนั้น ซึ่ง Databased จะอยู่ทางขวามือ(ตารางพื้นที่สีแดง)ของ ER Diagram

โจทย์ในการจัดทำ
1. ต้องการทำฟอร์มบันทึกข้อมูลการฝึกอบรมให้ได้ตามแบบรูปภาพที่ 2 คือ มี Form ที่มี tblSession (เก็บข้อมูลSessionID, ชื่อหลักสูตร, Description, Objectiveหลักสูตร, ระยะเวลาการฝึกอบรม,
ผู้สอน, บริษัทที่มาสอน ฯลฯ)เป็น Record Source และมี Subform ที่บันทึกชื่อผู้เข้าอบรม ในแต่ละ SessionID (Dropdown เลือก NationalID หรือชื่อ-สกุลปุ๊บ ขึ้น WorkID, ตำแหน่ง, สังกัดพนง.ปั๊ปทันที)
2. Subform ในข้อ 1 นั้น ต้องบันทึกข้อมูลไว้ด้วยว่า พนง.ที่มาอบรมนั้น ขณะนั้น มีตำแหน่งอะไร สังกัดอะไร เพื่อจะนำข้อมูลไปใช้ต่อในข้อ 3
3. ต้องรู้ให้ได้ว่าตำแหน่งงานทั้งหมดใน Databased นั้น จะต้องอบรมอะไรบ้าง เพื่อให้เป็นไปตามที่กฎหมายกำหนด แล้วพนง.ที่อยู่ในตำแหน่งนั้น ๆ
ได้อบรมครบตามกฎหมายกำหนดแล้วหรือยัง


การแก้โจทย์
ข้อ 1-2: ผมจัดทำ
- Form ขึ้นมาโดยใช้ tblSession เป็น Record Source ได้
- Subform โดยให้เป็น Unbound SubForm ซึ่งผมเขียน Expression ที่ txtWorkID โดยเมื่อ Dropdown เลือก NationalID เมื่อไหร่ ระบบจะไปดึง Last WorkID ของพนง.คนนั้น ๆ มาจาก
tblWork(Transaction Table) มาโชว์ จากนั้น ก็เขียน VBA on click ที่ปุ่ม Save ให้ Save ข้อมูล Subform ลง tblTrainingRec
ข้อ 3: ผมยังไม่รู้แนวทางจะทำอย่างไรดี ทั้งการออกแบบ Databased, การทำแบบฟอร์มเพื่อคีย์หลักสูตรที่แต่ละตำแหน่งต้องอบรมให้ครบตามกฎหมาย, การทำ Report

ปัญหาที่เกิดขึ้น
ข้อ 1-2: เกิด Error ใน Subform ตามภาพที่ 2
ข้อ 3: ผมยังไม่รู้แนวทางจะไปต่ออย่างไรดี ทั้งการออกแบบ Databased, การทำแบบฟอร์มเพื่อคีย์หลักสูตรที่แต่ละตำแหน่งต้องอบรมให้ครบตามกฎหมาย, การทำ Report

คำถาม: เพื่อให้ได้ตามโจทย์ที่กำหนด
1. แนวทางการออกแบบ Databased ที่ผมทำมานี้ เหมาะสมแล้วหรือไม่? ถ้าไม่ ผมควรจะออกแบบอย่างไรเพื่อให้ได้ตามโจทย์ที่ผมต้องการ?
2. ถ้าผมออกแบบ Databased มาถูกทางแล้ว จะทำอย่างไรให้ Subform ไม่ Error ครับ? แล้วจะไปต่อกับเรื่องการกำหนดหลักสูตรที่แต่ละตำแหน่งต้องอบรมให้ครบตามกฎหมายอย่างไรดีครับ?

ยาวหน่อยนะครับ รบกวนขอไอเดียจากท่านผู้รู้ด้วยครับ ขอบคุณมากๆครับผม
หากท่านใดอ่านแล้วงงๆ สามารถถามเพิ่มได้นะครับ หรืออยากจะดูไฟล์ที่ทำ ก็พร้อมจะส่งให้ดูครับ





65
ขอบคุณมากครับ ผมทำได้แล้วครับ เดี๋ยวมีเรื่องปรึกษาอีกนะครับ เกี่ยวกับการออกแบบฐานข้อมูล แต่ผมจะตั้งเป็นกระทู้ใหม่ เผื่อมีผู้รู้มาตอบเพิ่มอีก
ยังไงรบกวนหน่อยนะครับ

ขอบคุณอีกครั้งนึง มากๆเลยครับ  :love: :smile:

66
ลองดูตัวอย่างนี้ครับ
sub form ชื่อ frmsub

หรือส่งไฟล์มาทางกล่องข้อความครับเดียวผมดูให้

ผมส่งให้แล้วทางข้อความครับ ไม่แน่ใจได้รับหรือยังครับ

ขอบคุณครับ

67
ท่านมาถูกทางแล้ว แต่ผิดนิดเดียวตรงอ้างชื่อฟิลล์นะครับ

หรือจะใช้ Expression แบบเดิมก็ได้เหมือนกัน แก้ตรง อ้างถึงฟิลล์ใหม่ก็ใช้ได้เลย
น่าจะแบบนี้ DLast("ContractorStatus", "qryWork", "[NationalID]=[Forms]![frmEditWork]![txtNationalID]")

หรือ Event Form Current

Private Sub Form_Current()
Me.txtContractorStatus = DLast("ContractorStatus", "qryWork", "[NationalID]=[Forms]![frmEditWork]![txtNationalID]")
End Sub

ตรงสีแดงต้องอ้างถึงชื่อฟิลล์ ไม่ใช่ชื่อ textbox โดยผมคิดว่าฟิลล์น่าจะชื่อ  NationalID หรือเปล่า

Field ชื่อ NationalID ถูกต้องครับ

ผมลองทั้งสองวิธีแล้ว ถ้า NationalID = 1111 ใช้งานได้ครับ แต่ถ้าเลื่อน NationalID ไปเป็น 2222 มันจะไม่ขึ้นตามที่ต้องการครับ เช่น สมมติที่ NationalID=2222 Field ContractorStatus สุดท้ายเป็น "Activated" แต่มันดันขึ้นเป็น "Terminated"

จะแก้ไงดีครับ ถ้าผมส่งไฟล์ให้ท่านดู ท่านจะสะดวกไหมครับ?

68
สวัสดีครับทุกท่าน มีผมมีคำถามจะปรึกาษาเกี่ยวกับการเขียน Expression ครับ



จากภาพ ผมต้องการให้ SubForm ของผม นำค่าสุดท้ายของ Field ที่ชื่อ ContractorStatus ในแต่ละ NationalID มาโชว์บน Subform ครับ โดยที่เมื่อเลื่อน Subform ไปยัง NationalID ใหม่ก็ให้นำค่าสุดท้ายของ Field ContractorStatus มาแสดงเช่นเดิม เช่น NationalID = 1111 ก็ให้นำคำว่า "Activated" มาโชว์บน txtContractorStatus ถ้าเลื่อนไป NationalID = 2222 ก็ให้นำคำว่า "Terminated" มาแสดง

ผมควรจะเขียน Expression อย่างไรครับ? หรือมีวิธีการอื่นที่ดีกว่าการเขียน Expression ครับ?

ปล. ที่ txtContractorStatus(ที่วงในภาพ ด้านล่าง) ผมเขียน Expression ตามนี้ครับ ซึ่งไม่ได้ผลเลย เมื่อใส่ข้อมูลคนลงไปเยอะๆ ผมควรเขียนยังไงดีครับ ขอบคุณมากครับ
=DLast("ContractorStatus","qryWork","[txtNationalID]=[Forms]![frmEditWork]![txtNationalID]")



69
อ้างถึง
ความต้องการของผมคือ หากกรอก TerminatedDate ที่ Record ใด Record หนึ่ง ก็ให้ค่า TerminatedDate ที่กรอกนั้น ถูก Insert ลงไปยัง Record อื่นๆที่มี ContractorID เดียวกันให้หมด ผมควรจะเขียนโค้ดอย่างไรดีครับ

แก้ไขใหม่
น่าจะเป็น

โค๊ด: [Select]
Private Sub TerminatedDate_AfterUpdate()
Me.Dirty = False
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE tblWork SET tblWork.TerminatedDate = [forms]![frmEditWork]![TerminatedDate] WHERE (((tblWork.ContractorID)=[forms]![frmEditWork]![ContractorID]));", dbFailOnError
DoCmd.SetWarnings True
End Sub

tblWork คือตารางที่เราจะอัพเดท By ContractorID ครับ
วิธีนี้ ถ้า ContractorID เดียวกัน ก็จะอัพเดทวันที่ให้ทั้งหมดทุกแถวครับ ไม่สนว่าจะมี WorkID กี่ตัวครับ

ขอบคุณมากครับ แต่ผมใช้ Queries ชื่อ qryWork เป็น Record Source ของ Form frmEditWork
ถ้าผมเปลี่ยนจาก tblWork เปน qryWork ได้ไหมครับ เพราะผมใช้ Queries ในการ Generate ContractorID ขึ้นมาครับ

70
สวัสดีครับ จะรบกวนปรึกษาครับ Code ครับ โดยผมต้องการทำ Form แก้ไขประวัติพนง.โดยทำ Form ใหญ่ 1 Form และ SubForm ย่อย 2 Subform
1. Subform1(บน) เอาไว้ใช้เปน Selector ตามแต่ละ WorkID
2. Subform2(ล่าง) เอาไว้ใช้แสดงรายละเอียดของจาก SubForm1 ซึ่งการแก้ไขข้อมูล จะแก้ไขผ่าน Subform นี้ครับ
โดยทั้งสอง Subform ใช้ Queries ตัวเดียวกัน

ความต้องการของผมคือ หากกรอก TerminatedDate ที่ Record ใด Record หนึ่ง ก็ให้ค่า TerminatedDate ที่กรอกนั้น ถูก Insert ลงไปยัง Record อื่นๆที่มี ContractorID เดียวกันให้หมด ผมควรจะเขียนโค้ดอย่างไรดีครับ

ปล. โค้ดที่ผมเขียนคือ ตามด้านล่างนี้ครับ ซึ่งไม่ได้ผลเลยครับ
รบกวนทุกท่านด้วยครับ ขอบคุณมากครับ

Private Sub TerminatedDate_Click()
    DoCmd.RunSQL "SELECT GenerateID FROM tblWork WHERE GenerateID'" = Me.GenerateID
    DoCmd.RunSQL "INSERT INTO tblWork([TerminatedDate])" & _
        "Values ('" & Me.TerminatedDate & "');"
    End If
End Sub


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

72
ทุกท่านครับ ผมต้องการคำนวณหาอายุงาน โดยมีเงื่อนไขดังนี้

1. ผมมี Field CompanyHiringDate เพื่อบันทึกวันที่เข้างาน และ TerminateDate เพื่อบันทึกวันออกจากงาน
2. เงื่อนไขผมคือ หากพนักงานยังทำอยู่ จะไม่มีวันที่ระบุในช่อง TerminateDate การคำนวณจะคำนวณตั้งแต่วันเข้างานถึงปัจจุบัน
แต่ถ้าพนักงานลาออกจากงาน จะมีการระบุวันที่ออกจากงานในช่อง TerminateDate ให้คำนวณเฉพาะช่วงวันเข้างาน (CompanyHiringDate)
ถึงวันที่ออกจากงาน (TerminateDate)

โดยผมเขียน Expression ตามคลิปด้านล่างนี้ครับ ซึ่งเป็นการคำนวณตั้งแต่เข้างาน จนถึงปัจจุบัน ไปเรื่อยๆไม่สิ้นสุด
คำถามคือ จะทำอย่างไรให้หยุดคำนวณตามช่วงเวลา เมื่อมีการระบุวันที่ออกจากงาน หรือมีวิธีอื่นที่ดีกว่า รบกวนแนะนำด้วยนะครับ

รบกวนด้วยนะครับ ขอบคุณครับ

หมายเหตุ:
Expression ที่ผมใช้ คือ

คำนวณวัน
CompanyHiringDate_Day:
IIf(DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date())<0,DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date())-1,[CompanyHiringDate]),Date()),DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date()))

คำนวณเดือน
CompanyHiringDate_Month: IIf(DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date())<0,(DateDiff("m",[CompanyHiringDate],Date())-1) Mod 12,DateDiff("m",[CompanyHiringDate],Date()) Mod 12)

คำนวณปี
CompanyHiringDate_Year: IIf(DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date())<0,(DateDiff("m",[CompanyHiringDate],Date())-1)\12,DateDiff("m",[CompanyHiringDate],Date())\12)






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