ODBC เข้าวง LAN
กระทู้เก่าบอร์ด อ.Yeadram

 15,800   6
URL.หัวข้อ / URL
ODBC เข้าวง LAN

[ODBC]
DRIVER=Microsoft Access Driver (*.mdb)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=MS Access
DriverId=281
DefaultDir=\\JRSERVER2\ShareDATA\OTX5\FidonBF
DBQ=\\JRSERVER2\ShareDATA\OTX5\FidonBF\51FIdonB.mdb
ตรง 2 บรรทัดสุดท้าย ผม พยายามให้มัน CONNECT ข้ามเครื่องพอ RUN CODE
เหมือนมันทำงานได้ ไม่แจ้ง ERROR แต่ไม่ได้ TABLE LINK เข้ามาอย่างที่ต้องการ
ถ้า MAP DRIVE จะทำได้ ผมสงสัยว่า DRIVER ACCESS
มันถามหา MAP DRIVE เสมอ แสดงว่ามันไม่สนับสนุนการทำงานข้ามเครื่อง
ในแบบ ODBC หรือเปล่าครับ คือไม่สามรถเขียนแบบ
\\JRSERVER2\ShareDATA\OTX5\FidonBF
ได้ นะครับ ต้อง MAP มาเป็น DRIVE E: ก่อน


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

1 @R00210
Option Explicit
Public myFSO As New FileSystemObject
Public BrancCode
Public Des, Oppo, LinkDrive, Linkfile As String

Function Linkdatabase()
        DoCmd.OpenForm "Accompleted", acNormal, , , , acWindowNormal
        Dim tb(5) As String
        tb(1) = "GoodINV"
        tb(2) = "Invoice"
        tb(3) = "Person"
        tb(4) = "Sale"
        tb(5) = "Salesub"
        'tb(6) = "Product"
'                   'MsgBox "Des : " & Des & vbCrLf & "Oppo : " & Oppo & vbCrLf & "LinkFile : " & LinkFile
        Dim I As Integer
    For I = 1 To 5
    If tbExist(tb(I)) Then DoCmd.DeleteObject acTable, tb(I)
    DoCmd.TransferDatabase acLink, "Microsoft Access", Linkfile, acTable, tb(I), tb(I), False
    Next I
Forms.Item("Accompleted").Controls.Item("label0") = Linkfile & vbCrLf & "!!! ACCOMPLETE !!!"
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE Sale SET Sale.TaxPeriod = Format([sale].[date],'mmyy')" _
& "WHERE (((Sale.TaxPeriod) Is Null));"
End Function

Function CheckDrive()
GetPath
LinkDrive = KSGLinkPathMDB
'LinkDrive = "d:\GLOVEDB\"
End Function

นี่ใน 1 โมดูล
2 @R00211
       
'----- Original path --------------------
Public AnCLinkPathDBF As String
Public AnCLinkPathMDB As String
Public KSGLinkPathDBF As String
Public KSGLinkPathMDB As String
Public AllWorkPath As String

Const CfgFile = "\\ks01\d\NW's Shared\CLONE WORKS\ksglove_anc_program_config_nodelete"


Function chkConfig()

Dim FSO 'As New FileSystemObject
Dim f 'As TextStream
Set FSO = CreateObject("scripting.filesystemobject")
        If FSO.FileExists(CfgFile) = False Then
        MsgBox "Error File Lost : " & vbCrLf & CfgFile & vbCrLf _
        & "Program will make new default file for you." & vbCrLf _
        & "If you ever change the config file plese do it again in new defualt file"

       
        Set f = FSO.OpenTextFile(CfgFile, ForWriting, True)
       
            f.WriteLine "ãËéÃкºÁѹ¨´¨Ó¨Ò¡¨Ø´à´ÕÂÇà¾×èͧèÒµèÍ¡ÒÃá¡éä¢ ËÃ×ÍÂéÒ path ã¹ÀÒÂËÅѧ"
            f.WriteLine "¤èÒµÑÇá»ÃàËÅèÒ¹Õé ÊÒÁÒöà»ÅÕè¹á»Å§ä´é ¨Ò¡¨Ø´¹Õéâ´ÂµÃ§"
            f.WriteLine "â´Â¤ÇÒÁËÁÒ¢ͧáµèÅеÑÇá»Ã ¤×Í ãËéÊѧࡵØÊÒÁµÑÇ˹éÒ-ÊÒÁµÑÇËÅѧ àªè¹"
            f.WriteLine "µÑÇá»ÃµÑÇáá ËÁÒ¶֧ â¿Åà´ÍÃì·Õèà¡çº dbf"
            f.WriteLine "¢Í§â»Ãá¡ÃÁ CD organize «×觨ÐÂѧäÁèÃкØ件֧Ëéͧ·Ó§Ò¹"
            f.WriteLine "àÁ×èͨйӵÑÇá»Ãä»ãªé㹡ÒþѲ¹Ò㹡ÅØèÁ Clone works Âѧ¨ÐµéͧºÍ¡â¿Åà´ÍÃìÂèÍÂÍÕ¡¤ÃÑé§ ¡è͹¨Ðãªé§Ò¹ä´é"
            f.WriteLine "àªè¹ µéͧµèÍ´éÇ org\ ¨Ö§¨ÐËÁÒ¶֧Ëéͧ·Ó§Ò¹»Õ»Ñ¨¨ØºÑ¹¢Í§ ºÃÔÉÑ· àÍ á͹´ì «Õ"
            f.WriteLine "ÍÕ¡ÊÒÁµÑǵèÍÁÒ ¡ç¤ÅéÒ¡ѹ á¤èÇèÒ ¶éÒŧ·éÒ´éÇ MDB ¡çËÁÒ¶֧°Ò¹¢éÍÁÙÅ Access"
            f.WriteLine "Êèǹ µÑÇ·Õè 6 ËÁÒ¶֧ â¿Åìà´ÍÃì·Õèà¡çºâ»Ãá¡ÃÁ·Õè¤ÍÁä¾ÅìáÅéÇ áÅÐ ËÃ×Íâ»Ãá¡ÃÁ¨Ó¾Ç¡ Front End"
            f.WriteLine ""

            f.WriteLine "AnCDBF = " & "\\ks01\d\c-d\"
            f.WriteLine "AnCMDB = " & "\\ks01\d\nw's shared\clone works\"
            f.WriteLine "KSGDBF = " & "\\ks02\d\c-d\"
            f.WriteLine "KSGMDB = " & "\\ks02\D\glovedb\"
            f.WriteLine "WrkPth = " & "\\ks02\D\clone works\"
            f.WriteLine ""
            
            f.WriteLine "ä¿Åì¹Õé¨Óà»ç¹µéͧãªéã¹ Lost & Last Project áÅÐÍ×è¹æ ÍÕ¡ã¹Í¹Ò¤µ"
            f.WriteLine "Yeadram @ 2007"
            f.CLOSE
            Set f = Nothing
            Set FSO = Nothing
        If MsgBox("Your default config file has been created!" & vbCrLf _
        & "Do you want to stop this program and change some value(s) in your file now?", vbYesNo) = vbYes Then
        Shell "notepad.exe " & CfgFile, vbNormalNoFocus
        End
        End If
        End If
End Function

Function GetPath()
Dim FSO 'As New FileSystemObject
Set FSO = CreateObject("scripting.filesystemobject")
Dim ConfigFile As String

If FSO.FileExists(CurrentProject.Path & "\ksglove_anc_program_config_nodelete") = False Then
chkConfig
ConfigFile = CfgFile
Else
ConfigFile = CurrentProject.Path & "\ksglove_anc_program_config_nodelete"
End If

Dim instring As String
Open ConfigFile For Input As #1
        Do While Not EOF(1)
           Line Input #1, instring
            If Left(instring, 6) = "AnCDBF" Then AnCLinkPathDBF = Replace(instring, "AnCDBF = ", "")
            If Left(instring, 6) = "AnCMDB" Then AnCLinkPathMDB = Replace(instring, "AnCMDB = ", "")
            If Left(instring, 6) = "KSGDBF" Then KSGLinkPathDBF = Replace(instring, "KSGDBF = ", "")
            If Left(instring, 6) = "KSGMDB" Then KSGLinkPathMDB = Replace(instring, "KSGMDB = ", "")
            If Left(instring, 6) = "WrkPth" Then AllWorkPath = Replace(instring, "WrkPth = ", "")
        Loop
Close #1

'MsgBox "This is PUBLIC variables in this project : " & vbCrLf _
& "PUBLIC AnCLinkPathDBF : " & AnCLinkPathDBF & vbCrLf _
& "PUBLIC AnCLinkPathMDB : " & AnCLinkPathMDB & vbCrLf _
& "PUBLIC KSGLinkPathDBF : " & KSGLinkPathDBF & vbCrLf _
& "PUBLIC KSGLinkPathMDB : " & KSGLinkPathMDB & vbCrLf _
& "PUBLIC AllWorkPath : " & AllWorkPath

End Function

Function oConn(ByVal pth As String)
On Error GoTo errExit
If Conn.State <> 0 Then Conn.CLOSE
Conn.Open ("Provider=VFPOLEDB.1;Data Source=" & pth & ";Mode=ReadWrite|" _
& "Share Deny Read|Share Deny Write;Extended Properties="";User ID="";Password="";" _
& "Mask Password=False;Cache Authentication=False;Encrypt Password=False;" _
& "Collating Sequence=MACHINE;DSN=""")
Exit Function
errExit:
MsgBox Err.Number & " : " & Err.Description
End Function

Function cConn()
If Rs.State <> 0 Then Rs.CLOSE
If Conn.State <> 0 Then Conn.CLOSE
End Function


นี่ในอีก 1 โมดูล
3 @R00212
ไอ้ตัวอักษร ยึกยือ คือภาษาไทย ผมก็อบปี้มาจากโมดูลไม่ได้แปลงรหัส แต่ไม่เป็นไร มันแค่ คำแนะนำ ไม่ใช่ตัวโค้ด

ผมจะบอกว่า ผมไม่ได้สร้าง ODBC
ผมใช้ฟังก์ชั่นให้มันลิงค์ ตารางใหม่ เมื่อ
- เปิดใช้งานโปรแกรม
- เมื่อคลิ๊กเลือกเปลี่ยนฐานข้อมุล
ตัวโปรแกรมอยู่เครื่องผม (KS01) ตัวฐานข้อมูลอยู่อีกเครื่องหนึ่ง (KS02)
แต่เพราะผม อาจต้องย้ายตัว backend บ่อย ผมจึงใช้หลักการสร้างไฟล์ text ตัวหนึ่ง ให้เก็บ path ของแต่ละฐานข้อมูลไว้
เมื่อจะทำการเชื่อมต่อจากโปรแกรม ไปฐานข้อมูล ก็ให้เข้าไปอ่านใน ไฟล์ text ตัวนั้นดูว่า ฐานข้อมูลที่ผมต้องการอยู่ path ไหน เมื่อได้ค่า path มาแล้ว ก็เอาไปเรียกใช้ฟังก์ชั่น linkdatabase

ซึ่งพอจะตอบคำถามแบบอ้อมๆ ได้ว่า "แม้จะไม่มีการ Map Drive การคอนเนคชั่นก็เกิดได้ไม่มีปัญหาแต่อย่างใด ด้วยคำสั่ง transferdatabase (ในฟังก์ชั่น LinkDatabase)"
ไม่ทราบว่าพอจะเป็นแนวทางได้หรือเปล่า หรือมีความจำเป็นต้องสร้าง ODBC จริงๆ ครับ

ถ้าจำเป็นต้องสร้าง ODBC จริงๆ แล้วที่คุณทำ มันติดตรงที่ มันไม่ map drive ให้
ก็อาจใช้ วิธีกำปั้นทุบดินก็ได้ ด้วยการ สั่งให้มัน map drive ก่อน แล้วค่อย สร้าง ODBC

shell "NET USE E: \\KS02\D"

หากต้องการ ยกเลิกการ map drive นี้ ก็
shell "NET USE E: /DELETE
4 @R00222
เทพ ชัดๆ คงอีกนานครับกว่าผมจะตามทัน
5 @R00573
ถามแบบคนโง่ อีกครั้ง ยัง มึนอยู่ ผมมีปัญหาอยู่ว่า ถ้า KS02 (ฐานข้อมูล) ไม่เปลี่ยน แต่มี KS03 เพิ่มขึ้นมา วิธีไหนจะทำให้ KS03 เชื่อมต่อกับ KS02 ได้โดยเราไม่ต้องยุ่งที่เครื่องKS03 เลย วิธีที่ท่านเขียนโค้ดมานี้แก้ปัญหานี้ได้ไหม ยังไงขอไฟล์ตัวอย่างได้ไหมหรือถ้ามีวิธีอื่น ก็แนะนำด้วยนะ
6 @R00575
คุณต้องเอา พวก front-end ไปวางที่ เครื่อง KS03 อยู่แล้วครับ
ใน front-end พวกนั้นจะมี โมดูลตัวนี้อยู่แล้วครับ
สังเกต ใน Reply ลำดับที่ R00211   ข้างบนครับ นั่นเป็น โมดูลที่ว่า
เห็นการประกาศตัวแปร Const มั้ยครับ
จะเห็นได้ว่า มันจะเข้าไปอ่านไฟล์ config ที่เครื่อง KS01 เสมอครับ (ตัวอย่างนี้ KS01 คือเครื่องของผมเอง ซึ่งถ้ามีการเปลี่ยนพาธของ Backend ผมจะดูแลเปลี่ยนให้เอง)
เพราะฉะนั้น สรุปว่า

สำหรับเครื่องเกิดใหม่อย่าง KS03 (เพิ่งจะเพิ่มเข้ามาในระบบเน็ตเวิร์ค) คุณไม่ต้องทำอะไรอื่นนอกจากเอา Front-End ไปวางครับ

ตัวอย่าง เหรอครับ อิอิ ไม่รู้จะทำอย่างไรดี
ตารางของผมทั้งหลาย มันค่อนข้างเป็นลูกผสมครับ
บางตาราง คือ table ใน mdb
แต่ 80% เป็นตาราง dbf ครับ เป็นพวก Free table .dbf น่ะครับ ผมแค่ลิงค์เข้า mdb มาทำงานบางส่วนบางงานเท่านั้น แต่ตาราง dbf เหล่านั้น หลักๆ แล้วยังเป็น ฐานข้อมูลของ software อีกตัวครับ ซึ่ง เค้าเขียนโดย foxpro เถ้าแก่ผมซื้อโปรแกรมมา และโปรแกรมนั้นยังใช้อยู่ในบางส่วนบางแผนก
แต่ยังไงจะลองทำให้ดูครับ คงกำหนดเวลายังไม่ได้นะครับ ไม่มีกำหนด
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3616s