เคอร์เซอร์และการจัดเก็บข้อมูล
กระทู้เก่าบอร์ด อ.Yeadram

 3,567   18
URL.หัวข้อ / URL
เคอร์เซอร์และการจัดเก็บข้อมูล

มีคำถามขอรบกวนผู้รู้ทุกท่านครับผม
1 เวลาคีย์ข้อมูลเข้าไปใหม่ (ปัญหาของผมคือเมื่อคีย์ข้อมูลเข้าหน้าฟอร์ม ถ้าคีย์ตัวที่เป็นคีย์หลักด้วยจะบันทึกให้เอง ) แต่ผมอยากจะกำหนดว่าให้คลิ๊กที่ปุ่มบันทึกเท่านั้นถึงจะบันทึกข้อมูลลงในตารางได้ พร้อมกับมีข้อความแจ้งว่าคุณต้องการบันทึกข้อมูลหรือไม่

2 ในหน้าฟอร์มหลักซึ่งจะมีฟอร์มย่อยอยู่ด้วย เมื่อคลิ๊กเลือก Record ในฟอร์มย่อย   ข้อมูลในฟอร์มหลักก็จะเปลี่ยนไปด้วย แต่ปัญหาคือ เมื่อเราคลิ๊กเลือก Record ในฟอร์มย่อยตัวเคอร์เซอร์(ที่เป็นแท็บสีดำ) ไม่ยอมเลื่อนตามที่เราคลิ๊ก
และอยากให้สามารถกดลูกศรขึ้น ลง ที่คีย์บอร์ดเพื่อเลือกข้อมูลได้


18 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R15441
1. http://www.thai-access.com/yeadram_view.php?topic_id=2194 และ http://www.thai-access.com/yeadram_view.php?topic_id=3120

2. เพราะ RecordSource ของฟอร์มย่อยเป็นคิวรี่ที่มีเงื่อนไขโดยอิงค่าจากฟอร์มหลักเช่นกัน เมื่อฟอร์มหลักถูกฟิลเตอร์ คิวรี่จึงถูก Requery โดยอัตโนมัติ(แม้ว่าค่าดังกล่าวจะมีการเปลี่ยนแปลงก็ตาม) เป็นผลให้ฟอร์มย่อยถูก Requery ไปด้วย การ Requery จะทำให้กระโดดกลับไปเรคอร์ปัจจุบันเสมอ   วิธีแก้ที่น่าจะดีก็คือเปลี่ยน RecordSource จากคิวรี่ ไปเป็นเมื่อใดที่มีการเลือกเงื่อนไขเพื่อค้นหา ก็ให้สร้าง SQL SELECT statement ที่ตรงตามเงื่อนไขนั้น แล้วใส่ statement นี้ลงมาที่ RecordSource ของฟอร์มโดยตรงเลยครับ
2 @R15525
อ้างอิงคำตอบ ข้อ 2 ของ อ.สันติสุข
อาจารย์พอจะมีตัวอย่างบ้างหรือเปล่าครับ ประมาณว่าต้องเขียนอย่างไรแล้วต้อง
เอาไปใส่ส่วนไหนบ้าง ทั้งฟอร์มย่อยหรือฟอร์มหลักเลยหรือเปล่า (มือใหม่ต้องขอรบกวนอาจารย์อีกครั้งน่ะครับ) ผมยังงงอยู่น่ะครับ

ขอขอบพระคุณท่านอาจารย์ที่สละเวลาอันมีค่ามาช่วยแนะนำ ขอบคุณมากครับผม
3 @R15529
กลางวันยังไม่มีเวลาตอบนะครับ อย่างเร็วคือคืนนี้
4 @R15545
ถ้าคุณเปิดคิวรี่ QryOld ใน SQL View คุณจะเห็น SELECT statement ของคิวรี่ เราต้องสร้าง statement ที่คล้ายๆกับที่เห็นนั่นแหล่ะครับ โดยที่เราต้องหาค่าต่างๆของเท็กซ์บ็อกซ์บนฟอร์ม แล้วมาใส่ใน statement นี้แทนการอ้างชื่อเท็กซ์บ็อกซ์บนฟอร์ม ซึ่งเป็นสาเหตุทำให้เกิดปัญหาที่ถามมา เราจะเอา statement นี้ใส่ลงใน RecordSource ของฟอร์มย่อยแทน ทำเมื่อ 1) เปิดฟอร์มนี้ขึ้นมา 2) เมื่อมีการเพิ่มหรือลบเรคอร์ดในฟอร์มหลัก แต่ก่อนอื่นให้เอา QryOld ออกจาก RecordSource ของฟอร์มย่อยเสียก่อน แล้วเพิ่มโค้ดนี้เข้าไปในฟอร์มโมดูลของฟอร์มหลัก

Private Sub AssignSubFormRecordSource
Dim SQL as String
SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.DocName Like '*" & Me.TxtDocName & "*') " _
& "      AND (D.DateDoc Like '*" & Me.TextSearch & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& " ORDER BY D.DocNum; "
Me.FrmOldSub.form.RecordSource = SQL
End Sub


แล้วแก้โค้ดในโมดูลนี้เพื่อเรียกใช้ AssignSubFormRecordSource
Private Sub Form_Load()
ReSizeForm Me
DoCmd.Maximize
AssignSubFormRecordSource
End Sub

เมื่อมีการลบหรือเพิ่มรายการในฟอร์มหลัก ก็ต้องปรับปรุงลิสท์ของเอกสารในฟอร์มย่อยด้วย ดังนั้นจึงต้องเพิ่มโค้ด
Private Sub Form_Delete(Cancel As Integer)
AssignSubFormRecordSource
End Sub


Private Sub Form_AfterUpdate()
AssignSubFormRecordSource
Me.Refresh
End Sub

ปล.โค้ดทั้งหมดนี่เขียนเอาโดยที่ยังไม่ได้ทดลองนะครับ อาจเกิด syntax error หรือ runtime error ได้ คุณไปทดลองแก้ไขดูอีกทีครับ
5 @R15583
อ้างอิงคำตอบของอาจารย์สันติสุข
"ราต้องหาค่าต่างๆของเท็กซ์บ็อกซ์บนฟอร์ม แล้วมาใส่ใน statement "
อยากทราบว่าค่าต่าง ๆ ของเท็กซ์บ็อกมันเป็นค่าอะไรเหรอครับ ผมสามารถดูจากที่ไหนถึงจะได้ค่า ตามที่อาจารย์บอก และมันเป็นค่าของเท็กซ์บ็อกที่ไว้ Search หาข้อมูลใช่ไหมครับ
6 @R15584
ค่าของเท็กซ์บ็อกซ์ที่ว่าก็คือค่าของ Text74, TxtDocName, ... , TxtModel ซึ่งผมเขียนให้ดูแล้วในโค้ดข้างบน(สีน้ำเงิน)ครับ
7 @R15588
ตอนเอาไปวางใน RecordSource ของฟอร์มย่อย
copy ตัวนี้

Private Sub AssignSubFormRecordSource
Dim SQL as String
SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.DocName Like '*" & Me.TxtDocName & "*') " _
& "      AND (D.DateDoc Like '*" & Me.TextSearch & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& " ORDER BY D.DocNum; "
Me.FrmOldSub.form.RecordSource = SQL
End Sub

ไปวางเลยเหรออาจารย์
เห็นอาจารย์บอกว่า สร้าง Statement ให้เหมือนใน Query แต่ให้ใส่ค่าของ Textbox แทนชื่อ
ซึ่ง Query เป็นแบบนี้

SELECT Document.DocNum, Document.DocName, Document.DocRev, Document.DocMas, Document.DateRec, Document.DateDoc, Document.DateUse, Document.Section, Document.SecName, Document.Customer, Document.Model, Document.Group, Document.Opertor, Document.Comment, Document.PathName, Document.QA, Document.EN, Document.MK, Document.QC, Document.PD1, Document.PD2, Document.PD3, Document.PD4, Document.PD5, Document.AD1, Document.AD2, Document.AD3, Document.IT, Document.FA
FROM Document

/ในส่วนตรงนี้ให้ใส่ค่า Textbox เหมือน code ข้างบนหรือเปล่าครับ

WHERE (((Document.SecName) Like "*" & Forms!FrmReport!SecName & "*") And ((Document.Customer) Like "*" & Forms!FrmReport!ComCust & "*") And ((Document.Model) Like "*" & Forms!FrmReport!ComModel & "*") And ((Document.Group)=False))
ORDER BY Document.DocNum, Document.DateRec;


ให้นำ Statement วางใน RecordSource ของรูปข้างล่างใช่ไหมครับ

รูปข้างบนเป็น Property ของ Form ย่อย
และก็

เพิ่มโค้ดนี้เข้าไปในฟอร์มโมดูลของฟอร์มหลัก

Private Sub AssignSubFormRecordSource
Dim SQL as String
SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.DocName Like '*" & Me.TxtDocName & "*') " _
& "      AND (D.DateDoc Like '*" & Me.TextSearch & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& " ORDER BY D.DocNum; "
Me.FrmOldSub.form.RecordSource = SQL
End Sub

คือให้ว่างใน หน้า Source Code ของ Forms หลักเลยใช่ไหมครับ
8 @R15589
และส่วน Code ข้างล่างให้ใส่ในฟอร์มย่อยใช่หรือไม่ครับผม

Private Sub Form_Load()
ReSizeForm Me
DoCmd.Maximize
AssignSubFormRecordSource
End Sub

เมื่อมีการลบหรือเพิ่มรายการในฟอร์มหลัก ก็ต้องปรับปรุงลิสท์ของเอกสารในฟอร์มย่อยด้วย ดังนั้นจึงต้องเพิ่มโค้ด
Private Sub Form_Delete(Cancel As Integer)
AssignSubFormRecordSource
End Sub

Private Sub Form_AfterUpdate()
AssignSubFormRecordSource
Me.Refresh
End Sub

ต้องขอโทษอาจารย์ด้วยที่ผมยังงงๆ อย่างไรก็ขอบคุณอาจารย์มากครับผม

9 @R15590
- Private Sub AssignSubFormRecordSource จะเป็นโค้ดที่สร้าง statement เพื่อใส่เข้าไปใน RecordSource ครับ ไม่ใช่เอาโค้ดนี้ไปใส่ใน RecordSource

- โค้ดที่ให้ไปทั้งหมด เป็นโค้ดเดิมในโมดูลของฟอร์มหลักอยู่แล้ว ยกเว้น Private Sub AssignSubFormRecordSource ที่ต้องเพิ่มเข้าไปในโมดูลของฟอร์มหลัก   ไม่มีโค้ดไหนใส่ในโมดูลของฟอร์มย่อยครับ
10 @R15592
ได้แล้วครับขอถามอาจารย์อีกนิด
ถ้าใน ฟอร์มย่อยมีฟิวส์เพิ่มมาอีกสองฟิวส์
ชื่อ DocName และ Group (เป็นเช็คบ็อก) ฟิวส์ Group ไว้สำหรับเลือก เพื่อย้ายข้อมูลไปอีกฟอร์มน่ะครับ

ผมจะเพิ่มฟิวส์ทั้งสองใน Code อย่างไรครับ
เพิ่มใน Codeข้างล่างได้เลยหรือเปล่าครับผม

Private Sub AssignSubFormRecordSource
Dim SQL as String
SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.DocName Like '*" & Me.TxtDocName & "*') " _
& "      AND (D.DateDoc Like '*" & Me.TextSearch & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& " ORDER BY D.DocNum; "
Me.FrmOldSub.form.RecordSource = SQL
End Sub

ดั่งรูปด้านล่างอ่ะครับ มันไม่รู้จักชื่อเอกสาร และก็เลือกเช็คบ็อกไม่ได้



     ขอถามเพิ่มเติมอีกเรื่องครับ คือในฟอร์มสำหรับค้าหาข้อมูล ผมอยากให้มันขึ้นเป็นหน้าฟอร์มเปล่า ทั้งฟอร์มหลักและฟอร์มย่อย พอเลือกค้นหาข้อมูลค่อยให้มันขึ้นแสดงข้อมูลที่ค้นพบ
    มีคนเคยบอกว่าให้ตั้ง data entry เป็น Yes ผมก็ตั้ง ทั้งฟอร์มหลักและฟอร์มย่อย แต่พอค้นหาข้อมูลกับไม่แสดงอะไรขึ้นมาเลย แบบนี้อาจารย์พอมีวิธีหรือเปล่าครับ
ผมต้องขออภัยที่รบกวนอาจารย์มามาก อาจารย์ทำให้ผมเข้าใจอะไรหลาย ๆอย่างมากเลยครับ    ขอบพระคุณอย่างสูงครับผม
11 @R15594
เพิ่มได้ครับ แต่ฟิลด์ DocName กับ Group ต้องเป็นฟิลด์ที่มีอยู่ในเทเบิล Document นะครับ ก็แก้โค้ดเป็น

SQL = "SELECT D.DocNumม, DocName, [Group] FROM Document AS D "

ส่วนเท็กซ์บ็อกซ์ในฟอร์ม ก็ต้องใส่คำว่า DocName และ Group ลงใน ControlSource ของเท็กซ์บ็อกซ์ด้วยครับ

ปล. ไม่ควรตั้งฟิลด์ชื่อว่า Group เพราะเป็นคำ reserved word เวลาใช้งานแล้วทำให้ต้องมานั่งกังวลว่าจะทำให้คำสั่งทำงานผิดหรือเปล่า

เรื่องโหมด data entry เอาไว้มีเวลาแล้วค่อยทำให้ดูครับ หลักๆคือต้องสวิทช์กลับให้ data entry เป็น false ครับ
12 @R15600
เอาอย่างนี้แล้วกัน เปลี่ยนจากการกำหนด DataEntry มาเป็นการเพิ่มโค้ดสีฟ้าข้างล่างนี้แล้วกัน คือให้กรองเอาเรคอร์ดที่ DocNum เป็น '' ซึ่งเป็นค่าที่เป็นไปไม่ได้อยู่แล้ว มันก็จะเป็นหน้าว่างๆเอง

Private Sub Form_Load()
ReSizeForm Me
DoCmd.Maximize
AssignSubFormRecordSource
Me.Filter = "[DocNum] like ''"
Me.FilterOn = True

End Sub
13 @R15603
ขอคุณครับอาจารย์
คือมันมีปุ่มบันทึกข้อมูล พอผมกลับมาแก้ไขข้อมูลและคลิ๊กที่ปุ่มบันทึก มันก็วิ่งไปที่ Reccord แรก (ที่ฟอร์มย่อยอ่ะครับ) ผมต้องเพิ่ม AssignSubFormRecordSource
ในเหตุการณ์ไหนอีกหรือเปล่าครับ
ในปุ่มบันทึกมี Code
       IsSaveClicked = True
       Me.Dirty = False   
ประมาณว่าถ้าไม่คลิ๊กที่ปุ่มบันทึก ข้อมูลก็จะไม่บันทึกให้


ส่วนเรื่องการปรับให้ฟอร์มเป็นค่าว่าง ผมลองวาง
Me.Filter = "[DocNum] like ''"
Me.FilterOn = True
ในฟอร์มหลักแล้ว เมื่อโหลดขึ้นมาที่ฟอร์มหลักเป็นหน้าว่าง ๆ แล้ว แต่ที่ฟอร์มย่อยยังมีข้อมูลเหมือนเดิมครับผม(ยังไม่เป็นหน้าว่าง ๆให้ )
14 @R15604
เพิ่มเติมไม่ใช่เฉพาะคลิ๊กที่ปุ่มบันทึกเท่านั้น
เมื่อมีการแก้ไขข้อมูล ฟิวส์ใดก็ตาม มันก็จะวิ่งไปที่ Reccord แรกเสมอเลยครับ
แม้จะยังไม่คลิ๊กปุ่มบันทึกก็ตาม
15 @R15607
- เรื่องที่เซฟแล้วบรรทัดปัจจุบันจองฟอร์มย่อยกระโดดกลับไปที่เรคอร์ดแรกนั้น ผมทดลองสร้างที่เครื่องผมมันก็ไม่เป็นนะครับ

- เรื่องที่ว่าฟอร์มย่อยไม่เป็นหน้าว่างเปล่าเมื่อเปิดขึ้น ให้แก้โค้ด AssignSubFormRecordSource โดยเพิ่มส่วนที่เป็นสีน้ำเงิน แล้วเฉพาะใน Form_Load event procedure ก็ให้เพิ่มส่วนสีน้ำเงินเช่นกัน

Private Sub Form_Load()
ReSizeForm Me
DoCmd.Maximize
AssignSubFormRecordSource 0
End Sub

Private Sub AssignSubFormRecordSource(Optional Mode as Integer = 1)
Dim SQL as String

If Mode = 0 then
SQL = "SELECT D.DocNum FROM Document AS D WHERE D.DocNum = ''; "
Else

SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.DocName Like '*" & Me.TxtDocName & "*') " _
& "      AND (D.DateDoc Like '*" & Me.TextSearch & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& " ORDER BY D.DocNum; "
End If
Me.FrmOldSub.form.RecordSource = SQL
End Sub
16 @R15613
ขอบคุณคับอาจารย์
ผมได้ส่ง โปรแกรมส่วนที่มีปัญหา ไว้ที่บอร์ดกลาง
www.gmail.com
ปัญหาที่1
ตัวที่มีปัญหา ใน FrmReport ที่ว่า พอเลือกข้อมูลที่ฟอร์มย่อย
แล้ว ทำการแก้ไขข้อมูล แล้วเคอร์เซอร์กลับวิ่งไปที่ Reccordแรก
ลองแก้ตามอาจารย์บอกแล้ว แต่ยังมีปัญหาอยู่ช่วยดูด้วน่ะครับ

ปัญหาที่2
ตัวที่มีปัญหา ใน FrmSearch ผมต้องกำหนด
Private Sub AssignSubFormRecordSource(Optional Mode As Integer = 1)
Dim SQL As String
If Mode = 0 Then
SQL = "SELECT D.DocNum FROM Document AS D WHERE D.DocNum = ''; "
Else
SQL = "SELECT D.DocNum FROM Document AS D " _
& " WHERE (D.DocNum Like '*" & Me.Text74 & "*') " _
& "      AND (D.SecName Like '*" & Me.CmDoc & "*') " _
& "      AND (D.Customer Like '*" & Me.CmCustomer & "*') " _
& "      AND (D.Model Like '*" & Me.TxtModel & "*') " _
& "      AND (D.Grp=False) " _
& " ORDER BY D.DocNum; "
End If
Me.FrmReporSearchtsub.Form.RecordSource = SQL

End Sub

เพื่อให้มันแสดงข้อมูลเฉพาะตัวที่มันถูกเลือกใน checkbox
ซึ่งข้อมูลตรงนี้มันอ้างอิงข้อมูลมาจากการล็อกอิน โดยมีตารางเก็บเป็นเป็นล็อกไว้
ในฟอร์มนี้ผมให้ ดึง user ล่าสุดที่ล็อกอินเข้ามา (ก็คือแผนกต่าง ๆนั้นเอง) ผมก็ได้เขียนเงื่อนไขว่าถ้าแผนกไหนล็อกอินเข้ามาก็ให้มันแสดงข้อมูลของแผนกนั้น ซึ้งผมให้มันอ้างอิงจาก checkbox ที่ติ๊กในหน้า FrmReport ซึ่งทำได้แล้ว แต่มันมีปัญหาตรงที่พอเลือกข้อมูล reccord กลาง ๆ หรือสุดท้าย มันเลือกให้แต่เคอเซอร์กลับวิ่งไปที่ Reccord แรก ผมก็เลย copy code ด้านบนของอาจารย์เพื่อมาบังคับไม่ให้มันกลับไป Reccord แรกเมื่อเลือกข้อมูลในฟอร์มย่อย ผมควรจะเพิ่ม Code ที่ผมลองเขียนเพิ่มเติมข้างล่าง เข้าไปที่ Code ข้างบน แต่มันมีปัญหาว่า ถ้าแผนกไหนข้อมูลไม่ถูกติ๊ก(แต่ตัวมันถูกติ๊ก) มันก็จะไม่แสดงข้อมูลขึ้นมาด้วย
แล้วผมควรจะแก้ไขอย่างไรเพื่อตามที่เราต้องการ

ซึ่งข้อมูลที่มี checkbox ทั้งหมดมีดังนี้
& "      AND (D.QA=True) " _
& "      AND (D.EN=True) " _
& "      AND (D.MK=True) " _
& "      AND (D.QC=True) " _
& "      AND (D.PD1=True) " _
& "      AND (D.PD2=True) " _
& "      AND (D.PD3=True) " _
& "      AND (D.PD4=True) " _
& "      AND (D.PD5=True) " _
& "      AND (D.AD1=True) " _
& "      AND (D.AD2=True) " _
& "      AND (D.AD3=True) " _
& "      AND (D.FA=True) " _
& "      AND (D.IT=True) " _
ผมเขียนเงือนไขไม่เป็นน่ะครับ
ขอรบกวนอีกครั้งผม
17 @R15616
ตอนนี้ยังไม่ว่างดูให้นะครับ
18 @R15752
ในปัญหาที่ 1 ให้เพิ่ม/แก้ไขโค้ดเป็นดังนี้

Option Compare Database
Option Explicit
Dim IsSaveClicked   As Boolean
Dim CurrentDocNum   As Variant
Dim IsNewRecord     As Boolean

Private Sub AssignSubFormRecordSource()
    Dim RS As DAO.Recordset
    
    Dim SQL As String

    SQL = "SELECT D.DocNum , DocName, [Grp] FROM Document AS D " _
    & " WHERE (D.SecName Like '*" & Me.SecName & "*') " _
    & "      AND (D.Customer Like '*" & Me.ComCust & "*') " _
    & "      AND (D.Model Like '*" & Me.ComModel & "*') " _
    & "      AND (D.Grp=False) " _
    & " ORDER BY D.DocNum; "

    Me.FrmReportsub.Form.RecordSource = SQL
    
    If IsNull(CurrentDocNum) Then Exit Sub
    
    Set RS = Me.FrmReportsub.Form.RecordsetClone
    If IsNewRecord Then
        RS.FindFirst "DocNum = '" & CurrentDocNum & "' "
    Else
        RS.FindFirst "DocNum = '" & CurrentDocNum & "' "
    End If
    If Not RS.NoMatch Then
        Me.FrmReportsub.Form.Bookmark = RS.Bookmark
    End If
    RS.Close: Set RS = Nothing
End Sub


Private Sub Form_Current()
    CurrentDocNum = Me.DocNum
End Sub

Private Sub Form_Delete(Cancel As Integer)
    IsNewRecord = False
    AssignSubFormRecordSource
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
    IsNewRecord = True
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = Not IsSaveClicked
    CurrentDocNum = Me.DocNum
    IsNewRecord = False
End Sub

Private Sub Form_AfterUpdate()
    IsSaveClicked = False
    AssignSubFormRecordSource
End Sub

แล้วผมเห็นว่าคุณใส่ AssignSubFormRecordSource เต็มไปหมด ไม่จำเป็นนะครับ ใส่เฉพาะที่ผมให้มาเท่านี้ก็พอ ที่อื่นเอาออกให้หมด

ปัญหาที่ 2 ผมไม่ค่อยแน่ใจความต้องการ แต่ถ้าต้องการว่าให้เลือกเฉพาะเรคอร์ดที่ตรงตามแผนกที่คลิกเลือกบนหน้าจอแล้ว ก็ให้เพิ่มโค้ดนี้เข้าไปต่อท้ายครับ แต่ข้อจำกัดของโค้ดต่อท้ายนี้คือ ต้องเลือกอย่างน้อย 1 แผนกนะครับ ไม่อย่างนั้นจะไม่มีเรคอร์ดอะไรแสดงออกมาเลย

& "      AND ( FALSE " _
& iif(me.QA, " OR (D.QA=True) ","") _
& iif(me.EN, " OR (D.EN=True) ","") _
...
...
...
& iif(me.IT, " OR (D.IT=True) ","") _
& " ) "

ส่วนปัญหาที่มันกระโดดไปเรคอร์ดแรกบ่อยๆ ก็ให้แก้ตามปัญหาที่ 1 ดูครับ

คำสั่ง Refresh ไม่ค่อยจำเป็นสำหรับงานนี้ ก็เอาออกเสียนะครับ

ปล.
อยู่โรงงานใหญ่อย่างนี้ มันมีอะไรให้ทำได้เยอะแยะนะครับ เพราะลูกค้าผมก็เป็นโรงงานที่โรจนะ ทำมาหลายปีมากแล้ว ยังไม่จบสักที จริงๆยังขาดอีกเยอะเลย โดยเฉพาะการคำนวน MRP แต่หาโปรแกรมที่ไม่แพงเกินไปยังไม่มี เขียนเองก็ต้องขอเวลาสัก 2 ปี เพื่อศึกษาภาษาที่ใช้แก้ไขปัญหาเฉพาะด้าน ไม่ทราบว่าที่นั่นใช้โปรแกรมอะไรทำ MRP หรือไม่ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3158s