แสดงกระทู้

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 - ปิ่นณรงค์

หน้า: 1 [2] 3 4 5 ... 36
17
รบกวนถ้าจะอ้างอิง Code ยาวๆ จากโพสก่อน ผมว่าไม่ต้องก็ได้ครับให้กดโพสข้อความไปเลยไม่ต้องอ้างอิงมาเพราะมันจะดูรก และอ่านยากครับ

18
ไม่รู้แบบนี้ไหมนะครับ ที่ฟอร์มสอง ถ้าไม่กดบันทึก เวลาจะปิดจะมีการสอบถามเรื่องการบันทึกข้อมูลถ้าตอบ No ข้อมูลจะไม่บันทึกใน ตาราง tblFollowDetail
เพิ่มระบบค้นหา No มาแสดง ลองดูครับ


19
ใช้การสร้างตัวแปล มาเช็คสถานะของการบันทึกก็ได้ครับ โดยใช้ Events Form_BeforeUpdate ในการตรวจสอบ โค้ดผมยุบเหลือแค่นี้นะครับ
โค๊ด: [Select]
Private Sub cmb_Save_Click()
Dim IsSave As Boolean
If IsNull(txt_CIF) Then
MsgBox "กรุณาระบุ CIF !!", vbOKOnly, "Warning !!"
ElseIf IsNull(txt_TONo) Then
MsgBox "กรุณาระบุ TO No. !!", vbOKOnly, "Warning !!"
ElseIf IsNull(txt_DocCode) Then
MsgBox "กรุณาระบุรหัสเอกสาร !!", vbOKOnly, "Warning !!"
ElseIf IsNull(txt_DocTypeCode) Then
MsgBox "กรุณาระบุรหัสประเภทเอกสาร !!", vbOKOnly, "Warning !!"
ElseIf IsNull(txt_DocName) Then
MsgBox "กรุณาระบุชื่อเอกสาร !!", vbOKOnly, "Warning !!"
ElseIf IsNull(txt_DocDate) Then
MsgBox "กรุณาระบุวันที่เอกสาร !!", vbOKOnly, "Warning !!"
else
DoCmd.RunCommand (acCmdSaveRecord)
IsSave = True
End If
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)  'ก่อนข้อมูลจะถูกบันทึกในตารางต้องผ่านเงื่อนไขนี้ก่อน ครับถ้าตอบ No หรือกดปิดฟอร์มโดยไม่ได้กดบันทึก ข้อมูลจะไม่ถูกบันทึก
Dim msg As Integer
If IsSave = False Then
    msg = MsgBox("คุณต้องการบันทึกข้อมูลนี้หรือไม่?", vbYesNo, "สอบถาม")
    If msg = vbNo Then
       Me.Undo
    End If
End If
End Sub

20
ผมสร้างฟอร์ม ชื่อ frmMain1 มี text box ชื่อ txt_No1 ในฟอร์มนี้มีปุ่มเปิดฟอร์ม ชื่อ frmMain2 ในฟอร์มนี้มี textbox ชื่อ txt_No2
คำถาม ผมต้องการให้ frmMain1 เมื่อกดปุ่มเปิดฟอร์ม frmMain2 ให้ txt_No1= txt_No2 ต้องเขียนโค้ดใน vb ว่าอย่างไรบ้างครับ ขอบคุณมากครับ

ถ้าเป็นแบบ อ้างอิงแบบไม่ได้ Filter ที่ปุ่มก็ใส่แบบนี้ครับ
โค๊ด: [Select]
Private Sub OpenFrmMain2_Click()
DoCmd.OpenForm "frmmain2"
Forms!frmmain2.Form!txt_No2 = Me.txt_No1
End Sub

แต่ถ้าเป็นรูปแบบการ Filter เช่น txt_No2 Bound Field ชื่อ No และอยากให้ ระบุ No ที่ frmmain1 เมื่อเปิดฟอร์ม frmmain2 ก็ให้ Filter No มาแสดงก็ใส่แบบนี้
ถ้า Field No เป็น Number
โค๊ด: [Select]
Private Sub OpenFrmMain2_Click()
DoCmd.OpenForm "frmmain2", WhereCondition:="[No]=" & Me.txt_No1
End Sub

ถ้า Field No เป็น text
โค๊ด: [Select]
DoCmd.OpenForm "frmmain2", WhereCondition:="[No]= '" & Me.txt_No1 & "'"

21
ผมสมมุติ Field เก็บวันที่เริ่มทำงานของพนักงานชื่อ DateOfStartWork ตารางชื่อ Table1
ลองดูตัวอย่างนี้คับ

22
ถ้ามองตามเหตุการณ์จริงเมื่อ AfterUpdate แล้วมี MSGBOX มันจะลงไปที่ text2 อยู่แล้ว เราน่าจะกำหนดแบบนี้คับ

Private Sub Text1_AfterUpdate()
Dim Rs As Recordset
Set Rs = CurrentDb.OpenRecordset("Select * From UserClass Where UserName='" & Text1 & "';")

If Rs.RecordCount = 0 Then
MsgBox "ผู้ใช้ชื่อ" & Me.Text1 & " ไม่ได้รับอนุญาตให้ใช้งาน ", vbCritical, "ระบบตรวจสอบ"
Me.Text1 = null
Me.Text2.SetFocus
Me.Text1.SetFocus
Exit Sub
End If

End Sub

23
ใส่ me.Text1.setFocus ครับ

24
ตัวอย่างคือการกำหนด ประเภทของ Control ครับ ถ้าเป็นประเภทที่เราเลือกเช่นจะสั่งให้ null หรือให้ว่าง ในประเภท textbox หรือ Combobox หรือ ให้เป็น False ใน checkbox ครับ

โค๊ด: [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 ("ผิดพลาดตรง Reset Form")
        Resume Exit_err

End Sub

เวลาจะเรียกใช้งานก็สั่ง Call ResetForm()

ส่วนประเภทของ Control ต่างๆ ที่มีใน access ก็ตามนี้เลยคับ
Constant              Control
acBoundObjectFrame   Bound object frame
acCheckBox              Check box
acComboBox              Combo box
acCommandButton      Command button
acCustomControl      ActiveX (custom) control
acImage                      Image
acLabel                      Label
acLine                      Line
acListBox                      List box
acObjectFrame              Unbound object frame or chart
acOptionButton              Option button
acOptionGroup              Option group
acPage                      Page
acPageBreak              Page break
acRectangle              Rectangle
acSubform       Subform/subreport
acTabCtl                      Tab
acTextBox      Text box
acToggleButton      Toggle button

26
ส่งไฟล์ ที่กำลังสร้างอยู่มาดูหน่อยครับ ทาง Inbox ก็ได้ ติดปัญญาตรงไหนบอกได้เลยครับไม่ต้องเกรงใจ
เดี่ยวจะบอกสาเหตุของ Error นั้นให้ด้วย จะได้แก้ไขได้ในครั้งต่อไป

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

27
ห้อง MS Access / : ไม่ให้ลบข้อมูลใน Subform
« เมื่อ: 11 มิ.ย. 62 , 15:57:13 »
เวลากำหนดตั้งค่า ไม่ใช่เปิดจาก form หลักนะครับ
ให้เปิด SubForm มาแก้ไขโดยตรง ห้ามเปิดจาก MainForm ครับ

ลองเปิดเฉพาะSubForm มาแก้ไขดูครับ

หรือถ้ายังไม่ได้ให้ Zip File แนบมาทางอินบ๊อก เดี่ยวดูให้คับ

28
ห้อง MS Access / : ไม่ให้ลบข้อมูลใน Subform
« เมื่อ: 11 มิ.ย. 62 , 15:48:18 »
เลือก Tab Data แล้วแก้


Allow Deletions: NO
Allow Edits: NO


กดตรงนี้


กำหนดที่ tab data

29
ห้อง MS Access / : ไม่ให้ลบข้อมูลใน Subform
« เมื่อ: 11 มิ.ย. 62 , 15:32:06 »
สวัสดีค่ะ  อ๋อยรบกวนสอบถามเกี่ยวกับ Subform คือ ตอนนี้อ๋อยสร้าง Subform ให้แสดงข้อมูลจาก Form หลัก แล้วอยากจะ Lock Subform เพื่อไม่ให้แก้ไขข้อมูล หรือว่าลบข้อมูลใน Subform พอมีวิธีการไหนบ้างหรือเปล่าคะ  ขอบคุณค่ะ

กำหนดคุณสมบัติใน subform ตามนี้ก็ได้คับ



หรือจะใช้ โค้ดที่ Event Form_Current ของฟอร์มหลักก็ได้คับ  จากตัวอย่างฟอร์มหลักชื่อ Mainform ฟอร์มย่อยชื่อ Subform

Private Sub Form_Current()
Forms!mainform.Form!subform.Form.AllowDeletions = False
Forms!mainform.Form!subform.Form.AllowEdits = False
End Sub

30
อ้างถึง
1. หลักความแตกต่างระหว่าง " และ ' และ & คืออะไรครับ

 " และ '  เราเรียกว่า double quote และ Single quote ครับ สัญลักษณ์พวกนี้เป็นการบอกให้ทราบว่า คุณได้กำหนดช่วงของ ข้อความ หรือ String หรือ ตัวเลข หรือตัว Control จาก ไหน ถึง ไหน ครับ เช่น "..............." เป็นการบอกว่า ภายใน double quote นี้คือเนื้อหาส่วนเดียวกัน

ความแตกต่างของการใช้  " และ ยกตัวอย่างการใช้ Dlookup
เราจะใช้ ' ในการกรณีที่ อ้างถึงเขตข้อมูลที่เป็น string หรือข้อความ เช่น
DLookup("FieldName" , "TableName" , "Criteria= 'String'")

ในกรณีที่เป็น ตัวเลข เราจะใช้ " ในการกำหนดขอบเขตครับเช่น N คือตัวเลข
DLookup("FieldName" , "TableName" , "Criteria = n")

แต่ " " นี้ก็ไม่ได้ใช้กับตัวเลขเสมอไป เราจะใช้ในการกำหนด เริ่มต้นและสิ้นสุดของข้อความที่เรากำหนดได้เหมือนกันเช่น

msgbox "สวัสดีครับ",vbInformation,"ทักทาย"

& นั้นใช้ในการเชื่อมต่อกับส่วน อื่นๆของคำสั่ง เช่น ตัวแปร เชื่อมกับ Control / ข้อความเชื่อมกับ Control / กำหนด เชื่อมฟิลล์เข้าด้วยกัน เช่น Field1 & "/" & Field2  ก็จะได้ Field1/Field2เป็นต้น

อ้างถึง
2. ในกรณีนี้ทำไมต้องใส่ " " ที่ตอนต้นและตอนท้ายด้วยครับ เพราะดูในที่อื่น ก็ select * from  where ไม่เห็นต้องมี " " ปิดหัวท้ายเลย


คุณอ้างถึงตัวแปร Sql ที่เป็น string ซึ่ง ต้องมี " " ปิดหัวท้ายเพื่่อกำหนดขอบเขตของ String ที่เรากำหนดคับ

อ้างถึง
3. like '" & Nz(Me.tcombo, "*") & "'  --> รบกวนช่วยแปล Code นี้หน่อยครับ ไม่เข้าใจตรงการเขียน '" & XXX & "'
จากตัวอย่างนี้ลองสังเกตุ '" & XXX & "' การใส่ เครื่องหมาย  " และ ' ให้การ Control ที่เป็นข้อความคับ
Nz(Me.tcombo, "*") คือการกำหนดให้ตรวจสอบ Control ที่ชื่อ tcombo ครับโดยการกำหนดให้แสดงผลตามว่า tcombo ว่างหรือไม่ว่าง
ถ้า tcombo ไม่เป็นค่าว่าง สมมุติเราใส่ กรุงเทพ เงื่อนไขของ คำสั่งนี้คือ   like "กรุงเทพ" ซึ่ง ถ้าเขตข้อมูลไหนมีคำว่ากรุงเทพก็จะแสดงรายการออกมาครับ
แต่ถ้า tcombo เป็นค่าว่าง Nz Function ก็จะแทนค่าว่างด้วย * คือถ้าว่างก็ให้เงื่อนไขคือแสดงข้อมูลทั้งหมด

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

31
โค๊ด: [Select]
Option Compare Database

Private Sub SearchCombo()
Dim sql As String

sql = "SELECT * FROM tbldata WHERE [Province] like '" & Nz(Me.Combo1, "*") & "' and [District] like '" & Nz(Me.Combo2, "*") & "'"
    Forms!frmsearch!frmdata.Form.RecordSource = sql
    Forms!frmsearch!frmdata.Form.Requery
   
If Not IsNull(Me.Combo1) Then
Me.Combo2.RowSource = "SELECT DISTINCT tbldata.District, tbldata.Province FROM tbldata WHERE (((tbldata.Province)=[forms]![frmsearch]![Combo1]));"
Else
Me.Combo2.RowSource = "SELECT DISTINCT tbldata.District FROM tbldata GROUP BY tbldata.District;"
End If
End Sub
Private Sub Combo1_AfterUpdate()
    Me.Combo2 = Null
    SearchCombo
End Sub
Private Sub Combo2_AfterUpdate()
    SearchCombo
End Sub
Private Sub Combo2_GotFocus()
  SearchCombo
End Sub


สร้างเงื่อนไขในการกำหนด RowSource ครับลองดูครับ

32
ถ้าจะเก็บข้อมูลลงในตารางเป็น ID ของ ตารางนั้นก็คงจะเหมาะครับ เพราะใช้ทรัพยากรน้อยลง
ถ้าคุณกำหนดข้อมูลแถวของ Combobox เป็น คอลัมน์1 ID คอลัมน์2 ชื่อจังหวัดหรือตำบลหรืออำเภอ
ตรง column width(ความกว้างของคอลัมน์) กำหนดซัก 0ซม.;5ซม. หรือตัวเลขอื่นๆ เพื่อให้แสดงรายการได้ครบ


column width กำหนดซัก 0ซม.;5ซม. คือ Combobox คอลัมน์ไหน กำหนดเป็น 0 จะไม่แสดงคอลัมน์นั้น จากการกำหนดนี้ข้อมูลจะถูกเก็บข้อมูล ID แต่จะแสดง รายการของคอมโบบ๊อกนั้นแทน
ส่วน BoundColumn(คอลัมน์ที่ถูกผูกไว้)ถ้าอยากจะเก็บข้อมูลเป็น ID กำหนดเป็น 1 ถ้าจะเก็บเป็นตัวหนังสือหรือรายการกำหนดเป็น 2 หรือดูจากการกำหนดชนิดแหล่งข้อมูลแถวว่าต้องการผูกคอลัมน์ไหนไว้ครับ


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