อยากได้ตัวอย่าง access การทำ running number แบบ ปี เดือน รันเลข 3 ตำแหน่ง มือใหม



0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

19 ก.ค. 61 , 16:50:32
อ่าน 1689 ครั้ง

chatchai

  • สมาชิกไท.Access
  • กระทู้: 2

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

สวัสดีครับ ผมมือใหม่มาก ลองทำโปรแกรม Access เกี่ยวกับการสั่งซื้อ ขึ้นมาใช้งานง่ายๆ ครับ แต่ติดตรง running number ที่ต้องเป็นแบบ ปี เดือน และเลข รัน 3 ตัว เช่น 1807001 และรันไปจนถึงสิ้นเดือน และเริ่มเดือนใหม่ ก็จะเป็น 1808001 แบบนี้อะครับ เห็นบอกมีวิธี สร้าง query เพื่อทำ running แต่ไม่มีความรู้ด้านนี้เท่าไหร่ครับ เลยอยากได้ตัวอย่าง access ที่เพื่อนๆ ทำไว้แล้วมาขอศึกษาบ้างครับ ขอบคุณล่วงหน้าครับ

 

20 ก.ค. 61 , 10:12:47
ตอบกลับ #1

OddyWriter

ผมทำตัวอย่างบนฟอร์มและใช้มาโคร เนื่องจากเห็นว่าเป็นมือใหม่
กินร้อน ช้อนตัวเอง จานใครจานมัน ออกนอกบ้านใส่หน้ากากอนามัยหรือหน้ากากผ้า
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, chatchai, taedaneen

20 ก.ค. 61 , 10:17:29
ตอบกลับ #2

chatchai

  • สมาชิกไท.Access
  • กระทู้: 2

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

ขอบคุณมากครับ ผมจะลองทำดูครับ

 

23 ก.ค. 61 , 12:32:09
ตอบกลับ #3

UnKnown

จากไฟล์ตัวอย่างไหงผมรันแมโครไม่ได้ครับนี่ (เปิดใช้งานแมโครทั้งหมด by access 2013 แล้ว)


 

23 ก.ค. 61 , 15:04:57
ตอบกลับ #4

ปิ่นณรงค์

ผมลองปรับปรุงให้ ใหม่เป็นโค้ด แต่คงไม่ยากมาก ลองดูว่าสามารถใช้งานได้หรือไม่นะครับ
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, prajak

23 ก.ค. 61 , 19:59:36
ตอบกลับ #5

UnKnown

ยังคงใช้ไม่ได้ครับ
เห็นฟ้อง 'Jul' หรือเป็นที่เครื่องผมตั้งค่าเวลาเป็นอังกฤษ ต้องแก้อย่างไรโดยยังคงรูปแบบเวลาใว้ครับนี่



 

23 ก.ค. 61 , 20:52:34
ตอบกลับ #6

OddyWriter

ผม test ทั้งมาโครและโมดูลของคุณปิ่นณรงค์แล้วไม่พบปัญหาใดๆ

การตั้งค่า Windows ผมก็ตั้งเหมือนกับของคุณ

ผมใช้ Office 365 (2016) ปัญหาน่าจะอยู่เครื่องคุณแล้วล่ะ

ลองตั้งค่า Access ของคุณเป็นภาษาอังกฤษดีกว่าครับ

File > Options > Language
กินร้อน ช้อนตัวเอง จานใครจานมัน ออกนอกบ้านใส่หน้ากากอนามัยหรือหน้ากากผ้า
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

23 ก.ค. 61 , 21:40:13
ตอบกลับ #7

UnKnown

เป็นที่เครื่องจริงๆเอาไฟล์กลับไปใช้ที่บ้านใช้ได้ซะงั้น   :sweat:
เดี๋ยวพรุ้งนี้กลับไปแก้เครื่องเจ้าปัญหาตามท่าน OddyWriter อีกที :dizzy:


เปลี่ยนรูปแบบวันที่ของเครื่องที่ใช้จากแสดงชื่อเดือนด้วยตัวอักษร  เป็น--> แสดงชื่อเดือนเป็นตัวเลขสองหลัก = ใช้งานได้แล้วครับ  :fake smile:
« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 13:13:28 โดย UnKnown »

 

24 ก.ค. 61 , 19:36:13
ตอบกลับ #8

UnKnown

สอบถามเพิ่มเติมครับ
"ทำอย่างไรให้ตรวจสอบว่าเครื่องๆนั้นใช้ปี ค.ศ. หรือ พ.ศ. ถ้าใช้ปี ค.ศ. ก็ให้บวกเป็นปี พ.ศ." เพื่อให้เลขที่บิลที่ออกมาไปแนวทางเดียวกันนะครับ
ปล.พยายามเอาโมดูลมาใช้กลับไปไม่เป็นซะงั้น :spook:
โค๊ด: [Select]
Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare Function GetLocaleInfo Lib "kernel32" _
   Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
   ByVal LCType As Long, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) As Long

Public Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String
   Dim sReturn As String
   Dim r As Long
   r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
   If r Then
      sReturn = Space$(r)
      r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
      If r Then GetUserLocaleInfo = Left$(sReturn, r - 1)
   End If
End Function

Public Function mYear(ByVal yourDate As Date) As Long
    mYear = Year(yourDate)
    If GetUserLocaleInfo(GetSystemDefaultLCID(), &H1009) = 7 Then mYear = Year(yourDate) - 543
End Function

Public Function bYear(ByVal yourDate As Date) As Long
    bYear = Year(yourDate)
    If GetUserLocaleInfo(GetSystemDefaultLCID(), &H1009) <> 7 Then bYear = Year(yourDate) + 543
End Function
เครดิต อาจารย์ TTT อ.yeadram อาจารย์ PichaiTC เช่นกันครับ
« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 22:15:19 โดย UnKnown »

 

24 ก.ค. 61 , 20:28:13
ตอบกลับ #9

ปิ่นณรงค์

ฟังชั้นนี้เปนการ เลือกใช้ แบบปี พศ หรือ คศ ครับ
ถ้าเดิม เป็น 01/01/2018
อยากให้แปลงจาก พศ เป็น คศ
myear(Fieldวันที่) แปลงเป็น คศ
byear(Fieldวันที่) แปลงเป็น พศ

ที่ textbox หรือ คิวรี่ ใส่แบบนี้
=Format([mydate],"DD/MM/" & myear([Mydate]))
เราจะได้ 01/01/2018 ครับ

ส่วนการแปลง จาก คศ เป็น พศ
ที่ textbox หรือ คิวรี่ ใส่แบบนี้
=Format([mydate],"DD/MM/" & Byear([Mydate]))
เราจะได้ 01/01/2561 ครับ

Mydate คือฟิลล์วันที่ครับ
ผมได้ทำตัวอย่างการใช้งานกับคิวรี่ ไว้ให้ดูตัวอย่างด้วยนะครับ ตัวอย่างด้านล่าง

เครดิต อาจารย์ TTT อาจารย์ yeadram อาจารย์ PichaiTC นะครับ

« แก้ไขครั้งสุดท้าย: 24 ก.ค. 61 , 23:38:16 โดย ปิ่นณรงค์ »
:love: :grin:
 

25 ก.ค. 61 , 09:07:23
ตอบกลับ #10

UnKnown

ขออภัยด้วยครับ ที่ผมอยากให้มีผลคือเลข RunnungNum นะครับ
ตัวอย่าง
  รูปแบบเวลาของคอมพิวเตอร์    แสดงบน txtDate    RunnungNum  
Thailand
25-07-61
6107xxx
English
25-07-18
6107xxx

หรือก็คืออยากให้ RunnungNum เป็นปี พ.ศ.(61...)ไม่ว่าเครื่องๆนั้นจะใช้เวลาแบบใดนะครับ

 

25 ก.ค. 61 , 10:22:16
ตอบกลับ #11

preechaaesanan

https://www.thai-access.com/index.php?topic=298.msg1122#msg1122

คุณปิ่นณรงค์เคยจัดไปรอบนึง แล้วครับ ลองนำไปปรับดู

 

25 ก.ค. 61 , 10:53:21
ตอบกลับ #12

ปิ่นณรงค์

ลองดูตัวอย่างนี้ครับ Fix พศ ไว้ตลอด
โค๊ด: [Select]
Private Sub Data_AfterUpdate()
Dim fixyear As String
If GetUserLocaleInfo(GetSystemDefaultLCID(), &H1009) = 7 Then
Me.RunnungNum = Format(Me.txtDate, "YY") & Format(Me.txtDate, "MM") & Right("00" & DCount([myDate], "[tblRunningNumber]") + 1, 3)
ElseIf GetUserLocaleInfo(GetSystemDefaultLCID(), &H1009) <> 7 Then
fixyear = bYear(Me.txtDate)
Me.RunnungNum = Right(fixyear, 2) & Format(Me.txtDate, "MM") & Right("00" & DCount([myDate], "[tblRunningNumber]") + 1, 3)
End If
End Sub
« แก้ไขครั้งสุดท้าย: 25 ก.ค. 61 , 19:29:40 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

25 ก.ค. 61 , 11:17:26
ตอบกลับ #13

Kxess

ขอแชร์ฟังก์ชันที่ผมเอาไว้สร้างเลขที่ invoice อัตโนมัติ ละกันนะครับ

- รันเลขที่อัตโนมัติ โดยรูปแบบเป็น ABC001-05-18 (ABC = คำนำหน้าเฉยๆ / 001 = เลขที่ / 05 = เลขเดือน / 18 = เลขปี) (INV_ID เป็น Short Text และเป็น Primary Key)
- เป็นการเรียงเลข invoice โดยตรวจสอบจากเลขที่เก่า ขึ้นเดือนใหม่ นับ 001 ใหม่
- เขียนฟังก์ชั่นเก็บไว้ที่ Modules
- ผมเรียกใช้โดยสร้างตัวแปรตอนกดปุ่ม
โค๊ด: [Select]
AutoGenINV_ID as string
AutoGenINV_ID  = AutoINV_ID

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

โค๊ด: [Select]
Public Function AutoINV_ID() As String
On Error GoTo ErrorHandlerFx

'get Now date
Dim NowMM As String 'เลขเดือนปัจจุบัน
Dim NowYY As String 'เลขปีปัจุบัน
Dim StrINV_RunNumber As String 'เลข inv สุดท้ายที่ได้จากกระบวนการทั้งหมด
Dim getLastINV As String 'เลข inv ล่าสุด
Dim IntINV As Integer 'ไว้พักค่าเฉยๆ
Dim LastINV_MM_YY As String 'เลขรวม inv+MM+YY
Dim Now_MM_YY As String 'เลขเดือน/ปี ปัจุบัน
Dim NewINV As String 'เลข inv ใหม่
Dim LastDate As String 'วันที่ออก inv ล่าสุด

'get Date
NowMM = Month(Date)
If NowMM < 10 Then
NowMM = "0" & NowMM
End If

NowYY = Year(Date) 'รับค่าปีปัจจุบัน (ไม่ได้ขึ้นอยู่กับรูปแบบเวลาของเครื่อง)
NowYY = Right(NowYY, 2) 'เอาเฉพาะ 2 ตัวท้าย *จะทำงานผิดพลาด ถ้าขึ้นปี ค.ศ.2100 ให้เขียนเช็คปีแล้วหักลบเอาเองเด้อ
Now_MM_YY = NowMM & "-" & NowYY 'เอาค่าเดือนและปีมารวมกัน จะกลายเป็น "07-18"
'----------------------------------------------

LastDate = DMax("INV_Date", "Invoice") 'ตรวจสอบวันที่ออก inv ล่าสุด
getLastINV = Nz(DLookup("INV_ID", "Invoice", "Format(INV_Date, ""ddmmyyyyhhmm"") = " & Format(LastDate, "ddmmyyyyhhmm")), "ABC000-00-00") 'ดึงเอาเลข inv ล่าสุด โดยเปรียบเทียบจากวันเวลาที่ออก inv แต่ถ้าไม่มีข้อมูลจะกำหนดใหม่เป็น "ABC000-00-00"

'สมมติให้ getLastINV มีค่าเท่ากับ "ABC051-07-18"
LastINV_MM_YY = Right(getLastINV, 5) 'ตัด 5 อักษรจากขวา ได้ "07-18"

getLastINV = Left(getLastINV, 6) 'ตัด 6 หลักจากซ้าย ได้ "ABC051"
getLastINV = Right(getLastINV, 3) 'ตัด 3 หลักจากขวา ได้ "051" คือ inv ลำดับที่ 51 ในเดือนนี้

'ตรวจสอบถ้าเดือนและปีปัจจุบัน = เดือนและปีล่าสุดของเลขที่ inv หรือไม่
If Now_MM_YY = LastINV_MM_YY Then
IntINV = CInt(getLastINV)
IntINV = IntINV + 1 'จะได้ 51 + 1 = 52
Else
IntINV = 1 'ถ้าไม่เท่า แสดงว่าขึ้นเดือนใหม่ ให้นับ 1 ใหม่
End If

'ใส่เลข 0 ด้านหน้า เพื่อให้เป็นเลข 3 หลัก
Select Case IntINV
Case Is < 10
        StrArrayINV_Output = "00" & CStr(IntINV)
Case Is < 100
        StrArrayINV_Output = "0" & CStr(IntINV) 'ตอนนี้ IntINV = 51 จะเข้าเคส <100 ก็เติม 0 ไป 1 ตัว รวมเป็น "051"
Case Is < 1000
        StrArrayINV_Output = CStr(IntINV)
Case Else
        MsgBox "เกิดข้อผิดพลาด ไม่สามารถสร้างเลขที่ invoice ได้ !!!"
        Exit Function
End Select

StrINV_RunNumber = "ABC" & StrINV_RunNumber & "-" & Now_MM_YY 'สุดท้ายได้ "ABC052-07-18"
AutoINV_ID = StrINV_RunNumber คืนค่าเลข inv ที่ได้
Exit Function

'On Error Handler
ExitSubFx:
AutoINV_ID = "ใส่เลขที่ invoice"
Exit Function

ErrorHandlerFx:
MsgBox "Error Number:" & Err.Number & " " & "ไม่สามารถสร้างเลขที่ invoice อัตโนมัติได้ กรุณาใส่เลขที่เอง "
'Call onError_FX(Err.Number)
Resume ExitSubFx

End Function

 
โพสต์นี้ได้รับคำขอบคุณจาก: SuwaP, nutto2456

25 ก.ค. 61 , 11:32:39
ตอบกลับ #14

ปิ่นณรงค์

แก้ให้แล้วครับ อยู่โพสบนนะครับ
:love: :grin:
 

25 ก.ค. 61 , 12:31:34
ตอบกลับ #15

UnKnown

ขอขอบคุณท่านปิ่นณรงค์ครับ :love: ใช้ได้สมบูรณ์ตรงตามเป๋าหมาย
ขอบคุณ อ.OddyWriter ด้วยครับ(จากมาโครเล็กๆ ต่อความมาซะยาวเลยนะนี่เรา :nice day:)
ขอบคุณ.preechaaesanan คุณ.Kxess ครับสำหรับแนวทางเพิ่มเติม :slobber:

 

26 ก.ค. 61 , 11:34:57
ตอบกลับ #16

UnKnown

ทดสอบเปลี่ยนเดือน เลขสามตัวท้ายไม่กลับไปเริ่มนับ 001 นะครับ (ฉบับมาโครก็เช่นเดียวกัน)

  RunnungNum    myDate    Data 
  6107001   26-07-18    11
  6107002   26-07-18    22
  6108003   01-08-18    33
  6108004   01-08-18    44
  6109005   01-09-18    55
  6109006   01-09-18    66

 

26 ก.ค. 61 , 11:40:22
ตอบกลับ #17

OddyWriter

ทดสอบเปลี่ยนเดือน เลขสามตัวท้ายไม่กลับไปเริ่มนับ 001 นะครับ (ฉบับมาโครก็เช่นเดียวกัน)

  RunnungNum    myDate    Data 
  6107001   26-07-18    11
  6107002   26-07-18    22
  6108003   01-08-18    33
  6108004   01-08-18    44
  6109005   01-09-18    55
  6109006   01-09-18    66


ก็ไม่เปลี่ยนสิครับ เพราะลืมทำเงื่อนไขนั้นไว้

ลองดูไฟล์ใหม่ครับ
กินร้อน ช้อนตัวเอง จานใครจานมัน ออกนอกบ้านใส่หน้ากากอนามัยหรือหน้ากากผ้า
 
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, TaroKung Ichimura

17 ต.ค. 61 , 19:41:07
ตอบกลับ #18

TaroKung Ichimura

  • สมาชิกไท.Access
  • กระทู้: 19

    • ดูรายละเอียด

ทดสอบเปลี่ยนเดือน เลขสามตัวท้ายไม่กลับไปเริ่มนับ 001 นะครับ (ฉบับมาโครก็เช่นเดียวกัน)

  RunnungNum    myDate    Data 
  6107001   26-07-18    11
  6107002   26-07-18    22
  6108003   01-08-18    33
  6108004   01-08-18    44
  6109005   01-09-18    55
  6109006   01-09-18    66


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

Private Sub Name_AfterUpdate()
    ID = Format([date], "yymm") & Right("000" & DCount("[ID]", "[tbl_Tet]", "Left([ID],4) = Format([date],'yymm')") + 1, 3)
End Sub

***
ทำได้แล้วครับ ผมสับสนเอง ขอโทษด้วยนะครับ
« แก้ไขครั้งสุดท้าย: 17 ต.ค. 61 , 19:52:07 โดย TaroKung Ichimura »

 


บอร์ดเรียนรู้ Access สำหรับคนไทย