แสดงกระทู้

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
ปัญหาจากการกำหนด Relationship ครับต้องเอาการกำหนดตรงส่วนนี้มาดูครับ
หรือถ้าชิ้นงานนี้ไม่ได้ลับมากโพสไฟล์นั้นลงบอร์ดเดี่ยวช่วยตรวจสอบให้

2
เอาโค้ดนี้ไปวางในแต่ละฟิลล์ในคิวรี่ได้เลย

หมู่
โค๊ด: [Select]
qADDRMU: IIf(IsNull([ADDRMU]),"-",Replace(Replace([ADDRMU],"ม.",""),"หมู่ที่ ",""))
ซอย
โค๊ด: [Select]
qADDRSOI: IIf(IsNull([ADDRSOI]),"-",Replace(Replace([ADDRSOI],"ซอย",""),"ตรอก",""))
ถนน
โค๊ด: [Select]
qADDRRD: IIf(IsNull([ADDRRD]),"-",Replace([ADDRRD],"ถนน",""))
ตำบล
โค๊ด: [Select]
qADDRTB:IIF(isnull(ADDRTB),"-",Replace(Replace(Replace(ADDRTB, "ต.", ""), "ตำบล", ""), "แขวง", ""))
อำเภอ
โค๊ด: [Select]
qADDRAP:IIF(isnull(ADDRAP),"-",Replace(Replace(Replace(ADDRAP, "อ.", ""), "อำเภอ", ""), "เขต", ""))
จังหวัด
โค๊ด: [Select]
qADDRCW:IIF(isnull(ADDRCW),"-",Replace(Replace(ADDRCW, "จ.", ""), "จังหวัด", ""))

และโค้ดรวมทุกโค้ดสำหรับ SQL นะครับ

SELECT IIf(IsNull([ADDRSOI]),"-",Replace(Replace([ADDRSOI],"ซอย",""),"ตรอก","")) AS qADDRSOI, IIf(IsNull([ADDRRD]),"-",Replace([ADDRRD],"ถนน","")) AS qADDRRD, IIf(IsNull([ADDRTB]),"-",Replace(Replace(Replace([ADDRTB],"ต.",""),"ตำบล",""),"แขวง","")) AS qADDRTB, IIf(IsNull([ADDRAP]),"-",Replace(Replace(Replace([ADDRAP],"อ.",""),"อำเภอ",""),"เขต","")) AS qADDRAP, IIf(IsNull([ADDRCW]),"-",Replace(Replace([ADDRCW],"จ.",""),"จังหวัด","")) AS qADDRCW FROM [ชื่อตารางหรือคิวรี่];

3
อ้างถึง
ติดตรงที่ว่าถ้าเป็นลูกค้าเคสที่สองเงื่อนไขมันไม่ยอมทำงานไม่รู้ติดตรงไหน

อ่อกรณีที่มีลูกค้าหลายๆคนด้วยก็ต้องนำ รหัสลูกค้า มาเช็คด้วย
แต่จากตารางของคุณ ไม่ได้กำหนดรหัสลูกค้าไว้เลย มีแค่การระบุชื่อ นามสกุลในฟอร์มเลยก็ลองดูตัวอย่างนี้นะครับ

4
Event Exit ของ combobox ครับ
จากตัวอย่าง combobox ชื่อ cbresult ครับของคุณชื่ออะไร ใส่ชื่อให้ตรงกัน
เช่น

Private Sub cbresult _Exit(Cancel As Integer)
Mycheck
End Sub

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

พอมันไปเจอปีใหม่ข้อมูลก็จะรันกลับมา 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

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

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

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

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


ผมใช้การสร้างคิวรี่เพื่อนับจำนวนครั้งการเลือกของ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

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

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

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

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

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

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

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

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

13
ปัญหาคือ เวลาผมเลือก รายการใน 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

14
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

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


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

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

ผมใช้การตรวจสอบโดยการนับจำนวนครั้งของการ 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


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