กระทู้เก่าบอร์ด อ.Yeadram
        
           5,270   22		  
          
					  
		    URL.หัวข้อ / 
		    URL
        
        ขอโค้ดตรวจสอบตาราง ก่อน insert ข้อมูลค่ะ      
    
      หนูต้องการ สร้างปุ่มสำหรับ insert ข้อมูล จากไฟล์ฐานข้อมูลเป้าหมาย ภายนอกเข้ามา
แต่ติดปัญหาตรงที่ บางครั้งในไฟล์เป้าหมายไม่มี "ตาราง" ตามที่เรากำหนด
ซึ่งสมมติ กำหนดไว้ตายตัวดังนี้ค่ะ
ชื่อตาราง : TblCustom
ชื่อไฟล์เป้าหมาย : Sample
เก็บอยู่ที่ไดร์ฟ : D:\
สิ่งที่หนูต้องการคือ หากในไฟล์ฐานข้อมูลเป้าหมาย Sample ไม่มีตาราง TblCustom อยู่
ให้ยกเลิกการ insert และ MSG แจ้งเตือนให้ทราบค่ะ
รบกวนขอคำแนะนำด้วยนะคะ
ขอบคุณค่ะ
    
    
  แต่ติดปัญหาตรงที่ บางครั้งในไฟล์เป้าหมายไม่มี "ตาราง" ตามที่เรากำหนด
ซึ่งสมมติ กำหนดไว้ตายตัวดังนี้ค่ะ
ชื่อตาราง : TblCustom
ชื่อไฟล์เป้าหมาย : Sample
เก็บอยู่ที่ไดร์ฟ : D:\
สิ่งที่หนูต้องการคือ หากในไฟล์ฐานข้อมูลเป้าหมาย Sample ไม่มีตาราง TblCustom อยู่
ให้ยกเลิกการ insert และ MSG แจ้งเตือนให้ทราบค่ะ
รบกวนขอคำแนะนำด้วยนะคะ
ขอบคุณค่ะ
				22 Reply in this Topic. Dispaly 2  pages and you are on page number 1 
				
        
    2 @R11610    
        
  
      ขอบพระคุณอย่างยิ่งค่ะอาจารย์
หมายความว่า หนูต้องสร้างโมดูลขึ้นมา แล้วนำโค้ดนี้ ไปใส่ไว้ทั้งหมด
ไม่ว่าจะเลือกใช้กรณีที่ 1 หรือ 2 ก็ตาม ใช่หรือไม่คะ
ที่หนูต้องการคือกรณีที่ 2 เลยค่ะ
 
หนูจะลองเอาไปทำดูนะคะ
ขอบคุณค่ะ
    
  หมายความว่า หนูต้องสร้างโมดูลขึ้นมา แล้วนำโค้ดนี้ ไปใส่ไว้ทั้งหมด
ไม่ว่าจะเลือกใช้กรณีที่ 1 หรือ 2 ก็ตาม ใช่หรือไม่คะ
ที่หนูต้องการคือกรณีที่ 2 เลยค่ะ
หนูจะลองเอาไปทำดูนะคะ
ขอบคุณค่ะ
        
    3 @R11611    
        
  
      ส่วนนี้ไว้ที่ฟอร์ม เหตุการณ์ที่ปุ่ม click อาจเปลี่ยนเป็นเหตุการณ์อื่นก็ได้ครับ
ที่ cmdButton1_Click
'ตรงนี้หมายถึงการตรวจเช็คว่ามีไฟล์ TblCustom จะคืนค่า True
if ChkTbl_ADOX("TblCustom") then
'มีตารางจริงจะทำอะไรก็ทำครับ
msgbox "พบตาราง"
else
'ไม่มีตารางจะทำอะไรดี ออกไปเลย ก็ exit sub ไงครับ
msgbox "Not Found"
end if
ส่วน code อื่นไว้ที่ module แล้วลบส่วนที่ 1 ทิ้ง หรือ mark ด้านหน้า
ด้วย single quote (')
'1 กรณีใช้ตรวจสอบในฐานข้อมูลเดียวกัน
'Set objConnection = CurrentProject.Connection
    
    
  ที่ cmdButton1_Click
'ตรงนี้หมายถึงการตรวจเช็คว่ามีไฟล์ TblCustom จะคืนค่า True
if ChkTbl_ADOX("TblCustom") then
'มีตารางจริงจะทำอะไรก็ทำครับ
msgbox "พบตาราง"
else
'ไม่มีตารางจะทำอะไรดี ออกไปเลย ก็ exit sub ไงครับ
msgbox "Not Found"
end if
ส่วน code อื่นไว้ที่ module แล้วลบส่วนที่ 1 ทิ้ง หรือ mark ด้านหน้า
ด้วย single quote (')
'1 กรณีใช้ตรวจสอบในฐานข้อมูลเดียวกัน
'Set objConnection = CurrentProject.Connection
        
    4 @R11613    
        
  
      ลองทำแล้วค่ะ หนูไม่ทราบว่า ผิดตรงไหน มัน Error ตามในรูปเลยค่ะ
 
หนูทำโดยที่ยังไม่ได้ลบส่วนที่1ออกนะคะ ไม่ทราบเกี่ยวกันหรือเปล่า
ขอรบกวนด้วยนะคะ
ขอบคุณค่ะ
    
   
หนูทำโดยที่ยังไม่ได้ลบส่วนที่1ออกนะคะ ไม่ทราบเกี่ยวกันหรือเปล่า
ขอรบกวนด้วยนะคะ
ขอบคุณค่ะ
        
    5 @R11615    
        
  
      เปลี่ยน End Sub (ตรงที่ error คลุมเป็นสีเทาอยู่)
ให้เป็น End Function
ส่วนที่ 1 ลบไปเลยครับ
    
  ให้เป็น End Function
ส่วนที่ 1 ลบไปเลยครับ
        
    6 @R11616    
        
  
      ตาม อ.PichaiTC ครับ
Public Function ChkTbl_ADOX(tbl As String) as Boolean
Set objCatalog = CreateObject("ADOX.Catalog")
Set objConnection = CreateObject("ADODB.Connection")
Set objConnection = New ADODB.Connection
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb"
ChkTbl_ADOX=False
Set objCatalog.ActiveConnection = objConnection
For Each tdf In objCatalog.Tables
If UCase(tdf.Name) = UCase(tbl) Then
ChkTbl_ADOX=True
End If
Next
objConnection.Close
End Function
    
  Public Function ChkTbl_ADOX(tbl As String) as Boolean
Set objCatalog = CreateObject("ADOX.Catalog")
Set objConnection = CreateObject("ADODB.Connection")
Set objConnection = New ADODB.Connection
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb"
ChkTbl_ADOX=False
Set objCatalog.ActiveConnection = objConnection
For Each tdf In objCatalog.Tables
If UCase(tdf.Name) = UCase(tbl) Then
ChkTbl_ADOX=True
End If
Next
objConnection.Close
End Function
        
    7 @R11617    
        
  
      เย้...ผ่านฉลุยแล้วค่ะ 
ขอขอบคุณอาจารย์ทั้งสองท่าน อย่างยิ่งนะคะ
    
  ขอขอบคุณอาจารย์ทั้งสองท่าน อย่างยิ่งนะคะ
        
    8 @R11618    
        
  
      ขอรบกวนเพิ่มเติมอีกนิดนึงค่ะอาจารย์
หนูเจอปัญหา หากไฟล์ฐานข้อมูลเป็น.mde แล้วมันจะ Error ตามในรูปค่ะ
 
แต่หากเป็นไฟล์ .mdb แล้วจะผ่านได้ไม่มีปัญหาค่ะอาจารย์
    
    
  หนูเจอปัญหา หากไฟล์ฐานข้อมูลเป็น.mde แล้วมันจะ Error ตามในรูปค่ะ
 
แต่หากเป็นไฟล์ .mdb แล้วจะผ่านได้ไม่มีปัญหาค่ะอาจารย์
        
    9 @R11619    
        
  
      1 check ว่าไฟล์เป็นแบบ read-only หรือไม่ โดย clickขวา ชื่อไฟล์  Sample.mde เลือก property ดูด้านล่าง ถ้าเป็น read-only ให้เอาเครื่องหมายออก
2 เป็น file sharing หรือไม่ ให้ตั้งคุณสมบัติ การแชร์ Folder ให้ read และ write ได้
ตอนนี้นึกได้แค่นี้ เดี๋ยวนอนตื่นมา นึกได้จะมาตอบอีกนะครับ หรือเดี๋ยวท่านอื่นว่างก็มาช่วยตอบ
    
  2 เป็น file sharing หรือไม่ ให้ตั้งคุณสมบัติ การแชร์ Folder ให้ read และ write ได้
ตอนนี้นึกได้แค่นี้ เดี๋ยวนอนตื่นมา นึกได้จะมาตอบอีกนะครับ หรือเดี๋ยวท่านอื่นว่างก็มาช่วยตอบ
        
    10 @R11620    
        
  
      ตามที่ error report แจ้ง เป็นเรื่อง permission คือสิทธิ์ในการเรียกใช้งานครับ
ผมเดาว่าคุณอาจจะมีการกำหนดสิทธิื ผ่าน Workgroup แล้วพอจะทำเป็น .mde ก็ปลดสิทธิ์
หรือ อาจจะกำหนดสิทธิ์ไม่ตรงกัน
ทำให้เรียกใช้งานไม่ได้
    
  ผมเดาว่าคุณอาจจะมีการกำหนดสิทธิื ผ่าน Workgroup แล้วพอจะทำเป็น .mde ก็ปลดสิทธิ์
หรือ อาจจะกำหนดสิทธิ์ไม่ตรงกัน
ทำให้เรียกใช้งานไม่ได้
        
    11 @R11621    
        
  
      เป็นกรณีที่ อ. PichaiTC ตั้งข้อสัเกตุเลยค่ะ
ไฟล์เป้าหมาย มีการกำหนดสิทธิเอาไว้ หนูลองสร้างไฟล์จำลอง MDE ตัวใหม่ แบบไม่กำหนดสิทธิใดๆ แล้วมันผ่านได้ไม่มีปัญหาค่ะ
ไม่ทราบว่า เรามีวิธีตรวจสอบแบบอื่น อีกไหมคะ เพราะการกำหนดสิทธิ จำเป็นต้องคงไว้ค่ะ
    
    
  ไฟล์เป้าหมาย มีการกำหนดสิทธิเอาไว้ หนูลองสร้างไฟล์จำลอง MDE ตัวใหม่ แบบไม่กำหนดสิทธิใดๆ แล้วมันผ่านได้ไม่มีปัญหาค่ะ
ไม่ทราบว่า เรามีวิธีตรวจสอบแบบอื่น อีกไหมคะ เพราะการกำหนดสิทธิ จำเป็นต้องคงไว้ค่ะ
        
    12 @R11622    
        
  
      หนูคิดเอาเองเล่นๆ
จะมีทางเป็นไปได้ไหมคะว่า เมื่อเข้าเช็คไฟล์เป้าหมายต้นทางไม่ได้
งั้นเราเปลี่ยนมาเช็คที่ปลายทางแทนได้ไหมคะ ทำนองว่า
เมื่อสั่ง insert แล้วให้ล้างข้อมูลเก่าออกก่อน หากไม่มีข้อมูลใหม่เข้ามา จะด้วยเหตุใดก้แล้วแต่ เช่น
ไม่มีตารางเป้าหมาย หรือมี แต่เปิดเข้าไม่ได้ ก็ให้แจ้งเตือนแล้วยกเลิกการ insert
ไม่ทราบว่าในทางปฏิบัติ จะเป็นไปหรือไม่คะ
    
  จะมีทางเป็นไปได้ไหมคะว่า เมื่อเข้าเช็คไฟล์เป้าหมายต้นทางไม่ได้
งั้นเราเปลี่ยนมาเช็คที่ปลายทางแทนได้ไหมคะ ทำนองว่า
เมื่อสั่ง insert แล้วให้ล้างข้อมูลเก่าออกก่อน หากไม่มีข้อมูลใหม่เข้ามา จะด้วยเหตุใดก้แล้วแต่ เช่น
ไม่มีตารางเป้าหมาย หรือมี แต่เปิดเข้าไม่ได้ ก็ให้แจ้งเตือนแล้วยกเลิกการ insert
ไม่ทราบว่าในทางปฏิบัติ จะเป็นไปหรือไม่คะ
        
    13 @R11623    
        
  
      code ตรงนี้
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb"
ให้แก้โดยเพิ่ม User กับ Password ไปด้วยครับ
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb" _
, "", ""
    
    
  objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb"
ให้แก้โดยเพิ่ม User กับ Password ไปด้วยครับ
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb" _
, "", ""
        
    14 @R11624    
        
  
      objConnection.Open _ 
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb" _
, "[ระบุ UserID]", "[ระบุ password]"
    
    
  "Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb" _
, "[ระบุ UserID]", "[ระบุ password]"
        
    15 @R11627    
        
  
      เพิ่มบรรทัดดังกล่าวไม่ได้ค่ะอาจารย์ มันไม่ยอมให้เพิ่ม จะขึนแดงประมาณนี้เลยค่ะ
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mde" _
, "[ระบุ UserID]", "[ระบุ password]"
พอดีหนูยังไม่ได้จับภาพมาให้ดูค่ะ
    
    
  objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mde" _
, "[ระบุ UserID]", "[ระบุ password]"
พอดีหนูยังไม่ได้จับภาพมาให้ดูค่ะ
        
    16 @R11628    
        
  
      objConnection.Open _ 
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mde" & _
, "[ระบุ UserID]", "[ระบุ password]"
    
    
  "Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mde" & _
, "[ระบุ UserID]", "[ระบุ password]"
        
    17 @R11630    
        
  
      ผมไม่แน่ใจว่าจะต้องใช้ในรูปแบบไหน
ลองหลายรูปแบบดูครับ
เนื่องจากไม่ค่อยใช้วิธีนี้เท่าไหร่
ในกรณี Workgroup (system database)
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;
ในกรณี Workgroup (system database) specifying username and password
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;User ID=myUsername;Password=myPassword;
หมายเหตุ : system.mdw ชื่อไฟล์ system ที่ set permission
myUsername ระบุ user name
myPassword ระบุ password
    
    
  ลองหลายรูปแบบดูครับ
เนื่องจากไม่ค่อยใช้วิธีนี้เท่าไหร่
ในกรณี Workgroup (system database)
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;
ในกรณี Workgroup (system database) specifying username and password
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;User ID=myUsername;Password=myPassword;
หมายเหตุ : system.mdw ชื่อไฟล์ system ที่ set permission
myUsername ระบุ user name
myPassword ระบุ password
        
    18 @R11632    
        
  
      ยังไม่สำเร็จเลยค่ะอาจารย์
แก้ Error สีแดงได้แล้ว แต่ก็ยังติด debug สีเหลือง ไม่ผ่านเช่นเดิม
ค่อยๆลองทำดูทุกแบบ ตามที่ท่านแนะนำแล้วค่ะ
หนูว่าจะขอพักไว้ก่อน อิอิ เกรงใจ ที่ต้องรบกวนอารย์ค่ะ
ต้องขอขอบคุณท่านทั้งสองอีกครั้งนะคะ
    
    
  แก้ Error สีแดงได้แล้ว แต่ก็ยังติด debug สีเหลือง ไม่ผ่านเช่นเดิม
ค่อยๆลองทำดูทุกแบบ ตามที่ท่านแนะนำแล้วค่ะ
หนูว่าจะขอพักไว้ก่อน อิอิ เกรงใจ ที่ต้องรบกวนอารย์ค่ะ
ต้องขอขอบคุณท่านทั้งสองอีกครั้งนะคะ
        
    19 @R11633    
        
  
      ขอถามต่อนิดนะครับ
ผมลองกับไฟล์ที่เป็น .accdb (ถ้าเป็น mdb ของ 2003 ใช้ได้)
โปรแกรมจะฟ้อง
Run-time error '-2147467259 (80004005)':
Unrecognized database format 'D:\Sample.accdb'.
คือเหมือนกับว่า ถ้าเป็นเวอร์ชั่น 2007 ขึ้นไปอ่านไม่ได้ใช่ไหมครับ
ผมลองเปลี่ยนนามสกุลเล่นดูเป็น Sample.mdb ก็ไม่ได้ เหมือนกับโปรแกรม Microsoft.Jet.OLEDB.4.0 มอง Format ใหม่ ในไฟล์ไม่ออกจริงๆครับ
ต้องใช้ References ตัวไหนช่วยได้หรือเปล่าครับ
    
  ผมลองกับไฟล์ที่เป็น .accdb (ถ้าเป็น mdb ของ 2003 ใช้ได้)
โปรแกรมจะฟ้อง
Run-time error '-2147467259 (80004005)':
Unrecognized database format 'D:\Sample.accdb'.
คือเหมือนกับว่า ถ้าเป็นเวอร์ชั่น 2007 ขึ้นไปอ่านไม่ได้ใช่ไหมครับ
ผมลองเปลี่ยนนามสกุลเล่นดูเป็น Sample.mdb ก็ไม่ได้ เหมือนกับโปรแกรม Microsoft.Jet.OLEDB.4.0 มอง Format ใหม่ ในไฟล์ไม่ออกจริงๆครับ
ต้องใช้ References ตัวไหนช่วยได้หรือเปล่าครับ
        
    20 @R11634    
        
      
	  
      
    
      กำหนด USER ID เป็น admin    
    
  
      Time: 0.5953s
    
      
		
Microsoft ADO Ext x.x for DDL AND SECURITY (msadox28.tlb (2.8) , หรือ msadox.dll (6.0)
ประกาศตัวแปรไว้ใน Module
Global tdf As ADOX.Table
Global objCatalog As ADOX.Catalog
Global objConnection As ADODB.Connection
Public Function ChkTbl_ADOX(tbl As String) as Boolean
Set objCatalog = CreateObject("ADOX.Catalog")
Set objConnection = CreateObject("ADODB.Connection")
'1 กรณีใช้ตรวจสอบในฐานข้อมูลเดียวกัน
Set objConnection = CurrentProject.Connection
'2 กรณีต่างฐานข้อมูล
Set objConnection = New ADODB.Connection
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\Sample.mdb"
'เลือก 1 หรือ 2 ตามที่ต้องการ
Set objCatalog.ActiveConnection = objConnection
For Each tdf In objCatalog.Tables
If UCase(tdf.Name) = UCase(tbl) Then
ChkTbl_ADOX=True
End If
Next
objConnection.Close
End Sub
ที่ cmdButton1_Click
if ChkTbl_ADOX("TblCustom") then
msgbox "พบตาราง"
else
msgbox "Not Found"
end if
ทดลองดูครับ