สร้าง runing number บนฟอร์ม



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

19 พ.ค. 61 , 09:58:22
อ่าน 820 ครั้ง

prajak

สร้าง runing number บนฟอร์ม
« เมื่อ: 19 พ.ค. 61 , 09:58:22 »
รบกวนสอบถามครับ ผมมีฟอร์มสรุปยอดขายแต่ละลูกค้าที่สร้างมาจาก query โดยต้องการให้ฟิวด์ No. runตัวเลขให้อัตโนมัติ โดยไม่ว่าเราจะกรองค่าจากมากไปหาน้อย หรือน้อยไปหามาก ก็ให้เรียงลำดับจาก 1 แถวแรกเสมอ ( ข้อมูลลูกค้าหลังจาก group แล้วมีไม่มากครับ ประมาณไม่เกิน 30 ลูกค้า ซึงก็คือมีข้อมูลบนฟอร์มนี้ไม่เกิน 30 แถว )


 

19 พ.ค. 61 , 10:58:57
ตอบกลับ #1

OddyWriter

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #1 เมื่อ: 19 พ.ค. 61 , 10:58:57 »
ถ้าตารางมีฟิลด์ที่เป็น AutoNumber อยู่แล้วก็ไม่ต้องทำการเพิ่มฟิลด์ AutoNumber นะครับ
แต่ถ้าไม่มีให้ทำตามนี้
1. เพิ่มฟิลด์ myNum มีข้อมูลเป็น AutoNumber
2. นำฟิลด์ myNum มาใส่ในฟอร์ม ตั้งชื่อว่า myNum
3. ใส่ Code นี้เข้าไปใน Standard Module
=================================================
Option Compare Database
Option Explicit

Function myRunningSum(myForm As Form, myFieldName As String, myFieldNumber)
    Dim RS As Object
    Dim myCount As Integer
        On Error GoTo Err_myRunningSum
        Set RS = myForm.Recordset.Clone
        RS.FindFirst "[" & myFieldName & "] = " & myFieldNumber
            Do Until RS.BOF
                myCount = myCount + 1
                RS.MovePrevious
            Loop
End_myRunningSum:
    myRunningSum = myCount
Exit Function
Err_myRunningSum:
    myCount = 0
Resume End_myRunningSum
End Function
========================================

4. เพิ่ม Unbound Text Box แล้วใส่คำสั่งนี้เข้าไป Control Source
=myRunningSum([Form],"myNum",[myNum])

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

22 พ.ค. 61 , 09:39:34
ตอบกลับ #2

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #2 เมื่อ: 22 พ.ค. 61 , 09:39:34 »
ถ้าตารางมีฟิลด์ที่เป็น AutoNumber อยู่แล้วก็ไม่ต้องทำการเพิ่มฟิลด์ AutoNumber นะครับ
แต่ถ้าไม่มีให้ทำตามนี้
1. เพิ่มฟิลด์ myNum มีข้อมูลเป็น AutoNumber
2. นำฟิลด์ myNum มาใส่ในฟอร์ม ตั้งชื่อว่า myNum
3. ใส่ Code นี้เข้าไปใน Standard Module
=================================================
Option Compare Database
Option Explicit

Function myRunningSum(myForm As Form, myFieldName As String, myFieldNumber)
    Dim RS As Object
    Dim myCount As Integer
        On Error GoTo Err_myRunningSum
        Set RS = myForm.Recordset.Clone
        RS.FindFirst "[" & myFieldName & "] = " & myFieldNumber
            Do Until RS.BOF
                myCount = myCount + 1
                RS.MovePrevious
            Loop
End_myRunningSum:
    myRunningSum = myCount
Exit Function
Err_myRunningSum:
    myCount = 0
Resume End_myRunningSum
End Function
========================================

4. เพิ่ม Unbound Text Box แล้วใส่คำสั่งนี้เข้าไป Control Source
=myRunningSum([Form],"myNum",[myNum])
หลังจากที่อาจารย์ได้แนะนำมา เพิ่งมีเวลามาลองทำครับ ปรากฏว่ามีการ RuningNumberขึ้นมาจริงครับ แต่ Output ที่ได้ จากเดิมที่ Buyer จะถูกgroup เป็นตัวเดียว แล้วเอายอดขายมารวมกัน กลับกลายเป็นแยกมี buyer เดียวหลายๆบรรทัด ไม่ทราบว่าจะต้องแก้ไขยังไงครับ

 

22 พ.ค. 61 , 10:30:22
ตอบกลับ #3

OddyWriter

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #3 เมื่อ: 22 พ.ค. 61 , 10:30:22 »
ให้สร้างคิวรีจากคิวรีเพื่อไม่ให้มี Grouping ใน Query ที่นำมาทำฟอร์ม

กินร้อน ช้อนตัวเอง จานใครจานมัน ออกนอกบ้านใส่หน้ากากอนามัยหรือหน้ากากผ้า
 

22 พ.ค. 61 , 10:39:14
ตอบกลับ #4

ปิ่นณรงค์

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #4 เมื่อ: 22 พ.ค. 61 , 10:39:14 »
ลองดูอีกตัวอย่างนะครับ

บน Module

โค๊ด: [Select]
Global sNumber As Long
Global lastcall As Date
Function RunNumber(i) As Long
 If Now - lastcall > 1 / 60 / 60 / 24 Then
        lastcall = Now
        sNumber = -1
        End If
    sNumber = sNumber + 1
    RunNumber = sNumber
    End Function
ที่ฟอร์ม สร้าง Unbound Textbox ขึ้นมา 1 ตัว ใส่
=RunNumber([ชื่อของ Control ที่เราจะนับอันไหนก็ได้ในฟอร์มเลือกมา 1 ตัว])
แค่นี้ก็จะสามารถรันได้เหมือนกันครับ

หมายเหตุ
ถ้ารันฟอร์มแล้ว ตัวเลขที่รันตัวแรกไม่ใช้ 1 อาจจะเป็น 0 หรือ 2 ก็ให้เพิ่มลดที่ตรงนี้ได้เลยนะครับ
Global sNumber As Long
Global lastcall As Date
Function RunNumber(i) As Long
 If Now - lastcall > 1 / 60 / 60 / 24 Then
        lastcall = Now
        sNumber = -1 '-1 หรือ 0 หรือ 1 เลือกกำหนดได้
        End If
    sNumber = sNumber + 1
    RunNumber = sNumber
    End Function
« แก้ไขครั้งสุดท้าย: 22 พ.ค. 61 , 11:14:05 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, Eik Q Sang

22 พ.ค. 61 , 11:42:09
ตอบกลับ #5

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #5 เมื่อ: 22 พ.ค. 61 , 11:42:09 »
ลองดูอีกตัวอย่างนะครับ

บน Module

โค๊ด: [Select]
Global sNumber As Long
Global lastcall As Date
Function RunNumber(i) As Long
 If Now - lastcall > 1 / 60 / 60 / 24 Then
        lastcall = Now
        sNumber = -1
        End If
    sNumber = sNumber + 1
    RunNumber = sNumber
    End Function
ที่ฟอร์ม สร้าง Unbound Textbox ขึ้นมา 1 ตัว ใส่
=RunNumber([ชื่อของ Control ที่เราจะนับอันไหนก็ได้ในฟอร์มเลือกมา 1 ตัว])
แค่นี้ก็จะสามารถรันได้เหมือนกันครับ

หมายเหตุ
ถ้ารันฟอร์มแล้ว ตัวเลขที่รันตัวแรกไม่ใช้ 1 อาจจะเป็น 0 หรือ 2 ก็ให้เพิ่มลดที่ตรงนี้ได้เลยนะครับ
Global sNumber As Long
Global lastcall As Date
Function RunNumber(i) As Long
 If Now - lastcall > 1 / 60 / 60 / 24 Then
        lastcall = Now
        sNumber = -1 '-1 หรือ 0 หรือ 1 เลือกกำหนดได้
        End If
    sNumber = sNumber + 1
    RunNumber = sNumber
    End Function
ทำตามที่แนะนำ เวลาใส่-1 เปิดฟอร์มมาจะเริ่มที่ 0 แต่พอใช้ตัวกรองในฟอร์มจาก 0 จะกลายเป็น1
                               เวลาใส่0 เปิดฟอร์มมาจะเริ่มที่ 1 แต่พอใช้ตัวกรองในฟอร์มจาก 1 จะกลายเป็น2
                               เวลาใส่1 เปิดฟอร์มมาจะเริ่มที่ 2 แต่พอใช้ตัวกรองในฟอร์มจาก 2 จะกลายเป็น3
งงครับ ไม่รู้ต้องไปดักยังไง


 

22 พ.ค. 61 , 11:59:23
ตอบกลับ #6

ปิ่นณรงค์

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #6 เมื่อ: 22 พ.ค. 61 , 11:59:23 »
ลองดูตัวอย่างนี้นะครับ
ผมลองกรองแล้วก็ยังรันปกติ
ผมใส่ Code ดังนี้

Private Sub Form_Current()
Me.No.ControlSource = "=RunNumber([Sale_Index])"
End Sub

Sale_Index คือชื่อ Control ครับ
No คือชื่อ Unbound textbox
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, Eik Q Sang

22 พ.ค. 61 , 14:07:23
ตอบกลับ #7

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #7 เมื่อ: 22 พ.ค. 61 , 14:07:23 »
ผมลองสร้างฐานข้อมูลและฟอร์มใหม่ แล้วใช้คำสั่งตามที่คุณปิ่นณรงค์แนะนำ ก็running Number ได้ปกติครับ ไม่รู้ว่าฐานข้อมูลหรือ query มันไปผิดตรงไหน เดี๋ยวลองหาดูก่อนครับ

 

22 พ.ค. 61 , 14:34:15
ตอบกลับ #8

UnKnown

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #8 เมื่อ: 22 พ.ค. 61 , 14:34:15 »
ใน query ที่ดึงออกมาตามรูปนั้นมีข้อมูลอื่นที่เป็นข้อมูลที่ไม่มีค่าซ้ำเช่น เลขที่บิล,เลขที่... อีกใหมถ้ามีในมุมมองออกแบบใส่มันเข้ามาแล้วไม่อยากให้ใครเห็นค่อยไปสั่งซ้อนในมุมมองแผ่นข้อมูลก็ได้
หรือไม่มีข้อมูลอะไรที่ไม่มีค่าซ้ำกันถ้าจะทำตามวิธีนี้ก็ไปทำให้มีครับ


จากนั้นในกล่อง No ตามรูปใส่โค้ด
โค๊ด: [Select]
=GetLineNumber([Form],"Bill_no",[Bill_No])

ก็จะได้เลข No โดยอัตโนมัติ

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

23 พ.ค. 61 , 10:20:08
ตอบกลับ #9

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #9 เมื่อ: 23 พ.ค. 61 , 10:20:08 »
ใน query ที่ดึงออกมาตามรูปนั้นมีข้อมูลอื่นที่เป็นข้อมูลที่ไม่มีค่าซ้ำเช่น เลขที่บิล,เลขที่... อีกใหมถ้ามีในมุมมองออกแบบใส่มันเข้ามาแล้วไม่อยากให้ใครเห็นค่อยไปสั่งซ้อนในมุมมองแผ่นข้อมูลก็ได้
หรือไม่มีข้อมูลอะไรที่ไม่มีค่าซ้ำกันถ้าจะทำตามวิธีนี้ก็ไปทำให้มีครับ


จากนั้นในกล่อง No ตามรูปใส่โค้ด
โค๊ด: [Select]
=GetLineNumber([Form],"Bill_no",[Bill_No])

ก็จะได้เลข No โดยอัตโนมัติ

ลองแล้วยังเพี้ยนๆอยู่ครับ ได้บ้างไม่ได้บ้าง

 

23 พ.ค. 61 , 10:31:00
ตอบกลับ #10

ปิ่นณรงค์

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #10 เมื่อ: 23 พ.ค. 61 , 10:31:00 »
ลองดูตัวอย่างนี้นะครับ น่าจะโอเคสุดละ

บน Module

โค๊ด: [Select]
Public Function RowNum(frm As Form) As Variant
On Error GoTo Err_RowNum
   
    With frm.RecordsetClone
        .Bookmark = frm.Bookmark
        RowNum = .AbsolutePosition + 1
    End With
   
Exit_RowNum:
    Exit Function
   
Err_RowNum:
    If Err.Number <> 3021& Then
        Debug.Print "RowNum() error " & Err.Number & " - " & Err.Description
    End If
    RowNum = Null
    Resume Exit_RowNum
End Function

ที่ textbox ชื่อ NO ใส่ =RowNum([Form])
ตัวอย่างด้านล่าง
« แก้ไขครั้งสุดท้าย: 23 พ.ค. 61 , 11:33:13 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

23 พ.ค. 61 , 12:44:02
ตอบกลับ #11

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #11 เมื่อ: 23 พ.ค. 61 , 12:44:02 »
ลองดูตัวอย่างนี้นะครับ น่าจะโอเคสุดละ

บน Module

โค๊ด: [Select]
Public Function RowNum(frm As Form) As Variant
On Error GoTo Err_RowNum
   
    With frm.RecordsetClone
        .Bookmark = frm.Bookmark
        RowNum = .AbsolutePosition + 1
    End With
   
Exit_RowNum:
    Exit Function
   
Err_RowNum:
    If Err.Number <> 3021& Then
        Debug.Print "RowNum() error " & Err.Number & " - " & Err.Description
    End If
    RowNum = Null
    Resume Exit_RowNum
End Function

ที่ textbox ชื่อ NO ใส่ =RowNum([Form])
ตัวอย่างด้านล่าง
ได้เลยครับ ขอบคุณมากๆเลยนะครับคุณปิ่นณรงค์ (คุณ Newbies เดิมหรือเปล่าครับ)
ขอบคุณคุณ OddyWriter, คุณ UnKnown

 

23 พ.ค. 61 , 12:51:35
ตอบกลับ #12

ปิ่นณรงค์

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #12 เมื่อ: 23 พ.ค. 61 , 12:51:35 »
ใช่ครับ คุณ Prajak

จากตัวอย่าง ถ้าจะให้ดีสั่ง Requery ตอนโหลดฟอร์มมาซักครั้งเพื่อป้องกันข้อผิดพลาดนะครับเพราะ เป็นฟังชั่นทำงานกับข้อมูลบน Form

เช่น
Private Sub Form_Load()
Form.Requery
End Sub
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

23 พ.ค. 61 , 13:03:04
ตอบกลับ #13

prajak

: สร้าง runing number บนฟอร์ม
« ตอบกลับ #13 เมื่อ: 23 พ.ค. 61 , 13:03:04 »
ครับ เพิ่มคำสั่งแล้วครับ

 


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