24. januar 2004 - 23:05Der 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:
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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...
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.
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
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.
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?
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!
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.
Synes godt om
Ny brugerNybegynder
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.