Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 14.09.02 19:35
Hallo,
habe hier eine Form, auf der befindet sich ein Editfeld und mehrere DBeditFelder. Nach Eingabe einer Nr. in das Editfeld werden die DBfelder gefüllt. Das Onexit-Ereignis des Editfeldes führt hierbei ein select Statement durch. Die DBedit - Felder sind danach leer (neuer Datensatz) oder mit Werten bestückt. So weit so gut. Da es im Endausbau über 100 DBeditfelder sein werden, habe ich einen Button "Änderungen ignorieren" eingebaut, falls jemand den Überblick verliert
Clicke ich diesen Button, so macht er auch nichts, aber er macht auch zuwenig. Das Editfeld ist zwar leer, aber in den DBfeldern stehen immer noch die Werte des vorherigen Datensatzes. Erst wenn eine Nr. eingegeben wird, klappt wieder alles. Habe jetzt folgendes gemacht : Das Editfeld kann nur verlassen werden, falls ein Wert drin steht.
Dadurch komme ich aber letztendlich nicht mehr an meinen ENDE Button,
um halt diesen ganzen Vorgang abschließen zu können. Wer weiß weiter?
Gruß
Hansa
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 15.09.02 03:09
Hi,
bei der TQuery-Kompo gibt es eine Option die heißt ClearFields. Die Option sollte alle Felder löschen.
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 15.09.02 10:23
Hi
ne andere Möglichkeit wäre die Cancel-Methode aufzurufen, die alle Änderungen am aktuellen Satz rückgängig macht und die Datenmenge wieder in den Status dsBrowse bringt. (Das macht übrigens auch der Button des DB-Navigators)
Hat der Anwender einen bereits vorhandenen DS geändert, bekommt er wieder den vorigen Zustand angezeigt.
Wars ein neuer Satz ist die Datenmenge leer. Dann könntest du im AfterCancel Ereignis der Query darauf reagieren und zum Beispiel den Satz mit dem vorigen Suchkriterium wieder abrufen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 15.09.02 11:40
Hi,
brauche ich die Query-Komponente überhaupt? Habe nämlich keine. In Edit1exit wird einfach eine select-Anweisung durchgeführt. Programm funktioniert ! Deshalb habe ich weder Cancel, noch ClearFields zur Verfügung.
Das Problem taucht bei Button2click auf.
Quelltext:
Mir fällt gerade noch etwas auf : Ich verwende insert, bei einem neuen Datensatz, aber bei einem vorhanden kein update, wie gesagt Programm funktioniert insoweit schon. ???
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137:
| unit pro;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls, Sema, Menus, Hauptmod, Buttons;
type TKGeingabe = class(TForm) DBEdit2: TDBEdit; Button1: TButton; Label1: TLabel; Label2: TLabel; Edit1: TEdit; DBEdit1: TDBEdit; Button2: TButton; Button3: TButton; Button4: TButton; CheckBox1: TCheckBox; procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Edit1Exit(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure DBListBox1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var KGeingabe: TKGeingabe;
implementation
USES DataMod;
{$R *.dfm}
procedure TKGeingabe.FormShow(Sender: TObject); begin DataModule2.Database.Open; DataModule2.Transaction.StartTransaction; DataModule2.KGdatenSatz.Open; Edit1.SetFocus; end;
procedure TKGeingabe.FormClose(Sender: TObject; var Action: TCloseAction); begin DataModule2.TransAction.Commit; DataModule2.Database.Close; end;
procedure TKGeingabe.Button1Click(Sender: TObject); begin if MessageDlg('Soll der Datensatz gespeichert werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.insert; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end;
procedure TKGeingabe.Edit1Exit(Sender: TObject); begin IF StrVorhanden (Edit1.Text) THEN BEGIN Edit1.Enabled := false; // Kundennr. nicht editierbar WITH DataModule2.KGdatenSatz DO BEGIN active := false; SelectSQL.Text := 'select * from KG8 where "nr" = ' + Edit1.text; active := true; IF DataModule2.KGdatenSatz.IsEmpty THEN BEGIN insert; FieldByName ('nr').value := StrToInt (Edit1.text); END END; DBedit2.SetFocus; END ELSE Edit1.SetFocus; end;
procedure TKGeingabe.Button2Click(Sender: TObject); begin if MessageDlg('Änderungen gehen verloren ! Trotzdem nicht speichern ?', mtInformation, [mbYes, mbNo], 0) = mrYes then; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end;
procedure TKGeingabe.Button3Click(Sender: TObject); begin begin if MessageDlg('Soll der Datensatz wirklich gelöscht werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin if MessageDlg('Sind Sie sicher ?', mtInformation, [mbYes, mbNo], 0) = mrYes then DataModule2.KGdatenSatz.delete; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end;
end;
procedure TKGeingabe.Button4Click(Sender: TObject); begin Close; end;
procedure TKGeingabe.CheckBox1Click(Sender: TObject); begin Button3.Enabled := NOT Button3.Enabled; end;
procedure TKGeingabe.DBListBox1Click(Sender: TObject); begin // ??? funktioniert noch nicht WITH DataModule2.KGdatenSatz DO BEGIN active := false; SelectSQL.Text := 'select * from KG8'; active := true; END; end;
end. |
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 15.09.02 11:58
Hi
ohne das jetzt alles durchzulesen:
Das Cancel bezieht sich bei dir dann auf die FIBDataset KGDatenSatz.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TKGeingabe.Button2Click(Sender: TObject); begin if MessageDlg('Änderungen gehen verloren ! Trotzdem nicht speichern ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.Cancel; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end; end; |
Den Rest zieh ich mir heute nachmittag mal rein.
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 15.09.02 12:29
Hi LCS,
Cancel macht nichts, zumindest sieht man nichts.
Habe es mal so probiert :
DataModule2.KGdatenSatz.ClearFields (war doch da)
So wie von bis11 beschrieben. Hört sich zumindest mal logisch an. Leider sagt Online-Hilfe nichts. Kriege nur die Meldung "Dataset not in Edit or Insert Mode".
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 15.09.02 14:20
Ok,
jetzt hab ich mir das mal genauer angeschaut. Bei Edit1Exit wird ein neuer Datensatz eingefügt, wenn kein passender gefunden wird. Die Datenmenge ist damit in dsInsert. Wenn mit Button2 jetzt ein Cancel ausgelöst wird, wird diese Aktion rückgängig gemacht.
Button3 ist auch klar. Der DS wird gelöscht. Setzt voraus das einer vorhanden ist.
Unklar ist für mich die Bedeutung von Button1. Hier machst du nochmal Insert. Der Status ist ja aber schon dsInsert, wenn er bei Edit1Exit eingefügt wird. Oder er ist dsBrowse oder dsEdit, wenn ein Datensatz angezeigt wird bzw. geändert wird. In beiden Fällen müssten die Änderungen aber mit Post abgespeichert werden.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TKGeingabe.Button1Click(Sender: TObject); begin if MessageDlg('Soll der Datensatz gespeichert werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.Post; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end; |
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 15.09.02 16:23
Hallo Lothar,
glaube du hast Recht. Da stimmt etwas nicht. Das war ein Denk- oder Flüchtigkeitsfehler.  Ich frage ja extra IsEmpty ab, dann kommt das eine Insert. Also ist gewährleistet, daß ein Datensatz bereits da ist.
Falls NOT IsEmpty ist er ja sowieso da. Wie es jetzt ist, gibt es auf jeden Fall Ärger. Muß mir das ganze nochmal genauer anschauen.
Bis bald
Hansa
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 15.09.02 17:15
Hi LCS,
so scheint es zu gehen :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TKGeingabe.Button1Click(Sender: TObject); begin if MessageDlg('Soll der Datensatz gespeichert werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.insert; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end;
procedure TKGeingabe.Button2Click(Sender: TObject); begin if MessageDlg('Änderungen gehen verloren ! Trotzdem nicht speichern ?', mtInformation, [mbYes, mbNo], 0) = mrYes then BEGIN DataModule2.KGdatenSatz.edit; DataModule2.KGdatenSatz.ClearFields; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; END; end; |
Button 1 : "speichern"
Button 2 : "nicht speichern"
was ich allerdings nicht so ganz verstehe, ist wieso es bei Button1 mit post NICHT geht. Das Insert funktioniert.
Delphi Hilfe :
Zitat: | Call Post to commit changes to the current record. Methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.
|
Auf Deutsch also Bei Edit, Insert usw. wird das post automatisch durchgeführt. Weiterhin steht aber in der Hilfe, insert solle verwendet werden bei neuen Sätzen. Bei mir ist er aber nicht neu, sondern schon da.
Habe ich vielleicht das post falsch verstanden ???
Gruß
Hansa
P.S.: Da fällt mir noch etwas ein : Durch das Edit1.SetFocus komme ich nicht mehr an meinen ENDE Button. Gefällt mir nicht. Was besseres ist mir aber nicht eingefallen. 
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: So 15.09.02 17:37
Hi
Post speichert Änderungen einer Datenmenge die durch Edit (dsEdit) oder Insert (dsInsert) eingeleitet wurden. Danach befindet sich die Datenmenge wieder im Zustand Anzeige (dsBrowse).
Wenn du Insert aufrufst während sich die Datenmenge im Status dsInsert befindet, werden die änderungen des ersten eingefügten Satzes gespeichert und es wird zweiter neuer Satz eingefügt.
Die 'normale' Abfolge sieht immer so aus
Neuer Datensatz (Insert) oder vorhandenen Ändern (Edit)
...Benutzer gibt Daten ein...
Änderungen Speichern (Post) oder Verwerfen (Cancel)
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 15.09.02 20:04
Hi,
es ist wirklich seltsam. Habe das auch so verstanden, daß mit insert ein NEUER DS eingetragen wird. In meinem Programm läuft das über Edit1.
Falls IsEmpty : INSERT bei EditExit1 :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TKGeingabe.Edit1Exit(Sender: TObject); begin IF StrVorhanden (Edit1.Text) THEN BEGIN Edit1.Enabled := false; // Kundennr. nicht editierbar WITH DataModule2.KGdatenSatz DO BEGIN active := false; SelectSQL.Text := 'select * from KG8 where "nr" = ' + Edit1.text; active := true; IF DataModule2.KGdatenSatz.IsEmpty THEN BEGIN INSERT; FieldByName ('nr').value := StrToInt (Edit1.text); END END; DBedit2.SetFocus; END ELSE Edit1.SetFocus; end; |
ob neuer oder alter DS folgt am Schluß :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TKGeingabe.Button1Click(Sender: TObject); begin if MessageDlg('Soll der Datensatz gespeichert werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.INSERT; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end; |
Also wird AUF JEDEN FALL ein insert durchgeführt, sofern nur Button1 geclickt wird. Das sollte ja eigentlich nicht funkt., tut es aber trotzdem! Da sucht man manchmal tagelang einen Fehler und dann sowas. Habe die Delphi-Hilfe von vorne bis hinten durchsucht, überall steht, daß es so eigentlich nicht geht. Das hier sieht so aus, als ob sich zwei Fehler gegenseitig aufheben oder so.
Wenn es auch so klappt, kann ich es nicht benutzen, solange ich nicht genau weiß warum. Das Motto "alles funktioniert und keiner weiß warum", geht nämlich irgendwann schief.
Wahrscheinlich muß ich bei FIBplus nachfragen. Oder das ganze mit IBX nachbauen.
Gruß
Hansa
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mo 16.09.02 10:01
Hi
Zitat: |
Wenn du Insert aufrufst während sich die Datenmenge im Status dsInsert befindet, werden die änderungen des ersten eingefügten Satzes gespeichert und es wird zweiter neuer Satz eingefügt.
|
Eigentlich ist es klar das es funktioniert. Nur das du damit beim Speichern eben gleich einen weiteren neuen Datensatz einfügst.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 16.09.02 11:30
Hallo Lothar,
bin deiner Meinung, trotz zweier insert kriege ich aber egal wie nur einen Datensatz. Habe das in der IBconsole auch überprüft. Mit folgendem Code geht es auch (habe aber nicht alle Konstellationen ausprobiert) :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TKGeingabe.Edit1Exit(Sender: TObject); begin IF StrVorhanden (Edit1.Text) THEN BEGIN Edit1.Enabled := false; // Kundennr. nicht editierbar WITH DataModule2.KGdatenSatz DO BEGIN active := false; SelectSQL.Text := 'select * from KG8 where "nr" = ' + Edit1.text; active := true; IF DataModule2.KGdatenSatz.IsEmpty THEN BEGIN edit; FieldByName ('nr').value := StrToInt (Edit1.text); END END; DBedit2.SetFocus; END ELSE Edit1.SetFocus; end;
procedure TKGeingabe.Button1Click(Sender: TObject); begin if MessageDlg('Soll der Datensatz gespeichert werden ?', mtInformation, [mbYes, mbNo], 0) = mrYes then begin DataModule2.KGdatenSatz.post; end; Edit1.Text := ''; Edit1.Enabled := true; Edit1.SetFocus; Show; end; |
Hier ist halt das erste insert durch edit und das zweite durch post ersetzt. Vermute aber mittlerweile, daß der Code in beiden Fällen korrekt ist. Z.B. ruft, laut Delphi Hilfe, edit bei Bedarf automatisch insert auf. Wo, wann, was und wodurch automatisch ausgeführt wird, das habe ich noch nicht so im Griff.
Warte jetzt aber mal die Antwort von FIBplus ab. Schätze, daß die heute noch kommt (uff, ist mein Schreib-Englisch so schlecht geworden  ).
Gruß
Hansa
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 17.09.02 13:14
Hallo,
hier ist die Antwort (Frage ist gleich mit dabei  ). Anscheinend hat er meine Frage nicht so richtig verstanden, weil ich sie nicht präzise genug gestellt habe. Werde das heute abend mal auswerten. Die Antwort kommt übrigens vom Entwickler selber. Das ist doch schon mal was.
Zitat: | Hello, Hansa!
You wrote on Mon, 16 Sep 2002 11:17:04 +0200:
H> In my code there is a fault, but the program runs properly. Please
H> look at the lines with an INSERT Statement :
[skipped]
H> If I'm entering a NEW dataset, first he must get a number (in this
H> case from Edit1-Field). After that, it should be possible to enter
H> the other fields. At the beginning I'm using INSERT. At the end there
H> is another
H> INSERT Statement. The first INSERT causes, that at the end I should
H> use
H> POST. Is'nt it? But why does it works with INSERT ? Perhaps FIBplus
H> has another handling ? But I think it's too dangerous to use this
H> procedures.
FIBPlus inherits the standard TDataSet behaviour. That means, firstly,
that if you call Insert you should also call Post. But if you call Next
(manually or when you change the current record in visual db controls), VCL
automatically calls Post .
H> I've changed the first insert to edit and the second insert to post.
H> It works! But edit works also with a new dataset.
H> Can someone tell me, what's the correct way ?
Actually, I did not realized what exactly does not work. Could you give
me more details, what you want to do? For example, if you want to be sure
that your first insert is posted, you can check
DataModule2.KGdatenSatz.State before second Insert and call Post if it is
necessary.
Or do you need something else? I'm sorry for questions, I ask because I
really want to help you!
Sincerely yours,
Serg
|
Muß leider sofort weg.
Gruß
Hansa
|
|
|