AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Insert erst beim schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Insert erst beim schließen

Ein Thema von Tobinator · begonnen am 21. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Seite 2 von 3     12 3      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 20:12
Mach mal einen Refresh auf dem anderen DataSet
Markus Kinzler
  Mit Zitat antworten Zitat
Tobinator

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

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 20:26
hab ich gemacht, bringt aber auch nix...

hier ist mal mein code im andern From. (Die Komponenten sind genauso wie die anderen)

Code:
  IBDataSet1.SelectSQL:=a;
  IBDataSet1.RefreshSQL:=a;

  IBDataSet1.Open;
  IBDataset1.Refresh;

  frxReport1.ShowReport(true);
a ist eine recht komplizierte Abfrage, die funktioniert eigentlich auch, aber ist für den gerade erstellten Datensatz leer.
(die beiden zeilen mit refresh hab ich jetzt erst eingebaut, die bringen aber auhc nix...)
Tobias
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 20:33
Hänge das Projekt mal hier an.
Markus Kinzler
  Mit Zitat antworten Zitat
Tobinator

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

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 20: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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 21:02
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Tobinator

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

Re: Insert erst beim schließen

  Alt 21. Aug 2009, 21:29
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
Angehängte Dateien
Dateityp: zip neu_winrar-zip-archiv_118.zip (1,20 MB, 4x aufgerufen)
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#17

Re: Insert erst beim schließen

  Alt 22. Aug 2009, 04:27
Fehlt da kein ExecSQL in seinem Quelltext?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#18

Re: Insert erst beim schließen

  Alt 22. Aug 2009, 06:07
Hallo,

nein, fehlt nicht. Ist ein DataSet (ich hasse die Dinger )
Dort reicht das Post (Thread #1).


Heiko
Heiko
  Mit Zitat antworten Zitat
Tobinator

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

Re: Insert erst beim schließen

  Alt 22. Aug 2009, 23:51
Hat schon einer ne Lösung??
Tobias
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#20

Re: Insert erst beim schließen

  Alt 23. Aug 2009, 12:50
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:
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;
und nun mit Transaktionsverwaltung
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz