ช่วยดูโค๊ดออร์โต้นัมเบอร์ให้หน่อยครับ
กระทู้เก่าบอร์ด อ.Yeadram

 3,486   13
URL.หัวข้อ / URL
ช่วยดูโค๊ดออร์โต้นัมเบอร์ให้หน่อยครับ

สวัสดีครับ ผมรบกวนสอบถามท่านอาจารย์ทุกท่านด้วยนะครับ คือผมได้โค๊ดนี้มาจากกระทู้ในนี้และได้เปลี่ยนแปลงบางส่วนให้เข้ากับงานของผมโดยโค๊ดมีดังนี้ครับ

Private Sub RunBy_Click()
Me.ByDocNum = AutoNo
End Sub
----------------------------------------------------------
Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo", "mid(ByDocNo,3,4) = " & Year(Now()))
If IsNull(X) Or CInt(X) = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC" & Year(Now()) & "-" & Format(bk, "000000")
End Function
----------------------------------------------------------
ผมลัพที่ได้จะออกมาเป็น   IC2011-000001
ถ้าผมต้องการให้ผลออกมาแค่เพียง   IC-000001 โดยที่ไม่เอาปีเข้ามารวมด้วย
ไม่ทราบผมต้องแก้โค๊ดนี้ยังไงครับผม ผมลองแก้อยู่หลายทีแล้วครับ ขอบคุณครับ

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

1 @R07725
Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo", "mid(ByDocNo,3,4) = ")
If IsNull(X) Or CInt(X) = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC" & Year(Now()) & "-" & Format(bk, "000000")
End Function


ตัด & Year(Now()) ออก
2 @R07727
ขอบคุณครับคุณ Un ผมได้ลองทำตามที่ท่าน Un บอกแล้วครับมันขึ้น Run-time error '3075': ครับผม
รบกวนสอบถามด้วยครับ
3 @R07729
ในตารางของคุณ นอกจากเลขที่ ที่รันขึ้นต้นด้วย IC- แล้วมีเลขที่รูปแบบอื่น (ขึ้นต้นด้วยรูปแบบอื่นๆ) ด้วยหรือไม่ครับ

ถ้าคิดว่าไม่มีรูปแบบอื่น (ทั้งตารางรันเหมือนกัน คือ ขึ้นต้นด้วย IC- ทั้งหมด)
ให้เอาเงื่อนไข ออกจากฟังก์ชั่น Dmax ครับ ให้เหลือแค่
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo")


แต่ถ้ามีรูปแบบอื่นด้วย ก็ให้เปลี่ยนเงื่อนไข ไปตามความจำเป็นครับ เช่น เราจะตั้งเงื่อนไขว่า ให้ดูเลขที่สุดท้ายของเลขที่ ที่ขึ้นต้นด้วย IC- ก็ให้เปลี่ยนเงื่อนไขเป็น
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo", "Left(ByDocNo,3) Like 'IC-'")

ปัญหาของคุณอยู่ที่เงื่อนไขของ Dmax ครับ ลองปรับเปลี่ยนดูครับ
4 @R07730
ขอบคุณครับ คุณ yeadram ในตารางของผมเป็นตารางรหัสลูกค้าไม่ต้องการ Dlookup ครับคือให้มันรัน IC-000001, IC-000002 ไปเรื่อยๆนะครับ ถ้าผมเขียนอย่างนี้ถูกต้องไหมครับ

Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo")
If IsNull(X) Or CInt(X) = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC" & Year(Now()) & "-" & Format(bk, "000000")
End Function


รบกวนด้วยนะครับ
5 @R07736
ไม่ครับ ไม่
คุณต้องเอา year ออกอย่างที่คุณ Un บอกด้วยครับ

Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo")
If IsNull(X) Or CInt(X) = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC-" & Format(bk, "000000")
End Function
6 @R07738
ขอบคุณมากครับ ที่คุณ yeadram ช่วยเขียนโค๊ดให้ดู ขอบคุณมากๆครับผม
7 @R10016
ทำตามนี้ค่ะ

Private Sub RunBy_Click()
Me.ByDocNum = AutoNo
End Sub
----------------------------------------------------------

Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = DMax("Right(ByDocNo,6)", "TbBuyInDocNo")
If IsNull(X) Or CInt(X) = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC-" & Format(bk, "000000")
End Function


ฟ้้องว่า run time error '94'
             valid use of Null

รบกวนผู้รู้ ช่วยทีนะคะ
8 @R10037
ปรับแก้ตามนี้ดูครับ
Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = nz(DMax("Right(ByDocNo,6)", "TbBuyInDocNo") ,0)
If X = 0 Then bk = 1 Else bk = X + 1
AutoNo = "IC-" & Format(bk, "000000")
End Function
9 @R10045
แก้ไขได้แล้วค่ะ ขอบคุณมากค่ะ

เหลืออีก 2 อย่างที่หนูต้องการทำค่ะ รบกวนอีกทีนะคะ

1.หนูต้องการให้ตั้งค่าตัวอักษรตัวแรกได้
   สิ่งที่หนูทำคือ รับค่าจากหน้าตั้งค่า แล้วแยกตัวอักษรกับเลขใส่ไว้แยก 2 field ชื่อ txt_id และ num_id จากนั้น หน้าที่หนูจะรันรหัสขึ้นมา หนูจึงเรียก txt_id ขึ้นมา ดัง Code นี้
---------------------------------------------------------------

Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = Nz(DMax("Right(PD_ID,5)", "TbBuyInDocNo"), 0)
If X = 0 Then bk = 1 Else bk = X + 1
AutoNo = (txt_id) & Format(bk, "00000")
End Function
----------------------------------------------------------------

ปรากฏว่า สิ่งที่หนูได้คือ A00001,00002,00003.....
หนูต้องทำอย่างไรคะ

2. เมื่อรันรหัสขึ้นมา หนูต้องการใช้โชว์รหัสเลย ก่อนที่จะคีย์ข้อมูลใดๆ และ ช่องที่รันรหัสขึ้นมาไม่สามารถแก้ไขรหัสได้
หนูคิดว่า อาจจะต้องเปลี่ยน Action จาก Exit เป็นอย่างอื่น และต้องเขียนอะไรเพิ่ม ก็ลองหลายอย่างแล้ว แต่ก็ไม่ได้ค่ะ หนูจะแก้ยังไงดีคะ
Private Sub RunBy_Exit(Cancel As Integer)
Me.PD_ID = AutoNo
End Sub
    

เกือบได้แล้วค่ะ รบกวนอาจารย์ช่วยชี้แนะหนูด้วยนะคะ ขอบคุณค่ะ
10 @R10048
แก้ไปแก้มา แก้ปัญหา ข้อ 1 ได้แล้วค่ะ
คือ ไม่ต้องแยกฟิลด์ ก็ดึงค่าจาก PD_ID ที่กรอกเข้าไปแล้วมาแสดง โดยใช้ Code นี้ค่ะ(มั่วๆ)

Function AutoNo() As String
Dim X As Variant
Dim bk As String
X = Nz(DMax("Right(PD_ID,5)", "TbBuyInDocNo"), 0)
Z = Nz(DMax("Left(PD_ID,1)", "TbBuyInDocNo"), 0)
If X = 0 Then bk = 1 Else bk = X + 1
AutoNo = Z & Format(bk, "00000")
End Function

ได้ผลเป็นที่น่าพอใจ
ลองเทสเริ่มจาก A00005, A00006, A00007... แต่ว่าปัญหาก็ยังมีเหมือนเดิมค่ะ
คือรหัสที่แสดงตัวแรก มันจะถูกตัวที่สองมาทับซ้ำใน Record เดียวกัน แล้วจึงเพิ่ม Record ต่อไป คือ จะแสดง A00005 เมื่อ run และเมื่อกดแท็บเลื่อนไปยังคอลัมม์ต่อไป A00006 กลับมาทับ A00005 ส่วน A00007... + ได้เป็นปกติค่ะ ไม่ทราบว่า ต้องแก้ไข อย่างไรคะ

ส่วนข้อ 2 ยังไม่ได้เหมือนเดิมค่ะ

ขอบคุณค่ะ
11 @R10050
อย่าปล่อยให้มันทำงานทันทีครับ
ต้องมีเงื่อนไขให้มันบ้าง

Private Sub RunBy_Exit(Cancel As Integer)
if me.PD_ID="" or isnull(Me.PD_ID) then Me.PD_ID = AutoNo
End Sub
12 @R10051
ขอบคุณอาจารย์ yeadram มากค่ะ ที่สละเวลาพักผ่อนวันหยุดมาตอบให้

ตอบโจทย์ครบสมบูรณ์ค่ะ

ถ้ามีอะไรที่หนูช่วยได้บอกนะคะ

หนูเป็นหนี้บุญคุณอาจารย์แล้ว

13 @R10052
เรียนอาจารย์ yeadram ที่เคารพค่ะ

แฮะๆ นึกว่า จะจบละ ยังนิดนึงค่ะ

เนื่องจากรหัสสินค้าของหนูสามารถตั้งค่าใหม่ได้ หนูต้องการให้ทุกครั้งที่มีการตั้งค่าใหม่ มันไปเริ่มที่ Record สุดท้ายค่ะ

ตอนนี้ ถ้าเพิ่มเข้ามาใหม่มันไปทับที่ Record แรก แล้วพอเลื่อนไป Record สุด มันจะยังรันรหัสตัวเดิมอยู่ค่ะ

** มีตรงไหนเค้าแจก Code พร้อมอธิบายมั้ย คะ หนูเริ่ม ต้นใหม่ อ่านจบไปเล่มหนึ่ง ก็ยังไม่ค่อยมีไรในหัวเลยค่ะ



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