24. marts 2004 - 14:50Der er
22 kommentarer og 1 løsning
Opret tabel via modul
Hejsa Jeg har for at kunne omgå et problem med ODBC og Windows XP blevet nødt til at "tale" med min externe db gennem et modul. Kort og godt så er det jeg vil at få fat i tabellen notes fra den externe DB og kopier indholdet over i Access i en tabel notes1.
Uddybning:
Jeg opretter altså forbindelse til en extern DB gennem dette modul (noget kode som jeg har fået af Microsoft): ----------------------------------- Function LinkTable() On Error GoTo ErrorHandler
Dim ODBCConnection As ADODB.Connection Dim QDef As QueryDef Dim DB As Database
Set DB = CurrentDb()
Set ODBCConnection = New ADODB.Connection ODBCConnection.ConnectionString = "Data Source='DNS';" ODBCConnection.Open
Set QDef = DB.CreateQueryDef("Notes") QDef.Connect = "ODBC;DSN=DNS" QDef.SQL = "Select * From Notes" QDef.ReturnsRecords = True
ODBCConnection.Close
Set ODBCConnection = Nothing Exit Function
ErrorHandler: ' clean up If Not ODBCConnection Is Nothing Then If ODBCConnection.State = adStateOpen Then ODBCConnection.Close End If Set ODBCConnection = Nothing
If Err <> 0 Then MsgBox Err.Source & "-->" & Err.Description, , "Error" End If End Function ---------------------------------------
Men dette kode opretter en forespørgsel i min Access ved navn "Notes" (jeg kører modulet gennem en Macro).
Jeg vil gerne at når jeg kører funktionen, at indholdet så kopieres fra notes (i den externe DB) over i min tabel notes1. I SQL vil det vel se sådan her ud:
------------------------------------ insert into Notes1(RowNumber, LastChanged, NotesFileId, NotesRecId, LineNumber, Txt, User_, RecID, FileID) select * from Notes ------------------------------------
Hej Det er fordi den anden DB ikke er en Access DB og jeg derfor skal bruge en ODBC driver for at tale med den. Derfor gør jeg som jeg gør, men det kan da godt være dit kode virker anyway?
Jeg får den fejl ---------------------- Databaseformatet <filnavn> kan ikke genkendes. (Fejl 3343) ---------------------- når jeg vil køre dette: ---------------------- insert into Notes1 (RowNumber, LastChanged, NotesFileId, NotesRecId, LineNumber, Txt, User_, RecID, FileID) select * from [C:\Dokumenter\DinAndenDatabase.DMO].Notes ----------------------
Men hvis din DNS virker, hvorfor laver du så ikke en sammenkædning til den eksterne DB? Derved vil du i Access kunne lave en alm. tilføjelsesforespørgsel mellem de 2 tabeller. Eller blot arbejde på den eksterne tabel.
(Hvorfor sletter du mine svar hver gang? Hvorfor ikke bare vente til du er klar til at give point og derefter acceptere/afvise alle indlæg på én gang. Derved er fri for at skulle klikke svar hver gang, ligesom du undgår den situation, hvor du har fået løst dit problem og måske alligevel ønsker at give point for indsatsen til andre deltagere, men ikke har noget svar fra dem, da de er afvist.)
Kommentarer omkring afvisning er taget til efterretning...
Nå, men grunden til at jeg ikke bare bruger "Sammenkæd tabel" er fordi jeg får fejlen "argumentet er ugyldigt" - det har jeg så snakket med microsoft om og de siger det er en fejl i windows XP som de arbejder på, men de sagde også at jeg kunne komme udenom det ved at bruge et modul og de sendte mig ovenstående kode, men det opretter desvæære bare en forespørgsel i stedet for en tabel....
Hvordan får jeg det til at oprette en tabel og IKKE en forespørgsel?
Den forespørgsel, som oprettes, virker den? Så vidt jeg kan se, så skulle det rent faktisk svare til at sammenkæde med den eksterne Notes-tabel. Denne burde så kunne bruges på sammen måde, som hvis det rent faktisk var en sammenkædet tabel eller en intern tabel.
Hvordan virker den ny forespørgsel og hvilke data viser den?
Jo den opretter fint en forespørgsel men kan jeg gøre noget alla det her: ------------ insert into MIN_TABEL(RowNumber, LastChanged, NotesFileId, NotesRecId, LineNumber, Txt, User_, RecID, FileID) select * from DEN_FORESPØRGSEL_SOM_MODULET_OPRETTER ------------ I så fald ved jeg ikke hvordan men jeg ved at: ------------ insert into MIN_TABEL(RowNumber, LastChanged, NotesFileId, NotesRecId, LineNumber, Txt, User_, RecID, FileID) select * from DEN_TABEL_SOM_MODULET_OPRETTER
------------ ville virke jeg kan bare ikke få modulet til at oprette en tabel
Skal tabellen oprettes vha koden? Er det ikke bare et spørgsmål om at få den oprettet én gang (enten manuelt eller vha en tabeloprettelsesforespørgsel:
insert DEN_FORESPØRGSEL_SOM_MODULET_OPRETTER.* Into DET_NAVN_SOM_DU_VIL_HAVE_AT_DEN_NYE_TABEL_SKAL_HAVE from DEN_FORESPØRGSEL_SOM_MODULET_OPRETTER
Den siger: ------------------ syntaksfejl i INSERT INTO-sætningen. (Fejl 3134) ------------------ på denne sql i macroen: ------------------- insert Notes.* Into Notes1 from Notes -------------------
skal: ----------- insert DEN_FORESPØRGSEL_SOM_MODULET_OPRETTER.* Into DET_NAVN_SOM_DU_VIL_HAVE_AT_DEN_NYE_TABEL_SKAL_HAVE from DEN_FORESPØRGSEL_SOM_MODULET_OPRETTER ------------ står i modulet?
Jeg har sat det ind i en Macro og kørt det derfra - og det er der jeg får fejlen
Denne kan placeres i en forespørgsel og blot køres en gang eller du kan lægge den ind i slutningen af din kode (f.eks. lige efter "Set ODBCConnection = Nothing"). Så skal den bare lige pakkes ind således:
Docmd.RunSQL "Select Notes.* Into Notes1 from Notes"
Det kode som du har hjulpet mig med her i dette spg virker 100% under win2000 men da jeg gik på winXP fik jeg den fejl som jeg omtaler i http://www.eksperten.dk/spm/481633
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.