Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Herausfinden, ob ein DB-Feld ein Pflichtfeld ist (https://www.delphipraxis.net/46162-herausfinden-ob-ein-db-feld-ein-pflichtfeld-ist.html)

torud 20. Mai 2005 09:26

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo!

Danke für den Tipp!

Natürlich gibt es in der DB auch Bereiche, die selbst den Admin nichts angehen, aber die bekommt der gar nicht zu sehen. Da mir diese Bereiche bekannt sind, kann ich auch das Handling dafür beeinflussen.

Ich will das Problem nicht herunterspielen, aber es schon so, dass ich denke zu wissen, was ich tue.

Es gibt, wie schon weiter oben erwähnt, die property Required die eigentlich bei einem Feld, welches als Not Null deklariert ist auf True stehen sollte. Ich habe nun extra ein solches Testfeld erzeugt, aber noch kein Erfolgserlebnis erfahren. Vielleicht finde ich den Fehler noch...

nieurig 20. Mai 2005 09:27

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo Tom,
was die einfache Frage für eine Debatte auslöst :-)

Jeder der ein Admin-Tool schreibt, dürfte die Gefahren kennen. Aber ohne Admin-Tools ist das Leben schwerer und die Fehlermöglichkeiten sind trotzdem da. (Wer hindert denn den User, Access direkt zu starten und eine Tabelle oder ein Feld zu löschen?)

Zu Deiner eigentlichen Frage:

Wie Jasucol gesagt hat, hast Du die Möglichkeit die Requiered Eigenschaft des Feldes zu prüfen. Diese ist auch bei Access vorhanden, wenn das Feld mit NOT NULL (im Designer: Eingabe erforderlich) erstellt wurde. Weitere Möglichkeit zur Erstellung von Pflichtfeldern gibt es ja eigentlich auch nicht.

Wenn Du prüfen willst, ob das Feld ein FK Feld ist wird es schwieriger. Entweder versuchst du einfach den Datensatz mit dem aktuellen Wert zu speichern und fängst bei einem falschen FK die Exception ab, oder Du befaßt die mit den Systemtabellen (die gibt es auch in Access). Zumindest beim SQL-Server kann man mit Hilfe dieser Tabellen herausfinden, ob sich ein FK auf ein bestimmtes Feld bezieht.

Frohes Schaffen.
Niels

torud 20. Mai 2005 11:37

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo Leute!

Hier mal mein Code, mit dem ich die DB-Objekte dynamisch erzeuge. Da zu finden ist auch der Code, wo ich die Abfrage mit dem Require mache. Komischerweise ist der NIE auf true, obwohl ich extra zum Testen einige solcher Felder angelegt habe.

Habe ich da einen Fehler im Code???

Delphi-Quellcode:
             for i:=0 to dm.ADODataSet1.FieldCount-1 do
               begin
                 case Dm.ADODataSet1.Fields.Fields[i].DataType of
                   ftString,ftWideString,ftDate,ftDateTime,ftCurrency,ftInteger, ftSmallint, ftFloat,ftWord :
                     begin
                      //label erzeugen
                      Labels:= TLabel.Create(new_ds);
                      Labels.Parent := new_ds;
                      Labels.Left :=10;
                      Labels.Width:=85;
                      Labels.Alignment:=taRightJustify;
                      Labels.Top := int_gesamt_top + 3;
                      Labels.Caption:=dm.ADODataSet1.FieldList.Strings[i];
                      //dbfeld erzeugen
                      DBEdit:= TDBEdit.Create(new_ds);
                      DBEdit.Parent := new_ds;
                      DBEdit.Left :=100;
                      DBEdit.Top := int_gesamt_top;

                      //und hier die abfrage, des aktuellen db-feldes
                      if dm.ADODataSet1.Fields.Fields[i].Required=True then
                      begin ShowMessage('not null'); DBEdit.Color:=clRed; end;

                      DBEdit.DataSource:=dm.DataSource1;
                      DBEdit.Name:=dm.ADODataset1.FieldList.Strings[i];
                      DBEdit.DataField:=dm.ADODataset1.FieldList.Strings[i];
                      int_gesamt_top:=int_gesamt_top + 30;
                    end;
                 //usw...

marabu 21. Mai 2005 20:42

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Zitat:

Zitat von marabu
die TField-Komponente importiert die "NOT NULL" Klausel in der Eigenschaft Required.

Dumm ist nur, dass ADO diese Eigenschaft nicht verwendet - das tut nur die BDE. Als nächstes verfällt man dann auf die Idee, die field properties von ADOTable.RecordSet.Fields[index] zu durchforsten. Nicht nötig - habe ich schon gemacht - nicht umsonst, aber dafür ohne Erfolg.

Der einzige mir momentan bekannte Weg führt über die ADO Extension Library. Ich habe dann zuletzt im AfterOpen-Ereignis des ADO-Dataset Code eingebaut, der die Required-Eigenschaft der Fields korrekt initialisiert. Wenn jemand eine komfortablere Lösung kennt, lerne ich gerne dazu.

Grüße vom marabu

torud 21. Mai 2005 22:59

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Zitat:

Zitat von marabu
Der einzige mir momentan bekannte Weg führt über die ADO Extension Library. Ich habe dann zuletzt im AfterOpen-Ereignis des ADO-Dataset Code eingebaut, der die Required-Eigenschaft der Fields korrekt initialisiert. Wenn jemand eine komfortablere Lösung kennt, lerne ich gerne dazu.

Hallo Marabu!

Interessanter Ansatz!

Könntest Du mir mit etwas Code auf die Beine helfen???

marabu 21. Mai 2005 23:40

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Tom,

hier eine kleine Demo - ich habe mit der Northwind-Datenbank für Access 2000 getestet.

marabu

torud 22. Mai 2005 09:33

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo Marabu!

Vielen Dank für das Extra-Beispiel!
Es läuft zwar bei mir nicht, weil ADOX und TCatalog nicht gefunden wurde, aber ich denke, dass ich mit Hilfe einiger anderer Beispiele, in denen zur Laufzeit ein Catalogobjekt erzeugt wird mir helfen werden, Dein Beispiel umzuzusetzen.

marabu 22. Mai 2005 09:51

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo Tom,

im Projektmenü kannst du die ADOX Typbibiliothek (Microsoft ADO Ext. 2.8 ...) importieren. Dabei solltest du das Präfix ADOX vor die angezeigten Komponenten setzen, damit es zu keinen Namenskonflikten mit der BDE kommt. Aus Table wird dann AdoxTable, ...
Ich speichere die erstellte Unit dann nochmal als ADOX.pas, weil mir der generierte Name ADOX_TLB.pas nicht gefällt. Dann kannst du die Unit ADOX als Komponenten in einem neuen Package oder wo du willst installieren (Menü Komponente).
Danach sollte mein Demo-Code auch bei dir laufen.

marabu

torud 23. Mai 2005 06:22

Re: Herausfinden, ob ein DB-Feld ein Pflichtfeld ist
 
Hallo Marabu!

Danke für die Hinweise!

Ich hatte mir die TypeLibary schon importiert und Dein Projekt eigentlich nur dahingehend geändert, dass ich aus Uses Adox - Uses Adox_Tlb gemacht habe und aus TCatalog ein TAdoxCatalog. Die Komponenten sind da und ich kann Sie mir auch auf ein Formular ziehen, aber mit Deinem Projekt funzt es leider nicht.

Aber wie gesagt, ich denke, dass ich es nun hinbekommen werde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz