Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PosNummern in Rechnungsdaten (https://www.delphipraxis.net/75758-posnummern-rechnungsdaten.html)

Jelly 25. Aug 2006 22:35

Re: PosNummern in Rechnungsdaten
 
Michael,

Du bist dir aber schon bewusst, dass zwischen deinem Ermitteln der neuen ID im AfterInsert Event bis zum Post des Records eine Weile vergehen kann. Wer garantiert dir denn ,dass genau in der Zeit nicht ein anderer User einen Datensatz eingefügt hat... DEINE ID wird nämlich erst beim Post vom Server vergeben, und nicht nach dem Aufruf von Dataset.Insert...

hoika 26. Aug 2006 09:42

Re: PosNummern in Rechnungsdaten
 
Hallo,

mkinzler,
dein SQL-Text ist falsch !

SQL-Code:
SQL.Text := 'SELECT MAX(Pos) FROM Rechnungsdaten WHERE
               Rechnungsdaten.RechnungsNr = RechNr';
Es muss heissen

entweder

SQL-Code:
SQL.Text := 'SELECT MAX(Pos) FROM Rechnungsdaten WHERE
               Rechnungsdaten.RechnungsNr = '+IntToStr(RechNr);
oder

SQL-Code:
SQL.Text := 'SELECT MAX(Pos) FROM Rechnungsdaten WHERE
               Rechnungsdaten.RechnungsNr = :RechNr';
ParamByName('RechNr').AsInteger:= rechNr;
Heiko

Michael Habbe 26. Aug 2006 11:34

Re: PosNummern in Rechnungsdaten
 
Hi Tom.

Zitat:

Zitat von Jelly
Michael,

Du bist dir aber schon bewusst, dass zwischen deinem Ermitteln der neuen ID im AfterInsert Event bis zum Post des Records eine Weile vergehen kann. Wer garantiert dir denn ,dass genau in der Zeit nicht ein anderer User einen Datensatz eingefügt hat... DEINE ID wird nämlich erst beim Post vom Server vergeben, und nicht nach dem Aufruf von Dataset.Insert...

Bei mir wird insgesamt anders vorgegangen. Da werden nicht einzelne Positionen einer Rechnungsnummer zugeordnet, sondern einer Vorgangsnummer. Da aber jeder Vorgang nur von einem Anwender bearbeitet werden darf, passt das schon. Die Rechnungsnummer wird erst beim Druck der Rechnung geholt.
Aber generell hast Du schon recht. Das ist ein Problem von vielen in einer Mehrbenutzeranwendung.

mkinzler 26. Aug 2006 20:19

Re: PosNummern in Rechnungsdaten
 
Zitat:

mkinzler,
dein SQL-Text ist falsch !
Einfach schneller getippt als gedacht. :oops:

LOMBI 11. Sep 2006 18:55

Re: PosNummern in Rechnungsdaten
 
Guten Abend,

ich bekomme das mit den Positionsnummern einfach nicht hin:

Delphi-Quellcode:
function GetPosNr(fldName, tblName: String): Integer;
var
  QueryRechnungsdaten:TQuery;
begin
  with TQuery.Create(nil) do
    begin
      DatabaseName := Rechnungen.DatabaseName;
      SQL.Text := Format('SELECT MAX(%s) FROM %s WHERE
                  Rechnungsdaten.RechnungsNr= :RechnungsNr',
                  [fldName, tblName]);            
      ParamByName('RechnungsNr') := RechnungsNr;
      Open;
      Result := succ(Fields[0].AsInteger;
      Close;
    end;
  end;

procedure FRechnungen.QueryRechnungsdatenAfterInsert(DataSet: TDataSet);
begin
  with DataSet do
    begin
      if FieldByName('PosNr').IsNull then
        FieldByName('PosNr').AsInteger := GetPosNr('PosNr',
        Rechnungsdaten');
        QueryRechnungsdaten['RechnungsNr'] :=
        QueryRechnungen['RechnungsNr']
        ...
       end;
Fehlermeldung: "Undefinierter Bezeichner 'RechnungsNr'"

Delphi-Quellcode:
SQL.Text := Format('SELECT MAX(%s) FROM %s WHERE
                  Rechnungsdaten.RechnungsNr= :RechnungsNr',
      //":RechnungsNr" stammt aus Tabelle Rechnungen und ist vom Typ
          I(nteger)!
Wer hilft mir bitte nochmals?

Grüße
Lombi

uwewo 11. Sep 2006 19:42

Re: PosNummern in Rechnungsdaten
 
Hi,

habe mir jetzt nicht komplett alles durchgelesen, also Sorry wenn ich etwas wiederhole.
Beim erstellen einer neuen Rechnung, sind sehr wahrscheinlich noch keine Daten in Deinem DBGrid.
Was hindert Dich daran, beim anlegen eines neuen Datensatzes den Wert der PosNr. auf die Anzahl(+1) der gezeigten Datensätze im Grid zu setzen.

z.B. bei AfterInsert oder BeforePost

marabu 11. Sep 2006 19:47

Re: PosNummern in Rechnungsdaten
 
Hallo Lombi,

du brauchst beide Generatoren - NextKey() ermittelt die nächste laufende Nummer und NextSubkey() macht das für einen sogenannten compound key (zusammengesetzter Schlüssel) - in deinem Fall Rechnungsdaten(RechNr, PosNr). Hier nochmal ausführlich, was dir Markus bereits am Anfang geschrieben hatte:

Delphi-Quellcode:
function NextKey (fldName, tblName: String): Integer;
begin
  with TQuery.Create do
  begin
    DatabaseName := QueryRechnungen.DatabaseName;
    SQL.Text := Format('SELECT MAX(%s) FROM %s', [fldName, tblName]);
    Open;
    Result := Succ(Fields[0].AsInteger);
    Close;
  end;
end;

function NextSubKey (
  keyValue: Integer; // RechNr Wert
  fldName,           // RechNr Feldname
  subName,           // PosNr FeldName
  tblName: String    // Tabellenname
): Integer;
begin
  with TQuery.Create do
  begin
    DatabaseName := QueryRechnungen.DatabaseName;
    SQL.Text := Format('SELECT MAX(%s) FROM %s WHERE %s = %d', [subName, tblName, fldName, keyValue]);
    Open;
    Result := Succ(Fields[0].AsInteger);
    Close;
  end;
end;
Der Ansatz von Uwe führt zwar auch zum richtigen Ergebnis, aber die Vermischung von Datenmodell und GUI ist dabei nicht so schön.

Gute Nacht

marabu

LOMBI 13. Sep 2006 11:18

Re: PosNummern in Rechnungsdaten
 
Herzlichen Dank, auch für Eure Geduld mit einem Greenhorn in Sachen Progr.

@minzler
Delphi-Quellcode:
function PosNr(fldName, tblName: //String; RechNr: Integer//): Integer;
Entschuldigung, hatte in dieser Zeile eine wesentliche Änderung übersehen!

Gruß
Lombi


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr.
Seite 3 von 3     123   

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-2025 by Thomas Breitkreuz