![]() |
Re: Insert erst beim schließen
Mach mal einen Refresh auf dem anderen DataSet
|
Re: Insert erst beim schließen
hab ich gemacht, bringt aber auch nix...
hier ist mal mein code im andern From. (Die Komponenten sind genauso wie die anderen)
Code:
a ist eine recht komplizierte Abfrage, die funktioniert eigentlich auch, aber ist für den gerade erstellten Datensatz leer.
IBDataSet1.SelectSQL:=a;
IBDataSet1.RefreshSQL:=a; IBDataSet1.Open; IBDataset1.Refresh; frxReport1.ShowReport(true); (die beiden zeilen mit refresh hab ich jetzt erst eingebaut, die bringen aber auhc nix...) |
Re: Insert erst beim schließen
Hänge das Projekt mal hier an.
|
Re: Insert erst beim schließen
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:
Die Unit, die es einfügt.
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.
Code:
Die Unit, die den Report erstellen soll.
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. 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 :) ) |
Re: Insert erst beim schließen
Am Besten packst du die Units mitsamt der Formualre )dfm) und der DB in eine Zip und hängst diese an. Ich würde die Abfragen auch zur Entwurfstzeit setzen und nicht jedesmal neu. Zudem ist deine Methode zur Ermittlung der nächsten ID nicht wasserdicht; hier würde ich lieber den Weg über einen Generator(Sequenz) gehen.
|
Re: Insert erst beim schließen
Liste der Anhänge anzeigen (Anzahl: 1)
Ha, ich hab den _history-Ordner rausgenommen und jetzt gehts einigermaßen (hätte nicht gedacht, das das als zip so klein ist...)
Das mit dem Generator hab ich auch schon überlegt, dann hab ich das mal probiert und bin nicht so recht damit zurecht gekommen. Das ist dann eines der ersten Sachen zum überarbeiten. Danke schonmal für deine Hilfe :thumb: :thumb: |
Re: Insert erst beim schließen
Fehlt da kein ExecSQL in seinem Quelltext?
|
Re: Insert erst beim schließen
Hallo,
nein, fehlt nicht. Ist ein DataSet (ich hasse die Dinger ;) ) Dort reicht das Post (Thread #1). Heiko |
Re: Insert erst beim schließen
Hat schon einer ne Lösung??
|
Re: Insert erst beim schließen
Hallo,
du solltest mal unsere Vorschläge beachten. In UKunden1 gibt es zwar eine IBTransaction1, sie wird aber nicht benutzt (StartTransaction/Commit). D.h. die Daten sind Teil einer Transaktion. die erst mit dem DB-Close commited werden. Deshalb kann sie auch IBExpert erst nach Programm-Ende "sehen". ein Bsp. dein Code
Delphi-Quellcode:
und nun mit Transaktionsverwaltung
procedure TFKundenverwaltung.Button3Click(Sender: TObject);
begin k:=k2; k.KdNr:=NextFreeKdNr; SetKunde(k); if FKundenbearbeiten.ShowModal=mrOK then begin DS_Kunden.Insert; SetKundeToDS(GetKunde); DS_Kunden.Post; end; end;
Delphi-Quellcode:
procedure TFKundenverwaltung.Button3Click(Sender: TObject);
begin k:=k2; k.KdNr:=NextFreeKdNr; SetKunde(k); if FKundenbearbeiten.ShowModal=mrOK then begin Kunden.Transaction.StartTransaction; // IBTransaction1.StartTransaction ist hier das gleiche DS_Kunden.Insert; SetKundeToDS(GetKunde); DS_Kunden.Post; Kunden.Transaction.Commit; end; end; Hieko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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