แสดงกระทู้

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
37
ข้อ 1 แก้เป็น
โค๊ด: [Select]
Private Sub SearchCombo()
    Dim sql As String
    sql = "SELECT * FROM tblWorkforceY2020 WHERE (((tblWorkforceY2020.DepartmentID)=[forms]![frmWorkforce]![cbSearch1]) AND  ((tblWorkforceY2020.SectionID)=[forms]![frmWorkforce]![cbSearch2]));"
    Forms!frmWorkforce.RecordSource = sql
    Forms!frmWorkforce.Requery
End Sub

หรือแบบนี้
โค๊ด: [Select]
Dim sql As String
     sql = "SELECT * FROM qryWorkforceY2020 WHERE [DepartmentID]=" & Me.cbSearch1 & " AND [SectionID]=" & Me.cbSearch2 & ""

    Forms!frmWorkforce.RecordSource = sql
    Forms!frmWorkforce.Requery

ข้อ 1 แนะนำให้ใช้แบบนี้
โค๊ด: [Select]
Private Sub SearchCombo()
    Dim sql As String
    sql = "SELECT * FROM qryWorkforceY2020 WHERE [DepartmentID] Like '" & Nz(Me.cbSearch1, "*") & "' AND [SectionID] Like '" & Nz(Me.cbSearch2, "*") & "' AND [ShiftID] Like '" & Nz(Me.cbSearch3, "*") & "'"
    Forms!frmWorkforce.RecordSource = sql
    Forms!frmWorkforce.Requery
End Sub
Private Sub cbSearch1_AfterUpdate()
    SearchCombo
End Sub
Private Sub cbSearch2_AfterUpdate()
    SearchCombo
End Sub
Private Sub cbSearch3_AfterUpdate()
  SearchCombo
End Sub

ข้อที่ 2 แก้เป็นแบบนี้
โค๊ด: [Select]
DoCmd.OpenReport "rptCard1", acViewPreview, , "[Fulltime]='Fulltime' AND [CreateID] = " & Forms!frmCreateCard!txtCreateID
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

38
Private Sub SearchCombo()
    Dim sql As String
    sql = "SELECT * FROM qryWorkforceY2020 WHERE DepartmentID = '" & Me.cbSearch1 & "' And SectionID = '" & Me.cbSearch2 & "'"
    Forms!frmWorkforce.RecordSource = sql
    Forms!frmWorkforce.Requery
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

39
Dim sql As Integer ต้องแก้เป็น  Dim sql As String นะครับ

Private Sub SearchCombo()
Dim SQL As String
SQL = "SELECT * FROM tblWorkforceY2020 WHERE [DepartmentID] = " & Me.cbSearch1
    Forms!frmWorkforce.RecordSource = SQL
    Forms!frmWorkforce.Requery
End Sub


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

40
ถ้าหน้าบ้านใช้ Access ก็จะดึงข้อมูลมาแสดงได้เหมือนเดิมครับ
ข้อมูลที่เก็บก็เป็นตัวเลขเหมือนเดิมครับ ถ้า bound column ถูก

แต่ในตารางของ sql server ไม่มีฟังชั่น lookup มาแสดงแบบ access นะครับ เว้นแต่ว่าจะเขียน query เอง
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

41
ของผม เชื่อม ODBC driver Link Table ต่างๆ เข้ามากำหนด column ได้ปกติ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

42
โดย combobox มัน สามารถกำหนด Column ที่จะผูกค่าไว้เช่น กำหนดให้มี ServiceID และ  ServiceType
โดยกำหนดให้ BoundColumn 1 (ServiceID)
กำหนดให้แสดง 2 คอลัมน์
และกำหนด ความกว้างColumn = 0;5
มันจะแสดงเฉพาะ ServiceType แต่ค่าที่เรากำหนดให้เก็บในตารางคือ ServiceID ซึ่งเป็น Number นั้นเองครับ

ซึ่งการ lookup ในตารางก็มีการทำแบบนี้เหมือนกัน คือการให้แสดง column ServiceType  แต่จริงๆแล้วถ้าไม่ lookup นั้นมันเป็น ServiceID ตามปกติครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

43
ลองดูครับ

โค๊ด: [Select]
Private Sub cmdSave_Click()
Dim ctrl As Control
Dim mSave As Boolean
Dim DontDuplicate As String
Dim str1 As String
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
   
        DontDuplicate = Me.txtNationalID1.Value
        str1 = "[NationalID]=" & "'" & DontDuplicate & "'"
       
        If Me.txtNationalID1 = DLookup("[NationalID]", "tblContractor", str1) Then
        MsgBox "A record " & txtNationalID1 & " is duplicate. " & "Please check record.", vbInformation
        Me.Undo
        Exit Sub
    Else
        '---------------------------------------------------------------------------------------------
' 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
    End If     
     Else
     MsgBox "Please enter data for all the required fields", vbInformation + vbOKOnly, "Form is not fullfilled completly"
        Exit Sub
           End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

44
อ่อข้อมูลเป็น Bound Control อยู่แล้ว งั้นก็ทำแบบนี้ละครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

45
ติดตั้ง ดูคลิปนี้ครับ


แล้วก็ลองดูกระทู้นี้ครับ
https://www.thai-access.com/index.php?topic=1126
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

46
Private Sub cmdSave_Click()
Dim ctrl As Control
Dim mSave As Boolean
Dim DontDuplicate As String
Dim str1 As String

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
   
   
'---------------------------------------------------------------------------------------------
'CheckDuplicate
   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
       exit sub
   else
' Insert into table
   If IsNull(str) Or str = "" Then
           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 if
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

47
โค๊ด: [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 ครับ
ถ้ามีตัวอย่างผมเพิ่มเติมให้ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

48
หมายถึงทำ access เป็น front end แล้ว sql server เป็น backend ใช่มั้ยครับ
ถ้าใช่ ไม่หายครับ แต่อาจจะมีปัญหาแค่บางคำสั่งทำงานไม่ได้ ต้องแก้ไขเล็ก ๆ น้อย ๆ

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

49
แนะนำดังนี้นะครับ
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 ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

50
ขอเพิ่มเติมจาก อ. 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 ต่อท้ายครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

51
ข้อแนะนำมี 2 ข้อ เท่าที่ผมเห็นจากรูป
1. ควรทำ Normalization อย่างต่ำให้ได้ 3NF
2. ควรแยกตาราง "ข้อมูลส่วนบุคคล" ออกจาก tblWork ครับ ตารางใหญ่เกินไป จัดการยาก
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

52
ลองปรับให้แล้วครับ ให้ดูโค้ดล่าสุดที่ข้อความนะครับ ผมใช้การ ซ่อนสถานนะที่เป็น Label ไว้ด้วย

ถ้าอยากจะให้โค้ดทำงานตอนกดบันทึก แทนสถานะ หลังการปรับปรุง ก็ใส่ว่า

โค๊ด: [Select]
Private Sub cmdSave_Click()
    Dim strStatus as string
    Me.Dirty = False
    DoCmd.SetWarnings False
    DoCmd.RunSQL "UPDATE qryWork SET qryWork.TerminatedDate = [txtTerminatedDate] WHERE (((qryWork.ContractorID)=[txtContractorID]));", dbFailOnError
    strStatus = Nz(DLast("[ContractorStatus]", "[qryWork]", "[NationalID]=[Forms]![frmEditWork]![txtNationalID]"))
    Me.[txtContractorStatus2] = strStatus
    If strStatus = "ยังปฏิบัติงานอยู่" Then
    [Forms]![frmEditWork]!Label41.Visible = True
    Else
    [Forms]![frmEditWork]!Label41.Visible = False
    End If
    DoCmd.SetWarnings True
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

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

หรือส่งไฟล์มาทางกล่องข้อความครับเดียวผมดูให้
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

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

หรือจะใช้ 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 หรือเปล่า
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

หน้า: 1 2 [3] 4