สงสัยเรื่องการทำงานของ โปรแกรมย่อยที่ทำงานช้า
กระทู้เก่าบอร์ด อ.Yeadram

 1,038   5
URL.หัวข้อ / URL
สงสัยเรื่องการทำงานของ โปรแกรมย่อยที่ทำงานช้า

ผมเขียน VBA   โดยมีโปรแกรมหลัก และ โปรแกรมย่อย   เมื่อโปรแกรมหลักเรียกให้โปรแกรมย่อยทำงาน     หากโปรแกรมย่อยทำงานช้า เช่น ไปเปิด Table แล้วค้นหาข้อมูล (ต้องใช้เวลาค้นหา) โปรแกรมหลักจะไม่รอให้โปรแกรมย่อยทำงานเสร็จ โปรแกรมหลักมันจะข้าม เพื่อทำงานคำสั่งถัดไปทันที ผลก็คือโปรแกรมทำงานผิดพลาด เพราะข้อมูลจากโปรแกรมย่อยที่ไปทำงานอยู่ยังไม่ส่งกลับมาเลย (เพราะยังทำงานไม่เสร็จ)    แต่ถ้า SET ให้ทำงานทีละขั้น (ซึ่งจะช้า) จะไม่พบปัญหานี้ ทำงานได้ปกติ

ไม่ทราบว่าท่านที่เคยเขียน VBA พบปัญหาแบบนี้หรือไม่ และ ท่านแก้ไขอย่างไร เป็นทั้ง VBA ของ Access และ Excel     ขอบคุณครับ

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

1 @R23921
ช่วยแสดงโค้ดตั้งแต่บรรทัดที่เรียกโปรแกรมย่อยและบรรทัดต่อๆไปอีกสัก 10 บรรทัดให้ดูหน่อย หรือถ้าแสดงทั้งหมดได้ก็ดีครับ
2 @R23923
Option Compare Database

'ตรงนี้คือ โปรแกรมหลัก

Private Sub Command0_Click()
Dim no_ As Double
no_ = 0

' เรียกไปโปรแกรมย่อย
Document_last_no "LWG_IN", no_
Me.Text1 = no_

End Sub


' ตรงนี้คือ โปรแกรมย่อย

Public Sub Document_last_no(Transaction_Code As Variant, Last_Document_No As Double)
     Dim sy_m003_rs As Recordset
     Set sy_m003_rs = CurrentDb.OpenRecordset("select * from SY_M003 where   CODE = '" & Transaction_Code & "'")
     
     With sy_m003_rs
     If Not .AbsolutePosition = -1 Then
     
        Last_Document_No = 1 + .Fields("Value").Value

        .Edit
        .Fields("Value").Value = Last_Document_No
        .Fields("This_year").Value = Year(Date)
        .Update
    End If
    sy_m003_rs.Close
    End With
End Sub



เรียน อาจารย์ สันติสุข   ปกติ Table sy_m003 มีขนาดใหญ่มาก และ อยู่ที่ Server   หากโปรแกรมทำงานไม่ทัน Me.Text1 จะได้ค่า 0 ออกมา     คือผมตัดบางส่วนของโปรแกรมออกมา ตรงที่เป็นปัญหาครับผม

3 @R23924
แก้ sub Document_last_no() ให้เป็น function แทนครับ

Public Function Document_last_no(Transaction_Code As Variant, Last_Document_No As Double) as Double
...
...
Document_last_no = Last_Document_No
End Function

ในโปรแกรมหลักให้ใช้แบบนี้แทน
Me.Text1 = Document_last_no("LWG_IN", no_ )
4 @R23925
ลอง disable Accelerator Mode สำหรับการทำงานของ Graphic Card ดู แล้วดูว่าผลจะออกมาถูกต้องหรือไม่ http://www.thewindowsclub.com/hardware-acceleration-windows-7

ถ้ายังไม่ได้ ช่วยตอบคำถามเหล่านี้

1. เราใช้ Linked-Table โดยโยงจาก front end ไปหาฐานข้อมูลบนเซิร์ฟเวอร์ใช่หรือไม่
2. ถ้าใช้ Linked-Table   เราลิงค์ผ่าน ODBC หรือเปล่า
3. แน่ใจหรือไม่ว่าขณะที่เกิดปัญหานั้น (Text1 แสดงเป็น 0) มีเรคอร์ดที่ CODE เท่ากับ "LWG-IN" อยู่เสมอ หรือว่าเรคอร์ดนี้อาจมีคนอื่นหรือจากโปรแกรมอื่นที่เป็นไปได้ว่ากำลังแก้ไข/ลบด้วยเช่นกัน
4. ใน Sub Document_last_no   ตัวโค้ดที่แสดงนี่คือทั้งหมดแล้ว หรือว่ายังมีส่วนอื่นๆอีก เช่น มีบรรทัด On Error ... เป็นต้น
5. แน่ใจหรือไม่ว่าบรรทัด Document_last_no "LWG_IN", no_ ได้ทำงานทุกครั้ง     ก่อนบรรทัดนี้มี If หรือเงื่อนไขอะไรที่อาจทำให้โค้ดบรรทัดนี้ทำหรือไม่ทำด้วยหรือไม่
5 @R23930
ใช้ได้แล้วครับ   ขอบคุณ อาจารย์ทั้ง 2 ท่านเป็นอย่างยิ่ง
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2796s