Mit dem Code CurrentDb.TableDef("Adr").Fields(1).Name
kann man die Namen der Felder auslesen.
Wenn ich aber mit CurrentDb.TableDef("Adr").Fields("Vorname").Name
auf ein Feld zugreifen will das es noch nicht giebt kommt ein Fehler.
Nun möchte ich das aber nicht über eine Fehlerroutine abfragen.
Deshalb meine Frage:
Wie kann ich in der Fields-Auflistung prüfen ob ein Feld Namens "Vorname"
bereits enthalten ist?
Gruß Jens Wichmann
public function fktFeldVorhanden(txtTable as string, txtField as string) as boolean
dim db as database
dim tdf as tabledef
dim fld as field
fktFeldVorhanden=False
set db=currentdb
set tdf=db.TableDefs(txtTable)
for each fld in tdf.fields
if fld.Name=txtField then
fktFeldVorhanden=True
exit For
end if
next
set tdf=nothing
set db=nothing
end Function
aufrufen mit If fktFeldVorhanden("adr","Vorname") Then
HTH Jürgen
Jürgen Volke schrieb:
>> ich möchte per VBA überprüfen ob ein Feld-Name in eine Tabelle
>> bereits existiert.
> public function fktFeldVorhanden(txtTable as string, txtField as
[14 Zeilen]
> end Function
Schaut schön aus, ist aber IMHO zu lang für den Zweck. Hier mal
zwei kurze Versionen.
Function FeldDa(TabName As String, FldName As String) As Boolean
On Error Resume Next
Call DMin(FldName, TabName)
FeldDa = Not (Err.Number = 64479 Or Err.Number = 2428)
End Function
Function FeldDa2(TabName As String, FldName As String) As Boolean
Dim f As DAO.Field
On Error Resume Next
Set f = CurrentDb.TableDefs(TabName).Fields(FldName)
FeldDa2 = Not (Err.Number = 3265)
End Function
Gruß
Frank
>> public function fktFeldVorhanden(txtTable as string [...]
> [14 Zeilen]
>> end Function
> Schaut schön aus, ist aber IMHO zu lang für den Zweck. Hier
> mal zwei kurze Versionen.
> [Zwei Funktionen mit absichtlicher "Exception"]
Klar, aber Jens hat (aus welchem Grunde auch immer) ausdrücklich gesagt,
dass er nicht über einen Fehler laufen will.
Und bezügl. Effizienz:
> Set f = CurrentDb.TableDefs(TabName).Fields(FldName)
ist IMHO besser als
> Call DMin(FldName, TabName)
weil im zweiten Falle bei ungünstigen Datentypen und großen Tabellen (und
falls das Feld tatsächlich existiert) eine unnötige aber aufwändige
Berechnung durchgeführt wird.
Ansonsten stimme ich zu, aber eher aus Sicht der Laufzeit, nicht wegen der
Anzahl Codezeilen.
Gruß Daniel
Daniel Bolege schrieb:
> Klar, aber Jens hat (aus welchem Grunde auch immer) ausdrücklich gesagt,
> dass er nicht über einen Fehler laufen will.
Offensichtlich hat mein Firmenhamster Jens' Frage gefressen; ich hatte
nur die Antwort von Jürgen. Hier habe ich sie dann wieder, aber ... zu
spät. Allerdings: hätte ich sie gehabt, hätte ich nur noch ein
"warum?" dazu geschrieben.
> Und bezügl. Effizienz:
>
>> Set f = CurrentDb.TableDefs(TabName).Fields(FldName)
>
> ist IMHO besser als
>
>> Call DMin(FldName, TabName)
Ja, unbedingt. Ich setze die zweite Lösung selbst ein.
> Ansonsten stimme ich zu, aber eher aus Sicht der Laufzeit, nicht wegen der
> Anzahl Codezeilen.
Jürgen ist fit genug, dass ich ihm nichts von den Schleifen durch die
Objekte erzählen muss.
Gruß
Frank
danke .
Da man die gewünschte Funktion wohl kaum in einer Abfrage von 10000 Sätzen einsetzt,
kommt es auf ein paar Schleifendurchgänge wohl kaum an *bg*
Schönen Tag an alle
Jürgen Volke schrieb:
> Da man die gewünschte Funktion wohl kaum in einer Abfrage von 10000 Sätzen einsetzt,
> kommt es auf ein paar Schleifendurchgänge wohl kaum an *bg*
Richtig. Eine endgültige Version liefert man so aus, dass es einer
solchen Überprüfung nicht bedarf.
Gruß
Frank
Ich hatte gehofft das es bereits so eine Funktion gibt die ich nur nicht
kenne.
Und das mit den Fehlern ist eigentlich nur weil ich prinzipiell versuche so
zu programmieren das keine Fehler auftreten.
Ich habe den Vorschlag von Jürgen benutzt da Ihr recht habt, DIESE Tabellen
haben etwa 10-30 Felder und so sollte die Schleife keine relevanten
Verzögerungen verursachen.
Vielen Dank jens Wichmann
Das kommt immer wieder vor, in jeder Programmierung, dass man so vorgehen
muss. Auch, vielleicht vor allem, auf der Ebene der Betriebssysteme selbst.
Beispiel für eine der am häufigsten benutzen Funktion der Windows-API:
getSaveFileName. Als Parameter kann man für den
Datei-speichern-unter-Dialog, den es in fast jeder Windows-Anwendung gibt,
angeben, ob Windows prüfen soll, ob die vom Benutzer angegebene Datei auch
beschreibbar ist.
Windows macht das, indem eine Datei mit der Größe 0 Byte temporär angelegt
wird. Schlägt das fehl, so geht's offensichtlich nicht. Es wäre zu
umständlich, zuvor jeden Fall, warum es nicht gehen könnte, einzeln zu
prüfen, z.T., weil man sie nicht alle kennen kann.
Kurz: Ein abgefangener Fehler ist kein Fehler.
Gruß Daniel