แสดงกระทู้

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 ... 9 10 11 [12] 13 14 15 ... 19
199
ถ้าจะเขียนในลักษณะเดียวกับที่คุณมาลีเขียนมา ก็เขียนเป็น Forms!Main!Text2 = Text1

แต่โดยปกติผมจะเขียนเป็น Me.Parent!Text2 = Me.Text1 ครับ โดยที่ Parent หมายถึงเมนฟอร์มของฟอร์มปัจจุบันที่โค้ดเราอาศัยอยู่  (Me) ซึ่งตอนนี้เราอยู่ที่ซับฟอร์ม
โพสต์นี้ได้รับคำขอบคุณจาก: Un, มาลี

200
ตามที่ผมตอบในคำตอบแรกเลย
อ้างถึง
พอกดปุ่ม [ทำการเบิก] ก็ให้เขียนทุกเรคอร์ดในเทเบิล T ที่ฟิลด์ S มีค่าเป็น True ลงในเทเบิลการเบิกจ่ายและเทเบิลรายการเบิกจ่าย (RI)   แล้วค่อยเปิดฟอร์มเบิก/จ่ายตามเอกสารที่เพิ่งสร้างอีกที

การเขียนเรคอร์ด ก็คือสร้าง Append Query
ส่วนเปิดฟอร์มก็บอกไปแล้วเหมือนกัน คือ DoCmd.OpenForm
เปิดแล้วก็กำหนด .RecordSource ของฟอร์มเบิก/จ่าย เป็นเอกสารเลขที่ที่เพิ่งสร้าง
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

201
ห้อง MS Access / : Ms Access *.accdb มีอะไรดีกว่า *.mdb
« เมื่อ: 25 เม.ย. 62 , 11:15:38 »
ในความเห็นผมส่วนตัว ถ้าพูดถึงแง่ข้อมูล ไฟล์ .accdb ไม่ได้มีอะไรที่ดีขึ้นอย่างเด่นชัดเมื่อเทียบกับ .mdb  แต่ถ้าพูดถึงตัว Access เอง เปลี่ยนไปใช้เวอร์ชั่นใหม่กว่าก็ดีครับ เพราะมีอินเทอร์เฟสที่ดีกว่า ยกเว้น Ribbon ที่ผมเห็นว่าทำไมต้องใช้ XML มาสร้างให้ชีวิตลำบากก็ไม่รู้ แต่เมื่อ .accdb เป็นประเภทไฟล์ที่เป็น native สำหรับ Access เวอร์ชั่นใหม่ๆอยู่แล้ว ก็ควรจะย้ายข้อมูลไป .accdb แต่ถ้าคิดว่าระบบจะโตไปมากกว่า 2 GB และมีเวลากับเงินลงทุน ผมแนะนำไป SQL Server หรือฐานข้อมูลยี่ห้ออื่นในระดับเดียวกันเลยดีกว่า ยังไงก็ตาม ฐานข้อมูล SQL Server และอื่นๆ ตอนเขียนโปรแกรมใน Access หรือใช้งาน ต้องมีการปรับปรุงบางจุด ไม่เหมือนกับการใช้ .accdb/.mdb เป็นฐานข้อมูลโดยตรง แต่ก็สามารถหาคำถาม-ตอบเกี่ยวกับเรื่องพวกนี้ได้ทั่วไปครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, ta y

202
ก็ตรวจสอบโดยดับเบิลคลิกที่คิวรี่ A และ B ที่ละตัวตามลำดับสิครับ รันแต่ละตัวแล้วก็มาเปิดดูค่าในเทเบิลว่าเปลี่ยนแปลงไปตามการทำงานของคิวรี่หรือไม่ อันไหนไม่ ก็แปลว่าคิวรี่ตัวนั้นผิด ก็เอามาแก้ไข คุณต้องมีตรรกกะในการหาวิธีตีวงของปัญหาให้แคบลง หาจุดที่ผิดเอง ลองดูครับ

ถ้าหาที่ผิด (เรียกว่าการ debug โปรแกรม) อย่างมืออาชีพหน่อย ก็ใช้วิธีให้โค้ดทำงานทีละคำสั่งทีเราเรียกว่า การ trace การทำงานของโค้ดแบบ step by step แล้วตรวจดูค่าในเทเบิลเช่นกัน
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

203
ไม่ใช่เกณฑ์ (Criteria) แต่เป็นบรรทัดที่เขียนว่า Update To (ไม่รู้ภาษาไทยเขาใช้คำว่าอะไร) ของคอลัมน์ฟิลด์ Yes/No ซึ่งบรรทัดนี้จะมีใน Update Query เท่านั้น โดยใส่เป็นคำว่า True ไปตรงๆเลย
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

204
แน่นอนครับ คิวรี่ B ต้องกำหนดค่าของฟิลด์ Yes/No เป็น True
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

205
ใน Update Query (B) ก็จะมีลักษณะเงื่อนไขเป็นตามรูปข้างล่างนี้ (ไปเติมอีกเงื่อนไขเองนะครับ) เห็นไหมครับว่าเงื่อนไขก็เหมือนกับที่คุณทำ


ทีนี้ ต้องมีอีก Update Query (A) ที่ไม่ต้องมีเงื่อนไขใดๆ แต่ให้แก้ไขค่าฟิลด์ Yes/No เป็น False ให้หมดก่อนเพื่อเคลียร์การทำเครื่องหมายที่มีมาก่อน แล้วก่อนที่จะรันโค้ด 3 บรรทัดของคุณใน SearchCombo ก็ให้โปรแกรมก็เรียกคิว A ตัวนี้ทำงานเสียก่อน

ต่อไปก็เรียกคิวรี่ B ทำงานเพื่อทำเครื่องหมายให้ฟิลด์ Yes/No

แล้วค่อยต่อท้ายด้วยโค้ด 3 บรรทัดเดิมของคุณ เพื่อแสดงผลการค้นออกมาบนฟอร์ม

ทีนี้ถ้าอยากให้ดูกระชับ ใช้โค้ดเพียงอย่างเดียวโดยไม่ต้องสร้าง Update Query ก็ให้ใช้คำสั่ง DoCmd.RunSQL "คำสั่ง SQL UPDATE statement" แทนก็ได้ อันนี้ไปศึกษาเองครับ ไม่ได้ยากอะไร
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

206
"กำหนดเงื่อนไขโดยการเขียนโค้ดเป็นตัวกำหนดค่ะ"  ก็เงื่อนไขอันเดียวกันนั้นแหล่ะครับ เหมือนๆกัน 100% เลย

ลองเอาคิวรี่และโค้ดส่วนนี้มาแสดงให้ดูหน่อยครับ ถ้าแสดงเป็นรูปง่ายกว่าเขียนอธิบาย ก็เอารูปมาให้ดูประกอบด้วยก็ได้
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

207
อย่างที่บอกแหล่ะครับ การแก้ไขเรคอร์ดในเทเบิล ก็ใช้ Update Query    โดยในมุมมองแบบ Design View   ที่บรรทัด Update To ก็กำหนดค่าสำหรับฟิลด์ Yes/No นั้นเป็นคำว่า True และในบรรทัด Criteria ของคอลัมน์ของทุกฟิลด์ที่ใช้เป็นเงื่อนไข ก็ใส่เงื่อนไขสำหรับการดึงเรคอร์ดเหล่านั้นมาแก้ไข
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

208
มันคือ Arrays หรือเปล่าครับหรือ
https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/using-arrays

เพิ่มเติมว่า ควรจะใช้ dynamic array ที่เป็นของ User Defined Type ที่มี 2 element คือ element ของ string เพื่อเก็บชื่อที่ใช้อ้างอิง และ element ของ variant ที่เอาไว้เก็บค่า 

' การกำหนด Type ให้ใส่ไว้ในส่วนของ Module Declaration
Public Type DynamicVar
   Name As String
   Value As Variant
End Type

' การสร้าง element เพิ่มเติมให้ dynamic array  ให้ใส่ไว้ในส่วนของโค้ดที่ต้องการ
Dim DV( ) As DynamicVar
Dim N As Integer

N = Ubound(DV) + 1     ' หา element สูงสุดของ dynamic array
Redim Preserved DV(N)    ' สร้าง element เพิ่มเติม
DV(N).Name = "ชื่อที่ต้องการ"   ' ใส่ชื่อ
DV(N).Value = ค่าที่ต้องการ      ' ใส่ค่า

ส่วนตอนค้นหา ก็ไปวนอ่านเอาว่า DV ตัวที่เท่าไหร่ (X) ที่มี .Name เท่ากับชื่อที่ต้องการ ก็จะได้ค่าจาก DV(X).Value ครับ

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

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

210
ถ้าระบบมีผู้ใช้คนเดียว เอาง่ายก็คือเพิ่ม S ลงในเทเบิลที่เป็นแหล่งข้อมูลที่แสดงส่วนของ [ผลลัพธ์การค้น] (R) หาไปเลยก็ได้

ส่วนที่เลือกไม่ได้ ให้ทดสอบว่าสามารถแก้ค่าในคอนโทรลอื่นๆใน R ได้ด้วยหรือไม่ ถ้าไม่ได้เหมือนกัน อาจเกิดจากคิวรี่(ถ้ามี)ที่เป็นแหล่งข้อมูลของผลการค้นหามีการเชื่อมเทเบิลและเข้าเงื่อนไขให้คิวรี่นั้นแก้ไขไม่ได้ แก้ไขโดยเลือก Property ของคิวรี่ให้เป็น Inconsistant Update แต่ต้องไปล็อคทุกคอนโทรลบน R ยกเว้นคอนโทรลของ S เพื่อไม่ให้ผู้ใช้เผลอแก้ไขไปด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

211
เขียนเรคอร์ดลงเทเบิล สร้าง Append Query
แก้ไขเรคอร์ดในเทเบิล สร้าง Update Query
ลบเรคอร์ดในเทเบิล สร้าง Delete Query

ใช้แมโครเรียกคิวรี่มาทำงาน ใช้ Action ชื่อ OpenQuery
ใช้โค้ดสั่งคิวรี่มาทำงาน ใช้ DoCmd.OpenQuery "ชื่อคิวรี่"

ใช้แมโครเปิดฟอร์ม ใช้ Action ชื่อ OpenForm
ใช้โค้ดสั่งเปิดฟอร์ม ใช้ DoCmd.OpenForm "ชื่อฟอร์ม"

ใช้แมโครปิดฟอร์ม ใช้ Action ชื่อ Close
ใช้โค้ดสั่งปิดฟอร์ม ใช้ DoCmd.Close acForm, "ชื่อฟอร์ม"

อ้างอิงชื่อคอนโทรล (เท็กซ์บ็อกซ์, คอมโบบ็อกซ์, ...) บนฟอร์ม ใช้ Forms![ชื่อฟอร์ม]![ชื่อคอนโทรล]
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

212
ผมให้ไปแค่แนวคิดครับ ส่วนจะใช้วิธีเขียนโค้ด เขียนแมโคร หรือจะสร้างคิวรี่ ไม่ว่าจะเป็น Append Query หรือ Update Query ก็อยู่ที่รายละเอียดปลีกย่อยของระบบที่คุณได้ออกแบบไว้ครับ ถ้าไม่ถนัดเขียนโค้ดก็ต้องลองทำโดยแมโครดูก่อนครับ ถ้าไม่ได้ค่อยแก้ปัญหาบางส่วนโดยการเขียนโค้ด
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

213
แนวคิดก็คือ เมื่อรู้ว่าเรคอร์ดไหนบ้างที่เป็นผลลัพธ์ที่ค้นหาได้ ก็ให้เขียนเรคอร์ดเหล่านั้นลงในเทเบิลชั่วคราวอีกเทเบิลนึง (T) ซึ่งมีฟิลด์ต่างๆตามที่ต้องการแสดงในหน้า [การค้นหา] แต่ให้เพิ่มอีกหนึ่งฟิลด์ (S) ที่มี data type เป็น yes/no ซึ่งให้นำไปทำเป็น check box บนแต่ละบรรทัดในฟอร์ม [การค้นหา] ดังนั้นผู้ใช้ก็จะสามารถเลือก/ไม่เลือกทำเครื่องหมายสำหรับแต่ละบรรทัดได้ พอกดปุ่ม [ทำการเบิก] ก็ให้เขียนทุกเรคอร์ดในเทเบิล T ที่ฟิลด์ S มีค่าเป็น True ลงในเทเบิลการเบิกจ่ายและเทเบิลรายการเบิกจ่าย (RI)   แล้วค่อยเปิดฟอร์มเบิก/จ่ายตามเอกสารที่เพิ่งสร้างอีกที

ส่วนการเพิ่มหรือตัดสต็อก ง่ายๆก็สร้าง Update Query ที่โยงระหว่างเทเบิลสต็อก กับ เทเบิล RI โดยอ้างตามรหัสใบเบิกจ่ายวัตถุดิบบนหน้าจอ [การเบิกจ่ายวัตถุดิบ]  แล้วในปุ่ม [บันทึก] ก็ให้เรียก Update Query ตัวนี้มาทำงานครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Supanida

214
Error อะไรไม่ได้บอก งั้นก็เดาเอาตามนี้แล้วกัน อีกอย่าง ชื่อฟิลด์ที่บอกมาในโพสแรกบอกชื่อ Year กับ Month ไม่มี s แต่ในโค้ดที่คุณเขียนกลับมี s ก็ไปแก้ตำแหน่งสีแดงให้ถูกต้องเองแล้วกันนะครับว่ามี s หรือไม่มี s

Me.Sequence = Nz(DMax("Sequence", "ชื่อเทเบิล", "Years = '" & Me.Years & "' and Months = '" & Me.Months & "' "), 0) + 1

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

215
ใส่โค้ดนี้ไว้ใน Before Update event procedure ของฟอร์มครับ

โค๊ด: [Select]
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Nz(Me.Sequence, "") <> "" Then Exit Sub
   
    Me.Sequence = Nz(DMax("Sequence", "ชื่อเทเบิล", "Year = " & CStr(Me.Year) & " and Month = " & CStr(Me.Month)), 0) + 1
End Sub

ในโค้ดนี้ ถ้าช่อง Sequence ไม่ได้ใส่ค่าอะไรไว้ เมื่อทำการบันทึกเรคอร์ด โปรแกรมจะไปหาค่าถัดจากค่าสูงสุดที่หาได้ในปีและเดือนตามที่ป้อนในหน้าฟอร์ม แต่ถ้ามีค่า Sequence อยู่บนหน้าฟอร์มแล้ว โปรแกรมก็จะไม่ค้นหาให้ ก็ถือว่าใช้ค่าที่อยู่บนหน้าฟอร์มนั้นเลย

ยังไงก็ตาม ต้องระวังเกี่ยวกับการลบเรคอร์ดแล้วทำให้ค่า Sequence นั้นแหว่งไปด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Eik Q Sang

216
x \ y = จำนวนเต็มของ x / y
x Mod y = เศษเหลือจาก x / y เป็นจำนวนเต็ม


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

หน้า: 1 ... 9 10 11 [12] 13 14 15 ... 19