แสดงกระทู้

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

หน้า: 1 [2] 3 4 5 ... 7
19
ห้อง MS Access / : Auto number ไม่ทำงานบน Form
« เมื่อ: 14 พ.ค. 64 , 22:34:04 »
กดเลื่อนไป New Record ยังครับ เครื่องหมาย |> ด้านล่างฟอร์ม
กดแล้วค่ะก็ยังเป็นเลขเดิม
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

20
สอบถามการอัพโหลดไฟล์ Excel ใน MS Access ค่ะ อยากจะ อัพโหลดไฟล์ ได้โดยให้มีการตรวจสอบจากเลขที่บัตรประชาชน โดยเช็คว่า ถ้ามีข้อมูลที่เคยอัพโหลดอยู่แล้ว ให้อัพโหลดเฉพาะข้อมูลที่มีการเปลี่ยนแปลง ข้อมูลไหนไม่มีก็อัพโหลดเข้าตามปรกติ รบกวนแนะนำด้วยนะคะ ขอบคุณค่ะ

ถ้าทำแบบง่ายก็คือ
1.ให้นำเข้าข้อมูลตามบัตรประชาชนทั้งหมดเข้ามาก่อนไปยังตารางสำรอง สมมุติชื่อว่า TempImport นะครับ
2.ใช้การสร้างคิวรี่ โดยกำหนดให้เลือกเอาเฉพาะ รหัสที่ไม่มีในตารางหลัก สมมุติชื่อว่า tblDataMain นะครับ
3.มี Field เก็บเลขบัตรประชาชนชื่อเดียวกันคือ PersonalID


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

Private Sub Command0_Click()
'ตัวอย่างโค้ดการนำเข้าข้อมูลโดยมี Dialog ให้เลือกไฟล์เข้ามา
Dim dlg As FileDialog
Dim sql, Deletesql As String
Dim DB As DAO.Database
Set DB = CurrentDb
If MsgBox("คุณต้องการนำเข้าข้อมูลใหม่หรือไม่", vbQuestion + vbYesNo, "ระบบสอบถาม") = vbYes Then

Set dlg = Application.FileDialog(msoFileDialogFilePicker)

With dlg
.Title = "Select the Excel file to import"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xls*", 1
.Filters.Add "All Files", "*.*", 2

If .Show = -1 Then
StrFileName = .SelectedItems(1)

Deletesql = "DELETE * FROM TempImport;" 'สั่งให้ลบข้อมูลของตารางสำรองให้หมดก่อนเพื่อรอรับข้อมูลนำเข้าใหม่ที่จะเข้ามา
DB.Execute Deletesql

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "TempImport", StrFileName, True 'นำเข้าไปยังตารางชื่อ TempImport
Else
Exit Sub
End If
End With

'หลังจากนำเข้ามาเสร็จให้ทำการ Append ข้อมูลที่ รหัสประจำตัวประชาชนไม่ซ้ำกัน ไปยังตารางหลักของเรา
sql = "INSERT INTO tblDataMain SELECT * FROM TempImport WHERE (((TempImport.PersonalID) Not In (select [PersonalID] from [tblDataMain])));"
DB.Execute sql
If DB.RecordsAffected <= 0 Then
   MsgBox "ไม่มีข้อมูลที่นำเข้า."
Else
MsgBox "นำเข้าจำนวน " & DB.RecordsAffected & " เรคคอร์ด", vbInformation, "Myprogram"
End If
Set DB = Nothing
End If
End Sub

ใช้แค่ Table เดียวได้ไหมคะ ในการอัพโหลด ต้องการอัพโหลดข้อมูลเช่น เลขที่บัตรประชาชน ข้อมูลการเปลี่ยนแปลง ประมาณนี้นะคะ ยกตัวอย่าง นาย ก เลขบัตรประชาชน 1234567890123 ข้อมูลเก่า  กกกก อัพเดตใหม่เป็น กก77 ประมาณนี้นะคะ ถ้าเลขบัตรประชาชนไหนที่ไม่เคยมีการบันทึกก็ให้บันทึกเข้าไปเลย แต่ในกรณีเคยมีให้อัพเดตเฉพาะข้อมูลที่มีการแก้ไข รบกวนแนะนำด้วยนะคะ ขอบคุณค่ะ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

21
ทำการย้ายชุดคำสั่ง"แนบไฟล์"ออกมาใว้ข้างนอกด้านล่างกล่องข้อความเพื่อให้ใช้งานได้ง่ายขึ้นแล้วนะครับ :prettiness:

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

22
ใน Access ไม่มีความสามารถนี้ครับ
มีเฉพาะในฐานข้อมูลใหญ่ๆ อย่าง Oracle

ขออธิบายให้เข้าใจง่ายๆ ถึงการทำงานที่แตกต่างกันนะครับ
ใน Oracle นั้น เวลาที่เราสั่ง Delete Data นั้น จะเป็นการปิด Record ที่ลบเท่านั้น (ใส่ Time Stamp เอาไว้ด้วย) แต่ข้อมูลยังไม่ถูกลบ จึงสามารถสั่ง Rollback ได้ แต่ก็ต้องแลกมาด้วยการใช้พื้นที่ ที่เพิ่มขึ้นมาเรื่อยๆ
การสั่งลบข้อมูลจริงๆ ของ Oracle ต้องใช้คำสั่ง Pack เพื่อทำการลบข้อมูลออกจริงๆ

ส่วน Access เมื่อเราสั่ง Delete โปรแกรมจะทำการ Pack ให้ทันทีเลย ทำให้ไม่สามารถดึงข้อมูลกลับมาได้
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

23
สมมุติตาราง A ชื่อ Mytable
1.สร้างคิวรี่ใส่ SQL เข้าไป ตั้งชื่อ Q1
SELECT Idnumber, LV  FROM MyTable GROUP BY Idnumber, LV HAVING ((Not (LV) Is Null));

2.สร้างปุ่มขึ้นมา 1 ปุ่ม
ใส่โค้ดนี้เข้าไป
Private Sub Command0_Click()
Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Mytable", dbOpenDynaset)
   
    rst.MoveFirst
    Do Until rst.EOF
    If IsNull(rst!LV) Or rst!LV = "" Then
    rst.Edit
    rst!LV = DLookup("LV", "Q1", "Idnumber =" & rst!Idnumber & "")
    rst.Update
    End If
       rst.MoveNext
    Loop
   
    rst.Close: Set rst = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

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


โค๊ด: [Select]
Option Compare Database

Private Sub SLBoss1_Click()
Call unOption
Me.SLBoss1 = True
Me.Image11.Picture = CurrentProject.Path & "\Pics\" & "card_30021.jpg"
End Sub
Private Sub SLBoss2_Click()
Call unOption
Me.SLBoss2 = True
Me.Image11.Picture = CurrentProject.Path & "\Pics\" & "card_30017.jpg"
End Sub
Private Sub SLBoss3_Click()
Call unOption
Me.SLBoss3 = True
Me.Image11.Picture = CurrentProject.Path & "\Pics\" & "card_30015.jpg"
End Sub
Private Sub SLBoss4_Click()
Call unOption
Me.SLBoss4 = True
Me.Image11.Picture = CurrentProject.Path & "\Pics\" & "card_30011.jpg"
End Sub
Private Sub SLBoss5_Click()
Call unOption
Me.SLBoss5 = True
Me.Image11.Picture = CurrentProject.Path & "\Pics\" & "card_30006.jpg"
End Sub

Sub unOption()
'ชุดคำสั่งเพี่อให้ตัวเลือกทั้งหมดถูกยกเลิก
Dim ctl As Control
    For Each ctl In Me.Controls
     Select Case ctl.ControlType
       Case acOptionGroup, acOptionButton
           ctl.Value = Null
       Case acCheckBox
          ctl.Value = False
    End Select
   Next
   Set ctl = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

25
จากการไล่ดูพบว่าในบางตารางท่านมีการใช้ชื่อฟิวล์เป็นภาษาไทยครับ เช่น คิวรี่ ManCustomer เชื่อมตาราง CodePAT ในนั้นมีฟิวล์ภาษาไทย
แต่ลองแก้ชื่อฟิวล์ภาษาไทยในทุกตารางแล้วก็ยังใช้ไม่ได้ จึงดึงข้อมูลทั้งหมดไปใส่ในไฟล์ใหม่ถึงจะใช้งานได้ครับ

สรุปที่ผมแก้คือ แก้ชื่อฟิวล์ภาษาไทยในทุกตารางเป็นภาษาอังกฤษ(a1,a2,a.../c1,c2,c...) --> สร้างไฟล์ใหม่แล้วดึงตาราง,คิวรี่,หน้าฟอร์มไปใส่ = combo box ทุกตัวขึ้นรายการตามที่พิมพ์
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

26
ในคิวรี่ คงต้องเขียนฟังชั่นนะครับ แล้วมาเรียกใช้ในคิวรี่แต่ผมไม่เคยลอง รออาจารย์ท่านอื่นๆ


แต่ถ้าการสร้างข้องมูลไปวางในตาราง อีกอันนั้นผมใช้แบบนี้ครับ
ตารางหลักชื่อ MyTable
มีฟิลล์ ID,ITEM (ตามตัวอย่าง)
--------------------------------------------------
มีตารางแสดงผลชื่อ TblResult
มีฟิลล์ ID,ITEM (ตามตัวอย่าง)
โค้ด

โค๊ด: [Select]
Private Sub concatenateString()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim rstOut As DAO.Recordset
Dim strID As String
Dim strITEM As String
Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT Mytable.ID, Mytable.ITEM FROM Mytable GROUP BY Mytable.ID, Mytable.ITEM ORDER BY Mytable.ID, Mytable.ITEM DESC;", dbOpenDynaset)

If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
  strID = rst!ID
  strITEM = rst!Item
 
  rst.MoveNext
   
  Do Until rst.EOF
    If strID = rst!ID Then
      strITEM = strITEM & ", " & rst!Item
    Else
    Set db = CurrentDb()
    Set rstOut = db.OpenRecordset("tblResult", dbOpenDynaset)
    rstOut.AddNew
    rstOut!ID = strID
    rstOut!Item = strITEM
    rstOut.Update
       
      strID = rst!ID
      strITEM = rst!Item
        rstOut.Close
        db.Close
    End If
    rst.MoveNext
  Loop
    Set db = CurrentDb()
    Set rstOut = db.OpenRecordset("tblResult", dbOpenDynaset)
    rstOut.AddNew
    rstOut!ID = strID
    rstOut!Item = strITEM
    rstOut.Update
      strID = rstOut!ID
      strITEM = rstOut!Item
    rstOut.Close
    db.Close
End If
Set rst = Nothing
Set db = Nothing
Set rstOut = Nothing
End Sub
ที่ปุ่มใส่โค้ดเพื่อเรียกใช้งาน

โค๊ด: [Select]
Private Sub Command0_Click()
concatenateString
End Sub

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

27
ตัวอย่างแบบง่ายๆ ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

28
แนะนำว่าหาตัว Converter Com1 to USB มาใช้เถอะครับ ราคาไม่แพง ลง Driver ก็น่าจะใช้ได้แล้วครับ

https://smallbusiness.chron.com/update-driver-dell-usb-mouse-54449.html

คำค้น "convert RS232 to usb"



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

29
ที่ Module

Option Compare Database
#If Win64 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As LongPtr, ByVal dwFlags As Long) As Boolean
#Else
    Private Declare Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As Long, ByVal dwFlags As Long) As Boolean
#End If
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000

Function SoundMe() As String
    Call PlaySound("c:\windows\media\policesiren.WAV", 0, SND_ASYNC Or SND_FILENAME)
    SoundMe = ""
End Function

Public Sub StopSound()
    PlaySound vbNullString, 0, 0
End Sub


ที่ command button
เพิ่ม
  SoundMe 'เมื่อเล่นเสียงแล้ว ต่อไปจะเด้ง msgbox ก็ดักเงื่อนไขการกด OK
  If MsgBox("ข้อมูลซ้ำกัน กรุณาตรวจสอบ", vbOKOnly, "program") = vbOK Then
    StopSound
  End If

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

30
ปัณหามีอยู่ว่า  1)เมื่อขึ้นRecordไหม่ ฟอร์มจะบันทึกอัตโนมัติทุกครั้ง เนื่องจากการตั้งTime Interval ถ้าตั้งTime Interval =0 จะไม่เป็นครับ แต่ความต้องการคือตั้ง Time Interval 1000 และไม่ต้องการให้ฟอร์มบันทึกอัตโนมัติ ยกเว้นมีข้อมูลครบแล้วทำการSave ฟอร์มจึงจะบันทึกครับ
2) ฟอร์มบันทึกข้อมูลล่าลุดเมื่อมีข้อมูลแสดงครบแล้วทำการบันทึกและกดไปหน้าถัดไปหรือกดNew Record แต่พอย้อนกลับมาดูข้อมูลหน้าก่อนหน้านั้นข้อมูลในส่วน Tab Detail จะไม่แสดงจนกว่าจะเลื่อนย้อนกลับไปอีกครั้งแล้วกดเดินหน้ากลับมา ข้อมูลใน Tab Detail จึงแสดงขึ้นมา ต้องการทราบว่าจะแก้ตรงส่วนไหนครับ
3) ต้องการสร้างปุ่มที่กดแล้วไม่สามารถกดซ้ำได้อีกครั้ง หรือกดแล้วให้ปุ่มนั้นหายไป ยกเว้นขึ้นบันทึกไหม่และทำตามเงื่อนไขครบและกดแล้วหายไปครับ
การเขียนCode อาจะดูไม่เรียบร้อยผมอ่านจากในเว็ปนี้แล้วนำมาลองทำและแก้ไปเรื่อยๆครับ
ขอขอบคุณล่วงหน้าครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

31
ลองดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

32
1.ตั้งค่า Format เป็น 000

2.ตัวอย่างวิธีทำปุ่มค้นหา Multiple Field search box บนหน้าฟอร์มครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

33
น่าจะแบบนี้ครับ
โค๊ด: [Select]
Sub FieldNames()
    Dim rst, rstOut, strTable  As Recordset
    Dim f As Field
    Dim SQL, RecordName As String
   
    Set rst = CurrentDb.OpenRecordset("tbTarang1")
    Set rstOut = CurrentDb.OpenRecordset("tbfild1")
        rst.MoveFirst
        Do Until rst.EOF
            RecordName = rst!fname
    Set strTable = CurrentDb.OpenRecordset(RecordName)
            For Each f In strTable.Fields
                rstOut.AddNew
                rstOut![tarang] = RecordName
                rstOut![fild] = f.Name
                rstOut.Update
            Next
        rst.MoveNext
        Loop
    rst.Close: Set rst = Nothing
    rstOut.Close: Set rstOut = Nothing
    strTable.Close: Set strTable = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

34
ให้ใช้ Image control สำหรับแสดงรูปภาพ โดยกำหนด Control Source ของ Image control ให้เป็น ="ไดร์ฟ:\พาธ\...\...\พาธ\" & [ชื่อเท็กซ์บ็อกซ์ของ Picturetest]
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

36
ผมพิมพ์คำว่า เอนก Access มันแก้ไขให้เอง เป็น อเนก
ปกติก็ไปแก้ที่การตั้งค่า แต่พอเป็น Access คั้งแต่ 2010 ขึ้นไป แก้ที่ตรงไหนครับ
ผมลองไปที่ ตั้งค่า > ฐานข้อมูลปัจจุบัน > ตัวเลือกการแก้ไขชื่อัตโนมัติ คลิกที่กล่องคำสั่งออก
แล้วปิดโปรแกรม เปิดใหม่ แต่มันไม่หายครับ ใครรู้ช่วยหน่อยครับ

อยู่ตรง ตั้งค่า > การพิสูจน์อักษร มันจะมีปุ่ม ตัวเลือกการแก้ไขอัตโนมัติ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

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