สมัครสมาชิก

แสดงกระทู้

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

หน้า: [1] 2 3
1
การกำหนด Property ให้แก่คอนโทรลในบรรทัดของ Continuous Form จะมีผลกับคอนโทรลนั้นในทุกบรรทัดครับ แต่สำหรับการกำหนดคุณสมบัติในการแสดงบางอย่างเช่น สีพื้น, สีตัวอักษร. อักษรตัวหนา/ขีดเส้นใต้/ตัวเอียง, Enabled/Disabled สามารถใช้ Conditional Formatting ในการกำหนดเฉพาะคอนโทรลในบรรทัดนั้นๆตามเงื่อนไขให้เป็นไปอย่างอัตโนมัติได้ ดังนั้นอย่างแรกที่ต้องทำก็คือต้องหาก่อนว่าเงื่อนไขอะไรที่จะให้ Disabled   จากที่กำหนดมา ถ้าสมมุติว่าเมื่อเงื่อนไข cb_Status = "¨จบงาน" ก็ให้ Disabled ได้ ก็ให้ป้อน Conditional Formatting สำหรับคอนโทรลอื่นที่ต้องการเป็น (เช่น cb_DocEnvelope, txt_OrderID) [cb_Status] = "¨จบงาน" แล้วเลือกลักษณะคอนโทรลเป็น Disabled ครับ 



ส่วนโค้ดที่ให้มา ก็มีแค่นี้เท่านั้น

Private Sub Command27_Click()
    Me.txt_DateClose = Now()
    Me.cb_Status = "¨จบงาน"
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

2
เพิ่มเติมหน่อยนะครับ ที่บอกไปครั้งก่อนว่า "ใน BeforeUpdate event จะไม่ยอมให้เราแก้ไขค่าในเท็กซ์บ็อกซ์ของตัวมันเอง" หมายถึงจะเกิด runtime error ขึ้น แต่ถ้าเราอยากข้าม error นี้ไป ก็ทำแบบเถื่อนๆคือใส่ On Error Resume Next ตามโค้ดที่แก้ไขข้างล่างนี้ก็ได้

Private Sub TxITEM_ฺBeforeUpdate(Cancel As Integer)
  If Me.TxItem.Text = "" Then
  ElseIf DCount("Item", "QrItem") > 0 Then
  Else
      MsgBox "Item ¹ÕéäÁèÁÕã¹ÃкºËÃ×ÍÂѧäÁèä´éà¾ÔèÁà¢éÒä»ã¹Ãкº", vbOKOnly, "Warning!"
      Cancel = True
      On Error Resume Next
      Me.TxItem.Text = ""

  End If
End Sub

หมายเหตุ : สังเกตให้ดีว่าเราต้องอ้าง TxtItem.Text นะครับ ไม่ใช่ TxtItem เฉยๆ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

3
ห้าม set focus กลับไปที่ตัวเองครับ การทดสอบว่าเงื่อนไขไหนไม่ผ่านและจะให้ยังคงอยู่ที่เท็กซ์บ็อกซ์เดิม เราต้องทำที่ BeforeUpdate event  และเราจะกำหนดพารามิเตอร์ Cancel เป็น True เพื่อให้ Access หยุดเพียงแค่ event นี้ ดังนั้นจึงไม่ต้องกำหนด .SetFocus เพิ่มเติม แต่เนื่องจากใน BeforeUpdate event จะไม่ยอมให้เราแก้ไขค่าในเท็กซ์บ็อกซ์ของตัวมันเองเช่นกัน จึงไม่สามารถกำหนดค่า Null กลับไปได้ วิธีที่พอทำได้คือ กำหนดให้ตัวอักษรทั้งหมดในเท็กซ์บ็อกซ์ถูกเลือก ดังนั้นผู้ใช้ก็สามารถป้อนค่าใหม่ทับของเดิมไปได้ทันทีครับ

โค้ดคุณก็จะมีแค่นี้ครับ

Private Sub TxITEM_ฺBeforeUpdate(Cancel As Integer)
  If Me.TxItem.Text = "" Then
  ElseIf DCount("Item", "QrItem") > 0 Then
  Else
      MsgBox "Item ¹ÕéäÁèÁÕã¹ÃкºËÃ×ÍÂѧäÁèä´éà¾ÔèÁà¢éÒä»ã¹Ãкº", vbOKOnly, "Warning!"
      Cancel = True
      Me.TxItem.SelStart = 0
      Me.TxItem.SelLength = Len(Me.TxItem.Text)
  End If
End Sub


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

4
สนับสนุนการบ่นอีกเสียงครับ

บางคำถามอ่านแล้วได้แต่ถอนใจ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

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

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

ถามยาว โอกาสได้รับคำตอบเร็วมีสูง -- ถามสั้น โอกาสน้อยลง -- ถามสั้นมากๆ ยากที่จะมีโอกาส
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

6
นำไปใช้ การลงข้อมูล ชื่อ - ที่อยู่ลูกค้า ครับ

ไฟล์ตัวอย่างใช้ Combo box หลายตัว โดยทุกตัวมีความหมายเหมือนกันเพียงแค่เมื่อเลือกแล้วส่งค่ากลับไปยัง Combo box อื่นๆ เอาไปศึกษาแนวทางการนำไปใช้ดูครับ :yuush:
โค๊ด: [Select]
Private Sub Cus_ID_Click()
        Cus_Tax_ID.Value = Cus_ID.Column(9)
        Cus_Name.Value = Cus_ID.Column(1)
        Cus_addess.Value = Cus_ID.Column(2) & "  " & Cus_ID.Column(3) & Cus_ID.Column(4) & "  " & Cus_ID.Column(5) & "  " & Cus_ID.Column(6) & Cus_ID.Column(7) & "  " & Cus_ID.Column(8) '& "."
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

7
นำไปใช้ การลงข้อมูล ชื่อ - ที่อยู่ลูกค้า ครับ 
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

8
Combobox นิยมใช้ในการเลือกรายการหรือเลือกจากตัวเลือกที่สร้างขึ้นมามากกว่าจะใช้การ ใส่ตัวเลขนะครับ
แต่ถ้าใส่ตัวเลือก จาก ID แล้ว แสดงส่วนของ Detail ก็ว่าไปอย่าง
ถ้าเป็นการใส่ตัวเลขก็ใช้ textbox ก็ได้ เลยสงสัยว่าการนำไปใช้ๆทำอะไรครับ

เช่น
โค๊ด: [Select]
Private Sub Combo_Box_1_AfterUpdate()
If Not IsNull(Me.Combo_Box_1) Then
Me.Combo_Box_2 = Me.Combo_Box_1
Me.Combo_Box_3 = Me.Combo_Box_1
End If
End Sub



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

9
ไม่เคยทำกับเรคอร์ดจำนวนมากอย่างนี้ ได้แค่ออกแนวคิดให้ แต่จะทำได้ผลจริงหรือไม่ อันนี้ไม่ทราบนะครับ วิธีคือต้องหาทางสร้างคิวรี่เพื่อให้ได้เรคอร์ดทีละล้านเรคอร์ดก่อน แล้วใช้ CopyFromRecordset method ของ Range object จาก Excel object https://docs.microsoft.com/en-us/office/vba/api/excel.range.copyfromrecordset link เพื่อดึงข้อมูลจำนวนมากเข้าชีท แล้วก็เปิดชีทใหม่ วนทำกับคิวรี่ตัวต่อไปจนหมดครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

10
กดปุ่ม [CTRL] + ['] จะเป็นการเรียกข้อมูลก่อนหน้ามาใส่ (ไม่รู้ว่าช่วยแก้ปัญหาได้ป่าวนะครับ)
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

11
เราเอา code ไปใส่ใน module ได้ไหมครับ  เพราะทุกฟอร์มที่เปิดจะ เปิดใช้เหมือนกัน  จะได้ไม่ต้องไใส่ใน form load   ของ property
ท่านไปกำหนดของแต่ละฟอร์ม ก่อนเรียก Function มาใช้นะครับ


ที่ Module

โค๊ด: [Select]
Public Function MyKeyCode(KeyCode As Integer, Shift As Integer) As Integer
    Select Case KeyCode
        Case vbKeyF1
            MyKeyCode = 0
         MsgBox "F2 = Previous Record" & vbCrLf & "F3 = Next Record" & vbCrLf & _
         "F4 = Save Record" & vbCrLf & "F8 = Open Reports" & vbCrLf & _
         "F10 = Save And Exit", vbInformation + vbSystemModal, "HELP"
         
         Case vbKeyF2
            MyKeyCode = 0
             On Error Resume Next
             DoCmd.GoToRecord , , acPrevious
           
         Case vbKeyF3
            MyKeyCode = 0
            On Error Resume Next
            DoCmd.GoToRecord , , acNext
       
          Case vbKeyF4
            MyKeyCode = 0
            DoCmd.RunCommand acCmdSaveRecord
           
            Case vbKeyF8
            MyKeyCode = 0
            DoCmd.OpenReport "Report1", acViewNormal
         
             Case vbKeyF10
                DoCmd.Close , , acSaveYes
       
        Case Else
            MyKeyCode = KeyCode
    End Select
End Function

ที่ฟอร์มแต่ละฟอร์ม Event Keydown เอาโค้ดนี้ไปวางไว้ได้เลย
โค๊ด: [Select]
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
KeyCode = MyKeyCode(KeyCode, Shift)
End Sub

หมายเหตุที่ Select Case แต่ละอันท่านไปปรับเปลี่ยนการทำงานได้ตามสะดวกครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

12
อะไรที่เป็นรายได้ของเวป ทำเลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

13
ดันขึ้นบนหน่อย ขอความช่วยเหลืแอแสดงความคิดเห็นกันด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

14
สวัสดีชาว ms access ทุกท่านครับ เผลอแปปเดียวเว็บบอร์ดใหม่แห่งนี้ก็เปิดมาได้ปีกว่าล่ะ :grin:


จากที่ผ่านมาจะพบว่ามีการตั้งกระทู้หรือโพสต์แนวโฆษณา-ประชาสัมพันธ์แล้วถูกลบกระทู้ไปนั้นจึงอยากจะขอความคิดเห็นจากทุกท่านว่า...

1.เปิดห้องให้สามารถลงโฆษณาได้แยกต่างหากไปดีหรือไม่
2.หากมี Banner ข้างบน(ตามรูปตัวอย่าง)เพื่อเป็นรายได้ในการดูแลรักษาเว็บท่านคิดเห็นเช่นไร


*กดโหวตหรือตอบกระทู้แสดงความคิดเห็นมากันได้เลยนะครับ
ปล.ก่อนหน้าได้ท่าน OddyWriter ใจบุญนำหนังสือมาขายเพื่อเว็บนะ  :meaw:
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

15
ผมทำ report invoice โดยเชื่อมโยงจาก quiry และทุกครั้งต้องถามเลขที่บิล มีวิธีใดทางลัด ป้อนข้อมูลในฟอร์มขาย สั่งพิมพ์บิลได้เลย ขอคำแนะนำครับ
report invoice เชื่อมโยงจาก Query อยู่แล้วมี Field เก็บเลขที่บิลอยู่แล้ว
ก็ไปกำหนด Criteria ใน Query Field ที่เก็บเลขที่บิล
=Forms![ชื่อฟอร์ม]!txt_Bill
เท่านี้เวลาเปิดรายงานก็จะแสดงข้อมูลที่มีเลขที่บิลนั้นขึ้นมาคับ

เท่านี้เวลาเปิดรายงานเลขที่บิลจะปรากฎขึ้นมาทันทีครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

16
ที่จริงฟอร์ม ต้นฉบับหรือ ฟอร์มสำเนา ไม่ต้องเปิดขึ้นมาเพื่อจะพิมพ์ก็ได้คับ
ผมสมมุติ ฟอร์มต้นฉบับชื่อ Frm_original
           ฟอร์มสำเนาชื่อ Frm_Copy

คำสั่งที่จะนำไปวางที่ Event ที่ต้องการคือ
โค๊ด: [Select]
Private Sub BtnPrint_Click()

    DoCmd.SelectObject acForm, “Frm_original”, True
    DoCmd.PrintOut , , , , 1
    DoCmd.SelectObject acForm, “Frm_Copy”, True
    DoCmd.PrintOut , , , , 1

End Sub
เท่านี้ก็จะทำการปริ้น ทั้ง 2 ฟอร์ม โดยไม่ต้องเปิดฟอร์มขึ้นมาก็ได้คับ
หมายเหตุ ตรง DoCmd.PrintOut , , , , 1  การกำหนดจำนวนว่าจะปริ้นกี่แผ่นนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

หน้า: [1] 2 3