Einzelnen Beitrag anzeigen

Tobinator

Registriert seit: 18. Mai 2008
Ort: Cottbus
53 Beiträge
 
#14

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 21:45
Das Projekt ist mit DB ca. 8 MB groß, und das ist mit DSL-Light so ne sache... aber ich kann dir mal die beiden Units schicken, auf die es ankommt:

Code:
unit URech;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UKunden1, UKunden2, UArtikel1, UArtikel2, StdCtrls, UAbgabe, ComCtrls,
  Grids, DB, IBCustomDataSet, IBDatabase, frxClass, frxDBSet, UQuittung;

type
  TFRech = class(TForm)
    Kunde: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    LKdNr: TLabel;
    LAnr: TLabel;
    LName: TLabel;
    LTel: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    LOrt: TLabel;
    LStr: TLabel;
    LDat: TLabel;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    LGHA: TLabel;
    LGHQ: TLabel;
    BSuch: TButton;
    EMeng: TEdit;
    Label7: TLabel;
    StringGrid1: TStringGrid;
    GroupBox2: TGroupBox;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    LRestA: TLabel;
    LRestQ: TLabel;
    LSum: TLabel;
    LSumS: TLabel;
    LSumA: TLabel;
    LSumQ: TLabel;
    Button2: TButton;
    Button3: TButton;
    DS_Posten: TIBDataSet;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    procedure Button1Click(Sender: TObject);
    procedure ArtTabelle_show;
    procedure BSuchClick(Sender: TObject);
    procedure EMengExit(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure Gesamt;
    procedure clear;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TArtikel=record
    Artikelnummer,
    Bezeichnung,
    Tauschware_str,
    Einheit:String;
    Menge,
    Tauschware,
    Tauschmenge,
    Tauschmenge_ges:integer;
    EzPreis,
    GesPreis,
    Steuer:Currency;
  end;

type
  TArtikeltabelle=Array of TArtikel;

var
  FRech: TFRech;
  GHA, GHQ, RestGHA, RestGHQ, GesGHA, GesGHQ:Integer;
  ArtT:TArtikelTabelle;
  len:integer;
  Sum,SumS:Currency;

  function NextFreePostenID:integer;


implementation

{$R *.dfm}

procedure TFRech.ArtTabelle_show;
var i:integer;
begin
if length(ArtT)>0 then
begin
for i := 0 to Stringgrid1.RowCount - 1 do
  Stringgrid1.Rows[i].Clear;
  Stringgrid1.RowCount:=2;

  Stringgrid1.Cells[0,0]:='Artikelnummer';
  Stringgrid1.Cells[1,0]:='Bezeichnung';
  Stringgrid1.Cells[2,0]:='Menge';
  Stringgrid1.Cells[3,0]:='Einheit';
  Stringgrid1.Cells[4,0]:='Einzelpreis';
  Stringgrid1.Cells[5,0]:='Steuer';
  Stringgrid1.Cells[6,0]:='Gesamtpreis';
  Stringgrid1.Cells[7,0]:='Tauschware';
  Stringgrid1.ColWidths[0]:=90;
  Stringgrid1.ColWidths[1]:=150;
  Stringgrid1.ColWidths[2]:=50;
  Stringgrid1.ColWidths[3]:=70;
  Stringgrid1.ColWidths[4]:=70;
  Stringgrid1.ColWidths[5]:=70;
  Stringgrid1.ColWidths[6]:=70;
  Stringgrid1.ColWidths[7]:=90;

  Stringgrid1.RowCount:=length(ArtT)+1;

  for i := 0 to length(ArtT)-1 do
  begin
    Stringgrid1.Cells[0,i+1]:=ArtT[i].Artikelnummer;
    Stringgrid1.Cells[1,i+1]:=(ArtT[i].Bezeichnung);
    Stringgrid1.Cells[2,i+1]:=(inttostr(ArtT[i].Menge));
    Stringgrid1.Cells[3,i+1]:=(ArtT[i].Einheit);
    Stringgrid1.Cells[4,i+1]:=(FloatToStrF(ArtT[i].EzPreis,ffFixed,10,2));
    Stringgrid1.Cells[5,i+1]:=(FloatToStrF(ArtT[i].Steuer,ffFixed,10,2));
    Stringgrid1.Cells[6,i+1]:=(FloatToStrF(ArtT[i].GesPreis,ffFixed,10,2));
    Stringgrid1.Cells[7,i+1]:=(ArtT[i].Tauschware_str);
  end;
  EMeng.Clear;
end;

end;

function NextFreePostenID:integer;
begin
  with FRech do
  begin
  DS_Posten.SelectSQL.Text:='SELECT * From POSTEN Order By ID';
  DS_Posten.Open;
  DS_Posten.Last;
  result:=DS_Posten.FindField('ID').AsInteger+1;
  end;

end;

procedure TFRech.BSuchClick(Sender: TObject);
var i : integer;
begin


  if FArtikel.ShowModal=mrok then
    begin
      len:=length(ArtT);
      EMeng.SetFocus;
      EMeng.Text:='1';
      EMeng.SelectAll;
      SetLength(ArtT,len+1);
      ArtT[len].Artikelnummer:=resArt.Artikelnummer;
      ArtT[len].Bezeichnung:=resArt.Bezeichnung;
      ArtT[len].Einheit:=resArt.Einheit;
      ArtT[len].Tauschware:=resArt.Tauschware;
      ArtT[len].Tauschmenge:=-resArt.Tauschmenge;
      ArtT[len].EzPreis:=resArt.VKPreisBrutto;
      ArtT[len].Steuer:=resArt.VKPreisBrutto - resArt.VKPreisNetto;
    end;

end;

procedure TFRech.Button1Click(Sender: TObject);
begin
  if FKundenverwaltung.showmodal=mrok then
  begin
    LKdNr.Caption:=resKd.KdNr;
    LAnr.Caption:=Anreden[resKd.Anrede];
    LName.Caption:=resKd.Name1;
    LTel.Caption:=resKd.Tel;
    LStr.Caption:=resKd.Strasse;
    LOrt.Caption:=resKd.PLZ+' '+resKd.Ort;
    LDat.Caption:=DateToStr(date);
    GHA:=GHLadenApfL(resKd.KdNr);
    GHQ:=GHLadenQuittL(resKd.KdNr);
    LGHA.Caption:=FloatToStr(GHLadenApfKG(resKd.KdNr)) +' kg/ ' + IntToStr(GHA)+ ' Liter';
    LGHQ.Caption:=FloatToStr(GHLadenQuittKG(resKd.KdNr)) +' kg/ ' + IntToStr(GHQ)+ ' Liter';
  end;
end;

procedure TFRech.Button2Click(Sender: TObject);  // Der OK-Button
  var s:string;
      i,k :Integer;
begin
if (LKdNr.Caption<>'') and (GesGHA>=-GHA) and (GesGHQ>=-GHQ) then
begin

  IBTransaction1.StartTransaction;

  s:=NextFreeVorgNr;
  with FAbgabe do
  begin
    DS_Vorgang.Open;
    DS_Vorgang.Insert;
    DS_Vorgang.FieldByName('Vorgangsnummer').AsString:=s;
    DS_Vorgang.FieldByName('Datum').AsDateTime:=Date;
    DS_Vorgang.FieldByName('Art').asinteger:=2;
    DS_Vorgang.FieldByName('Kunde').AsString:=FRech.LKdNr.Caption;
    DS_Vorgang.FieldByName('Posten').AsString:='';
    DS_Vorgang.FieldByName('TauschApfelKg').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschApfelL').AsInteger:=GesGHA;
    DS_Vorgang.FieldByName('AufkaufA').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschQuitteKg').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschQuitteL').AsInteger:=GesGHQ;
    DS_Vorgang.FieldByName('AufkaufQ').AsFloat:=0;
    DS_Vorgang.FieldByName('BetragNetto').AsFloat:=Sum;
    DS_Vorgang.FieldByName('BetragBrutto').AsFloat:=Sum-SumS;

    DS_Vorgang.Post;

  end;


  k:=NextFreePostenID;
  DS_Posten.Open;

  for i := 0 to length(ArtT) - 1 do
    begin
      DS_Posten.Insert;
      DS_Posten.FieldValues['ID']:=k+i;
      DS_Posten.FieldValues['Vorgangsnummer']:=s;
      DS_Posten.FieldValues['Artikelnummer']:=ArtT[i].Artikelnummer;
      DS_Posten.FieldValues['Menge']:=ArtT[i].Menge;
      DS_Posten.FieldValues['BetragNetto']:=ArtT[i].GesPreis;
      DS_Posten.FieldValues['BetragBrutto']:=ArtT[i].GesPreis-ArtT[i].Steuer;
      DS_Posten.Post;
    end;

  IBTransaction1.Commit;

  modalresult:=mrOk;
  clear;
  hide;
  showrep(s);
end;

end;

procedure TFRech.Button3Click(Sender: TObject);
begin
  clear;
  hide;
end;

procedure TFRech.clear;
var i:integer;
begin
  LKdNr.Caption:='';
  LAnr.Caption:='';
  LName.Caption:='';
  LTel.Caption:='';
  LStr.Caption:='';
  LOrt.Caption:='';
  LDat.Caption:='';
  GHA:=0;
  GHQ:=0;
  LGHA.Caption:='';
  LGHQ.Caption:='';
  for i := 0 to length(ArtT) - 1 do
  begin
    ArtT[i].Artikelnummer:='';
    ArtT[i].Bezeichnung:='';
    ArtT[i].Tauschware_str:='';
    ArtT[i].Einheit:='';
    ArtT[i].Menge:=0;
    ArtT[i].Tauschware:=0;
    ArtT[i].Tauschmenge_ges:=0;
    ArtT[i].EzPreis:=0;
    ArtT[i].GesPreis:=0;
    ArtT[i].Steuer:=0;
  end;

  SetLength(ArtT,0);

  LRestA.Caption:='';
  LRestQ.Caption:='';

  LSum.Caption:='';
  LSumS.Caption:='';
  LSumA.Caption:='';
  LSumQ.Caption:='';
  EMeng.Clear;

  for i := 0 to Stringgrid1.RowCount - 1 do
  Stringgrid1.Rows[i].Clear;
  Stringgrid1.RowCount:=2;

  ResKd:=K2;
  ResArt:=A2;

end;

procedure TFRech.EMengExit(Sender: TObject);
begin
  if resArt.Artikelnummer<>'' then
    begin
    ArtT[len].Menge:=StrToIntDef(EMeng.Text,0);
    ArtT[len].Tauschmenge_ges:=StrToIntDef(EMeng.Text,0)*ArtT[len].Tauschmenge;
    ArtT[len].GesPreis:=StrToIntDef(EMeng.Text,0)*ArtT[len].EzPreis;
    ArtT[len].Tauschware_str:=Tauschwaren[ArtT[len].Tauschware]+' ('+InttoStr(StrToIntDef(EMeng.Text,0)*ArtT[len].Tauschmenge)+' Liter)';
    end
    else
    begin
    //ArtT[Stringgrid1.Row-1].Menge:=StrToIntDef(EMeng.Text,0);
    //ArtT[Stringgrid1.Row-1].Tauschmenge_ges:=StrToIntDef(EMeng.Text,0)*ArtT[len].Tauschmenge;
    //ArtT[Stringgrid1.Row-1].GesPreis:=StrToIntDef(EMeng.Text,0)*ArtT[len].EzPreis;
    //ArtT[Stringgrid1.Row-1].Tauschware_str:=Tauschwaren[ArtT[len].Tauschware]+' ('+InttoStr(StrToIntDef(EMeng.Text,0)*ArtT[len].Tauschmenge)+' Liter)';
    end;
  ArtTabelle_show;
  resArt:=A2;
  gesamt;
end;

procedure TFRech.Gesamt;
var i:integer;
begin
  RestGHA:=0;
  RestGHQ:=0;
  GesGHA:=0;
  GesGHQ:=0;
  Sum:=0;
  SumS:=0;

  for i := 0 to length(ArtT) - 1 do
  begin
  if ArtT[i].Tauschware=1 then GesGHA:=GesGHA+ArtT[i].Tauschmenge_ges;
  if ArtT[i].Tauschware=2 then GesGHQ:=GesGHQ+ArtT[i].Tauschmenge_ges;
  Sum:=Sum+ArtT[i].GesPreis;
  SumS:=SumS+ArtT[i].Steuer;
  end;

  RestGHA:=GHA+GesGHA;
  RestGHQ:=GHQ+GesGHQ;

  LRestA.Caption:=inttostr(RestGHA)+' Liter';
  LRestQ.Caption:=inttostr(RestGHQ)+' Liter';

  LSum.Caption:=floattostrf(Sum,ffFixed,10,2);
  LSumS.Caption:=floattostrf(SumS,ffFixed,10,2);
  LSumA.Caption:=inttoStr(GesGHA)+' Liter';
  LSumQ.Caption:=inttoStr(GesGHQ)+' Liter';

end;

procedure TFRech.StringGrid1Click(Sender: TObject);
begin
if Stringgrid1.Row>0 then
  EMeng.Text:=inttostr(ArtT[Stringgrid1.Row-1].Menge);
end;

end.
Die Unit, die es einfügt.

Code:
unit UQuittung;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frxClass, frxDBSet, DB, IBCustomDataSet, IBQuery, StdCtrls,
  IBDatabase;

type
  TFQuittung = class(TForm)
    frxReport1: TfrxReport;
    frxDBDataset5: TfrxDBDataset;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBDataSet1: TIBDataSet;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FQuittung: TFQuittung;

  procedure showrep(VgNr:String);

implementation

{$R *.dfm}

procedure showrep(VgNr:String);
var a : TStrings;
begin

a:=TStringList.Create;
with FQuittung do
begin
  show;
  a.Clear;
  a.Add('SELECT V.VORGANGSNUMMER, V.DATUM, V.KUNDE, V.TAUSCHAPFELL, V.TAUSCHQUITTEL, V.BETRAGBRUTTO, ' + 'P.VORGANGSNUMMER, P.ARTIKELNUMMER, P.MENGE, P.BETRAGBRUTTO, A.ARTIKELNUMMER, A.BEZEICHNUNG, A.VKPREISBRUTTO, K.KUNDENNUMMER, K.ANREDE, K.NAME1, K.TEL, K.STRASSE, K.PLZ, K.ORT');
  a.Add('FROM');
  a.Add(' VORGANG V,');
  a.Add(' POSTEN P,');
  a.Add('  ARTIKEL A,');
  a.Add(' KUNDEN K');
  a.Add('WHERE');
  a.Add(' V.VORGANGSNUMMER = '+chr(39)+VgNr+chr(39)+' AND');
  a.Add(' P.VORGANGSNUMMER = V.Vorgangsnummer AND');
  a.Add(' A.ARTIKELNUMMER = P.Artikelnummer AND');
  a.Add(' V.KUNDE = K.KUNDENNUMMER');
  IBDataSet1.SelectSQL:=a;
  IBDataSet1.RefreshSQL:=a;

  IBDataSet1.Open;
  IBDataset1.Refresh;

  frxReport1.ShowReport(true);
  Memo1.Lines:=IBDataSet1.SelectSQL;
  showmessage(IBDataSet1.FieldByName('Vorgangsnummer').AsString);
end;


end;

procedure TFQuittung.Button1Click(Sender: TObject);
begin
  frxReport1.ShowReport(true);
end;

procedure TFQuittung.Button2Click(Sender: TObject);
begin
  showrep('V.00073'); // der letzte Datensatz
end;

end.
Die Unit, die den Report erstellen soll.

Zur erklärung: Das soll eine Art Buchhaltungs-Programm werden für ein Lohnobst annahme- und umtauschstelle.
(Ich weis, das es noch nicht wirklich effektiv arbeitet, aber es muss erstmal fertig werden. Überarbeitet wir später )
Tobias
  Mit Zitat antworten Zitat