Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 14:50 Der 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
------------------------------------

Er det klart hvad problemet er?
24. marts 2004 - 14:53 #1
Jeg er ikke helt klar over, hvofor du vil gøre det så kompliceret. Du kan jo gøre det hele via en enkelt SQL-sætning:

Docmd.RunSQL "insert into Notes1 (RowNumber, LastChanged, NotesFileId, NotesRecId, LineNumber, Txt, User_, RecID, FileID) select * from [C:\Dokumenter\DinAndenDatabase.mdb].Notes

/Thomas
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 14:57 #2
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?
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 14:58 #3
Hvor får jeg Docmd fra?
24. marts 2004 - 15:10 #4
hmm skulle koden ikke afvikles fra Access? DoCmd er en standard-access-kommando.

Men du kan også bare smide sætningen direkte ind i en forespørgsel og afspille den.
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 15:13 #5
Jo koden skal afvikles i Access med den Externe DB er ikke fra Access så det er denne del jeg ikke kan gøre:

select * from [C:\Dokumenter\DinAndenDatabase.???].Notes

Jeg tror den externe db er .dmo
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 15:17 #6
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
----------------------
24. marts 2004 - 15:39 #7
ja, det kan den selvfølgelig ikke finde ud af.

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.)
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 15:45 #8
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?
24. marts 2004 - 16:01 #9
okay, jeg forstår (! :-)

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?
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:07 #10
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
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:08 #11
Svar på dit spg:
Forespørgslen viser de data der er i notes i den externe DB
24. marts 2004 - 16:16 #12
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
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:29 #13
Den siger:
------------------
syntaksfejl i INSERT INTO-sætningen. (Fejl 3134)
------------------
på denne sql i macroen:
-------------------
insert Notes.* Into Notes1 from Notes
-------------------
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:34 #14
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
24. marts 2004 - 16:37 #15
Sorry...my bad :o(
SQL'en skal se således ud:

Select Notes.* Into Notes1 from Notes

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"
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:45 #16
:)
Det ser ud til at virke fedt!

én lille ting til hvordan sletter jeg en forespørgsel i SQL?

Det er fordi hvis jeg skal "opdaterer" mine data så melder den fejl fordi forespørgslen allerede findes. Derfor skal jeg:

1) slette forespørgslen
2) oprette den via modulet
3) kopier indholdet over i en tabel

det er altså kun nummer 1 jeg mangler :)
Kan du også hjælpe med den?
24. marts 2004 - 16:52 #17
Hvis du kan nøjes med at få VBA-koden (i stedet for SQL), så ser den således ud:

Docmd.Deleteobjet acquery, "Navn på query"

Hvis du vil undgå alle de irriterende advarsler undervejs, kan du starte din kode med denne linie:
DOcmd.Setwarnings false

og skrive denne lige inden Exit Function:
Docmd.Setwarnings true
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 16:59 #18
Nu er jeg ikke så stræk i vb men jeg har forsøgt dette:
---------------
Function DelFore()
    DoCmd.SetWarnings False

    DoCmd.Deleteobjet acQuery, "Notes"
   
    DoCmd.SetWarnings True
    Exit Function
   
End Function
-----------------
og det giver compiler felj på DoCmd.Deleteobjet

Hvad gør jeg galt?
24. marts 2004 - 17:06 #19
stavefejl:
DoCmd.Deleteobject acQuery, "Notes"
Avatar billede kimlarsen1978 Nybegynder
24. marts 2004 - 17:09 #20
Tusind tak for din hjælp
Jeg håber at dette kan få det hele til at gå op i en højere enhed. Du har i hvert fald været til stor hjælp.

Dukker der noget op så vender jeg tilbage :)

Tak for nu
24. marts 2004 - 17:10 #21
selv tak :o)
Avatar billede kimlarsen1978 Nybegynder
25. marts 2004 - 00:17 #22
Heysa
Hvis du har tid så kig lige forbi den her: http://www.eksperten.dk/spm/481633

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
25. marts 2004 - 21:22 #23
sorry...det siger mig absolut intet :o(
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester