1. DoSave ist eine Variable
2. If DoSave Then hatte ich, geht aber auch nicht
3. Auch nach einem frischen (kompletten) kompilieren geht es nicht
4. Passiert dies an mindestens 10 Stellen im Programm
Es ist ein Form mit zwei Buttons Verwerfen und Speichern.
Im OnClick wird DoSave auf False bzw. auf True gesetzt.
Wenn DoSave wahr ist, wird der Datensatz gespeichert, im anderen Fall soll er nicht gespeichert werden.
(Code gekürzt)
Code: Alles auswählen
unit frm_position;
{$mode objfpc}{$H+}
interface
uses
Classes, Controls, ctrfunctions, DB, DBCtrls, DBGrids, Dialogs, ExtCtrls, FileUtil, Forms, frm_mengeneinheiten,
frm_textbausteine, Graphics,
LCLType, StdCtrls, DBExtCtrls, SysUtils;
type
{ TfrmPosition }
TfrmPosition = class(TForm)
lblArtikelnummer: TLabel;
...
procedure btnBausteinPositionClick(Sender: TObject);
procedure dbeLohnExit(Sender: TObject);
procedure dblPositionsArtChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormShow(Sender: TObject);
procedure btnSpeichernClick(Sender: TObject);
procedure btnVerwerfenClick(Sender: TObject);
private
public
end;
var
frmPosition: TfrmPosition;
DoSave: boolean;
function BearbeiteAuftragsPosition(IDAuftrag: integer; IDPosition: integer; Neu: boolean): boolean;
implementation
uses
dtm_artikel, dtm_auftrag, dtm_basis, frm_getartikel;
{$R *.frm}
function BearbeiteAuftragsPosition(IDAuftrag: integer; IDPosition: integer; Neu: boolean): boolean;
var
Suchtext: string;
LastRec: integer;
PosNeu: integer;
IDArtikel, IDPreis: integer;
StSatz, FStSatz: string;
F: TfrmPosition;
LDat: boolean;
begin
with dtmAuftrag do
begin
qryPosition.Connection.StartTransaction;
if IDPosition = 0 then
if MessageDlg('Es sind noch keine Positionen vorhanden. Wollen Sie jetzt eine anlegen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
Neu := True
else
begin
Result := False;
exit;
end;
LDat := False;
case dtmAuftrag.qryAuftragsListe.FieldByName('auf_typ').AsInteger of
10, 40, 50, 53, 59: LDat := True;
end;
if Neu then
CreateNewPosition(IDPosition);
if IDPosition > 0 then
begin
OpenSQLSet(qryPosition, 'Select * from AuftragsPositionen where idauftragsposition = ' + IntToStr(IDPosition));
BerechnePosition;
F := TfrmPosition.Create(nil);
try
F.ShowModal;
// Hier findet der Spuk statt:
if DoSave = True then
begin
if qryPosition.State = dsEdit then
qryPosition.ApplyUpdates;
qryPosition.Connection.Commit;
if qryPosition.FieldByName('fk_posart').AsInteger=2 then
ExecSQLDirect(dtmBasis.qrySQL,'Update AuftragsPositionen set apo_artikelgruppe=0 '+
'where idauftragsposition=' + qryPosition.FieldByName('idauftragsposition').AsString);
qryPositionsListe.Refresh;
qryPositionsListe.Locate('idauftragsposition', qryPosition.FieldByName('idauftragsposition').AsInteger, []);
Result := True;
end
else
begin
// Hier kommt das Programm nie hin
qryPosition.Connection.Rollback;
Result := False;
end;
finally
FreeAndNil(F);
end;
end;
end;
end;
{ TfrmPosition }
procedure TfrmPosition.btnSpeichernClick(Sender: TObject);
begin
DoSave := True;
Close;
end;
procedure TfrmPosition.btnVerwerfenClick(Sender: TObject);
begin
if MessageDlg('Sollen wirklich alle Änderungen verworfen werden?', mtWarning, [mbYes, mbNo], 0) = mrYes then
begin
DoSave := False;
Close;
end;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.