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

 6,083   21
URL.หัวข้อ / URL
เลขอัตโนมัติ

อยากสอบถามนิดหนึ่งครับ ตามโค๊ตนี้
Function MaxAllIDs() As Long
        RNum = DMax("ids", "555", "ids >= " & Right((year(date) + 543), 4) * 1000)
        If IsNull(RNum) Then
                  RNum = Right((year(date) + 543), 4) * 1000
        End If
        MaxAllIDs = RNum
       
End Function

เวลาในฟอร์มและรายรายจะต้องมาเป็น 2551/0001 ถ้าเราต้องการสลับตำแหน่งโดยให้เป็น 0001/2551 ต้องเปลี่ยนค่าตรงไหนครับ

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

1 @R00600
??....... Right((year(date) + 543), 4) * 1000 .......??

year(date)          จะได้        2008
2008+543            จะได้        2551
Right(2551,4)     ก็จะได้      2551
2551 * 1000        ก็จะได้       2551000

ถ้ากรณีฟังก์ชั่นนี้ หาค่า Dmax ออกมาไม่ได้ มันจะคือค่าออกมาเป็น Long
ถ้าใช้ฟังก์ชั่นนี้ ในปีนี้ และรันบนเครื่องที่ตั้ง System Date เป็นสากล มันจะคืนค่าออกมาเป็น
2551000

แล้วมันไปเป็น 2551/001 ได้อย่างไร
คำถามที่ว่าจะให้มันสลับกลับ ก็ไปต่อไม่ได้แล้วครับ
1 มันต้องมีคำสั่งอื่น หรือฟังก์ชั่นอื่นเข้ามาเกี่ยวข้องด้วย คุณเอามาให้ดูไม่ครบ
2 ในฟังก์ชั่นนี้ก็พิกลอยู่พอสมควร
2 @R00601
แต่อ่านไปอ่านมา เหมือนๆ กับว่า ต้องการแค่แสดงผล
งั้นผมไม่ตามสืบการได้มา ของเลขที่ก็แล้วกัน ว่ามันได้มาอย่างไร
ผมเอาแค่ว่า จะกลับมันอย่างไรดีกว่านะ
ผมสันนิษฐานเอาว่า ฟิลด์ที่ชื่อ ids เก็บข้อมูลใน รูปแบบ ปี/รันนิ่ง3หลัก เช่น
2551/001
2551/002
2551/099
2551/100

หากต้องการแสดงผลกลับกัน (ไม่ว่าจะในคิวรี่ ในฟอร์ม หรือในรายงาน)
right(ids,3) & "/" & left(ids,4)
* เรากล้าที่จะระบุตำแหน่งในฟังก์ชั่น left หรือ right ได้ เพราะว่า ข้อมูลในฟิลด์มีรูปแบบที่ตายตัว และมีข้อมูลในทุกๆ เรคคอร์ด
3 @R00603
คุณ yeadram ช่วยดูไฟล์ให้หน่อยครับ
http://www.sendmefile.com/00645865
4 @R00610
ผมโหลดตัวอย่างมาแล้วครับ
คุณ tes ต้องการทำ auto running number
หรือการ รันเลขที่อัตโนมัติ ในรูปแบบของตัวเอง

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

ของเก่าที่คุณ tes ทำไว้ เป็นชนิดข้อมูล Long Integer และเก็บข้อมูลในรูปแบบ
2551001
2551002
2551003
เมื่อจะแสดงข้อมูล จึงค่อยกำหนด รูปแบบให้เป็น @@@@/@@@
ก็ได้ผลดีครับ 2551/001, 2551/002
แต่เมื่อต้องการกลับให้เลขรันนิ่ง ไปอยู่ข้างหน้า เป็น 001/2552, 002/2551 จึงทำได้ยาก
ผมจึงเปลี่ยนชนิดข้อมูลให้เป็น text แล้วเขียนฟังก์ชั่นหาเลขที่ใหม่ให้ด้วย
เอาไปดูเป็นตัวอย่างก็แล้วกันครับ

5 @R00613
คุณ yeadram ครับ
ไฟล์โหลดอย่างไรครับ โหลดไม่ได้เลย
6 @R00614
แก้ไขลิงค์ให้แล้วครับ
7 @R00615
ขอบคุณมากครับ มาวิธีอยู่ตั้งนาน
8 @R00623
ถามเพิ่มเติมอีกนิดหนึ่งครับถ้าเราไม่ต้องการให้มีเลข 0 นำหน้าเลขพอจะมีวิธีบ้างไหมครับ
เช่น 1/2551
9 @R00627
นี่ของเก่า.............................. ได้เลขแบบ leading zero

Function NewID()
Dim lastID As Long
lastID = Nz(DMax("CLng(Left(ids, 3))", "666", "clng(right([ids],4)) = " & year(date) + 543), 0)
NewID = Format(lastID + 1, "000") & "/" & year(date) + 543
End Function


ถ้าไม่อยากมีเลข 0 นำ ก็ปรับแค่ตรงนี้
เปลี่ยนเลข 3 ในบรรทัดแรกให้เป็น Len([ids])-5)
เอาฟังก์ชั่น format() ออกจากบรรทัดที่สอง
lastID = Nz(DMax("CLng(Left(ids, Len([ids])-5)))", "666", "clng(right([ids],4)) = " & year(date) + 543), 0)
NewID = lastID + 1 & "/" & year(date) + 543
10 @R00628
ทำไมมัน error เป็นแถบสีเหลืองที่
lastID = Nz(DMax("CLng(Left(ids, Len([ids])-5)))", "666", "clng(right([ids],4)) = " & Year(date) + 543), 0)

ครับ
11 @R00629
ตรวจสอบ ไลบรารี่ของ Mdac หน่อยครับ
จำได้ว่า ตัวอย่างที่ผมอัพไว้ มันยังเป็น 2.1 อยู่
ไปเปลี่ยนให้เป็น 2.8 ดูหน่อยครับ

-กด alt+F11 เพื่อเปิดหน้าต่าง VBA
-เลือกเมนู Tools>References...   
-รายชื่อ ไลบรารี่ ที่ถูกเลือกจะอยู่บนสุด ที่ไม่ถูกเลือกจะอยู่ถัดลงไปโดยเรียงลำดับตามตัวอักษร
Microsoft ActiveX Data Objects ...... Library
ของคุณ เวอร์ชั่นอะไร ถ้ายังเป็น 2.1 ให้ติ๊กออก แล้วเลื่อนลงไปหาเวอร์ชั่นอื่น เอาสูงๆ สูงสุดเท่าที่ในเครื่องมีเลยครับ ผมใช้ 2.8 ปัญหา error นั้นก็หายครับ

* * * Mdac 2.1 ไม่รู้จักฟังก์ชั่น   len() * * *
12 @R00635
คุณ yeadram ของผมเปลี่ยนเป็นเวอร์ชั่น 2.8 แล้วก็ยังมีปัญหาอีก
พอคลิ๊กเปิดมันก็ขึ้น
Run-time error 3075
Extra)in guery expression 'Max(CLng(Left(ids,Len([ids])-5))))'
13 @R00639
แปลตามตัวเลยครับ    Extra ) in guery expression
มี "วงเล็บปิด" มากเกิน
ก็เอาออกตัวหนึ่ง เอ... หรือจะสองตัวนะนั่น อิอิ ผมคงเขียนเกินไปครับ
14 @R00640
ขอบคุณมากครับ คุณyeadram สุดยอดเลยครับ
เมื่อไรผมจะเก่งเหมือนคุณก็ไม่รู้
15 @R00644
มีปัญหาอีกแล้วครับ เพราะว่าผมใช้โปรแกรมนี้โดนผ่านระบบLan ซึ่งใช้ร่วมกัน 4 เครื่อง
แล้วปรากฎว่า กรณีที่เปิดโปรแกรมพร้อมกัน ทำให้เลขที่ออกมาเป็นเลขเดียวกัน
ไม่ทราบว่าต้องเพิ่มเติมตรงไหนบ้างครับ
16 @R00651
ต้องเพิ่มระบบครับ ครับ อาจต้องกระทบกับ โครงสร้างตารางเลยทีเดียว
1 ต้องมั่นใจว่า ตารางนั้น มีฟิลด์ ที่จำเป็นแค่ฟิลด์เดียว (ถ้ามีมากกว่านี้ วิธีการก็มากขึ้น แต่ก็ทำได้)
2 เขียนคำสั่ง ในเหตุการณ์ใดๆ ก็ได้ ที่บ่งบอกว่า ต้องการเพิ่มเลขที่ใหม่ เหตุการณ์เหล่านั้นก็เช่น.... เมื่อ ผู้ใช้คลิ๊กปุ่ม "เพิ่มระเบียน" (สร้างปุ่มขึ้นมาเอง ฝั่งคำสั่งเอง ไม่ใช่วิซาร์ดสร้าง) และลำดับคำสั่งใน ข้อนี้ก็จะประมาณว่า
2.1 เรียกใช้ฟังก์ชั่น newId เพื่อหาเลขที่ใหม่
2.2 เพิ่มเลขที่ใหม่ที่หาได้เข้าตารางทันที่ เอาแค่ฟิลด์เดียวนี้ก่อน ฟิลด์อื่น ปล่อยว่างไว้ ใช้การรันคิวรี่ Insert
2.3 ทำการเพิ่มข้อมูลในฟิลด์อื่นๆ ต่อไป
2.4 กดปุ่ม "บันทึกข้อมูล" (สร้างปุ่มขึ้นมาเอง ฝั่งคำสั่งเอง ไม่ใช่วิซาร์ดสร้าง) ใช้การรัน คิวรี่ update


ในกระบวนงานข้อที่ 2.2 ถ้ายังมีเหตุการณ์ชนกันอีก จะต้องใช้กลยุทธที่ อ.สันติสุข เคยว่าไว้ คือการ เก็บผลการ error มา Try (ผมไม่ค่อยกระจ่างนัก กับการวนลูปชนิดนี้ ต้องปรึกษา อ.สันติส??ขอีกที) แนวคิดก็คือ
ถ้าการรันคิวรี่ Insert เกิด error ให้
นับ "การพยายาม" เป็น 1
รอ(กี่วินาทีแล้วแต่จะกำหนด)
เมื่อครบระยะเวลา ให้

กลับไปหาเลขที่ใหม่
แล้วเอาเลขที่ใหม่ มา Insert อีกครั้ง
ถ้าการรันคิวรี่ insert เกิด error ให้
นับ "การพยายาม" เป็น 2
รอ(กี่วินาทีแล้วแต่จะกำหนด)
เมื่อครบระยะเวลา ให้

ก็วนลูปไปเรื่อยๆ ครับ จนจำนวนการนับ "การพยายาม" ถึงที่เรากำหนด ค่อยหยุด พยายามแล้วแจ้ง error ให้ผู้ใช้


ผมคิดได้แค่นี้ เหอๆ น่าจะมีวิธีที่ดีและง่ายกว่านี้นะ ต้องรอดูความเห็นของท่านอื่นๆ ดูด้วยครับ
17 @R02063
สวัสดีค่ะ

ตัวอย่าง file AUTOID ดีมาก ๆ เลยคะ ตรงกับความต้องการอยู่พอดี
แต่เมื่อนำไปใช้เองแล้วทำไมตัวเลขออกมาแปลกๆคะ เช่น ตัวเลขที่รันอัตโนมัติ ควรจะเป็น 003/2552 แต่กลายเป็น 003/2442 ตามรูปที่แสดงคะ

สาเหตุเกิดจากอะไรคะ



***วันก่อนเข้า webboard ไม่ได้ ตกใจหมดเลย แต่ตอนนี้ดีใจมาก เหมือนมีคุณครูช่วยสอนอยู่ตลอดเวลา
18 @R02065
คร่าวๆ น่าจะเกิดจากการนับปีผิด เพราะ system date ของเครื่องคุณมีน อาจจะไม่เหมือน กับที่ตัวอย่างเขาทำเอาไว้
คุณมีนต้องไปไล่ดูตามโค้ดของคุณมีนเอง แล้วดักเช็คไปทีละจุดทีละเงื่อนไขว่า ณ ขั้นตอนนั้น มันไปเอาค่าอะไรมาบ้าง ค่าที่ได้มาถูกต้องหรือไม่
เช่น ถ้าเอา year() มาเข้าตัวแปรไว้ เพื่อจะเอาไปต่อท้ายเลขที่
ก็ต้องดักเช็คดูว่า ค่าของมันเป็น ค.ศ. หรือ พ.ศ.
ลองดูครับ
19 @R02071
ทำได้แล้วค่ะ แต่ก็ยังไม่เข้าใจว่าเกิดอะไรขึ้นเหมือนกัน
โดยเปลี่ยน code NewID จากเดิมเก็บไว้ที่ Module นำไปไว้ที่ code ของ form (ไม่รู้เรียกว่าอะไร)
ผลปรากฎว่าได้ข้อมูลถูกต้อง

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