Avatar billede torbenuk Novice
28. marts 2011 - 08:53 Der er 13 kommentarer og
1 løsning

Forespørgsel - Tabeloprettelse - definere Primær Nøgle

Jeg kører dagligt en makro, der sletter min gamle tabel og samtidig opretter en ny tabel via forespørgsel - tabeloprettelse. I den forebindelse vil jeg gerne have, at når jeg kører forepørgselen, at den samtidig definerer to felter som primær nøgler. Er det muligt at gøre dette i en forespørgsel som opretter en tabel.
Avatar billede jensen363 Forsker
28. marts 2011 - 09:12 #1
Hvorfor sletter du ikke kun indhold, og benytter en tilføjelsesforespørgsel i stedet, så kan du beholde dine nøglefelter
Avatar billede neoman Novice
28. marts 2011 - 09:20 #2
Og hvis du af en eller anden årsag ikke gør som #1 forslår, hvilket jeg også ville kraftigt anbefale, så kan du tilføje en sammensat primær nægle efterfølgende: http://office.microsoft.com/en-us/access-help/create-or-modify-tables-or-indexes-by-using-a-data-definition-query-HA010206112.aspx
Avatar billede Slettet bruger
28. marts 2011 - 09:30 #3
Idet jeg tilslutter mig betænkligheder ved at et kørende system anvender ddl sql, er her en eksemplifikation af linket i #2:

create table A (id1 integer not null,id2 integer not null, aInfo text(100), CONSTRAINT constName PRIMARY KEY(id1,id2))

not null er ikke nødvendigt for at kunne oprette - bare en oplagt begrænsning på enhver praktisk forkommende situation.
Avatar billede torbenuk Novice
28. marts 2011 - 09:34 #4
Tak for svar begge. Jeg ønsker ikke at bruge den føste mulighed, idet jeg sletter ca. 1,4 millioner linjer, hvorfor jeg får en fejlmeddelse om at jeg ikke fortryde slet. Jeg har faktisk i alt 4 tabeller, som jeg opdaterer daglige, derfor er det lidt irriterende med denne fejl. Jeg har også kigget på svar 2. Men det jeg ønsker er at rette min forespørgelse således at den definerer to præmære felter. Min forespøgsel er en ganske almindelige forespørgsel ikke noget VBA. Men måske jeg kan rette det i SQL designet. Jeg ved bare ikke hvordan og hvor jeg evt. kan indsætte en constraint statement, der definerer to primære felter. Jeg er endnu ikke en arfaren Access-bruger. Håber jeg kan få et lidt mere specifikt svar. Men tak for jeres tlbagemeldinger indtil videre.
Avatar billede jensen363 Forsker
28. marts 2011 - 09:43 #5
Hvis du benytter macro / vba kode kan sådanne fejlmeddelelser helt ignoreres, og det er ikke en fejl men derimod en serviceoplysning
Avatar billede neoman Novice
28. marts 2011 - 09:44 #6
Du kan ikke have "to primære felter" - en table har EN primær nøgle per definition. Denne kan så være sammensat af to felter.

"Fejlmeddelelsen" om at ikke kunne fortryde slet kan slås fra vha docmd.SetWarnings(False) og efterfølgende SetWarnings(True)

Access er ikke en full-blown database, så at slette objekter når det ikke er nødvendigt kan til tider føre til korruption af databasen. Derfor er det bedre at slette rækker i en tabel, fremfor hele tabellen.

Den forespørgsel til at lave om på tabellen kan du ikke lave i QBE-griddet men skal definere den i VBA.
Avatar billede torbenuk Novice
28. marts 2011 - 09:48 #7
Hej. Jeg har først set svar 3 nu. Jeg vil lige overveje og vende tilbage.
Avatar billede torbenuk Novice
28. marts 2011 - 10:02 #8
Hej Neoman. Din løsning virker perfekt med docmd.SetWarnings(False) og efterfølgende SetWarnings(True). Jeg sletter nu kun rækkerne og ikke tabelen. Jeg slipper for servicemeddlesen når jeg kører den. Bare til info grunden til at jeg har 2 felter defineret som primærnøgle er jeg dagligt indlæser aktiekurser bestående af bla.a et symbol og en dato. Jeg bruger således både symbol og dato til finde en specifik aktiekurs. Mange tak for alle svar. Jeg formoder at Neoman lige skal lige et svar, så jeg kan give point.
Avatar billede neoman Novice
28. marts 2011 - 10:23 #9
ok
Avatar billede jensen363 Forsker
28. marts 2011 - 10:27 #10
Til orientering

#1 og #5 er den samme løsning der refereres til :-)
Avatar billede torbenuk Novice
28. marts 2011 - 10:37 #11
Hej Jensen363. Det er fuldstændig korrekt. Men fordi jeg er stadig nybegynder i Access valgte jeg neoman, fordi hans løsning var meget specifik med docmd.SetWarnings(False) og efterfølgende SetWarnings(True). Måske var det oplagt for lidt mere erfarne access bruger, at du også henviste til det, men jeg havde aldrig hørt om kommandoen. Men endnu engang tak for dit og andres svar. Super med så hurtig tilbagemelding.
Avatar billede jensen363 Forsker
28. marts 2011 - 10:46 #12
Den er jeg med på ... mit bidrag er også udelukkende ment som inspiration.

Her er sletterutine i VBA/SQL

Public Function Delete()
Dim strSql As String
Dim db As DAO.Database

Set db = CurrentDb()

    strSql = "DELETE DinTabel.* "
    strSql = strSql & "FROM DinTabel;"
        db.Execute strSql

End Function
Avatar billede mugs Novice
28. marts 2011 - 22:36 #13
Husk blot een ting:

Den plads de slettede rækker optog, bliver IKKE frigivet før databasen bliver komprimeret. Det kan du gøre i funktioner > databasefunktioner > komprimer og reparer.

Du kan sætte db til at komprimere sig selv ved lukning i funktioner > indstillinger > generelt > komprimer ved lukning.

Så fylder db aldrig mere end nødvendigt.
Avatar billede torbenuk Novice
29. marts 2011 - 07:55 #14
Tak Jensen363 for din slette løsning, den ser noget mere elegant ud end min. Mugs jeg allerede sat min database til at komprimere hver gang jeg lukker den. Men tak fordi du nævner det.
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