![]() |
Im DBGrid soll anstelle von 1234,23 - 1.234,23 erscheinen
Hi, so nun habe ich wieder was bemerkt.
Ich habe ja eine Access-DB. Wie kann ich es anstellen, dass wenn ich z.B. 1000 eingebe dass dann im DBGrid, dann so erscheint 1.000 Oder ich gebe 1234,23 ein. Erscheinen soll dann im DBGrid 1.234,23 Das DBGrid greift ganz normal auf die Access-DB zu. Ich hab leider nichts gefunden, wo ich das einstellen kann. Ich verwende Access 2000. Kann man das auch im Programm selbst lösen, damit ich bei der Datenbank nichts mehr ändern muß? Kann mir da jemand helfen? |
Wenn Du in der ADOTable (bzw. ADOQuery) die einzelnen Felder bearbeitest, dann kannst Du das DisplayFormat ändern. Dort kannst Du das gewünschte Format einstellen. Einfach mal in den Objekt Inspektor gehen und nachschaun (F1 listst alle Möglichkeiten).
Wenn Du noch weitere Infos brauchst, poste einfach noch einmal. Ich habe gerade nur wenig Zeit. |
Hi, danke, das hat mir sehr weitergeholfen. Zu diesem Thema habe ich jetzt keine Frage mehr.
Ich habe aber noch eine andere Frage. In meiner Datenbank sind ja einige Tabellen. Im Programm sind diese Tabellen verknüpft über die KundenNr Wenn ich jetzt vom Hauptprogramm einen Kunden lösche, wie kann ich es anstellen, dass von den anderen Tabellen diese Werte, die dem Hauptkunden zugeordnet sind, auch gelöscht werden? Im Programm ist es jetzt so das wenn ich den Hauptkunden lösche, auch die anderen Werte nicht mehr ersichtlich sind (KundenNr zugeordnet) Aber in der Access-DB sind diese Werte noch drinn. |
Hallo m-werk,
dazu könntest du in der AfterDelete (oder BeforeDelete) Methode ein SQL Statement einer TQuery Komponente ausführen:
Code:
Durch den Doppelpunkt vor dem KNr wird ein Parameter erzeugt, den du z.B. über ParamByName zugreifen kannst:
DELETE FROM Tabelle2 WHERE KNr = :KNr
Code:
Dabei ist DelQry der Name der Lösch TQuery, KundenNr die zu löschende Kundennummer als String.
DelQry.ParamByName('KNr').AsString := KundenNr;
DelQry.ExexSQL; ShowMessage(IntToStr(DelQry.RowsEffected)+' Datensätze gelöscht.'); Übrigens liefert RowsEffected die Anzahl der betroffenen Datensätze. |
Hi, das hab ich jetzt nicht ganz kapiert.
So sieht zur Zeit der Code im Hauptformular aus, wenn ich einen Hauptkunden löschen möchte.
Code:
procedure TKundendaten.DeleteClick(Sender: TObject);
begin if MessageDlg('Wollen Sie den Datensatz wirklich löschen?', mtWarning,[mbYes, mbNo], 0) = mrYes then begin try DM.ADOSHaupt.Delete; except on exception do MessageDlg('Keinen Datensatz zum löschen gefunden!', mtWarning,[mbOk], 0); end; end; end; Wie und wo kann ich deinen Code einsetzen? |
Hallo m-werk,
den SQL Code weist du einer neuen TQuery Komponente in ihrer Eigenschaft SQL zu. Diese Komponente nennst du (Eigenschaft Name) DelQry. Die DataBaseName dieser Kompo muss natürlich auf die korrekte Datenbank (ALIAS) zeigen. Den Code, der unten steht, schreibst du in die Methode, die du dem Ereignis AfterDelete von ADOSHaupt zuweist. |
Hi, ich habs noch immer nicht.
Ich habe jetzt mal ne ADOQuery2 erstellt. Diese hat den Namen 'DelQry' Die connection bezieht sich auf die ADOConnection, diese wiederum auf die Datenbank. Wie muß ich jetzt schritt für schritt weitergehen? Ich komm nicht dahinter! |
Hallo m-werk,
jetzt kannst du die Eigenschaft SQL von DelQry anklicken und den 1. Code eingeben. |
OK, das hab ich jetzt mal gemacht. Ich habe anstelle Tabelle1 ADOSKinder eingegeben.
Muß ich nicht anstelle KNr = :KNR KundenNr = :KundenNr eingeben? Ich habe in jeder Tabelle die Zuordnung mit KundenNr gemacht! Und den anderen Code muß ich beim Löschen Button eingeben, oder? Was ist mit den anderen Tabellen, die ich so habe? muß ich immer eine neue ADOQuery erstellen? Wenn ja, wie sieht dann der Code beim Löschen button aus wenn ich auch andere Querys erstellen muß? |
Hallo m-werk,
KundenNr sollte eine Variable sein, die die Kundennummer des Kunden enthält, der gerade gelöscht werden soll. :Knr kannst du ruhig stehen lassen, da damit nur ein Parameter erzeugt wird, der einen beliebigen Namen haben darf. Die spätere Zuweisung mit ParamByName setzt dann den Parameter auf den gewünschten Wert. Den 2. Code solltest du nicht unbedingt beim Löschen-Button eingeben, weil sonst z.B. bei anderen Wegen einen Datensatz zu löschen der Code evtl. nicht ausgeführt wird. Ich schlage vor das Ereignis AfterDelete von ADOSHaupt doppelzuklicken und dort den Code hinzuschreiben. |
Hi, ich habe, wenn ich das Prog. jetzt compiliere, folgende Fehlermeldungen:
Undefinierter Bezeichner: 'ParamByName' Undefinierter Bezeichner: 'KundenNr' Undefinierter Bezeichner: 'ExexSQL' Undefinierter Bezeichner: 'RowsEffected' Wenn ich anstelle von ParamByName - FieldByName eingebe, dann kommt zwar die 1. Fehlermeldung nicht mehr, aber alle anderen sehr wohl. Was hab ich da vergessen? |
Hallo m-werk,
nein, FieldByName ist was anderes. Du musst schon ParamByName verwenden. Kannst du bitte mal den Code posten? Ich habe D5, so dass ich nicht mit ADO Komoponenten arbeite, sondern mit der Standard TQuery Kompo, aber die sollten sich eigentlich nicht so drastisch voneinander unterscheiden. Ich vermute eher einen Fehler im Code (with - Anweisung oder so...) |
Ich poste den Code heute am abend!
|
Hi, so sieht der Code bei mir aus:
Code:
Noch eine fehlermeldung habe ich
procedure TDM.ADOSHauptAfterDelete(DataSet: TDataSet);
begin DM.DelQry.ParamByName('KNr').AsString := KundenNr; DM.DelQry.ExexSQL; ShowMessage(IntToStr(DM.DelQry.RowsEffected)+' Datensätze gelöscht.'); end; 'Operator oder Semikolon fehlt' Diese erscheint nach dem AsString Muß ich bei der DelQry eine DataSource angeben? wenn ja, welche? Muß ich für jede Tabelle eine eigene ADOQuery erstellen? Die Fehlermeldung bei ExexSQL kommt jetzt nicht mehr. Wenn ich jetzt z.B. DM.DelQry. eingebe, kommt immer ein Infofenster, wo ich dann gewisse sachen auswählen kann. Es steht dort aber kein ParamByName Ich habe in der Hilfe auch gesehen, dass ParamByName nicht für ADO ist. Gibts da nen anderen Befehl? Das gleiche ist bei RowsEffected. Zu RowsEffected habe ich nicht einmal eine Hilfe gefunden. Mir scheint, diesen Befehl giebt es gar nicht. Ich habe aber RowsAffected gefunden. Dies müßte funktionieren (Ich verwende Delphi6) Das mit der Fehlermeldung KundenNr habe ich glaube ich auch gefunden. Ich habe die KundenNr unter '' gesetzt. |
Hallo m-werk,
ja, da hab ich mich tatsächlich verschrieben. Es muss RowsAffected heißen. Wenn ParamByName nicht für ADO Komponenten gilt, weiß ich leider nicht, wie man dort auf Parameter zugreift. Vielleicht findest du unter ADOQuery irgendein Hinweis, wie man auf Parameter zugreifen kann. KundenNr darfst du auf keinen Fall in '' setzen, da du ja den Wert dieser Variablen haben willst. Du musst KundenNr als String deklarieren, z.B. im DatenModul. Du kannst für jede Tabelle eine Query einsetzen oder du setzt den Tabellennamen in eine eigene Zeile:
Code:
Dann kannst du einfach in einer Schleife jeweils DelQry.SQL.Strings[1]den Tabellen Namen der Tabelle zuweisen, in der du die Einträge löschen willst.
DELETE FROM
Tabelle2 WHERE KNr = :KNr DataSource muss nicht gesetzt werden, sondern nur DatabaseName. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr. |
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