สมัครสมาชิก
 

ต้องการ Running Sum บน Continuous Form, แก้ปัญหาการ Search by Date Rage และอื่นๆ



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

03 ก.ย. 62 , 22:40:20
อ่าน 128 ครั้ง

Tatchawin

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

  • ขอบคุณ ไท.Access

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

สวัสดีครับทุกท่าน ผมมีปัญหามาถามทุกท่าน 3 ข้อ
1. ผมต้องการทำเลขบอกลำดับด้านหน้า Record บนคล้าย Continuous Form คล้ายๆกับ Running Sum บน Report จะมีวิธีการทำอย่างไร? (ตามภาพ)


2. ผมทำช่องให้กรอกช่วงเวลาที่ต้องการค้นหา Record(Search by Date Rage) เอาไว้ครับ(ตามภาพ) แต่พบปัญหาคือ
ผลลัพท์ที่ Search มาไม่ตรงที่ต้องการ โดยถ้าเปนการค้นหาในช่วงวันที่หลักเดียว เช่น วันที่ 1-9 ระบบจะค้นหา
โดยเป็นรูปแบบ เดือน/วัน/ปี แต่ถ้าเปนวันที่ 2 หลัก เช่น 10-31 ระบบจะค้นหาได้ผลลัพธ์ที่ถูกต้องแบบ วัน/เดือน/ปี
ผมจะมีวิธีแก้อย่างไร (โค้ดที่ผมเขียนเป็นอย่างนี้นะครับ)

Private Sub cmdSearch_Click()
    'Search button
Call Search
End Sub
_____________________________________________________________________________________________________
Sub Search()
Dim strCriteria, task As String
Me.Refresh
If IsNull(Me.txtDateFrom) Or IsNull(Me.txtDateTo) Then
    MsgBox "Please enter the date range", vbInformation, "Date Range Required"
    Me.txtDateFrom.SetFocus
Else
    strCriteria = "([TransactionsDate] >= #" & Me.txtDateFrom & "# And [TransactionsDate] <= #" & Me.txtDateTo & "#)"
    task = "select * from qryTransactions where (" & strCriteria & ") order by [TransactionsDate] ASC"
    DoCmd.ApplyFilter task
End If
End Sub


3. ผมต้องการให้แสดงผลลัพธ์ทั้งหมดที่ค้นหาได้ ตามภาพด้านบน จะมีแนวทางเขียนโค้ดอย่างไร

ขอบคุณทุกท่านล่วงหน้าครับ
ปล. ข้อมูลที่เหน เป็นข้อมูลจำลองนะครับ มิใช่ของจริงแต่อย่างใด
« แก้ไขครั้งสุดท้าย: 03 ก.ย. 62 , 22:55:15 โดย Tatchawin »

 

04 ก.ย. 62 , 09:19:23
ตอบกลับ #1

PNR

อ้างถึง
1. ผมต้องการทำเลขบอกลำดับด้านหน้า Record บนคล้าย Continuous Form คล้ายๆกับ Running Sum บน Report จะมีวิธีการทำอย่างไร? (ตามภาพ)

ขั้นตอนที่ 1 สร้าง 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
ขั้นตอนที่ 2 สร้าง textbox ชื่อ No ที่ ControlSource ใส่ ว่า =RowNum([Form])


ลำดับก็จะรันอัตโนมัติครับ


อ้างถึง
2. ผมทำช่องให้กรอกช่วงเวลาที่ต้องการค้นหา Record(Search by Date Rage) เอาไว้ครับ(ตามภาพ)
แก้โค้ดเป็นแบบนี้ดูครับ ใช้การกำหนด Sql แทน แก้ชื่อ Form1 เป็นชื่อฟอร์มของคุณด้วยนะครับ
โค๊ด: [Select]
Sub Search()
Dim Sql As String
 If IsNull(Me.txtDateFrom) Or IsNull(Me.txtDateTo) Then
    MsgBox "Please enter the date range", vbInformation, "Date Range Required"
    Me.txtDateFrom.SetFocus
    Sql = "SELECT * FROM qryTransactions ORDER BY qryTransactions.TransactionsDate;"
        Else
    Sql = "SELECT * FROM qryTransactions  WHERE (((qryTransactions.[TransactionsDate]) Between forms!Form1!txtDateFrom And forms!Form1!txtDateTo)) ORDER BY qryTransactions.TransactionsDate;"       
End If
        Me.Form.RecordSource = Sql       
End Sub

อ้างถึง
3. ผมต้องการให้แสดงผลลัพธ์ทั้งหมดที่ค้นหาได้ ตามภาพด้านบน จะมีแนวทางเขียนโค้ดอย่างไร
ผมสมมัติสร้าง textbox ไว้เก็บจำนวน Record ชื่อ txt_TotalRecordSearch
เวลาเราจะเรียกใช้ก็นำไปรวมกับ คำสั้งค้นหาวันที่ แบบนี้คับ

โค๊ด: [Select]
Sub Search()
Dim Sql As String
Dim FormRecCount  As Long
 If IsNull(Me.txtDateFrom) Or IsNull(Me.txtDateTo) Then
    MsgBox "Please enter the date range", vbInformation, "Date Range Required"
    Me.txtDateFrom.SetFocus
    Sql = "SELECT * FROM qryTransactions ORDER BY qryTransactions.TransactionsDate;"
        Else
    Sql = "SELECT * FROM qryTransactions  WHERE (((qryTransactions.[TransactionsDate]) Between forms!Form1!txtDateFrom And forms!Form1!txtDateTo)) ORDER BY qryTransactions.TransactionsDate;"       
End If
        Me.Form.RecordSource = Sql
        Me.txt_TotalRecordSearch.ControlSource = "=Count(No)"
End Sub

ตัวอย่างด้านล่างนะครับ

« แก้ไขครั้งสุดท้าย: 04 ก.ย. 62 , 09:44:28 โดย PNR »
:meaw: :grin: :shout:
 
โพสต์นี้ได้รับคำขอบคุณจาก: สันติสุข, Tatchawin

04 ก.ย. 62 , 13:13:58
ตอบกลับ #2

สันติสุข


Public Function RowNum(frm As Form) As Variant
        ...
        ...
        ...

เพิ่งรู้ว่าการอ้าง Form property ผ่านฟังก์ชั่นบน Continuous Form จะทำให้อ้างถึงเรคอร์ดเฉพาะของบรรทัดนั้นๆบนฟอร์ม แทนที่จะเป็นเรคอร์ดปัจจุบันบนฟอร์มเพียงเรคอร์ดเดียว
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อเป็นการสนับสนุนเวปบอร์ดให้สามารถอยู่บ
 
โพสต์นี้ได้รับคำขอบคุณจาก: PNR, Tatchawin

04 ก.ย. 62 , 15:13:47
ตอบกลับ #3

PNR

ใช่ครับอาจารย์ พอดีไปค้นเจอมาจากเว็บนอกครับเลยเอามาประยุกต์กับเคสนี้  :grin: :grin:
:meaw: :grin: :shout:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

05 ก.ย. 62 , 21:11:36
ตอบกลับ #4

Tatchawin

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

  • ขอบคุณ ไท.Access

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

อ้างถึง
1. ผมต้องการทำเลขบอกลำดับด้านหน้า Record บนคล้าย Continuous Form คล้ายๆกับ Running Sum บน Report จะมีวิธีการทำอย่างไร? (ตามภาพ)

ขั้นตอนที่ 1 สร้าง 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
ขั้นตอนที่ 2 สร้าง textbox ชื่อ No ที่ ControlSource ใส่ ว่า =RowNum([Form])


ลำดับก็จะรันอัตโนมัติครับ


อ้างถึง
2. ผมทำช่องให้กรอกช่วงเวลาที่ต้องการค้นหา Record(Search by Date Rage) เอาไว้ครับ(ตามภาพ)
แก้โค้ดเป็นแบบนี้ดูครับ ใช้การกำหนด Sql แทน แก้ชื่อ Form1 เป็นชื่อฟอร์มของคุณด้วยนะครับ
โค๊ด: [Select]
Sub Search()
Dim Sql As String
 If IsNull(Me.txtDateFrom) Or IsNull(Me.txtDateTo) Then
    MsgBox "Please enter the date range", vbInformation, "Date Range Required"
    Me.txtDateFrom.SetFocus
    Sql = "SELECT * FROM qryTransactions ORDER BY qryTransactions.TransactionsDate;"
        Else
    Sql = "SELECT * FROM qryTransactions  WHERE (((qryTransactions.[TransactionsDate]) Between forms!Form1!txtDateFrom And forms!Form1!txtDateTo)) ORDER BY qryTransactions.TransactionsDate;"       
End If
        Me.Form.RecordSource = Sql       
End Sub

อ้างถึง
3. ผมต้องการให้แสดงผลลัพธ์ทั้งหมดที่ค้นหาได้ ตามภาพด้านบน จะมีแนวทางเขียนโค้ดอย่างไร
ผมสมมัติสร้าง textbox ไว้เก็บจำนวน Record ชื่อ txt_TotalRecordSearch
เวลาเราจะเรียกใช้ก็นำไปรวมกับ คำสั้งค้นหาวันที่ แบบนี้คับ

โค๊ด: [Select]
Sub Search()
Dim Sql As String
Dim FormRecCount  As Long
 If IsNull(Me.txtDateFrom) Or IsNull(Me.txtDateTo) Then
    MsgBox "Please enter the date range", vbInformation, "Date Range Required"
    Me.txtDateFrom.SetFocus
    Sql = "SELECT * FROM qryTransactions ORDER BY qryTransactions.TransactionsDate;"
        Else
    Sql = "SELECT * FROM qryTransactions  WHERE (((qryTransactions.[TransactionsDate]) Between forms!Form1!txtDateFrom And forms!Form1!txtDateTo)) ORDER BY qryTransactions.TransactionsDate;"       
End If
        Me.Form.RecordSource = Sql
        Me.txt_TotalRecordSearch.ControlSource = "=Count(No)"
End Sub

ตัวอย่างด้านล่างนะครับ


ขอบคุณมากๆครับ เจ๋งมากๆ ผมแก้ไขตามที่ท่านให้แนวทางมา ทำได้จริง สุดๆครับ ขอคารวะ

 


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