กระทู้เก่าบอร์ด อ.Yeadram
4,706 14
URL.หัวข้อ /
URL
รันเลขที่เล่มที่อัตโนมัติ
เล่มที่ 1 มีเลขที่ 1-23 เมื่อหมดก็เริ่่ม เล่มที่ 2 ก็มีเลขที่ 1-23 และเริ่มเล่มที่ 3 ในทำนองเดียวกัน
ก่อนรันเลขที่อัตโนมัติ ต้องการเช็คใน table ก่อนว่าถึง เลขที่..เล่มที่..อะไรแล้วก็ให้รันต่อเลยเช่น
ปัจจุบัน เล่มที่ 3 เลขที่ 22
ต่อไปก็เป็น เล่มที่ 3 เลขที่ 23
และต่อไปก็ เล่มที่ 4 เลขที่ 1
ก่อนรันเลขที่อัตโนมัติ ต้องการเช็คใน table ก่อนว่าถึง เลขที่..เล่มที่..อะไรแล้วก็ให้รันต่อเลยเช่น
ปัจจุบัน เล่มที่ 3 เลขที่ 22
ต่อไปก็เป็น เล่มที่ 3 เลขที่ 23
และต่อไปก็ เล่มที่ 4 เลขที่ 1
14 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R06657
เรียนคุณyeadram
ผมลองทำตามแล้วไม่ได้ครับ
รบกวนดูให้อีกรอบตามรูปที่แนบมา ขอบคุณครับ
ผมลองทำตามแล้วไม่ได้ครับ
รบกวนดูให้อีกรอบตามรูปที่แนบมา ขอบคุณครับ
3 @R06658
เรียนคุณyeadram
ลืมบอกไปครับว่าต้องการรันเลขที่อัตโนมัติเวลาที่ขึ้น Record ใหม่โดยต่อไปเป็นเล่มที่ 2 เลขที่ 7 ครับ แต่ถ้า user ต้องการแก้ไขเองก็สามารถคีย์เล่มที่...เลขที่.. ที่ต้องการแทนที่เลขอัตโนมัติได้เลยครับ
ขอบคุณล่วงหน้าครับ
ลืมบอกไปครับว่าต้องการรันเลขที่อัตโนมัติเวลาที่ขึ้น Record ใหม่โดยต่อไปเป็นเล่มที่ 2 เลขที่ 7 ครับ แต่ถ้า user ต้องการแก้ไขเองก็สามารถคีย์เล่มที่...เลขที่.. ที่ต้องการแทนที่เลขอัตโนมัติได้เลยครับ
ขอบคุณล่วงหน้าครับ
4 @R06660
แล้วทำไม ไม่บอกว่า เลขที่กับเล่มที่ มันเป็นคนละฟิลด์กันล่ะครับบบบบบบบ!
คุณบอกว่าลองทำตามแล้วยังไม่ได้ คุณทำตามไปถึงขั้นตอนไหนแล้วล่ะครับ
ทำไม ที่เห็นในรูป ฟิลด์เล่มที่ของคุณมันยังเป็น textbox อยู่เลย ไม่เห็นมันจะเป็น คอมโบบ็อกซ์ตรงไหน โค้ดที่ผมให้ไปผมมาดูอีกรอบเห็นว่าผมพิมพ์คำสั่งตกไปดังนั้นมันน่าจะ error แน่ๆ แต่ไม่เห็นคุณแจ้งว่า error ใดๆ เลย ตกลงคุณได้ทำตามแล้วจริงๆ หรือเปล่า ทำแบบไหน ทำตามทั้งหมดหรือว่านำไปประยุกต์บางส่วน ถ้านำไปประยุกต์บางส่วน ผมจะแน่ใจได้อย่างไรว่าคุณนำไปประยุกต์ได้ถูกต้อง หรือไม่ คุณก็ควรจะเล่าให้ฟังว่าประยุกต์อย่างไรถึงไหน ติดตรงไหนผมหรือท่านอื่นๆ อาจจะช่วยต่อยอดจากที่คุณประยุกต์แล้วอีกนิดหน่อย แก้ปัญหาให้คุณได้เลย
คุณต้องการให้ผู้ใช้สามารถแก้ไขเลขที่ได้เองด้วย แล้วถ้าที่แก้ไขแล้วนั้น มันซ้ำกับเรคคอร์ดเก่าในระบบละครับ คุณจะเอายังไงต่อ จะห้ามบันทึก หรือจะอนุญาตให้บันทึก คุณจะมีวิธีเช็คได้อย่างไรว่าซ้ำหรือไม่ซ้ำ คุณจะเช็คตอนไหนจังหวะไหน
คุณบอกว่าลองทำตามแล้วยังไม่ได้ คุณทำตามไปถึงขั้นตอนไหนแล้วล่ะครับ
ทำไม ที่เห็นในรูป ฟิลด์เล่มที่ของคุณมันยังเป็น 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
ต้องขอโทษมากครับ ผมเพิ่มมาใช้บอร์ดนี้เป็นครั้งแรกยังไม่รู้ระเบียบต่างๆ คราวหลังจะระวังให้มาก
ผมได้ลองเอา 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 ร่วมกันครับ
ให้แก้ไข
, "[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 ปัจจุบันได้ครับ
ขอบคุณหลายๆ ครับ ผมทำได้แล้วสุดยอด
แต่ยังมีปัญหาอีกนิดครับ ถ้าหากลบ record ปัจจุบันที่ยังคีย์ไม่เสร็จมันจะกลายเป็นการเพิ่ม record ถัดไปใหม่ โดยรันเลขที่ auto เพิ่มให้ครับ ไม่สามารถลบrecord ปัจจุบันได้ครับ
9 @R06671
เรียนคุณ yeadram
เนื่องจากผมสั่งให้เปิด form ขึ้นมาแบบ goto new recode
ทำให้เวลาเปิด form ขึ้นมาทุกครั้งโดยไม่คีย์ข้อมูลใดๆ แล้วปิดไป มันจะ save form เปล่าพร้อม เลขที่รันให้ด้วย ทำไงดีครับ
เนื่องจากผมสั่งให้เปิด 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
ที่ผมแนะนำไปแรกๆ แล้วต้องให้ผู้ใช้ป้อนข้อมูลอะไรซักอย่างก่อนค่อยให้โค้ดทำงาน
หรือไม่ก็ลองตรวจสอบ ฟิลด์ใดๆ ที่สำคัญๆ ก่อนจะปิดฟอร์ม
ถ้าไม่มีข้อมูลก็ให้ยกเลิกการเพิ่มรายการ
หรืออาจต้องสั่งลบเรคคอร์ดล่าสุดเลยก็ได้
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
โค้ดที่ผมใช้ มันไม่ทำงานครับ
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 ที่จะใช้ลบข้อมูลที่คุณเขียนน่ะ ผิดนะครับ
ดูให้ดี ที่ผมให้ตัวอย่างไปต้องใช้ เงื่อนไขสองตัวตรวจสอบนะครับ ไม่ใช่ ตัวเดียว
ไม่งั้นเรื่องใหญ่ ดีนะที่มันเช็คเงื่อนไขไม่ผ่าน ไม่งั้น งานเข้าครับ
ตัวไหนมันใช้ได้ ขึ้นอยู่กับคุณด้วยว่า
ฟิลด์ไหนสำคัญกว่ากัน จำเป็นต้องมี ถ้าไม่มีข้อมูลก็ถือว่ายังไม่ได้บันทึก คุณก็ไปตรวจที่คอนโทรล ที่บันทึกฟิลด์นั้น
สำหรับ statement ที่จะใช้ลบข้อมูลที่คุณเขียนน่ะ ผิดนะครับ
ดูให้ดี ที่ผมให้ตัวอย่างไปต้องใช้ เงื่อนไขสองตัวตรวจสอบนะครับ ไม่ใช่ ตัวเดียว
ไม่งั้นเรื่องใหญ่ ดีนะที่มันเช็คเงื่อนไขไม่ผ่าน ไม่งั้น งานเข้าครับ
13 @R06679
เรียนคุณ yeadram
ผมควรเชื่อคุณ yeadram ตั้งแต่แรกครับ ที่แนะนำไปว่าต้องให้ผู้ใช้ป้อนข้อมูลอะไรซักอย่างก่อนค่อยให้รันเลขที่
งานเสร็จเรียบร้อยสมบูรณ์ ต้องยกความดีทั้งหมดให้คุณ yeadram
ขอบคุณมากๆ ครับ
ผมควรเชื่อคุณ yeadram ตั้งแต่แรกครับ ที่แนะนำไปว่าต้องให้ผู้ใช้ป้อนข้อมูลอะไรซักอย่างก่อนค่อยให้รันเลขที่
งานเสร็จเรียบร้อยสมบูรณ์ ต้องยกความดีทั้งหมดให้คุณ yeadram
ขอบคุณมากๆ ครับ
14 @R06680
เรียนคุณ yeadram
รบกวนอีกเรื่องครับ ทำไมเวลาสั่ง preview report จึงมีหน้าว่างติดมาหนึ่งหน้า หรือจะเป็นตอนที่ผมออกแบบ report แต่ผมก็ดูดีแล้วว่าไม่มีส่วนที่เกินออกมาเลย จะแก้ไขอย่างไรครับ
รบกวนอีกเรื่องครับ ทำไมเวลาสั่ง preview report จึงมีหน้าว่างติดมาหนึ่งหน้า หรือจะเป็นตอนที่ผมออกแบบ report แต่ผมก็ดูดีแล้วว่าไม่มีส่วนที่เกินออกมาเลย จะแก้ไขอย่างไรครับ
Time: 0.3349s
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
-กรณีเป็นการเพิ่มเรคคอร์ดใหม่ ให้ผู้ใช้เลือกเล่ม จากคอมโบก่อน แล้วระบบจะรันเลขอัตโนมัติให้เอง
-กรณีถ้าไม่ใช่การขึ้นเรคคอร์ดใหม่ แล้วผู้ใช้ไปเลือกค่าจากคอมโบ ระบบจะไม่ทำการหาเลขที่ให้
อื่นๆ ต้องประยุกต์เพิ่มเติมเอง