37
ห้อง MS Access / : สอบถามการอัพโหลดไฟล์ Excel ใน MS Access
« เมื่อ: 23 เม.ย. 64 , 14:28:20 »
พอนำไปใช้กับไฟล์งานที่ทำ ติด error นี้ค่ะ
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.
ลองดูตัวอย่างนี้นะครับ
ถ้าไม่เข้าใจตรงโค้ด AddnewSQL กับ UpdateSQL ให้ดูการกำหนดคิวรี่ที่ผมใส่ไว้ให้ด้วยนะครับ
ทั้ง 2 คิวรี่นั้นคือคิวรี่ที่นำไปใช้เขียนโค๊ด โดยมีการกำหนดเงื่อนไขไว้แล้ว คิวรี่ 2 อันนั้น สามารถลบทิ้งได้
เพราะผมสร้างไว้ให้ดูการกำหนดเงื่อนไขเฉยๆ
โดยเงื่อนไขการอัพเดทผมเช็คจาก Field PersonalName นะครับ ถ้าส่วนนี้ไม่เหมือนกันจะอัพเดทใหม่
ตัวอย่างโค๊ดโค๊ด: [Select]Private Sub Command0_Click()
'ตัวอย่างโค้ดการนำเข้าข้อมูลโดยมี Dialog ให้เลือกไฟล์เข้ามา
Dim dlg As FileDialog
Dim sql, Deletesql, AddnewSQL, UpdateSQL As String
Dim DB As DAO.Database
Dim DBaddnew As DAO.Database
Dim DBupdate As DAO.Database
Set DB = CurrentDb
Set DBaddnew = CurrentDb
Set DBupdate = 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
End If
'โค้ดสำหรับเพิ่มข้อมูลใหม่ที่ไม่เคยมีรหัสบัตรประชาชน
AddnewSQL = "INSERT INTO tblDataMain ( PersonalID, PersonalName ) " _
& "SELECT TempImport.PersonalID, TempImport.PersonalName " _
& "FROM TempImport WHERE (((TempImport.PersonalID) Not In (select personalID from [tblDataMain])));"
'โค้ดสำหรับอัพเดทข้อมูลใน Field PersonalName ที่มีรหัสบัตรประชาชนตรงกัน
UpdateSQL = "UPDATE tblDataMain INNER JOIN TempImport ON tblDataMain.PersonalID = " _
& "TempImport.PersonalID SET tblDataMain.PersonalName = [TempImport].[PersonalName] " _
& "WHERE (((tblDataMain.PersonalName)<>[TempImport].[PersonalName]) AND ((tblDataMain.PersonalID)=[TempImport].[PersonalID]));"
DBaddnew.Execute AddnewSQL
DBupdate.Execute UpdateSQL
MsgBox "อัพเดทจำนวน " & DBupdate.RecordsAffected & vbCrLf & "เพิ่มใหม่จำนวน " & DBaddnew.RecordsAffected, vbInformation, "Myprogram"
End Sub
เรียนคุณอ้างถึงยกตัวอย่าง นาย ก เลขบัตรประชาชน 1234567890123 ข้อมูลเก่า กกกก อัพเดตใหม่เป็น กก77 ประมาณนี้นะคะตารางชั่วคราวเราก็ควรมีไว้เหมือนเดิม เพื่อใช้ตารางนี้ในการตรวจสอบเงือนไขก่อนนำเข้าสู่ตารางหลักครับ
จากโจทย์คือเพิ่มเติมได้ไม่ยากครับคือใช้การ loop เช็คจากเลขบัตรประชาชน เช่น
ถ้าเจอว่า ข้อมูลเก่ามีฟิลล์ไหนที่ข้อมูลไม่เหมือนกันก็สั่งให้อัพเดท
ส่วนข้อมูลไหนใหม่ ไม่มีเลขบัตรประชาชนนี้มาก่อน ก็สั่งเพิ่มใหม่
ส่วนข้อมูลไหนยังเหมือนเดิมไม่มีการเปลี่ยนแปลงในฟิลล์ที่เราตรวจสอบก็ข้ามการนำเข้าเป็นต้น
ถ้าโอเคกับขั้นตอนที่ผมกล่าวมา เดี่ยวผมปรับโค๊ดให้ใหม่
สอบถามการอัพโหลดไฟล์ 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
อ้างถึงถ้าเราจะให้บันทึกลงใน google drive ตามลิงค์ที่เรามี สามารถทำได้ไหมคะ รบกวนแนะนำด้วยค่ะ ขอบคุณค่ะ
แนะนำขึ้นโพสใหม่เลยดีกว่าครับ
เหมือนมีรูปซ้อนกันสองรูปมีรูปที่เป็นพื้นหลัง 1 และรูปที่เป็นลายเซ็นต์ 1
ผมไม่เห็นภาพครับ อธิบายไม่ถูกเหมือนกัน
หรืออีกวิธีลองคลิกขวาที่รูป โดยที่รูปพื้นหลัง เลือก นำไปไว้ข้างหลังสุด
และ รูปลายเซ็นต์กดเลือกนำไปไว้ข้างหน้าสุด
หรือลองลบรูปที่เป็นพื้นหลังออกไปก่อนครับ ว่าแสดงหรือไม่
ไม่น่าจะไม่แสดงนะครับ จากโค้ดถึงมีรูปในหน้ารายงานก็ต้องแสดงอยู่แล้วครับ
ลองเช็คความถูกต้องของการตั้งค่าการแสดงให้ดีๆครับผิดตรงไหนหรือเปล่า
การกำหนด ให้แสดงด้านหลังสุด หรือ ด้านหน้าสุดก็มีส่วนนะครับ
ลองดูหน้ารายงานในมุมมองเหมือนพิมพ์ ดูหรือลองปริ้นดู กด Ctrl + P ว่าตอนพิมพ์ออกมาลายเซ็นต์แสดงหรือไม่
ในคิวรี่ ฟอแมท ฟิลล์ TrainingEndDate ก่อนนะครับ
เอาโค้ดนี้ไปวางในฟิลล์นะครับ
Dates: Format([TrainingEndDate],'dd/mm/yyyy')
ชื่อฟิลล์ผิดครับ
Dates คือฟิลล์ TrainingEndDate อันเดิมของคุณครับ
ที่ผมต้องเปลี่ยนชื่อเป็น Dates เพื่อทำการฟอแมทเป็น Dates: Format([TrainingEndDate],'dd/mm/yyyy')
ลองส่งรูปแสดงชื่อฟิลล์ในคิวรี่ มาดูหน่อย
และโค้ดที่ใส่ไว้ตอน OpenRecord ด้วยครับ
ต้องฟอแมทวันที่ให้ตรงกันกับ textbox ที่ใช้ในการค้นหาก่อนครับ
ที่คิวรี่ปรับฟอแมทเป็นแบบนี้ดูครับ
Dates: Format([TrainingEndDate],'dd/mm/yyyy')
และที่ โค้ดใส่แบบนี้
Set rsGroup = CurrentDb.OpenRecordset("SELECT * FROM QueryForReportCertification where Cstr([Dates])='" & CStr(Forms!frmSearchCertificate!txtApplyDate) & "'")
และแก้ฟิลล์ที่ตัวรายงาน ที่เป็นฟิลล์ TrainingEndDate เป็น Dates ทั้งหมด
ถ้าไม่ได้ คงต้องรีโมทไปตรวจสอบให้แล้วละครับ
เพราะต้องเช็คข้อมูลวันที่ที่แสดงใน access ว่าเป็นแบบไหนจะได้ปรับให้เหมือนกัน
เป็นเพราะ Format วันที่ ไม่ตรงกันหรือเปล่าครับ
ขอดูฟอแมทวันที่จากฐาน SQL Server มาดูหน่อย
(ผมไม่ได้อยู่ตอบมาอีกทีวันจันทร์นะครับ ไปทริปตกปลาทะเล)
ลองรีเช็คเรืองฟอแมทวันที่ให้ตรงกันนะครับ
อ้างถึงลองทำในตัวอย่างแล้วใช้ได้ เดี๋ยวจะลองนำไปใช้กับงานจริงดูค่ะ
ขอชื่นชมนะครับ มีการสร้างไฟล์ตัวอย่าง และรูปอธิบายแบบนี้
จะทำให้ผู้ตอบเข้าใจขั้นตอนที่ต้องการและ แก้ไขให้ได้อย่างรวดเร็วครับ
เสียเวลาสร้างนิดหน่อย แต่แก้ไขได้ง่ายกว่าครับ
Private Sub cmdPDF_Click()
Dim rsGroup As DAO.Recordset
Dim ColumnName As String, myPath As String
myPath = "\\Servername\h\upload\" '--------------อยู่บน Host ค่ะ
Set rsGroup = CurrentDb.OpenRecordset("SELECT * FROM QueryForReportCertification where Cstr([dbo_ResultTraining.TrainingEndDate])='" & CStr(Forms!frmSearchCertificate!txtApplyDate) & "'")
Do While Not rsGroup.EOF
ColumnName = rsGroup!dbo_Reg.EmployeeCode
DoCmd.OpenReport "ReportCertificationNew", acViewPreview, , "dbo_Reg.EmployeeCode='" & ColumnName & "'"
DoCmd.OutputTo acOutputReport, "ReportCertificationNew", acFormatPDF, _
myPath & ColumnName & ".pdf", False
DoCmd.Close acReport, "ReportCertificationNew"
rsGroup.MoveNext
Loop
rsGroup.Close
End Sub
ลองดูนะครับ
คุณต้องไปสร้าง Floder ชื่อ upload ไว้ Drive C: ก่อนเน้อ
อัพเดทโค้ดให้ใหม่นะครับ ไม่ต้องสร้าง Table เพิ่มและ ลบ Criteria ใน Query ออกไป
โค้ดโค๊ด: [Select]Private Sub Command8_Click()
Dim rsGroup As DAO.Recordset
Dim ColumnName As String, myPath As String
myPath = "C:\upload\"
Set rsGroup = CurrentDb.OpenRecordset("SELECT * FROM QueryForReportCertification where Cstr([TrainingEndDate])='" & CStr(Forms!frmSearchCertificate!txtApplyDate) & "'")
Do While Not rsGroup.EOF
ColumnName = rsGroup!EmployeeCode
DoCmd.OpenReport "ReportCertificationNew", acViewPreview, , "EmployeeCode='" & ColumnName & "'"
DoCmd.OutputTo acOutputReport, "ReportCertificationNew", acFormatPDF, _
myPath & ColumnName & ".pdf", False
DoCmd.Close acReport, "ReportCertificationNew"
rsGroup.MoveNext
Loop
rsGroup.Close
End Sub