นำเข้าข้อมูลครั้งละหลายตารางจากฐานข้อมูลอื่นได้ไหม
กระทู้เก่าบอร์ด อ.Yeadram

 6,681   38
URL.หัวข้อ / URL
นำเข้าข้อมูลครั้งละหลายตารางจากฐานข้อมูลอื่นได้ไหม

อยากทราบว่า เราสามารถนำเข้าข้อมูลครั้งละหลายตาราง จากฐานข้อมูลอื่นซึ่งเป็นAccess เหมือนกันและมีโครงสร้างเหมือนกันได้ไหมคะ สมมติฐานข้อมูลเป้าหมายที่เราจะไปเอาข้อมูลมีชื่อว่า Access-1 และฐานข้อมูลปัจจุบันของเราชื่อว่า Access-2 ซึ่งฐานข้อมูลทั้งสอง มีตารางเก็บข้อมูลอยู่ 10 ตารางโดยมีโครงสร้างเหมือนกัน
ความต้องการของหนูก็คือ ที่ฐานข้อมูล Access-2 จะมีฟอร์มอยู่หนึ่งฟอร์มซึ่งมีปุ่มให้คลิก เมือคลิกแล้วก็ให้ไปโหลดข้อมูลจาก Access-1 มาเข้าใน Access-2 ทั้งหมด ทุกตารางค่ะ อยากทราบว่า Access สามารถทำได้หรือไม่ ถ้าได้..เราต้องเขียนโค๊คคำสั่งให้กับปุ่มนี้อย่างไรบ้างคะ

38 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R02760
เป็นตย.คำสั่งเขียนใน VBA นะครับ

docmd.runsql "insert into ชื่อเทเบิล select * from ชื่อเทเบิล in ""C:\...\...\...\Access-1.mdb"""

มีกี่เทเบิลก็เขียนเท่านั้นคำสั่งครับ
2 @R02763
ขอเรียนถามเพิ่มเติมค่ะอาจารย์
select * from ชื่อเทเบิล in ""C:\...\...\...\Access-1.mdb"""
ระหว่างเครื่องหมาย \...\...\ ที่ถัดจาก C:\ นั้นสำหรับใส่ชื่อโฟลเดอร์ใช่หรือเปล่าคะ
แล้วหาก Access-1.mdb ไม่ได้อยู่ที่ไดร์ฟ C:\ เสมอไป จะสามารถสร้างให้มีการค้นหาตำแหน่งที่อยู่ของ Access-1.mdb ด้วยได้หรือไม่คะ
3 @R02765
ตรงตำแหน่ง Drive:\...\...\...\ หมายถึงใส่ไดร์ฟและโฟลเดอร์ที่ไฟล์อยู่ครับ หรือจะใส่เป็นรูปแบบ \\ชื่อเครื่อง หรือ IP Address\โฟลเดอร์\โฟลเดอร์\ไฟล์ ก็ได้ครับ
4 @R02773
ขอบคุณค่ะอาจารย์
อาจารย์คะ หากเราระบุเฉพาะไดร์ฟและชื่อโฟลเดอร์ที่ไฟล์นั้นอยู่ แต่เราไม่ต้องระบุชื่อเต็มของไฟล์ฐานข้อมูลนั้น ต้องทำอย่างไรคะ หนูลองดัดแปลงโค๊ดตามที่ท่านแนะนำ ให้เป็นแบบนี้ดู
docmd.runsql "insert into tbl_family select * from tbl_family in ""C:\mydata\*.mdb""" แล้วมันใช้ไม่ได้คะไม่ทราบว่าต้องใช้คำสั่งอย่างไรจึงจะถูกต้องคะอาจารย์
5 @R02774
ทำไมเราจะไม่ระบุชื่อเต็มมันหล่ะครับ ถ้าใช้ wildcard เช่น *.mdb มันก็ไม่รู้สิครับว่าจะเอามาจากไฟล์ไหน มันไม่ได้ดั่งใจเราขนาดนั้นครับ ต้องระบุชื่อไฟล์ให้ครบถ้วนครับ
6 @R02776
หนูคิดวางแผนไว้อย่างนี้ค่ะอาจารย์ (ขออนุญาตอธิบายยาวนิดนึงนะคะ) คือ User หนูจะมีอยู่ประมาณ 5 User โดยไม่ได้อยู่ที่เดียวกัน ประมาณ 1-3 เดือนหนูก็จะส่งไฟล์ข้อมูล Access-1,2,3,4,5,, ที่อัพเดตล่าสุดของแต่ละครั้งไปให้ ซึ่งชื่อไฟล์ที่ส่งไปแต่ละครั้งจะเปลี่ยนไปเรื่อยๆ User เขาก็จะโหลดข้อมูล เข้าในไฟล์ฐานข้อมูลหลักของเขาอีกที โดยในเครื่องของแต่ละ User จะต้องมีโฟลเดอร์หลักตายตัวชื่อ mydata อยู่ที่ C:\ สำหรับเก็บไฟล์ที่เราจะส่งไปให้เป็นระยะๆ ซึ่งภายในโฟลเดอร์นี้ เราจะบังคับให้ User ลบไฟล์เดิมออกก่อนทุกครั้งที่ได้รับไฟล์ใหม่ เพื่อเอาไฟล์ใหม่ไปไว้แทนที่ คือให้มีไฟล์ .mdb อยู่ได้เพียงไฟล์เดียวเท่านั้น แต่ชื่อไฟล์ของแต่ละครั้งนี่แหละค่ะ ที่มันจะเปลี่ยนไปเรือยๆ ไม่ซ้ำกัน
ประเด็นความต้องการของหนูก็คือ หนูอยากสร้างปุ่มคำสั่งสำหรับนำเข้าข้อมูล ไว้ที่ไฟล์ฐานข้อมูลหลักของทุก User เหมือนกันทั้งหมดโดยจะออกแบบให้โหลดข้อมูลจาก ไฟล์ .mdb ที่อยู่ภายในโฟลเดอร์ mydata ของไดร์ฟ C:\ โดยไม่ต้องคำนึงถึงชื่อไฟล์ เพราะมันจะมีอยู่เพียงไฟล์เดียวเท่านั้น แต่ชื่อของไฟล์แต่ละครั้ง มันจะไม่คงที่ค่ะ

รบกวนขอคำแนะนำจากอาจารย์ด้วยค่ะ
7 @R02778
ขออนุญาต ครับ
หาโค้ดมาไล่อ่านรายชื่อไฟล์ในโฟลเดอร์ก่อนครับ
ดูว่ามันเจอ mdb ชื่ออะไร (อาจมีประโยชน์ในการตรวจสอบไฟล์ได้ด้วย)
เอาชื่อของมันเข้าเก็บในตัวแปรก่อนครับ
เพราะชื่อของมันสำคัญมาก ในการอ้างอิง สำหรับงานต่อไป
แล้วค่อยเอาตัวแปรนั้นไปใช้งานอีกที

จะใช้ wildcard ในการอ้างอิงพาธ ไม่ได้ครับ
8 @R02780
ขออนุญาตร่วมตอลกระทู้ครับ
สามารถทำได้อีกวิธีครับ โดยที่ไม่ต้องยุ่งยากมาก โดยหลักการมีคร่าวๆ ดังนี้ครับ
1. มีไฟล์ FrontEnd Link Table ในไฟล์ BackEnd ที่ต้องการ
2. ไฟล์ที่ต้องการนั้นสามารถเขียนคำสั่งให้ Browse ระบุไปยังไฟล์ที่ต้องการได้

เดี๋ยวถ้าว่างจะทำตัวอย่างไปให้ที่ accboard@gmail.com
9 @R02784
ขอบคุณอาจารย์ yeadram และอาจารย์ ศรี-นคร นะคะ หนูสนใจและอยากทำตามที่ท่านทั้งสองแนะนำ แต่หนูยังอ่อนหัดเรื่องโค๊ดอยู่ค่ะ หากมีโค้ดตัวอย่าง หนูก็พอจะแกะและดัดแปลงได้บ้าง แต่ถ้าจะให้เขียนเองเลยนี่หนูยังทำไม่เป็นค่ะ หลายโปรเจ็คที่หนูทำมา ก็อาศัยโค้ดตัวอย่างจากหลายๆท่านในบอร์ดนี้แหละค่ะ คงต้องขอรบกวนให้อาจารย์เขียนโค้ดตัวอย่างให้หนูหน่อยนะคะ
หนูขอทั้งสองท่านเลย ขอบคุณค่ะ
10 @R02785
ลองไปปรับใช้ดูครับ ผมเคยเขียนเอาไว้ ให้ยูสเซอร์ใช้กดปุ่มเพื่อเลือกไฟล์
เพื่อจะ Import ข้อมูลเข้าตารางครับ

ส่วนนี้วางไว้ในโมดูล
Option Compare Database
Option Explicit
'************** Code Start **************

'This code was originally written by Terry Kreft.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'Code courtesy of
'Terry Kreft
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
            "SHGetPathFromIDListA" (ByVal pIDL As Long, _
            ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
            "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
            As Long
Private Const BIF_RETURNONLYFSDIRS = &H1

'** API **
'*********
'[Open File]Dialog Box API
Private Declare Function GetOpenFileName _
        Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
        (pOpenfilename As OPENFILENAME) As Long

'***********
'** CONST **
'***********

'***********
'** CONST **
'***********
'OPENFILENAME flags
Public Const OFN_READONLY = &H1            '[Read Only]Check On
Public Const OFN_OVERWRITEPROMPT = &H2     'Ask Overwrite
Public Const OFN_HIDEREADONLY = &H4        '[Read Only]Hide Checkbox
Public Const OFN_SHOWHELP = &H10           '[Help]Visible
Public Const OFN_ALLOWMULTISELECT = &H200 'Select Multi
Public Const OFN_EXTENSIONDIFFERENT = &H400
Public Const OFN_PATHMUSTEXIST = &H800     'Can not use unexistant path name
Public Const OFN_FILEMUSTEXIST = &H1000    'Can not use unexistant file name
Public Const OFN_CREATEPROMPT = &H2000     'If there is no file,create or not.
Public Const OFN_EXPLORER = &H80000

'*********
'** Val **
'*********
'[Open file] and [Save File]Dialog
Private Type OPENFILENAME
        lStructSize As Long     'Size
        hwndOwner As Long       'Window's handle
        hInstance As Long       'Apprication's instance
        lpstrFilter As String   'Filter
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long    'Default file name
        lpstrFile As String     'Selected file name
        nMaxFile As Long        'Max length of file name
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long           'option
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
End Type

'--------------------------------------------------------
'   FUNC    : ShowOpenFileDlg
'   aim     : Show [Open File]Dialog and get file name
'--------------------------------------------------------
Public Function ShowOpenFileDlg(lnghWnd As Long, strFilter As String, strDefDir As String) As String

    Dim strRePathName As String
    
    Dim typOpenFileName As OPENFILENAME
    
    With typOpenFileName
        'Set Size
        .lStructSize = Len(typOpenFileName)
        'Set owner windows handle
        .hwndOwner = lnghWnd
        'Set Apprication's instance
'        .hInstance = App.hInstance
        'Set filter
        .lpstrFilter = strFilter
        'Set active filter name
        .nFilterIndex = 1
        'Reset [File]box
        .lpstrFile = String(256, Chr(0))
        'Set max length of file name
        .nMaxFile = 256
        'pointer for Recieve file's title
        .lpstrFileTitle = String(256, Chr(0))
        'Set max length of file title
        .nMaxFileTitle = 256
        'Set default directory
        .lpstrInitialDir = strDefDir
        'Set dialog's title
        .lpstrTitle = "Select File"
        'Set option
        .flags = OFN_EXPLORER Or OFN_PATHMUSTEXIST _
            Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY

    End With
    
    'Show [Open File]Dialog
    If GetOpenFileName(typOpenFileName) = 0 Then
        'When Cancel
        ShowOpenFileDlg = ""
    Else
        'If OK,show file name
        'purge Null strings
        ShowOpenFileDlg = Left(typOpenFileName.lpstrFile, _
               InStr(typOpenFileName.lpstrFile, vbNullChar) - 1)
    End If

End Function

ส่วนนี้วางไว้ที่ฟอร์ม สร้างปุ่มให้ยูสเซอร์กดเลือกไฟล์
กับเท็กซ์บ๊อกซ์ให้แสดงชื่อพาธกับไฟล์

    Dim strFilter As String

    strFilter = "All File (*.*)" & vbNullChar
    buff = ShowOpenFileDlg(Me.Hwnd, strFilter, "C:\")
    Me.txtFolderPath = buff
11 @R02788
ขอบคุณอาจารย์ รักน้องบิวท์ ค่ะ
โค้ดที่ท่านให้มา หนูแกะไม่ไหวก็เลยคัดลอกไปวางเพรียวๆเลยที่โมดูล แต่ในส่วนท้ายที่ว่า
ส่วนนี้วางไว้ที่ฟอร์ม สร้างปุ่มให้ยูสเซอร์กดเลือกไฟล์
กับเท็กซ์บ๊อกซ์ให้แสดงชื่อพาธกับไฟล์

    Dim strFilter As String

    strFilter = "All File (*.*)" & vbNullChar
    buff = ShowOpenFileDlg(Me.Hwnd, strFilter, "C:\")
    Me.txtFolderPath = buff


หนูยังไม่เข้าใจวิธีว่าจะนำไปวางไว้ตรงไหนของฟอร์มค่ะ ตอนนี้ก็เลยยังไม่ทราบผล ว่าจะใช้ได้หรือไม่
ขอคำแนะนำเพิ่มเติมด้วยค่ะอาจารย์
12 @R02789
ที่ฟอร์ม ให้สร้างปุ่มขึ้นมา ก่อน
แล้วเขียนโค๊ดที่ปุ่ม (สมมุติชื่อปุ่ม cmdBrowse)

Private sub cmdBrowse_Click()
Dim strFilter As String

    strFilter = "All File (*.*)" & vbNullChar
    buff = ShowOpenFileDlg(Me.Hwnd, strFilter, "C:\")
    Me.txtFolderPath = buff
end sub
13 @R02791
ลองทำตามดูแล้วก็ยังไม่สำเร็จค่ะอาจารย์ พอคลิกที่ปุ่มแล้วมันจะเป็นตามในภาพ

ทดลองกลับไปสร้างโฟลเดอร์ไว้ที่ไดร์ฟ C:\ แล้วก็ตั้งชื่อโฟลเดอร์ให้ตรงกับที่มันแจ้ง error ก็ยังไม่ได้ค่ะอาจารย์
14 @R02795
ต้องกำหนดชื่อเท็กซ์บ๊อกซ์เป็น txtFolderPath ครับ
15 @R02796
ว้าว...ใช้ได้แล้ว...ขอบคุณมากค่ะอาจารย์
16 @R02797
อาจารย์คะ ผลที่ได้มันยังไม่ตรงตามที่หนูต้องการค่ะ แต่เอาเถอะโค้ดนี้มันมีประโยชน์มากๆ หนูเลยจะขอพักความต้องการเดิมเอาไว้ก่อน เพราะบังเอิญโค้ดนี้หนูก็ค้นหามานานเช่นกัน พอมาเจอก็ปิ้งไอเดียร์ทันทีเลยค่ะอาจารย์ แต่หนูอยากขอดัดแปลงโค้ดนี้เล็กน้อยเพื่อให้ตรงตามที่ต้องการ แต่ไม่ทราบจะดัดแปลงตรงไหนได้ เบื้องต้นหนูดัดแปลงให้เปิดไปที่โฟลเดอร์เป้าหมาย "Browse Test" ได้แล้ว ตามตัวอย่างภาพที่ 1 ค่ะ



แต่หนูอยาให้มันเปิดมาแบบภาพตัวอย่างที่ 2 (อยู่ในกระทู้ถัดไปค่ะ)
17 @R02798
หนูอยากให้มันเปิดมาแบบภาพตัวอย่างที่ 2 นี้ หนูจะต้องแก้ไขโค้ดตรงไหนบ้างคะ

ขอคำแนะนำด้วยค่ะอาจารย์
18 @R02800

Shell "explorer c:\browse test", vbNormalFocus
19 @R02801
ได้สมดั่งใจปราถนาเลยท่านอาจารย์

Private sub cmdBrowse_Click()
Dim strFilter As String

    strFilter = "All File (*.*)" & vbNullChar
    Shell "explorer c:\browse test", vbNormalFocus
    Me.txtFolderPath = buff

end sub


ด้วยความขอบพระคุณเป็นอย่างยิ่งค่ะ
20 @R07953
        อ่านแล้วก็ยังงงอยู่ค่ะ คือหนูมือใหม่มาก ๆๆ หนูก็นั่งอ่านกระทู้จนเกือบจะทุกหน้า ก็ยัง งง ออกแบบฐานข้อมูลก็ทำแบบลูกทุ่งมากเลย แต่การแก้ปัญหาเฉพาะหน้า เรื่องการนำข้อมูลทั้งตาราง หนูอ่านแล้วงงค่ะ แต่ก็น่าจะช่วยหนูได้

    เรื่องของหนูคือ มีฐานข้อมูลที่เป็นตาราง (ตารางจะเหมือนกันทุกคอลัม) ให้แต่ละแผนก กรอกข้อมูล พอสิ้นเดือนก็นำมารวมกัน ที่เครื่องหลักค่ะ ที่หนูสงสัยคือการทำปุ่ม ที่ฟอร์ม จะทำอย่างไร พอเลือกปุ่มแล้ว ระบบจะถามว่าจะทำปุ่มแบบไหน เช่น เปิดฟอร์ม หรือเพิ่มเรคคอด ประมาณนี้ค่ะ แล้วโค๊ดจะทำแบบไหน หนูรบกวนจริงๆๆค่ะ

ฐานข้อมูลหลักของหนู ชื่อ PST ตารางชื่อ NAM เก็บไว้ที่ไดร์ D

ข้อมูลเครื่องอื่นๆ ก็จะเป็น เช่น เครื่องที่1 ชื่อ PST1 เครื่องที่ 2 ชื่อ PST2 ส่วนตารางก็จะเป็น NAM ทุกเครื่อง เวลารวมข้อมูลก็จะทำที่ละฐานข้อมูลโดยก๊อปปี้แล้วมาวางที่เดสท๊อป ค่ะ

อยากรบกวนให้เขียนโค๊ดให้หน่อยค่ะว่าจะทำอย่างไร เอาแบบตรงๆเลย พอมีเวลาหนูจะศึกษารายละเอียดค่ะ ตอนนี้เร่งด่วนมากค่ะ


ขอบคุณมากๆๆๆๆๆ นะค่ะ   ลำบากจริงๆๆๆ
       
                                                         ขอบคุณค่ะ น้องพร
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2890s