แสดงกระทู้

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 - ปิ่นณรงค์

หน้า: 1 [2] 3 4 5 ... 21
19
ถ้ามองตามเหตุการณ์จริงเมื่อ AfterUpdate แล้วมี MSGBOX มันจะลงไปที่ text2 อยู่แล้ว เราน่าจะกำหนดแบบนี้คับ

Private Sub Text1_AfterUpdate()
Dim Rs As Recordset
Set Rs = CurrentDb.OpenRecordset("Select * From UserClass Where UserName='" & Text1 & "';")

If Rs.RecordCount = 0 Then
MsgBox "ผู้ใช้ชื่อ" & Me.Text1 & " ไม่ได้รับอนุญาตให้ใช้งาน ", vbCritical, "ระบบตรวจสอบ"
Me.Text1 = null
Me.Text2.SetFocus
Me.Text1.SetFocus
Exit Sub
End If

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

20
ใส่ me.Text1.setFocus ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Teeyai

21
ตัวอย่างคือการกำหนด ประเภทของ Control ครับ ถ้าเป็นประเภทที่เราเลือกเช่นจะสั่งให้ null หรือให้ว่าง ในประเภท textbox หรือ Combobox หรือ ให้เป็น False ใน checkbox ครับ

โค๊ด: [Select]
Sub ResetForm()   
    On Error GoTo Err_Err
    Dim ctl As Control
           
    For Each ctl In Me
        If ctl.ControlType = acComboBox Then
                ctl = Null       
        End If
        If ctl.ControlType = acTextBox Then
                ctl = Null
        End If
        If ctl.ControlType = acCheckBox Then
                ctl = False
        End If

          Next ctl
   
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox ("ผิดพลาดตรง Reset Form")
        Resume Exit_err

End Sub

เวลาจะเรียกใช้งานก็สั่ง Call ResetForm()

ส่วนประเภทของ Control ต่างๆ ที่มีใน access ก็ตามนี้เลยคับ
Constant              Control
acBoundObjectFrame   Bound object frame
acCheckBox              Check box
acComboBox              Combo box
acCommandButton      Command button
acCustomControl      ActiveX (custom) control
acImage                      Image
acLabel                      Label
acLine                      Line
acListBox                      List box
acObjectFrame              Unbound object frame or chart
acOptionButton              Option button
acOptionGroup              Option group
acPage                      Page
acPageBreak              Page break
acRectangle              Rectangle
acSubform       Subform/subreport
acTabCtl                      Tab
acTextBox      Text box
acToggleButton      Toggle button
โพสต์นี้ได้รับคำขอบคุณจาก: superdog

22
ลองศึกษา Function นี้ดูนะครับ
https://www.devhut.net/2017/05/14/vba-wia-convert-the-image-format/
โพสต์นี้ได้รับคำขอบคุณจาก: O_o

23
ห้อง MS Access / : ไม่ให้ลบข้อมูลใน Subform
« เมื่อ: 11 มิ.ย. 62 , 15:57:13 »
เวลากำหนดตั้งค่า ไม่ใช่เปิดจาก form หลักนะครับ
ให้เปิด SubForm มาแก้ไขโดยตรง ห้ามเปิดจาก MainForm ครับ

ลองเปิดเฉพาะSubForm มาแก้ไขดูครับ

หรือถ้ายังไม่ได้ให้ Zip File แนบมาทางอินบ๊อก เดี่ยวดูให้คับ
โพสต์นี้ได้รับคำขอบคุณจาก: oraaoi

24
ห้อง MS Access / : ไม่ให้ลบข้อมูลใน Subform
« เมื่อ: 11 มิ.ย. 62 , 15:32:06 »
สวัสดีค่ะ  อ๋อยรบกวนสอบถามเกี่ยวกับ Subform คือ ตอนนี้อ๋อยสร้าง Subform ให้แสดงข้อมูลจาก Form หลัก แล้วอยากจะ Lock Subform เพื่อไม่ให้แก้ไขข้อมูล หรือว่าลบข้อมูลใน Subform พอมีวิธีการไหนบ้างหรือเปล่าคะ  ขอบคุณค่ะ

กำหนดคุณสมบัติใน subform ตามนี้ก็ได้คับ



หรือจะใช้ โค้ดที่ Event Form_Current ของฟอร์มหลักก็ได้คับ  จากตัวอย่างฟอร์มหลักชื่อ Mainform ฟอร์มย่อยชื่อ Subform

Private Sub Form_Current()
Forms!mainform.Form!subform.Form.AllowDeletions = False
Forms!mainform.Form!subform.Form.AllowEdits = False
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: oraaoi

25
อ้างถึง
1. หลักความแตกต่างระหว่าง " และ ' และ & คืออะไรครับ

 " และ '  เราเรียกว่า double quote และ Single quote ครับ สัญลักษณ์พวกนี้เป็นการบอกให้ทราบว่า คุณได้กำหนดช่วงของ ข้อความ หรือ String หรือ ตัวเลข หรือตัว Control จาก ไหน ถึง ไหน ครับ เช่น "..............." เป็นการบอกว่า ภายใน double quote นี้คือเนื้อหาส่วนเดียวกัน

ความแตกต่างของการใช้  " และ ยกตัวอย่างการใช้ Dlookup
เราจะใช้ ' ในการกรณีที่ อ้างถึงเขตข้อมูลที่เป็น string หรือข้อความ เช่น
DLookup("FieldName" , "TableName" , "Criteria= 'String'")

ในกรณีที่เป็น ตัวเลข เราจะใช้ " ในการกำหนดขอบเขตครับเช่น N คือตัวเลข
DLookup("FieldName" , "TableName" , "Criteria = n")

แต่ " " นี้ก็ไม่ได้ใช้กับตัวเลขเสมอไป เราจะใช้ในการกำหนด เริ่มต้นและสิ้นสุดของข้อความที่เรากำหนดได้เหมือนกันเช่น

msgbox "สวัสดีครับ",vbInformation,"ทักทาย"

& นั้นใช้ในการเชื่อมต่อกับส่วน อื่นๆของคำสั่ง เช่น ตัวแปร เชื่อมกับ Control / ข้อความเชื่อมกับ Control / กำหนด เชื่อมฟิลล์เข้าด้วยกัน เช่น Field1 & "/" & Field2  ก็จะได้ Field1/Field2เป็นต้น

อ้างถึง
2. ในกรณีนี้ทำไมต้องใส่ " " ที่ตอนต้นและตอนท้ายด้วยครับ เพราะดูในที่อื่น ก็ select * from  where ไม่เห็นต้องมี " " ปิดหัวท้ายเลย


คุณอ้างถึงตัวแปร Sql ที่เป็น string ซึ่ง ต้องมี " " ปิดหัวท้ายเพื่่อกำหนดขอบเขตของ String ที่เรากำหนดคับ

อ้างถึง
3. like '" & Nz(Me.tcombo, "*") & "'  --> รบกวนช่วยแปล Code นี้หน่อยครับ ไม่เข้าใจตรงการเขียน '" & XXX & "'
จากตัวอย่างนี้ลองสังเกตุ '" & XXX & "' การใส่ เครื่องหมาย  " และ ' ให้การ Control ที่เป็นข้อความคับ
Nz(Me.tcombo, "*") คือการกำหนดให้ตรวจสอบ Control ที่ชื่อ tcombo ครับโดยการกำหนดให้แสดงผลตามว่า tcombo ว่างหรือไม่ว่าง
ถ้า tcombo ไม่เป็นค่าว่าง สมมุติเราใส่ กรุงเทพ เงื่อนไขของ คำสั่งนี้คือ   like "กรุงเทพ" ซึ่ง ถ้าเขตข้อมูลไหนมีคำว่ากรุงเทพก็จะแสดงรายการออกมาครับ
แต่ถ้า tcombo เป็นค่าว่าง Nz Function ก็จะแทนค่าว่างด้วย * คือถ้าว่างก็ให้เงื่อนไขคือแสดงข้อมูลทั้งหมด

ผมตอบได้เท่าที่ผมนึกออกนะคับ  รออาจารย์ท่านอื่นมาเสริม
โพสต์นี้ได้รับคำขอบคุณจาก: Un, aek, apirak

26
โค๊ด: [Select]
Option Compare Database

Private Sub SearchCombo()
Dim sql As String

sql = "SELECT * FROM tbldata WHERE [Province] like '" & Nz(Me.Combo1, "*") & "' and [District] like '" & Nz(Me.Combo2, "*") & "'"
    Forms!frmsearch!frmdata.Form.RecordSource = sql
    Forms!frmsearch!frmdata.Form.Requery
   
If Not IsNull(Me.Combo1) Then
Me.Combo2.RowSource = "SELECT DISTINCT tbldata.District, tbldata.Province FROM tbldata WHERE (((tbldata.Province)=[forms]![frmsearch]![Combo1]));"
Else
Me.Combo2.RowSource = "SELECT DISTINCT tbldata.District FROM tbldata GROUP BY tbldata.District;"
End If
End Sub
Private Sub Combo1_AfterUpdate()
    Me.Combo2 = Null
    SearchCombo
End Sub
Private Sub Combo2_AfterUpdate()
    SearchCombo
End Sub
Private Sub Combo2_GotFocus()
  SearchCombo
End Sub


สร้างเงื่อนไขในการกำหนด RowSource ครับลองดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: apirak, kpueng

27
ถ้าจะเก็บข้อมูลลงในตารางเป็น ID ของ ตารางนั้นก็คงจะเหมาะครับ เพราะใช้ทรัพยากรน้อยลง
ถ้าคุณกำหนดข้อมูลแถวของ Combobox เป็น คอลัมน์1 ID คอลัมน์2 ชื่อจังหวัดหรือตำบลหรืออำเภอ
ตรง column width(ความกว้างของคอลัมน์) กำหนดซัก 0ซม.;5ซม. หรือตัวเลขอื่นๆ เพื่อให้แสดงรายการได้ครบ


column width กำหนดซัก 0ซม.;5ซม. คือ Combobox คอลัมน์ไหน กำหนดเป็น 0 จะไม่แสดงคอลัมน์นั้น จากการกำหนดนี้ข้อมูลจะถูกเก็บข้อมูล ID แต่จะแสดง รายการของคอมโบบ๊อกนั้นแทน
ส่วน BoundColumn(คอลัมน์ที่ถูกผูกไว้)ถ้าอยากจะเก็บข้อมูลเป็น ID กำหนดเป็น 1 ถ้าจะเก็บเป็นตัวหนังสือหรือรายการกำหนดเป็น 2 หรือดูจากการกำหนดชนิดแหล่งข้อมูลแถวว่าต้องการผูกคอลัมน์ไหนไว้ครับ

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

28
ไม่รู้แบบนี้หรือเปล่านะครับ
เป็นการเช็คว่า ในแต่ละวันมีใครขาดเรียนบ้าง


โดย Query ที่ผมสร้างขึ้นมามี
GroupName คือ เป็นการจัดกลุ่มชื่อเด็กทั้งหมดไว้ (อันนี้เอามาจากฐานชื่อนามสกุลนักเรียนได้ครับ)
NameByDate คือ การหารายชื่อเด็กที่มาในแต่ละวัน เพื่อค้นหาชื่อเด็กที่หายไป(ขาดเรียน)
Result คือแสดงผลลัพท์ว่า ถ้าชื่อเด็กคนนั้นหายไปให้แสดงว่าขาดเรียน ถ้าไม่หายไปแสดงว่ามาเรียน

ตัวอย่างด้านล่างคับ
ถ้าไม่ใช้แบบนี้ ก็ต้องขออภัยด้วยนะครับ รออาจารย์ท่านอื่นมาแนะนำต่อ
โพสต์นี้ได้รับคำขอบคุณจาก: MiKu, spntming

29
ถ้าเป็นไฟล์พวก excel word access มันทำง่ายคับ ในการสั่งปิด แต่พอเป็นพวกไฟล์ PDF หรือ ไฟล์รูปภาพ คงยังหาวิธีไม่เจอเลยคับ
คือถ้าอยากจะปิดไฟล์พวกนี้จริงๆ คงต้องสั่งปิด Process ที่ทำงานอยู่กับโปรแกรมที่ใช้เปิดไฟล์รูปภาพ และโปรแกรม adobe reader ครับ

ส่วนปิดไฟล์ Word ก็ประมาณนี้ครับ

Dim sPath, sfilename, sLink, sCopyInto, myOutput As String
Dim fso As Object
Dim OpenDB As Object
Dim myFileOld As FileSystemObject
Dim appExtension As String
Dim ObjName As String

    Set fso = CreateObject("Scripting.FileSystemObject")
    sfilename = GetFileName
    myOutput = Right(sfilename, Len(sfilename) - InStrRev(sfilename, "."))
    sPath = GetFilePath
    sLink = sPath & sfilename
   
    sCopyInto = [Forms]![manHisInsu]![folderInsu] & "\" & [Forms]![manHisInsu]![Even2] & "." & myOutput  'แล้ว Copy File
    fso.CopyFile sLink, sCopyInto
    Set fso = Nothing
   
   appExtension = Right$(slink, Len(slink) - InStrRev(slink, ".") + 1) 'ดึงนามสกุลมา
   ObjName = Right(slink, Len(slink) - InStrRev(slink, "\")) 'ดึงชื่อไฟล์และนามสกุลมา

   If appExtension = ".doc" Or appExtension = ".docx" Then

   Set objWord = GetObject(, "word.application")
   Set objDocs = objWord.Documents

   For Each doc In objDocs
       If StrComp(doc.Name, ObjName, 1) = 0 Then
           doc.Close
           objWord.Application.Quit
           Exit For
       End If
   Next
   Set objDocs = Nothing
   Set objWord = Nothing
   End If


    Set myFileOld = New FileSystemObject 'สั่งลบไฟล์เดิม
    myFileOld.DeleteFile sLink
    Set myFileOld = Nothing
   
    MsgBox ("บันทึกเรียบร้อยแล้ว"), vbInformation, "ผลการทำงาน"

   
Exit_Command33_Click:
    Exit Sub

Err_Command33_Click:
    MsgBox " ไฟลนี้อาจเปิดอยู่ ให้ปิดไฟล์นี้เสียก่อน"
    Resume Exit_Command33_Click
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

30
ไฟล์ที่จะปิด คัดลอก และ ลบ ไม่ใช้ไฟล์ access แต่เป็นไฟล์ pdf หรืออื่น ๆ ได้ไหมครับ

สรุปมาให้ผมหน่อยครับ เป็นไฟล์ประเภทอะไรบ้าง
คงต้องทำเป็น Select Case ตามประเภทไฟล์ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

31
เช็ค path จากตัวแปร   sLink  เลยก็ได้คับถ้าเปิดอยู่ก็สั่งปิดแล้ว Copy พอ Copy เสร็จสั่งลบไฟล์เก่าเลย
ตรง Reference เพิ่ม microsoft scripting runtime ด้วยนะครับ

โค๊ด: [Select]
Dim sPath, sfilename, sLink, sCopyInto, myOutput As String
Dim fso As Object
Dim OpenDB As Object
Dim myFileOld As FileSystemObject

    Set fso = CreateObject("Scripting.FileSystemObject")
    sfilename = GetFileName
    myOutput = Right(sfilename, Len(sfilename) - InStrRev(sfilename, "."))
    sPath = GetFilePath
    sLink = sPath & sfilename
   
    sCopyInto = [Forms]![manHisInsu]![folderInsu] & "\" & [Forms]![manHisInsu]![Even2] & "." & myOutput  'แล้ว Copy File
    fso.CopyFile sLink, sCopyInto
    Set fso = Nothing
   
    Set OpenDB = GetObject(sLink) 'สั่งปิดไฟล์ก่อน
    OpenDB.Application.Quit
    Set OpenDB = Nothing

    Set myFileOld = New FileSystemObject 'สั่งลบไฟล์เดิม
    myFileOld.DeleteFile sLink
    Set myFileOld = Nothing
   
    MsgBox ("บันทึกเรียบร้อยแล้ว"), vbInformation, "ผลการทำงาน"

   
Exit_Command33_Click:
    Exit Sub

Err_Command33_Click:
    MsgBox " ไฟลนี้อาจเปิดอยู่ ให้ปิดไฟล์นี้เสียก่อน"
    Resume Exit_Command33_Click
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

32
น่าจะประมาณนี้คับ เอาโค้ด Sql นี้ไปวางแล้วรันดูคับ ผมสมมุติชื่อ tableหรือQuery ที่จะนำข้อมูลมาบวกลบ ว่า Table เลยนะครับ ถ้าชื่อ table เป็นชื่ออื่นๆก็กดแก้ก่อนนะครับ

ถ้าข้อมูลเป็น Number นะครับ

โค๊ด: [Select]
SELECT IIf([จำนวนวันลาสะสม]=0,Nz([จำนวนวันลาประจำปี],0)-Nz([จำนวนลาครั้งนี้],0),Nz([จำนวนวันลาสะสม],0)-Nz([จำนวนลาครั้งนี้],0)) AS ผลลัพท์, table.[จำนวนวันลาสะสม], table.[จำนวนวันลาประจำปี], table.รวม, table.[จำนวนลาครั้งนี้], table.[คงเหลือวันลา]
FROM [table];

ถ้าข้อมูลเป็น Text

โค๊ด: [Select]
SELECT IIf([จำนวนวันลาสะสม]="0",Nz([จำนวนวันลาประจำปี],0)-Nz([จำนวนลาครั้งนี้],0),Nz([จำนวนวันลาสะสม],0)-Nz([จำนวนลาครั้งนี้],0)) AS ผลลัพท์, table.[จำนวนวันลาสะสม], table.[จำนวนวันลาประจำปี], table.รวม, table.[จำนวนลาครั้งนี้], table.[คงเหลือวันลา]
FROM [table];
โพสต์นี้ได้รับคำขอบคุณจาก: MiKu

33
ใช้การดักค่าว่างด้วย Nz Fuction ครับถ้าค่ามันว่างให้แทนค่าเป็น 0
รูปแบบ คือ Nz([ชื่อฟิลล์]),0)

โค๊ด: [Select]
SELECT [VATSALE Query1].Vatmonth, [VATSALE Query1].[Sum Of Price] AS SALE, Format(Nz(DLookUp("[Sum Of Price]","[Vatbuy Query1]","Vatmonth = '" & [Vatmonth] & "'"),0),"Standard") AS Buy, Format(Nz([sale])-Nz([buy]),"Standard") AS [Sale-Buy]
FROM [VATSALE Query1];
โพสต์นี้ได้รับคำขอบคุณจาก: pim

34
หรือจะใช้ Dlookup แทนการ Join Table ก็น่าจะแสดงผลเร็วดีครับ
โค๊ด: [Select]
SELECT [VATSALE Query1].Vatmonth, [VATSALE Query1].[Sum Of Price] AS SALE, Format(DLookUp("[Sum Of Price]","[Vatbuy Query1]","Vatmonth = '" & [Vatmonth] & "'"),"Standard") AS Buy, Format(Nz([sale])-Nz([buy]),"Standard") AS [Sale-Buy], *
FROM [VATSALE Query1];
โพสต์นี้ได้รับคำขอบคุณจาก: pim

35
ลองดูโค้ดนี้ครับ ไม่รู้รันผ่านไหมยังไม่ได้เทสครับ สร้างคิวรี่ใหม่ขึ้นมาเอา SQL นี้ไปวางแล้วรันดู

โค๊ด: [Select]
SELECT [VATBUY QUERY1].VatMonth, [VATSALE QUERY1].[Sum Of Price] AS Sale, [VATBUY QUERY1].[Sum Of Price] AS Buy, Format(Nz([sale])-Nz([buy]),"Standard") AS [Sale-Buy]
FROM [VATBUY QUERY1] INNER JOIN [VATSALE QUERY1] ON [VATBUY QUERY1].VatMonth = [VATSALE QUERY1].VatMonth;
โพสต์นี้ได้รับคำขอบคุณจาก: pim, apirak

36
ผมมีตัวอย่างการทำงานแบบที่คุณบอกไว้ โดยใช้ปุ่ม Run แทน Event Enter ของ เครื่อง Barcode นะครับ

แบบที่ 1
1.ระบุรหัส Barcode แล้วกด Run ข้อมูลจะสร้าง รหัส Barcode แบบเดียวกันจำนวน 5 แถว สวนรายละเอียด ของ Combobox คุณไปกำหนดเอาเองนะครับ
2.ข้อมูลที่ได้ในฟอร์มจะจัดเก็บไว้ในตารางชั่วคราว ชื่อ LNBTemp
3.เมื่อต้องการบันทึก ผมสร้างปุ่มบันทึกไว้ ถ้าตอบ Yes ข้อมูลในฟอร์มจะนำเข้าไปยังตารางหลักทันที และลบข้อมูลในตารางชั่วคราวทันที เพื่อรับข้อมูลใหม่

แบบที่ 2
1.ระบุรหัส Barcode แล้วกด Run ข้อมูลจะสร้าง รหัส Barcode มา 1 อันและพร้อมรับรหัส Barcode อันต่อไป 
2.ข้อมูลที่ได้ในฟอร์มจะจัดเก็บไว้ในตารางชั่วคราว ชื่อ LNBTemp
3.เมื่อต้องการบันทึก ผมสร้างปุ่มบันทึกไว้ ถ้าตอบ Yes ข้อมูลในฟอร์มจะนำเข้าไปยังตารางหลักทันที และลบข้อมูลในตารางชั่วคราวทันที เพื่อรับข้อมูลใหม่
ลองดูตัวอย่างด้านล่างครับ ทั้ง 2 แบบ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, phatthawat

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