แสดงกระทู้

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

หน้า: [1]
1
พอดีพึ่งเริ่มเขียนVBในAccessเลยอยากรู้ว่าDoCmd.SetWarnings False/True ไว้ใช้ทำอะอะไรและDoCmd.คืออะไร

SetWarnings คือการเปิด/ปิดข้อความโต้ตอบ ของระบบครับ True = เปิด   / False = ปิด
ถ้าคุณใช้งานไปคุณจะสังเกตุเห็นข้อความสอบถามจากระบบเช่น ตกลง หรือ ยกเลิก ใช่ หรือ ไม่ เป็นต้น
การสั่งให้  DoCmd.SetWarnings False เป็นการสั่งปิดข้อความตอบโต้ของระบบออกไป
ซึ่งคุณต้องมั่นใจว่าผลลัพธ์ของแมโครแอคชันทั้งหมด หรือการนำไปใช้กับ Query แบบ MakeTable /Append /Delete นั้นทำงานถูกต้องแล้วด้วยนะครับ ถ้าต้องการให้แสดงข้อความตอบโต้ กำหนดเป็น True

ยกตัวอย่าง
ผมสมมุติว่าต้องการสร้าง Make Table Query ขึ้นมา 1 ตัว โดยใช้คำสั่งในการรัน Query ดังนี้
โค๊ด: [Select]
Private Sub Command0_Click()
DoCmd.OpenQuery "Query1"
End Sub
ผลที่ได้คือจะมีข้อความตอบโต้ขึ้นมา ซึ่งไม่สะดวกในการนำไปใช้งานกับโปรแกรมจริงๆ


ผมเลยนิยม ปิดคำสั่งตอบโต้ซะโดยใส่ Code แบบนี้
โค๊ด: [Select]
Private Sub Command0_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Query1"
DoCmd.SetWarnings True
End Sub
DoCmd คือ Object ในการสั่งให้ Methods ทำงานซึ่ง Methods ก็มีมากมายที่ ใช้ใน Visual Basic ซึ่งรวมถึงการสั่ง run มาโคร actions โดยวิธีการจะดูว่า Methods มีอะไรบ้าง ที่หน้าต่าง เขียนโค็ดถ้าท่านพิมพ์ DoCmd. เมื่อใส่ . ท่านจะเห็นว่ามีอะไรบ้างที่ทำงานด้วยใช้ Docmd ซึ่ง นำไปใช้งานได้หลากหลายเช่น การเปิด/ปิดฟอร์ม ปริ้นรายงาน ตั้งค่าตัว Control การ Import/Export และอื่นๆ มากมาย
โพสต์นี้ได้รับคำขอบคุณจาก: armdack

2
ภาษา VBA นำมาจากภาษา BASIC ซึ่งเป็นภาษาเก่าแก่ สิ่งนึงที่ตกทอดมาถึง VBA ก็คือหมายเลขบรรทัด เราสามารถใส่เลขที่บรรทัด จะเป็นเลขอะไรก็ได้ตั้งแต่ 1 ถึง 65535 และแต่ละบรรทัดจะเป็นเลขอะไรก็ได้ ไม่จำเป็นต้องเรียงลำดับ ไม่จำเป็นต้องมีทุกบรรทัด ขอให้ไม่ซ้ำใน Sub หรือ Function Procedure เดียวกันก็พอ โดยเขียนไว้เป็นส่วนแรกของโค้ดแต่ละบรรทัด ที่ทำๆกันมาเป็นมาตรฐานก็คือเริ่มจาก 10  และเพิ่มทีละ 10 เพื่อให้อ่านง่ายและสะดวกเมื่อมีการแทรกบรรทัดเพิ่ม จะได้ใส่เลขบรรทัดได้โดยไม่ต้องไปแก้หมายเลขของบรรทัดอื่นๆให้เสียเวลาครับ

ตย.ของโค้ดก็เช่น
โค๊ด: [Select]
Private Function NewSalesPrice(Price As Variant, Percent As Variant) As Single
          Dim Factor  As Single

          On Error GoTo ErrHandler

10        Factor = 1 + Percent / 100
20        NewSalesPrice = Price * Factor

ExitRtn:
30        Exit Function
               
ErrHandler:
40        MsgBox "In [NewSalesPrice], Line " & Str(Erl) & ", Error " & Str(Err.Number) & " : " & Err.Description
50        Resume ExitRtn
End Function

เลขบรรทัดทำหน้าที่แบบเดียวกับลาเบล เราสามารถสั่ง Goto <ลาเบล/เลขบรรทัด> หรือ GoSub <ลาเบล/เลขบรรทัด> เพื่อให้โค้ดข้ามไปทำงานที่บรรทัดตามเลขที่นั้นได้ แต่ประโยชน์ที่ชัดเจนที่สุดก็คือ ถ้าเกิด Runtime Error ขึ้นในบรรทัดของโค้ดที่มีเลขที่บรรทัดอยู่ เราสามารถใช้ฟังก์ชั่น Erl เพื่อคืนเลขที่บรรทัดออกมาได้ด้วย ดังนั้นเราจึงใส่ไว้ในส่วนของ Error Handling Routine เพื่อบอกให้ทราบว่าเกิดปัญหาที่บรรทัดอะไร การ Debug หรือแก้ไขปัญหาก็จะทำได้ง่ายขึ้นมาก แต่หากเกิด Error ในบรรทัดที่ไม่ได้ใส่หมายเลขบรรทัดเอาไว้  ฟังก์ชั่น Erl จะคืนค่าของเลขบรรทัดสุดท้ายที่อยู่ก่อนหน้าออกมาให้แทน หรือถ้าไม่มีเลย ก็จะคืนค่าเป็นศูนย์แทนครับ

ตย.ของข้อความ

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

3


สามารถไปกำหนดได้ที่ File  >  Option  > Object Designer > QueryDesign
กำหนดรูปแบบฟ้อน กับขนาดได้เลยครับ


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

4
ที่จริง ถ้าจะให้ Advance อีกนิด เราสามารถสร้าง Control แบบ Unbound น่าจะเวิคนะครับ

ตัวอย่างเพื่อจะนำไปปรับใช้

คำสั่งในการบันทึกข้อมูล
โค๊ด: [Select]
Private Sub Save_Click()
Call AddNewToTable
subform.Requery
MsgBox "บันทึกข้อมูลแล้วค่ะ", vbInformation, "สถานะ"
Call ResetForm
End Sub

โค๊ด: [Select]
Sub AddNewToTable()
On Error GoTo Err_Err
    Dim DB As Database
    Dim rs As Recordset
    Set DB = CurrentDb()
    Set rs = DB.OpenRecordset("BillHead", dbOpenDynaset)
    rs.AddNew
    rs![BillNumber] = Me.BillNumber
    rs![CustomerName] = Me.CustomerName
    rs![CustomerLastName] = Me.CustomerLastName
    rs![Tel1] = Me.Tel1
    rs![Tel2] = Me.Tel2
    rs.Update
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox "Error, ( Add New)!", vbExclamation, "แจ้ง"
        Resume Exit_err
End Sub

คำสั่งทำให้ ข้อมูลจากตัว Control บนฟอร์ม เป็นค่าว่าง
โค๊ด: [Select]
Sub ResetForm()
    On Error GoTo Err_Err
    Dim ctl As Control
   
       
    For Each ctl In Me
        If ctl.ControlType = acComboBox Then
            ctl = Null
        End If
        If ctl.ControlType = acTextBox Then
         ctl = Null
        End If
        If ctl.ControlType = acCheckBox Then
                ctl = False
        End If

    Next ctl
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
         MsgBox "ERROR ResetForm"
        Resume Exit_err

End Sub

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

5
ทำไม ชื่อ Field ในตาราง หลัก กับรองเหมือนกันเลยละครับ
 subform ของคุณไว้ดูข้อมูลทั้งหมดที่เพิ่มเข้าไปใช่หรือเปล่าครับ คือกรอกข้อมูลจาก ฟอร์มหลักแล้วให้ มาแสดงในฟอร์มย่อยแบบนั้นเปล่าครับ

ใช่เลยค่ะ เหมือนบันทึกจากฟอร์มหลักลงฟอร์มย่อยอ่ะค่ะ พอกดบันทึก ช่องก็จะว่างให้เราบันทึก Record ต่อไปได้ อะไรประมาณนี้อ่ะค่ะ


งั้นก็เอา การตั้งค่าตรง หัวข้อที่ 3 ออกไปครับ

Form หลัก และ Form ย่อย ใช้ RecordSource จากตารางเดียวกัน
สมมุติชื่อ ฟอร์มย่อยว่า Subform
ที่ปุ่ม บันทึกใส่แบบนี้ครับ

โค๊ด: [Select]
Private Sub Save_Click()
DoCmd.GoToRecord , , acNewRec
subform.Requery
MsgBox "บันทึกข้อมูลแล้วค่ะ", vbInformation, "สถานะ"
End Sub

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

6
ตอบข้อ 1
ผมกำหนด combobox สถานะ ชื่อ status
             textbox    วันที่ลาออก ชื่อ DateOut
             combobox สาเหตุการลาออก ชื่อ OutDetail

ที่Event Afterupdate ของ combobox status ใส่โค้ดดังนี้

โค๊ด: [Select]
Private Sub Status_AfterUpdate()
If Me.Status = "ยังทำงานอยู่" Then
Me.OutDetail.Locked = True
Me.DateOut.Locked = True
Me.OutDetail.Enabled = False
Me.DateOut.Enabled = False
Me.OutDetail = Null
Me.DateOut = Null
Else
Me.OutDetail.Locked = False
Me.DateOut.Locked = False
Me.OutDetail.Enabled = True
Me.DateOut.Enabled = True
End If
End Sub

คำสั่งนี้ เราใช้ IF Function เพื่อสร้างเงื่อนไขการทำงานของ Combobox และ Textbox ที่เรากำหนด  ถ้า เราเลือก ยังทำงานอยู่ ซึ่งกำหนดให้ เป็นความจริง ก็จะทำงานตามที่เรากำหนดไว้ แต่ถ้าไม่เป็นจริงก็จะทำงาน ที่ Else ลงมา
Locked คือ ห้ามไม่ให้กรอกข้อมูลได้
Enabled คือ ปิดการใช้งาน
Null คือ ถ้ามีข้อมูลอยู่ก็ทำให้เป็นค่าว่าง

ข้อสองน่าจะกำหนด RelationShip ไม่ถูกต้อง และตั้งค่า เชื่อมต่อ ตรง Link master กับ Link Child Field ไม่ถูกต้องครับ

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

7

สอบถามนิดนึงค่ะว่า ตรง หน้าต่างใส่โค้ด VBA อ่ะค่ะ มันไม่อ่านภาษาไทย ต้องแก้ตรงไหนหรอคะ

ที่หน้าต่างใส่โค้ด ไปที  Tool > Option > Editor Format
ที่ Font กำหนดเป็น Tahoma Bold (Thai)  หรือ ฟ้อนอื่นๆ ที่มีคำว่า(thai) ต่อท้ายอยู่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: armdack

หน้า: [1]