Avatar billede micaud Mester
19. december 2010 - 09:37 Der er 8 kommentarer og
1 løsning

Tilføj nyeste poster fra Navision tabel

Hej.

Håber I kan hjælpe.

Jeg har sammenkædet Access og Navision via ODBC. Det virker fint.

Jeg har nogle store tabeller, hvor jeg gerne vil opdatere nye records, så jeg ikke skal hente alt hver gang.

Jeg henter fra tabel "kreditorpost" (sammenkædet tabel fra Navision) og vil tilføje til tabel TKreditorpost i Access.

Uddrag fra TKreditorpost som den er nu i Access.
Løbenr_    Kreditornr_    Bogføringsdato    Beløb
4114821    640600            15-12-2010    4650
4114820    640600            15-12-2010    18385
4114807    740170            14-12-2010    7450

Nu vil jeg gerne lave en forespørgsel som kun henter og tilføjer nye records fra Kreditorpost til TKreditorpost. Altså skal den kun hente, hvor Løbenr_ er > 4114821. Kriteriet er altså, at den skal hente records fra Kreditorpost, hvis de er større end Løbenr_ i TKreditorpost

Min SQL er simpel således nu:

INSERT INTO tKreditor ( Løbenr_, Kreditornr_, Bogføringsdato, Beløb )
SELECT Kreditorpost.Løbenr_, Kreditorpost.Kreditornr_, Kreditorpost.Bogføringsdato, Kreditorpost.Beløb
FROM Kreditorpost
ORDER BY Kreditorpost.Løbenr_ DESC;

Hvordan får jeg det kriterie sat op, så det afhænger af en anden tabel. Skal jeg bruge JOIN? Skal jeg bruge select * from where?

I må meget gerne tilføje det min nuværende SQL, da jeg ikke er den største haj i Access.

Tak.
Avatar billede anlu Nybegynder
19. december 2010 - 11:05 #1
I den simple form hvor du direkte indsætter værdien som løbenr skal sammenlignes med:

INSERT INTO tKreditor ( Løbenr_, Kreditornr_, Bogføringsdato, Beløb )
SELECT Kreditorpost.Løbenr_, Kreditorpost.Kreditornr_, Kreditorpost.Bogføringsdato, Kreditorpost.Beløb
FROM Kreditorpost
WHERE Kreditorpost.Løbenr_ > 4114821

For at gøre den generelt brugbar (hvis det er noget du skal gøre flere gange) kunne du ændre den til at hente de records hvor løbenr er større end max løbenr i Access-tabellen:

INSERT INTO tKreditor ( Løbenr_, Kreditornr_, Bogføringsdato, Beløb )
SELECT Kreditorpost.Løbenr_, Kreditorpost.Kreditornr_, Kreditorpost.Bogføringsdato, Kreditorpost.Beløb
FROM Kreditorpost
WHERE Kreditorpost.Løbenr_ > (SELECT MAX(Løbenr_) FROM tKreditor)

P.s. I en insert bør "ORDER BY" være irrelevant
Avatar billede micaud Mester
19. december 2010 - 11:49 #2
Tusind tak.

Det er jo perfekt.

Lige et tillægsspørgsmål - vil det være en fordel at ligge maks løbenr. over i anden tabel. Vil forespørgsel så kører hurtigere, nu hvor jeg har en tabel med mere end ½ mill. records?
Avatar billede micaud Mester
19. december 2010 - 11:57 #3
Den kører fint, når jeg vil teste forespørgsel, men når jeg vil kører den og tilføje den nuværende så fejler den, men opretter jeg en ny tabel, så kører den fint.

Skal jeg måske lave mit nummer med at lægge maks of løbenr. i en anden tabel.

Den kan måske ikke tilføje, når den bruger et kriterie fra den tabel, hvor jeg tilføjer i.
Avatar billede anlu Nybegynder
19. december 2010 - 12:06 #4
Hvilken fejl får du? Den burde kunne køre også selv om den bruger et kriterium baseret på den tabel du sætter ind i.

Hvis løbenr er din primærnøgle i tabellen (kunne godt se sådan ud), så er der et indeks på og så bør det ikke koste Access mange kræfter at finde maks.
Avatar billede micaud Mester
19. december 2010 - 18:27 #5
Den melder følgende fejl:

ODBC - call failed

[Simba][SimbaEngine ODBC Driver][DRM File Library] cy error message not found!](#1).

Altså er den en ODBC fejl, og det er vidst noget med, at der ikke er adgang til netværket, men det passer jo ikke, for jeg kan sagtens kører den, hvis jeg altså ikke sætter et kriterium til den tabel, som jeg sætter ind i, og jeg kan også køre min forespørgsel i design view.

Nu ved jeg ikke, hvordan jeg marker løbenr. som en primærnøgle, da det jo er en tabel, som jeg har oprettet via en forespørgsel ned i Navision databasen. Jeg har dog indekseret den nu, så det er måske det du mener?
Avatar billede anlu Nybegynder
19. december 2010 - 19:52 #6
Hmm.. det lyder mystisk - men hvis du kan leve med at lave den workaround med at lægge max løbenr. i en anden tabel, er det så ikke løsningen?
Avatar billede micaud Mester
29. december 2010 - 17:00 #7
Nu har jeg fået kigget lidt mere på dette og jeg skylder dig nogle point.

Det undre mig dog en del, når jeg sætter mit kriterie

"WHERE Kreditorpost.Løbenr_ > (SELECT (Løbenr_) FROM tKreditor_max)"

ind, så tager det utrolig langt til at lave forespørgslen, men hvis jeg blot taster ">4130129" i kriteriet, så kommer de sidste 19 linjer med det samme.

Hvorfor tager forespørgslen så lang tid, når den blot skal hente løbenummeret fra en tabel i forhold til, hvis jeg taster det sidste løbenummer direkte i kreteriet. Vi taler om mange minutter før de 19 linjer kommer.
Avatar billede anlu Nybegynder
29. december 2010 - 17:21 #8
det er et rigtigt godt spm - man skulle tro at Access kunne finde ud af at optimere forespørgslen. Hjælper det evt. at skrive

"WHERE Kreditorpost.Løbenr_ > (SELECT MAX(Løbenr_) FROM tKreditor_max)"

??

(Lægger denne som svar, så du kan lukke tråden :)
Avatar billede micaud Mester
29. december 2010 - 18:10 #9
Desværre ikke, og der er jo også kun ét nummer i min tKreditor_max, da der kun er en række og en kolonne med nummeret 4130129

Tak for hjælpen alligevel.
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