แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - kn208598

หน้า: [1]
1
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 18:14:51 »
ขาดโค๊ดไปบรรทัดหนึ่ง
ตรงที่ ให้ ไปยัง record แรกก่อน

Dim rst As Recordset
Dim strFirstSalary As String
Set rst = Me.RecordsetClone
If rst.RecordCount = "0" Then
MsgBox "No record"
Else
rst.MoveFirst
strFirstSalary = rst!Salary
DoCmd.GoToRecord , , acFirst
Do Until rst.EOF
Me.ID = strFirstSalary
DoCmd.GoToRecord , , acNext
rst.MoveNext
Loop
End If
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

2
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 15:53:23 »
อ๋อครับ..คือผมยกตัวอย่างเพื่อให้ทราบว่าโค้ดตัวนี้มันผิดอย่างไร และต้องแก้อย่างไรน่ะครับ..ขอบคุณครับ..

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

ปกติถ้าจะให้ record ในตาราง นั้นอัพเดทแล้วไปยังเรคคอร์ดต่อไปใช้
rst.movenext อย่างเดียวก็ได้แล้วครับ

แต่ถ้าบนฟอร์มและให้ข้อมูลวางบน Control Textbox ต้องใช้การ gotoRecord เพื่อให้มันสามารถเลื่อนไปยังตัวต่อไปได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

3
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 15:33:55 »
ฟิลด์ Salary มาแสดงที่ฟิลด์ ID ทุกๆเรคคอร์ด

ผมไม่แน่ใจเกี่ยวกับการนำไปใช้งานในอนาคต
กรณีที่มี salary เหมือนกัน ข้อมูล ID ที่เก็บเข้าไปก็จะซ้ำกันนะครับ

วิธีทำง่ายๆใช้ gotoRecord มาช่วยได้ครับ

โค๊ด: [Select]
Dim rst As Recordset
Dim strFirstSalary As String
Set rst = Me.RecordsetClone
If rst.RecordCount = "0" Then
MsgBox "No record"
Else
rst.MoveFirst
strFirstSalary = rst!Salary
DoCmd.GoToRecord , , acFirst
Do Until rst.EOF
Me.ID = strFirstSalary
DoCmd.GoToRecord , , acNext
rst.MoveNext
Loop
End If
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

4
ห้อง MS Access / : สร้าง AutoRunning ในคิวรี่
« เมื่อ: 23 ธ.ค. 64 , 15:25:54 »
ลองดูกระทู้นี้ครับ

https://www.thai-access.com/yeadram_view.php?topic_id=187
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

5
ดูที่ผมตอบในกระทู้ตามลิงค์นี้นะครับ พอเป็นแนวทางได้ครับ https://www.thai-access.com/index.php?topic=1322.0
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

6
ได้แล้วครับ..ขอบคุณมากน่ะครับ
ขอถามเป็นความรู้หน่อยน่ะครับ...
If Me.Dirty = True Then
   Me.Dirty = False
End If
หมายความว่าอย่างไร..ใช้ประโยชน์อะไรครับ..ขอขอบคุณมากน่ะครับ

If Me.Dirty = True Then   ค่า true คือ เปรียบเสมือนผู้ใช้ทำการเปลี่ยนแปลงระเบียนหรือดำเนินการเกี่ยวกับระเบียนอยู่
การที่เราสั่ง Dirty = false คือบอกให้โปรแกรมทราบว่าเราได้หยุดการดำเนินการกับระเบียนแล้ว
และโปรแกรมจะบันทึกข้อมูลลงตารางและพร้อมสำหรับการใช้เงื่อนไข การตรวจสอบขั้นต่อๆไป

ถ้าสังเกตุผมไม่ได้ใส่โค้ดสำหรับบันทึกไว้เพราะ Dirty = false มันก็บันทึกได้เหมือนกัน
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

7
ผม DIY เอานะครับโดยเพิ่มฟิลล์ GetReport ไว้ในตาราง TaxRegis นะครับ
แนวทางคือ ถ้าเราติกเลือกแล้ว จะทำอย่างไรให้ข้อมูลที่เลือกนี้ สามารถไปแสดงบนรายงานได้ ผมเลยใช้การใส่ค่า Picking ไว้เพื่อใช้ในการ Criteria ไปแสดงบนรายงานนะครับ (ดูโค้ดที่  AddPickingReport นะครับ)
โดยผมจะใช้การลบ Picking ออกทุกครั้งที่กด บันทึกระเบียน เพราะเราต้องการค่าจากการติ๊กใหม่แล้วนั้นเอง
โดยเราใช้ Me.RecordsetClone เข้ามาใช้ในการจัดการกับ Recordset บน form ครับ

โค้ดที่ปุ่มบันทึก

โค๊ด: [Select]
Private Sub Command24_Click()
Call ClearPickingReport
DoEvents
Call AddPickingReport
End Sub
Sub ClearPickingReport()
Dim RS As DAO.Recordset
    Set RS = CurrentDb.OpenRecordset("TaxRegis", dbOpenDynaset)
    If Me.Dirty = True Then
    Me.Dirty = False
    End If
        RS.MoveFirst
        Do While Not RS.EOF
            If RS("GetReport") = "Picking" Then
                RS.Edit
                RS("GetReport") = Null
                RS.Update
            End If
            RS.MoveNext
        Loop
    RS.Close
    Set RS = Nothing
End Sub
Sub AddPickingReport()

Dim RSt As DAO.Recordset
    Set RSt = Me.RecordsetClone
        RSt.MoveFirst
        Do While Not RSt.EOF
            If RSt("ฎีกา/ส่งตรวจ") = True Then
                RSt.Edit
                RSt("GetReport") = "Picking"
                RSt.Update
            End If
            RSt.MoveNext
        Loop
        RSt.Close
       Set RSt = Nothing
       Me.Dirty = False
       DoCmd.OpenReport "TaxRegis_Check_Yes", acViewPreview
End Sub

Recordsource ของ Report

โค๊ด: [Select]
SELECT TaxRegis.* FROM TaxRegis WHERE ((Not (TaxRegis.GetReport) Is Null));
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

8
1.หน้าฟอร์มแสดงเฉพาะรายการที่ Check = False

ไฟล์ตัวอย่างแนวทางใหม่(ยังไม่ได้แกะเพื่อแก้ไฟล์ของท่านนะครับ /ดูแนวแล้วแก้เองเลยหรือรอท่านอื่นอีกทีนะครับ)
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

9
ขอแทรกเข้ามาตีโจทย์ของกระทู้นี้นะครับ / สิ่งที่ จขก.นั้นต้องการก็คือ
1.ต้องการให้บนหน้าฟอร์มแสดงเฉพาะรายการที่ถูกติ๊กและมีการเก็บค่าใว้บนตารางจากที่อื่น(ทั้งหมด40-มีติ๊กใว้อยู่ก่อนแล้ว20=ฟอร์มต้องแสดงแค่20ที่เหลือ)
2.เมื่อหน้าฟอร์มแสดงแค่20รายการจากข้อ1 จะมาทำการติ๊กเลือกอีกครั้งว่าจะเอาตัวไหนออกรายงานบ้าง(เหลือ20-ติ๊กใหม่10=ออกรายงาน10)

ถ้าเป็นดั่งด้านบน วิธีการที่ผมจะทำคือให้บนตารางเก็บค่าติ๊กใว้2ค่าแล้วจะเกิดเหตุการณ์ดังนี้
1.หน้าฟอร์มแสดงเฉพาะรายการที่ Check = True
2.เมื่อติ๊กบนหน้าฟอร์มอีกครั้งจะเก็บค่าใว้บน Check2 = True
3.เมื่อออกรายงานจึงเป็น 40 - 20(check) - 10(check2) = 10รายการเท่านั้นใช่หรือไม่ครับ?

ปล.ผมเอาไฟล์จากโพสนี้ไปทำการเพิ่ม check2 และทำการกรองตามวิธีด้านบนครับ(ค่าcheck อยู่บนตารางไม่ได้ทำฟอร์มแก้)
ลองดูตัวอย่างจากกระทู้นี้ครับ
https://www.thai-access.com/index.php?topic=307.msg1223#msg1223
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

10
ผมใช้ฟอร์มชื่อ FrmTaxRegis_Check_Nobook เพื่อติ๊กเลือกรายที่ต้องการขอคืน..เมื่อติ๊กเลือกแล้วกดปุ่มบันทึกระเบียน(ปุ่มนี้จะ Save+OpenReport) ซึ่งรายงานจะดึงรายจากคิวรี่ TaxRegis_Check_Yes แต่ตัวรายงานจะออกมาแค่รายเดียว(ผมติ๊กเลือกเกิน 1 ราย) และเมื่อไปเปิดในคิวรี่ดู ก็จะขึ้นแค่รายเดียวเช่นกัน ผมแนบไฟล์มาแล้วรบกวนช่วยดูให้หน่อยน่ะครับ..ขอขอบคุณมากครับ
ที่แก้นะครับ

แก้คิวรี่ให้ ฎีกา/ส่งตรวจ จาก yes เป็น True แทน
ลบเงื่อนไข เลขทะเบียนงาน ออกไปเพราะเรคคอร์ดที่จะแสดงจะต้องมาจาก ฎีกา/ส่งตรวจ ครับ
แก้โค้ด เป็น
โค๊ด: [Select]
Private Sub Command24_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport "TaxRegis_Check_Yes", acViewPreview
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

11
อ้างถึง
ตรง MainFrm แสดงทุกระเบียนจากตาราง  ซึ่ง ถ้าผมต้องการให้ MainFrm แสดงเฉพาะรายที่ยังไม่ได้ติ๊ก

ตรงกำหนด Criteria ในคิวรี่ให้กำหนดตรง Field CheckBox เป็น Not True ครับคือให้แสดงเฉพาะค่าที่เป็น False คือยังไม่ได้ติ๊กนั้นเอง

อ้างถึง
ก็ให้ออกรายงานเฉพาะรายที่ติ๊กเลือกจาก MainFrm ไม่ทราบว่าต้องทำอย่างไร

ที่คิวรี่บนตัวรายงานนั้นให้กำหนด เลือกข้อมูลในตาราง datasub จาก ID เดียวกับที่แสดงบนฟอร์ม
และกำหนดให้แสดง Field Check เฉพาะข้อมูลที่ต๊ิกอยู่หรือ True นั้นเอง
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

12
ลองดูตัวอย่างจากกระทู้นี้ครับ
https://www.thai-access.com/index.php?topic=307.msg1223#msg1223
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

13
ใช้วิธีการซ่อน Control ต่างๆ ที่อยู่ในแต่ละ Area ของฟอร์มดูนะครับ  วิธีง่ายๆ ตามด้านล่างนี้ครับ
==================================================
เพิ่มปุ่ม Command เข้าไปในฟอร์ม 4 ปุ่ม
Name:    cmdShowAll  |  cmdShowA1 | cmdShowA2   |  cmdShowA3
Caption:  [Show All]    |   [Show #1]  |  [Show #2]    |   [Show #3]

และที่ Control แต่ตัว เฉพาะใน Area 1, 2 และ 3 ให้ระบายรวบ ทุกๆ Control ใน Area นั้นๆ
     แล้วเปลี่ยน Properties ที่ชื่อว่า tag เป็นตัวเลข 1, 2 และ 3 ตามแต่ละ Area
     ส่วน Control อื่นๆ ที่ต้องพิมพ์ทุกๆครั้ง ไม่ต้องระบุครับ
เมื่อคลิกปุ่มหนึ่งปุ่มใดใน 4 ปุ่ม นี้ จะทำการซ่อน/แสดง Control ตาม Area
หลังจากที่ซ่อนแล้ว สามารถสั่งพิมพ์ฟอร์มได้ต่างต้องการครับ
----------------------------------------------------------------------------------------

Option Compare Database
Option Explicit


Sub ShowForm(Optional ShowArea As Byte = 0)
   'ซ่อน/แสดง Control
   Dim ctl As Control
   Dim ShowMe As Boolean
   
   'ShowArea = 0 is Show All
   
   'ย้ายโฟกัสมาที่ Control ตัวอื่นก่อน กัน Error ขณะซ่อน Control ที่โฟกัสอยู่
   txtDATE.Tag = ""
   txtDATE.SetFocus
   'วนซ่อน Control
   For Each ctl In Me.Controls
        If ShowArea = 0 Or ctl.Tag = "" Or ctl.Tag = ShowArea Then
           'Show All | Show for No Tag | Show for Matching Area
           ctl.Visible = True
        Else
           ctl.Visible = Fase
        End If
       
   Next ctl
   
   'ซ่อนปุ่มคำสั่ง Show ต่างๆ
   cmdShowAll.Visible = False
   cmdShowA1.Visible = False
   cmdShowA2.Visible = False
   cmdShowA3.Visible = False
   '4 ปุ่มนี้ แสดงเมื่อ Form_load หรือ Detail_DblClick
End Sub

Private Sub cmdShowAll_Click()
   ShowForm
End Sub

Private Sub cmdShowA1_Click()
  Call ShowForm(1)
End Sub

Private Sub cmdShowA2_Click()
  Call ShowForm(2)
End Sub

Private Sub cmdShowA3_Click()
  Call ShowForm(3)
End Sub


Private Sub Detail_DblClick(Cancel As Integer)
   'คลิกๆ ที่ว่าง (Form Detail) เพื่อแสดงปุ่มที่ซ่อนไป
   cmdShowAll.Visible = True
   cmdShowA1.Visible = True
   cmdShowA2.Visible = True
   cmdShowA3.Visible = True
End Sub

----------------------------------------------------------------------------------------


ลองปรับใช้ดูนะครับ
ูู๋^J^
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

หน้า: [1]