Autor Beitrag
UWER
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79

SUSE 8.1, XP Home
D7 Prof. , Kylix 3
BeitragVerfasst: Do 24.04.03 15:13 
Hallo Leute,

ich habe das folgende Problem:

Ich greife über ODBC auf eine Datenbank zu. Das kann sowohl eine ACCESS als auch eine MSSQL-Datenbank sein. Nun sind im Laufe der Zeit ein paar Felder dazugekommen und die Datenbank ist in verschiedenen Versionen im Umlauf. Wie kriege ich raus welche Felder in den Tabellen verfügbar sind?

Gruß
UWER
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Do 24.04.03 16:27 
Hi
dafür gibts die Methoden Table.Fields.CheckFieldName oder Table.Fields.CheckFieldNames. Die zweite dürfte für deine Zwecke besser geeignet sein. Du übergibst einen String mit den fraglichen Feldern durch Semikolon getrennt. Falls eines der Felder nicht enthalten ist, wird eine EDatabaseError Exception ausgelöst.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
UWER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79

SUSE 8.1, XP Home
D7 Prof. , Kylix 3
BeitragVerfasst: Fr 25.04.03 08:08 
Hallo Lothar,

leider prallen hier Theorie und Praxis mal wieder aufeinander. Die Procedur CheckFieldName liefert mir grundsätzlich keine Exception, egal ob das Feld existiert oder nicht.

Ich habe auch mal mit FieldByName rumgespielt (die heuristische Methode ist oft immer noch die beste). Leider liefert mir FieldByName immer dann eine Exception wenn das Feld nicht im Feld-Editor eingetragen ist.

Gibts da noch eine andere Möglichkeit oder eine Schraube an der man drehen kann?

Gruß
UweR

PS: Ich habe D5 mit der BDE 5.2.02 im Einsatz und versuche mit der ACCESS-Treiber 4.00.62 mein Glück mit einer ACCESS97-Datenbank
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Sa 26.04.03 10:50 
Hi
Eigenlich sollte das mit CheckFieldNames schon hinhauen. Ich werds mal selber testen. Als Alternative kannst du immer noch in einer Schleife die Felder durchgehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function CheckIfFieldExists(Tabelle: TTable; FeldName: string): boolean;
var
 i : integer;
begin
 Result := False;
 for i := 0 to Tabelle.FieldCount - 1 do
   if Tabelle.Fields[i].FieldName = FeldName then begin
      result := True;
      break;
   end;
end;

Nicht getestet, aber sollte hinhauen.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
UWER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79

SUSE 8.1, XP Home
D7 Prof. , Kylix 3
BeitragVerfasst: Mo 28.04.03 07:49 
Hallo,

das mit dem Durchsuchen von Fields war eigentlich mein erster Gedanke. Die Sache hat nur den Nachteil das ich nur die Felder kriege die ich schon im Feld-Editor eingetragen habe und nicht auch die die sich nur in der Tabelle befinden.

Kann das ganze damit zusammenhängen das ich nicht mit TTable sondern mit TQuery auf die Tabelle zugreife? Wobei hierbei allerdings mit "SELECT * FROM" zugegriffen wird.

Gruß
UWER
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mo 28.04.03 14:27 
Hi
wenn du per Query zugreifst, kannst du's mal so probieren:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function CheckIfFieldExists(Tabelle: TQUERY; FeldName: string): boolean; 
var 
i : integer; 
begin 
Result := False; 
Tabelle.FieldDefs.Update;
for i := 0 to Tabelle.FieldCount - 1 do 
   if Tabelle.FieldDefs[i].Name = FeldName then begin 
      result := True; 
      break; 
   end; 
end;


Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
UWER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79

SUSE 8.1, XP Home
D7 Prof. , Kylix 3
BeitragVerfasst: Mo 28.04.03 15:08 
DANKE!!

Das war der entscheidende Hinweis.

Ich habe allerdings noch eine kleine Anpassung vorgenommen und die Schleife nicht bis "Tabelle.Fieldcount-1" sondern bis "Tabelle.FieldDefs.Count-1" laufen lassen. Das ganze sa dann so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function CheckIfFieldExists(Tabelle: TQUERY; FeldName: string): boolean;
var
  i : integer;
begin
  Result := False;
  Tabelle.FieldDefs.Update;
  for i := 0 to Tabelle.FieldDefs.Count - 1 do
     if Tabelle.FieldDefs[i].Name = FeldName then begin
        result := True;
        break;
     end;
end;


Kaum macht mans richtig, schon funktionierts. (altes chinesisches Sprichwort)

Gruß
UWER
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mo 28.04.03 17:29 
Hi
UWER hat folgendes geschrieben:
Ich habe allerdings noch eine kleine Anpassung vorgenommen und die Schleife nicht bis "Tabelle.Fieldcount-1" sondern bis "Tabelle.FieldDefs.Count-1" laufen lassen. Das ganze sa dann so aus:

Test bestanden. Eins. :mrgreen: Ne, im Ernst, hab ich übersehen.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...