แสดงกระทู้

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 - PNR

หน้า: [1] 2 3 4 ... 26
1
อ.คะ ไม่ได้ค่ะ มันรันเริ่ม 1 ตั้งแต่ตอนนี้เรยคะ เพิ่ม record ใหม่ก็ เริ่ม 1 ใหม่

งั้นขอเช็คหน่อยครับว่า ตารางรูปแบบวันที่เป็นแบบไหน คริสตศักราช หรือ พุทธศักราช
และข้อมูลที่แสดงบนฟอร์มของคุณเป็นแบบไหนครับ

และที่โค้ดลองเพิ่มโค้ดนี้เข้าไปเพื่อจะดูปีที่ format แสดงครับ

Sub AutoRunnumber()
Dim MaxNum As Integer
msgbox CStr(Format(วันที่ลง, "YYYY"))
MaxNum = Nz(DMax("ID", "tb_คำสั่ง", "[ปีงบ] = '" & CStr(Format(วันที่ลง, "YYYY")) & "'"))
If MaxNum = 0 Then
MaxNum = 1
Else
MaxNum = MaxNum + 1
End If
Me.ID = MaxNum
End Sub

และส่งรูปมาดูหน่อยครับ

2
เพิ่มโค้ดอีกนิดใช้การเช็คปีของการลงข้อมูลด้วยครับ

พอมันไปเจอปีใหม่ข้อมูลก็จะรันกลับมา 1 ใหม่ครับ
โค๊ด: [Select]
Sub AutoRunnumber()
Dim MaxNum As Integer
MaxNum = Nz(DMax("ID", "tb_คำสั่ง", "[ปีงบ] = '" & CStr(Format(วันที่ลง, "YYYY")) & "'"))
If MaxNum = 0 Then
MaxNum = 1
Else
MaxNum = MaxNum + 1
End If
Me.ID = MaxNum
End Sub

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

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

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

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


ผมใช้การสร้างคิวรี่เพื่อนับจำนวนครั้งการเลือกของCombobox Result ในแต่ละวัน
โดยกำหนดเงื่อนไขว่าถ้า RPP PD BRK นี้มีการลงไว้แล้ว จะไม่สามารถลงต่อได้อีกและมีการแจ้งเตือน พร้อมกับลบค่าที่เพิ่งกรอกลงไปเพื่อรอรับการกรอกใหม่อีกครั้งที่ถูกต้อง

ส่วนโค้ดก็ประมาณนี้ครับ
โค๊ด: [Select]
Private Sub Mycheck()
Dim IntCount As String
If Not IsNull(Me.dtDate) And Not IsNull(Me.cbresult) Then
Me.Dirty = False
IntCount = Nz(DLookup("CountResult", "QryCheckDate", "result ='" & cbresult & "' and Ondate = '" & CStr(Format(Forms!mainform!SubForm!dtDate, "DD/MM/YYYY")) & "'"), 0)

If cbresult = "RPP" And IntCount > 1 Then
MsgBox "วันนี้คุณไม่สามารถลงได้อีก!!!!", vbInformation, "ตรวจเช็ค"
Me.cbresult = Null
Me.cbresult.SetFocus

ElseIf cbresult = "PD" And IntCount > 1 Then
MsgBox "วันนี้คุณไม่สามารถลงได้อีก!!!!", vbInformation, "ตรวจเช็ค"
Me.cbresult = Null
Me.cbresult.SetFocus

ElseIf cbresult = "BRK" And IntCount > 1 Then
MsgBox "วันนี้คุณไม่สามารถลงได้อีก!!!!", vbInformation, "ตรวจเช็ค"
Me.cbresult = Null
Me.cbresult.SetFocus
End If
End If
End Sub

ส่วน Event ของ Combobox cbresult ผมใช้  Exit นะครับ เพราะจะสามารถตรวจสอบค่าที่กรอกลงไปได้แม่นยำกว่า Afterupdate ครับ

Private Sub cbresult_Exit(Cancel As Integer)
Mycheck
End Sub

5
สร้างคิวรี่ ขึ้นมาครับเพื่อรวบรวมว่า ในแต่ละวันได้ระบุ Result ว่าอะไร....   และระบุไปจำนวนกี่ครั้งแล้ว

แล้วสร้าง Dlookup มาเช็คจำนวนครั้งการระบุ Result ได้เลยครับ ถ้าเจอว่า ในวันนั้นเจอการระบุ Result แล้ว หรือ >1 ก็ให้ทำตามเงื่อนไขเช่นแจ้งเตือนเป็นต้น
ส่วนตัวอย่างไว้พรุ่งนี้เน้อ

6
คล้ายๆกันละครับ VBA จะอ้างชื่อ textbox ประมาณนี้

Me.textboxName = [Forms]![frmdashboard]![Childdash].[Form]![cmdgroup]

อะไรประมาณนี้
อธิบายเพิ่มเติมอีกหน่อยครับ ถ้ายังไม่ใช้แบบนี้

7
ใช้ Append Query ครับ
โดยกำหนด JobNo = Forms![ชื่อฟอร์ม]![JobNo]
และกำหนดฟิลล์ให้มันก็ได้แล้วครับ

8
ผม 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));

9
ผมใช้ฟอร์มชื่อ 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

10
ปัญหาคือ เวลาผมเลือก รายการใน combobox1 แล้วไฟของปุ่ม Numlock  ชอบดับเองตลอดเวลา  แล้วเวลาเลือกรายการอีกตรั้งก็จะติด เลือกรายการครั้งที่ 3 ก็จะดับ
ช่วยด้วยครับคืออยากให้ไฟติดตลอดเวลาไม่ว่ากี่ครั้งที่เลือกรายการครับ เป็น Windows 10 , Access 2007 ครับ

ขั้นตอนนะครับ
1.สร้าง Module ใส่โค้ดในลงไปแล้วเซฟ

โค๊ด: [Select]
Option Compare Database
 Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128   '  Maintenance string for PSS usage
      End Type
      ' API declarations:
      Private Declare Function GetVersionEx Lib "Kernel32" _
         Alias "GetVersionExA" _
         (lpVersionInformation As OSVERSIONINFO) As Long
      Private Declare Sub keybd_event Lib "user32" _
         (ByVal bVk As Byte, _
          ByVal bScan As Byte, _
          ByVal dwflags As Long, ByVal dwExtraInfo As Long)

      Private Declare Function GetKeyboardState Lib "user32" _
         (pbKeyState As Byte) As Long

      Private Declare Function SetKeyboardState Lib "user32" _
         (lppbKeyState As Byte) As Long
      ' Constant declarations:
      Const VK_NUMLOCK = &H90
      Const VK_SCROLL = &H91
      Const VK_CAPITAL = &H14
      Const KEYEVENTF_EXTENDEDKEY = &H1
      Const KEYEVENTF_KEYUP = &H2
      Const VER_PLATFORM_WIN32_NT = 2
      Const VER_PLATFORM_WIN32_WINDOWS = 1
Function IsNumLockOn() As Boolean
        Dim o As OSVERSIONINFO
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
        IsNumLockOn = keys(VK_NUMLOCK)
End Function

Sub ToggleNumLock()
        Dim o As OSVERSIONINFO
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
          If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=====Win95
                keys(VK_NUMLOCK) = Abs(Not keys(VK_NUMLOCK))
                SetKeyboardState keys(0)
          ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=====WinNT
          'Simulate Key Press
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
          'Simulate Key Release
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _
               Or KEYEVENTF_KEYUP, 0
          End If
End Sub

Sub mySendKeys(sKeys As String, Optional bWait As Boolean = False)
Dim bNumLockState As Boolean
    bNumLockState = IsNumLockOn()
    SendKeys sKeys, bWait
    If IsNumLockOn() <> bNumLockState Then
        ToggleNumLock
    End If
End Sub

ขั้นตอนที่ 2 ไปที่ฟอร์ม เราจะทำกับ Control ตัวไหนให้กำหนด Event GoFocus ได้เลยเช่น

โค๊ด: [Select]
Private Sub Combo1_GotFocus()
Call ToggleNumLock
End Sub


Credit http://access.mvps.org/ link

11
Work order คือชื่อฟิลล์ คับจากโค้ดน่าจะเป็น string ครับ
ส่วน  Like '*'" คือแสดงทั้งหมด

ถ้าอยากสร้างการค้นหาแบบหลายเงื่อนไขลองแบบนี้

Dim sql As String
    sql = "SELECT * FROM [ชื่อตาราง] WHERE [รหัสงาน] Like '" & Nz(Me.cbWorkID, "*") & "' AND [กลุ่มที่ทำ] Like '" & Nz(Me.cbGroupWork, "*") & "' AND [วันส่งงาน] Like '" & Nz(Me.txtWorkSendDate, "*") & "'"
    Forms![ชื่อฟอร์ม].RecordSource = sql

หรือถ้ายังไม่ค่อยเข้าใจ ให้ทำตัวอย่างข้อมูลส่งไฟล์เข้ามาเดี่ยวเพิ่มโค้ดให้นะ


12
แนะนำฟ้อนต่างประเทศที่เป็นสากล ดีกว่าครับเช่น Arial , Tahoma , Calibri , Verdana , Lucida , sans serif เป็นต้น
ผมก็เคยใช้ฟ้อนไทย เจอปัญหาพวกนี้ตลอด ปัจจุบันเลยใช้ฟ้อนตามข้างบนแทนครับ มันเป็นฟ้อนที่ติดมากับวินโดร์ไม่ต้องลงเพิ่ม
เพราะบางเครื่องก็ไม่ได้กำหนด Location Thai ไว้ปัญหาก็จะเกิดได้เหมือนกัน

13
ลองดูตัวอย่างนี้นะครับน่าจะได้ข้อมูลแบบที่คุณต้องการนะ

ผมใช้การตรวจสอบโดยการนับจำนวนครั้งของการ Append ข้อมูลลงไปในตาราง customer
โดยเช็คว่าถ้า Employee ไหน asign = 0 แล้วก็ให้ลบออกไป ไม่นำไป Append ต่อครับ

โค้ดของคิวรี่ในการเช็คจำนวนการAppend ข้อมูล
โค๊ด: [Select]
SELECT tbl_Job.Employee_Name, Count(tbl_Customer.Employee_Name) AS CountCTM, tbl_Job.assign, Nz([assign],0)-Nz([CountCTM],0) AS Remaining
FROM tbl_Job LEFT JOIN tbl_Customer ON tbl_Job.Employee_Name = tbl_Customer.Employee_Name
GROUP BY tbl_Job.Employee_Name, tbl_Job.assign;

โดยจะต้องมีฟอร์มที่มีปุ่มกดให้โค้ดทำงานโดยมีโค้ดประมาณนี้ครับ
โค๊ด: [Select]
Private Sub Command0_Click()
Dim rst As DAO.Recordset
Dim IntAssign As Integer
Dim sql As String
Dim I As Long
    Set rst = CurrentDb.OpenRecordset("tbl_Job", dbOpenDynaset)
 
 
rst.MoveFirst
Do Until rst.EOF
IntAssign = rst!Assign
For I = 1 To IntAssign
If IntAssign = rst!Assign Then
sql = "INSERT INTO tbl_Customer ( Employee_Name, Cust_Name ) SELECT QryCheckRemaining.Employee_Name, 'XXXX' AS Expr1 FROM QryCheckRemaining WHERE (((QryCheckRemaining.Remaining)>0));"
DoCmd.SetWarnings False
           DoCmd.RunSQL sql
End If
    Next
  rst.MoveNext
  Loop
  DoCmd.SetWarnings True
    rst.Close
    Set rst = Nothing
End Sub


14
ผมเขียนแล้วcopyไปเปิดที่อีกเครื่องหนึ่งครับ โดยเครื่องที่ใช้ประจำกับเครื่องที่อาไปลง ใช้ เวอเดียวกัน

แต่ในเครื่องที่เอาไปลง พอกดใช้งานป่มคำสั่ง มันขึ้น ไม่สามารถทำงานeventได้ครับ

แก้ไขยังไงดีครับ :cry:

ไปเปิด Trust Center ครับดูจากกระทู้นี้
https://www.thai-access.com/index.php?topic=375.msg1562#msg1562

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

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

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

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

16
ห้อง MS Access / : รวมตัวเลขไม่ได้
« เมื่อ: 24 ก.ค. 63 , 14:21:15 »
ุถ้าคำนวนจาก 365 วันคือ 1 ปี ก็ประมาณนี้ครับ


โค๊ด: [Select]
date_age: IIf(365-(DateDiff("d",([date_buy]),([ใส่วันที่สิ้นสุด]))-[asset_term]*365)<0,0,365-(DateDiff("d",([date_buy]),([ใส่วันที่สิ้นสุด]))-[asset_term]*365)+1)
แต่ถ้าอยากให้แสดงจำนวนวัน ไม่นับวันปัจจุบันก็ แก้เป็น
โค๊ด: [Select]
[code]date_age: IIf(365-(DateDiff("d",([date_buy]),([ใส่วันที่สิ้นสุด]))-[asset_term]*365)<0,0,365-(DateDiff("d",([date_buy]),([ใส่วันที่สิ้นสุด]))-[asset_term]*365))[/code]

จะเหลือ 48 วันนะครับ

หน้า: [1] 2 3 4 ... 26