รันเลขที่เล่มที่อัตโนมัติ
กระทู้เก่าบอร์ด อ.Yeadram

 4,706   14
URL.หัวข้อ / URL
รันเลขที่เล่มที่อัตโนมัติ

เล่มที่ 1 มีเลขที่ 1-23 เมื่อหมดก็เริ่่ม เล่มที่ 2 ก็มีเลขที่ 1-23 และเริ่มเล่มที่ 3 ในทำนองเดียวกัน
ก่อนรันเลขที่อัตโนมัติ ต้องการเช็คใน table ก่อนว่าถึง เลขที่..เล่มที่..อะไรแล้วก็ให้รันต่อเลยเช่น
ปัจจุบัน       เล่มที่ 3 เลขที่ 22   
ต่อไปก็เป็น เล่มที่ 3 เลขที่ 23   
และต่อไปก็ เล่มที่ 4 เลขที่ 1

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

1 @R06653
COMBO BOX
   name = cbBookNo
   control source type = "value list"
   control source =1,2,3,4,...
   column count = 1

TEXT BOX
   name = txNum
   control source = ชื่อฟิลด์เก็บเลขที่อัตโนมัติ (stNum)
   format = x-x

VBA CODE
Private sub cbBookNo_afterupdate()
     if me.newcord=false then exit sub
     dim MaxNum as integer
     MaxNum=nz(dmax(mid(stnum,instr(1,stnum,'-')+1),"table1",left(stnum,instr(1,stnum,'-')-1) = " & cbBookNo),0)
     Maxnum=Maxnum+1
     me.txNum=cbBookNum & "-" & MaxNum
End sub


PROCESSING
-กรณีเป็นการเพิ่มเรคคอร์ดใหม่ ให้ผู้ใช้เลือกเล่ม จากคอมโบก่อน แล้วระบบจะรันเลขอัตโนมัติให้เอง
-กรณีถ้าไม่ใช่การขึ้นเรคคอร์ดใหม่ แล้วผู้ใช้ไปเลือกค่าจากคอมโบ ระบบจะไม่ทำการหาเลขที่ให้

อื่นๆ ต้องประยุกต์เพิ่มเติมเอง
2 @R06657
เรียนคุณyeadram
ผมลองทำตามแล้วไม่ได้ครับ
รบกวนดูให้อีกรอบตามรูปที่แนบมา ขอบคุณครับ

3 @R06658
เรียนคุณyeadram
ลืมบอกไปครับว่าต้องการรันเลขที่อัตโนมัติเวลาที่ขึ้น Record ใหม่โดยต่อไปเป็นเล่มที่ 2 เลขที่ 7 ครับ แต่ถ้า user ต้องการแก้ไขเองก็สามารถคีย์เล่มที่...เลขที่.. ที่ต้องการแทนที่เลขอัตโนมัติได้เลยครับ
ขอบคุณล่วงหน้าครับ
4 @R06660
แล้วทำไม ไม่บอกว่า เลขที่กับเล่มที่ มันเป็นคนละฟิลด์กันล่ะครับบบบบบบบ!

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

คุณต้องการให้ผู้ใช้สามารถแก้ไขเลขที่ได้เองด้วย แล้วถ้าที่แก้ไขแล้วนั้น มันซ้ำกับเรคคอร์ดเก่าในระบบละครับ คุณจะเอายังไงต่อ จะห้ามบันทึก หรือจะอนุญาตให้บันทึก คุณจะมีวิธีเช็คได้อย่างไรว่าซ้ำหรือไม่ซ้ำ คุณจะเช็คตอนไหนจังหวะไหน



dim mxBil, mxBook
mxBil=nz(Dmax( .... ),0)   ' dMax ต้องใส่เงื่อนไข
mxBil=mxBil+1

if mxBil<=23 then
txBillno=mxBil
esle
txBilno=1
mxBook=nz(Dmax( .... ),0) ' dMax ไม่ต้องใส่เงื่อนไข
txBookNo=mxBook+1
end if
5 @R06664
เรียนคุณ yeadram
ต้องขอโทษมากครับ ผมเพิ่มมาใช้บอร์ดนี้เป็นครั้งแรกยังไม่รู้ระเบียบต่างๆ คราวหลังจะระวังให้มาก
ผมได้ลองเอา code ของคุณไปประยุกต์ใช้แล้วแต่ยังติดอยู่ตามดูจากรูปครับ

ลอง code เอาไปเทสเงื่อนไง ดูจากรูปในวงสีแดงแล้วก็ได้ค่าถูกต้องตามใน table
มันติดปัญหาที่ code สีเหลือง
mxBill = Nz(DLookup("[BillNo]", "[Bills]", "[BillId]=[mxBillID]"), 0)
ผมเอาเมาส์ไปชี้ที่ตัวแปรแล้วได้ค่าดังนี้
mxBill = 0
BillNo = null
BillID = null
mxBillID = 54
คำถามเพิ่ม
1. ผมควรนำ code ไปผูกกับ event อะไร เพื่อให้รันเลขหลังจากกด new record
2. ถ้าไม่ต้องการให้ เล่มที่+เลขที่ซ้ำควรทำอย่างไร

ขอบคุณครับ

code
===============================
Private Sub Form_Load()
Dim mxBillID As Integer, mxBill As Integer, mxBook As Integer
mxBillID = Nz(DMax("[BillID]", "[Bills]"), 0)
mxBill = Nz(DLookup("[BillNo]", "[Bills]", "[BillId]=[mxBillID]"), 0)
mxBill = mxBill + 1
mxBook = Nz(DLookup("[BookNo]", "[Bills]", "[BillId]=[mxBillID]"), 0)

If mxBill <= 23 Then
TxBillNo = mxBill
TxBookNo = mxBook
Else
TxBillNo = 1
TxBookNo = mxBook + 1
End If
6 @R06665
ลืมส่ง error ให้ดูครับ
7 @R06668
ตอบเฉพาะ error บรรทัดเหลืองนะครับ
ให้แก้ไข
, "[BillID]=[mxBillD]")
เป็น
, "[BillID] = " & mxBillID)

ถ้าแก้ไขบรรทัดนั้นได้แล้ว
อีกสองบรรทัดต่อมาก็ติดอีกครับ ก็ต้องแก้ให้เหมือนๆ กันครับ


โค้ดทั้งหมดอาจเขียนไว้เป็น โปรแกรมย่อย ให้เรียกใช้จากที่อื่นๆ ได้เช่น
Sub AutoNo()
คำสั่ง....
คำสั่ง....
คำสั่ง....
End sub
แล้วเอาวางไว้ในโมดูลของฟอร์มนั่นแหละครับ

เหตุการณ์ที่เหมาะ แล้วแต่พฤติกรรมหรือความเข้าใจของผู้ใช้เป็นหลักครับ
เบื้องต้น แนะนำใช้ Form_Current ดังนี้
Private Sub Form_current()
If me.newrecord=true then
call autono
end if
end Sub

การป้องกันการซ้ำ ยากง่าย ละเอียดยิบย่อย เยอะมากๆ เอาเป็นว่า แนะนำขั้นต้น ดังนี้
ถ้าทำได้ (ปรับเปลี่ยนโครงสร้างตารางแล้วไม่กระทบงานอื่นๆ) ให้เลือก primary key เป็นแบบคู่ คือให้เลือกฟิลด์ เล่มที่ กับเลขที่ เป็น Primary ร่วมกันครับ
8 @R06670
เรียนคุณ yeadram
ขอบคุณหลายๆ ครับ ผมทำได้แล้วสุดยอด
แต่ยังมีปัญหาอีกนิดครับ ถ้าหากลบ record ปัจจุบันที่ยังคีย์ไม่เสร็จมันจะกลายเป็นการเพิ่ม record ถัดไปใหม่ โดยรันเลขที่ auto เพิ่มให้ครับ ไม่สามารถลบrecord ปัจจุบันได้ครับ
9 @R06671
เรียนคุณ yeadram
เนื่องจากผมสั่งให้เปิด form ขึ้นมาแบบ goto new recode
ทำให้เวลาเปิด form ขึ้นมาทุกครั้งโดยไม่คีย์ข้อมูลใดๆ แล้วปิดไป มันจะ save form เปล่าพร้อม เลขที่รันให้ด้วย ทำไงดีครับ
10 @R06672
มันอัตโนมัติเกินไปครับ ต้องหาความลงตัว user คงไม่ขี้เกียจขนาดนั้นหรอกครับ
ที่ผมแนะนำไปแรกๆ แล้วต้องให้ผู้ใช้ป้อนข้อมูลอะไรซักอย่างก่อนค่อยให้โค้ดทำงาน

หรือไม่ก็ลองตรวจสอบ ฟิลด์ใดๆ ที่สำคัญๆ ก่อนจะปิดฟอร์ม
ถ้าไม่มีข้อมูลก็ให้ยกเลิกการเพิ่มรายการ
หรืออาจต้องสั่งลบเรคคอร์ดล่าสุดเลยก็ได้
private sub form_unload()
if cid="" then me.undo
หรือ
if cid="" then
mxBook=Dlast(..............) เอาเล่มที่สุดท้าย ที่เพิ่งคีย์เข้าไป ไม่มีเงื่อนไข
mxBill = dMax(..........., = mxBook.....) เอาเลขที่สูงสุด ใส่เงื่อนไขเป็นเล่มที่ ที่หาได้ก่อนหน้า
docmd.runsql "Delete From table1 where เลขที่ = mxBill and เล่มที่ = mxBook"
end if
ประมาณนี้ครับ ต้องลองผิดลองถูกหาดูครับ
end sub
11 @R06674
เรียนคุณ yeadram
โค้ดที่ผมใช้ มันไม่ทำงานครับ
Private Sub Form_Unload(Cancel As Integer)
Dim mxBillID As Integer
If Cid = "" Then
mxBillID = Nz(DMax("[BillID]", "[Bills]"), 0)
'mxBill = Nz(DLookup("[BillNo]", "[Bills]", "[BillId]= " & mxBillID), 0)
'mxBook = Nz(DLookup("[BookNo]", "[Bills]", "[BillId]= " & mxBillID), 0)
DoCmd.RunSQL "Delete From Bills where BillID=mxBillID"
End If
End Sub

ลองเช็คค่า Cid แล้วมันไม่เป็นค่าว่าง ตรวจสอบยังไงดีคับ
Private Sub T1_Click()
If Cid = "" Then
MsgBox ("ค่าว่าง")
Else
MsgBox ("ไม่เป็นค่าว่าง")
End If
End Sub
12 @R06676
ก็ลองตรวจที่คอนโทรลตัวอื่นดูครับ
ตัวไหนมันใช้ได้ ขึ้นอยู่กับคุณด้วยว่า
ฟิลด์ไหนสำคัญกว่ากัน จำเป็นต้องมี ถ้าไม่มีข้อมูลก็ถือว่ายังไม่ได้บันทึก คุณก็ไปตรวจที่คอนโทรล ที่บันทึกฟิลด์นั้น

สำหรับ statement ที่จะใช้ลบข้อมูลที่คุณเขียนน่ะ ผิดนะครับ
ดูให้ดี ที่ผมให้ตัวอย่างไปต้องใช้ เงื่อนไขสองตัวตรวจสอบนะครับ ไม่ใช่ ตัวเดียว
ไม่งั้นเรื่องใหญ่ ดีนะที่มันเช็คเงื่อนไขไม่ผ่าน ไม่งั้น งานเข้าครับ
13 @R06679
เรียนคุณ yeadram
ผมควรเชื่อคุณ yeadram ตั้งแต่แรกครับ ที่แนะนำไปว่าต้องให้ผู้ใช้ป้อนข้อมูลอะไรซักอย่างก่อนค่อยให้รันเลขที่

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