รบกวนอีกแล้วครับผมเรื่องใส่ข้อความแทนเมื่อคลิก
กระทู้เก่าบอร์ด อ.Yeadram

 1,286   7
URL.หัวข้อ / URL
รบกวนอีกแล้วครับผมเรื่องใส่ข้อความแทนเมื่อคลิก

รบกวนอาจารย์ด้วยครับ ผมมี ฟอร์มลงการขายอยู่หนึ่งฟอร์ม แต่ไม่ต้องการให้มีการลบบิลได้ จึงทำฟอร์มสำหรับยกเลิกเป็นบิลเสีย ผ่านฟอร์มยกเลิก โดยมีฟอร์มดังนี้

ฟอร์มหลักชื่อ FmOrder_Out_Hd_Cc_ExV (จากTableชื่อ TbOrder )
ฟอร์มย่อยชื่อ FsOrderDetail_Out_Hd_Cc_ExV (จากTableชื่อ TbOrderDetail)

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

จึงอยากสร้างปุ่มให้ โดย เมื่อคลิกแล้ว จะแสดงหน้าต่าง ถามว่า "ท่านแน่ใจว่าต้องการยกเลิกรายการนี้เป็นบิลเสียหรือไม่ หากตอบ Y=ใช่ N=ไม่ใช่"
และเมื่อกด Y กด Enter ก็จะทำงานโดย เปลี่ยนข้อความในฟิล์ด OrderBuild เป็น "บิลเสีย"ทั้ง2ฟอร์ม แล้วยังคงเปิดฟอร์มอยู่ และแสดงรายการปรกติถูกตั้งให้แสดงแสดงแต่รายการที่เป็นบิลดีอยู่แล้ว
หากกด N กด Enter ก็จะไม่มีการเปลี่ยนแปลงใดๆเกิดขึ้น

ฟิล์ด OrderBuild จะใช้เป็นComboที่ใช้แหล่งข้อมูลจาก TzOrderBuild ที่มีเพียงฟิล์ดเดียว และมีเพียง2เรคคอร์ดคือ "บิลดี" และ "บิลเสีย" ครับ

ไม่ทราบว่าจะเขียนโค๊ตอย่างไรครับ เป็นโค๊ตที่ต้องการมากๆ รบกวนด้วยนะครับ

ขอบคุณครับ

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

1 @R04261
dim db as dao.database

if msgbox("ท่านแน่ใจ...", vbQuestion + vbYesNo) = vbNo then
   exit sub
end if

dbengine.begintrans

set db = currentdb( )

' ถ้า OrderID ไม่ใช่ฟิลด์เดียวที่เป็น PrimaryKey ของ TbOrder โค้ดข้างล่างก็ต้องปรับแก้ให้ส่วนของ Where clause ครอบคลุมทุกฟิลด์ที่เป็น PrimaryKey ด้วย

db.execute "update TbOrderDetail set OrderBuild = 'บิลเสีย' where OrderID = '" & me.OrderID & "' "
db.execute "update TbOrder set OrderBuild = 'บิลเสีย' where OrderID = '" & me.OrderID & "' "

dbengine.committrans dbForceOSFlush

me.refresh
2 @R04262
ขอบคุณครับอาจารย์
เบื้องต้นได้ลองดูแล้วครับ มี error ที่
db.execute "update TbOrderDetail set OrderBuild = 'บิลเสีย' where OrderID = '" & me.OrderID & "' "
db.execute "update TbOrder set OrderBuild = 'บิลเสีย' where OrderID = '" & me.OrderID & "' "


โดย OrderID ในเทเบิ้ล Order เป็น PrimaryKey เพียงฟิล์ดเดียวครับ และเป็นฟิล์ดประเภท AutoNumber
ส่วน OrderID ในเทเบิ้ล OrderDetail ไม่เป็นPrimary และเป็นฟิล์ดประเภท Number
(ตรงที่เป็น OrderIDที่เป็นAutoNumber และ Numberนั้น ผมได้ลองเปลี่ยนเป็น Text แล้วก็ยังerror อยุ่ครับ) แต่พึ่งกลับมาลองได้พักนุง เดี๋ยวจะทดสอบต่อไปครับ

ขอบคุณอาจารย์ สันติสุขมากครับ

3 @R04263
ไม่รบกวนแล้วครับ อาจารย์สันติสุขครับ
พอดีคิดได้อีกแบบนึงครับ ถึงไม่ค่อยสะดวกนักแต่พอใช้ ใช้ไปก่อนครับ
ขอบคุณครับ
4 @R04264
เปลี่ยนเป็น ... where OrderID = " & me.OrderID
5 @R04265
อ้างอิง
เปลี่ยนเป็น ... where OrderID = " & me.OrderID

-----------------------------------------------------------

เปลี่ยนแล้วครับอาจารย์ ไม่Errorแล้วครับ แต่ฟิล์ดไม่มีการเปลี่ยนแปลงเลยครับ ผมไม่ได้ให้ไฟล์ดอาจารย์ไปดู เลยอาจไม่ตรงกับที่ต้องการน่ะครับ ต้องขอโทษด้วยครับ

ตอนนี้ผมเอาโค๊ตของอาจารย์ไป เปลี่ยนดังนี้ครับ คือ มีลักษณะว่า ผมไปสร้าง TxtBadBill เอาไว้ก่อน แล้วพอผมกดปุ่มแล้ว ถ้ากดYes จะไปเปลี่ยนฟิล์ดOrderBuildของฟอร์มหลัก แล้วจึงRequeryทั้งฟอร์มผ่านQueryชื่อQCHOrder_Out_Hd_Cc_ExVอีกทีครับ


โค๊ตที่เปลี่ยนแปลงจากอาจารย์คือ
Private Sub Command208_Click()

If MsgBox("ท่านแน่ใจหรือว่า ต้องการยกเลิกบิลนี้ ให้เป็นบิลเสีย", vbQuestion + vbYesNo) = vbYes Then

Me.OrderBuild = TxtBadBill

On Error GoTo PersonID_AfterUpdate_Err

    DoCmd.SetWarnings False
    DoCmd.OpenQuery "QCHOrder_Out_Hd_Cc_ExV", acViewNormal, acEdit

PersonID_AfterUpdate_Exit:
    Exit Sub

PersonID_AfterUpdate_Err:
    MsgBox Error$
    Resume PersonID_AfterUpdate_Exit

   Exit Sub
End If

Me.Refresh

End Sub

ที่ให้รายละเอียดตรงนี้ เผื่อว่า เป็นไปได้ในแนวทางไหนบ้างเท่านั้นน่ะครับ เพราะโค๊ตน่าจะบอกอะไรได้ในส่วนหนึ่งน่ะครับ

ขอบคุณครับอาจารย์สันติสุขมากๆเลยครับ ที่เสียสละเว??าครับ
6 @R04266
ยิ่งบอก ยิ่งงง ยิ่งไม่เข้าใจเลย

แน่ใจนะว่าคุณไม่ลืมบรรทัด dbengine.committrans dbForceOSFlush เพราะถ้าลืมบรรทัดนี้ ค่าจะไม่เปลี่ยนแปลง หรือไม่ก็ ตัดออกทั้งบบรรทัด dbengine.begintrans และ dbengine.committrans dbForceOSFlush ออกไปก่อน แล้วทดลองดูครับ
7 @R04267
เย๋!!! ได้แล้วครับ อาจารย์ครับ
อตนนี้ใช้โค๊ตแบบนี้ครับ

Private Sub Command209_Click()
Dim db As dao.Database

If MsgBox("ท่านแน่ใจว่าต้องการยกเลิกรายการนี้เป็นบิลเสีย", vbQuestion + vbYesNo) = vbNo Then
   Exit Sub
End If

DBEngine.BeginTrans

Set db = CurrentDb()

' ถ้า OrderID ไม่ใช่ฟิลด์เดียวที่เป็น PrimaryKey ของ TbOrder โค้ดข้างล่างก็ต้องปรับแก้ให้ส่วนของ Where clause ครอบคลุมทุกฟิลด์ที่เป็น PrimaryKey ด้วย

db.Execute "update TbOrderDetail set OrderBuild = 'ºÔÅàÊÕÂ' where OrderID = " & Me.OrderID
db.Execute "update TbOrder set OrderBuild = 'ºÔÅàÊÕÂ' where OrderID = " & Me.OrderID

DBEngine.CommitTrans dbForceOSFlush

Me.Refresh
End Sub

ตอนแรกผมลองแล้วมันไม่เปลี่ยนน่ะครับ ถ้าเขียนๆอยู่แล้วใช้เลย พอปิดแล้วเปิดใหม่ ก็ใช้ได้แล้วครับ

ผมเลยลองเปลี่ยนไปเปลี่ยนมา ระหว่างบิลดีบิลเสีย (ซึ่งจริงๆแล้วไม่ได้ทำให้เปลี่ยนได้ เพียงแต่ทดลองในตอนนี้เท่านั้นครับ) ปรากฏว่าบางทีก็ได้บ้าง ไม่ได้บ้าง และบางครั้ง ฟ้อง Error ที่ Me.Refresh แต่ไม่เป็นปัญหาครับ เพราะผมเปิดให้แก้ไขเพียงครั้งเดียว แล้วก็จะหายไปแล้วครับ

ผมว่าน่าจะสามารถ นำไปแปลงไปใช้อย่างอื่นได้อีกครับ เดี่ยวลองเล่ดูก่อนครับ

ขอบพระคุณอย่างสูงครับผม
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.4125s