Avatar billede hekla Nybegynder
24. januar 2004 - 23:05 Der er 8 kommentarer og
2 løsninger

Eksisterer feltet?

Jeg er i gang med at lave en opdateringsfunktion til en database, som allerede er i brug flere steder. Jeg skal tilføje felter og har derfor brug for en rutine til at spørge om et felt allerede findes.
Med andre ord:

Findes feltet BarnMobil i tabellen T_barn2?
Avatar billede trer Nybegynder
24. januar 2004 - 23:19 #1
Der er svjv ikke direkte adgang til metadata i Access. I stedet kan du bruge funktionen OpenSchema der er en del af ADODB Connection-objektet.

Dim CON, RS
Set CON = CreateObject("ADODB.Connection")
CON.Open <connection string>
Set RS = CON.OpenSchema(4) ' 4 = Kolonne-navne

Du har nu et resultsæt i RS. Det kan du traversere for om en tabel og kolonne findes.  Der er endda mulighed for at tilføje et filter i OpenSchema() - men jeg kan ikke offhand huske syntaksen...

Jeg ved ikke om du kan definere connection-objektet som noget "self" i en Access funktion...
Avatar billede hekla Nybegynder
25. januar 2004 - 01:24 #2
hmm...
Jeg kan få den til at printe kolonnenavnene, men hvordan spørger man om BarnMobil findes?

Function FT()
   
    Dim RS As New ADODB.Recordset
    Dim CN As ADODB.Connection
    Dim strSQL As String
   
    CurrentDb.TableDefs.Refresh
   
    Set CN = New ADODB.Connection
    CN.Provider = "Microsoft.Jet.OLEDB.4.0"
    CN.Open fGetLinkPath("t_barn2")
    Set RS = CN.OpenSchema(4) ' 4 = Kolonne-navne
    Do Until RS.EOF
        Debug.Print RS!COLUMN_NAME
        RS.MoveNext
    Loop
    RS.Close
End Function

fGetLinkPath("t_barn2") henter navnet på backend databasen.
Avatar billede mugs Novice
25. januar 2004 - 07:08 #3
Kan du ikke bruge en normal errorhandler:

Dim db As Database, tdf As TableDef, fld As Field
On Error GoTo Errorhandler
Set db = CurrentDb
Set tdf = db.Tabledefs!Tabel2
Set fld = tdf.CreateField("felt5", dbLong)
fld.DefaultValue = "250000"
tdf.Fields.Append fld
MsgBox "Feltet er oprettet og tildelt standardværdi"
Set db = Nothing
Errorhandler:
If Err.Number = 3191 Then
MsgBox "Feltet findes i forvejen"
Exit Sub
End If
Avatar billede trer Nybegynder
25. januar 2004 - 09:26 #4
Prøv således

Function FT()
   
    Dim RS As New ADODB.Recordset
    Dim CN As ADODB.Connection
    Dim strSQL As String
   
    CurrentDb.TableDefs.Refresh
   
    Set CN = New ADODB.Connection
    CN.Provider = "Microsoft.Jet.OLEDB.4.0"
    CN.Open fGetLinkPath("t_barn2")
    Set RS = CN.OpenSchema(4) ' 4 = Kolonne-navne
    FT = 0
    Do Until RS.EOF
        if RS!Column_name="t_barn_2" then
                FT = 1
        end if
      RS.MoveNext
    Loop
    RS.Close
End Function

Nu burde FT returnere et 1 tal hvis t_barn_2 findes, og 0 hvis det ikke gør.
25. januar 2004 - 09:32 #5
Hekla-> Efter min mening må Mugs svar være det mest optimale, da den både checker om den er oprettet og opretter de, hvis den ikke findes i forvejen.
Men husk at den kun duer, hvis du husker at lave en reference til "Microsoft DAO 3.x Object Library" (med mindre at du bruger Acc 97)

Trer-> Hvad er fGetLinkPath? Er det ikke en funktion, som kun du har liggende?
Og hvorfor blander du DAO og ADO sammen?
25. januar 2004 - 09:33 #6
Trer-> beklager kommentaren herover....jeg så ikke, at det bare var Heklas funktion, som du arbejdede videre med ;o)
Avatar billede fynbohans Nybegynder
25. januar 2004 - 09:37 #7
Brug Funktioner/Analyser. Her kan du se/udskrive alle dine tabeller med alle
felter og egenskaber.
Avatar billede terry Ekspert
25. januar 2004 - 10:21 #8
hekla>why bother testing if the field exists? Just place

On error resume next
or
On error go to
or what ever and if it fails you know it exists. You can even test for the error number!
This method can actually be faster then testing if it exists!
Avatar billede terry Ekspert
25. januar 2004 - 10:23 #9
I see mugs is on to the same idea too. Strange, now comments from after mugs last appear!!
Avatar billede hekla Nybegynder
25. januar 2004 - 14:24 #10
trer's løsning har den fordel, at man ikke behøver at åbne backend med udelt adgang for at tjekke om feltet findes, dvs. at jeg kan nøjes med at kræve åbning med udelt adgang, hvis der er behov for opdatering, hvilket er en fordel ved flerbrugersystemer.

mugs funktion er også brugbar, men ikke den bedste i mit tilfælde.
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