กระทู้เก่าบอร์ด อ.Yeadram
1,191 5
URL.หัวข้อ /
URL
สงสัยเรื่องการทำงานของ โปรแกรมย่อยที่ทำงานช้า
ผมเขียน VBA โดยมีโปรแกรมหลัก และ โปรแกรมย่อย เมื่อโปรแกรมหลักเรียกให้โปรแกรมย่อยทำงาน หากโปรแกรมย่อยทำงานช้า เช่น ไปเปิด Table แล้วค้นหาข้อมูล (ต้องใช้เวลาค้นหา) โปรแกรมหลักจะไม่รอให้โปรแกรมย่อยทำงานเสร็จ โปรแกรมหลักมันจะข้าม เพื่อทำงานคำสั่งถัดไปทันที ผลก็คือโปรแกรมทำงานผิดพลาด เพราะข้อมูลจากโปรแกรมย่อยที่ไปทำงานอยู่ยังไม่ส่งกลับมาเลย (เพราะยังทำงานไม่เสร็จ) แต่ถ้า SET ให้ทำงานทีละขั้น (ซึ่งจะช้า) จะไม่พบปัญหานี้ ทำงานได้ปกติ
ไม่ทราบว่าท่านที่เคยเขียน VBA พบปัญหาแบบนี้หรือไม่ และ ท่านแก้ไขอย่างไร เป็นทั้ง VBA ของ Access และ Excel ขอบคุณครับ
ไม่ทราบว่าท่านที่เคยเขียน 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 ออกมา คือผมตัดบางส่วนของโปรแกรมออกมา ตรงที่เป็นปัญหาครับผม
'ตรงนี้คือ โปรแกรมหลัก
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_ )
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 หรือเงื่อนไขอะไรที่อาจทำให้โค้ดบรรทัดนี้ทำหรือไม่ทำด้วยหรือไม่
ถ้ายังไม่ได้ ช่วยตอบคำถามเหล่านี้
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 ท่านเป็นอย่างยิ่ง
Time: 0.3725s