![]() |
Re: PosNummern in Rechnungsdaten
Hi mkinzler,
leider, es will nicht klappen. Vielleicht liegt's an der function NextKey und dem darin enthalten SQL.Text?
Delphi-Quellcode:
Gruß
SQL.Text := Format('SELECT MAX(%s) FROM %s', [fldName, tblName]);
Lombi |
Re: PosNummern in Rechnungsdaten
Ich habe gedacht, du hast diesen durch meine Erweiterung ersetzt!
|
Re: PosNummern in Rechnungsdaten
Delphi-Quellcode:
Den SQL.Text habe ich ersetzt. Nun beginnen alle Artikelpositionen
function PosNr(fldName, tblName: String): Integer;
begin with TQuery.Create do begin DatabaseName := QueryRechnungen.DatabaseName; SQL.Text := 'SELECT MAX(Pos) FROM Rechnungsdaten WHERE Rechnungsdaten.RechnungsNr = 999999'; Open; Result: succ(Fields[0].AsInteger); Close; end; mit der PosNr. 1.0. Das "succ" in Result wird hier scheinbar ignoriert. |
Re: PosNummern in Rechnungsdaten
Der Wert von 99999 ist natürlich falsch, war nur wegen meiner frage was er liefret wenn die Rechnungsnummer unbeknnat ist.
Bisher liefert die Abfarge ja das Maximum aller Positionen durch Erweiterung um die Rechnungsnummer liefert er das Maximum bezogen auf dise Nummer. Bsp: RechNr Pos 1 1 1 2 1 3 2 1 2 2 Die Abfrage
SQL-Code:
liefert also 3
SELECT MAX(Pos) FROM Rechnungsdaten WHERE Rechnungsdaten.RechNr = 1
Die Abfrage
SQL-Code:
2
SELECT MAX(Pos) FROM Rechnungsdaten WHERE Rechnungsdaten.RechNr = 2
und die Abfrage
SQL-Code:
NULL.
SELECT MAX(Pos) FROM Rechnungsdaten WHERE Rechnungsdaten.RechNr = 3
Das kannst du dann abfangen und dann den Wert 1 setzen. |
Re: PosNummern in Rechnungsdaten
Hallo Lombi,
ein etwas anderer Ansatz. Warum merkst du dir während der Bearbeitung der Positionen die bisherige Anzahl in einer Variablen oder lade gleiche alle Positionen in eine Liste. Dann kannst du beim Speichern gleich neu durchnumerieren und hast beim Löschen von Positionen keine Lücken. Heiko |
Re: PosNummern in Rechnungsdaten
@mkinzler
Ich habe den SQL.Text in der function PosNr nochmals überarbeit, aber es will einfach nicht funktionieren. In den Rechnungen haben alle gespeicherten Artikel die PosNr 1.0 oder die Artikel starten z.B ab PosNr 6.0 ... @hoika Ich möchte vorerst keine Positionen bearbeiten. Zunächst muß eine Rechnung mit den Artikeln eingeben und gespeichert werden. Oder habe ich etwas mißverstanden? Soll ich etwa für die PosNr eine neue Tabelle anlegen? Gruß Lombi |
Re: PosNummern in Rechnungsdaten
Versuchs mal so
Delphi-Quellcode:
function PosNr(fldName, tblName: String; RechNr: Integer): Integer;
begin with TQuery.Create do begin DatabaseName := QueryRechnungen.DatabaseName; SQL.Text := 'SELECT MAX(Pos) FROM Rechnungsdaten WHERE Rechnungsdaten.RechnungsNr = RechNr'; Open; if not Fields[0].isNull then Result := succ(Fields[0].AsInteger) else Result := 1; Close; end; |
Re: PosNummern in Rechnungsdaten
Ist mir echt peinlich, aber wieder Fehlanzeige!
|
Re: PosNummern in Rechnungsdaten
Dann schau mal was Field[0] für ein Wert hat.
|
Re: PosNummern in Rechnungsdaten
Hi.
Guck Dir das mal an, wie ich es löse. Ich verwende zwar ADS, aber mit Paradox sollte es auch gehen. Zunächst brauchst Du zwei Funktionen (das vereinfacht es später, den Aufruf woanders zu wiederholen). Die erste kapselt einfach nur den Aufruf des SQLs. "AsInteger" gibt immer einen Wert zurück, auch wenn noch kein Datensatz existiert, also hast Du automatisch die aktuelle Positionsnummer (im ersten Fall NULL --> 0 --> +1 = 1). Die "GlobaleQry" (bei Dir also eine TQuery) muss mit dem Database verbunden werden. Sie dient mir in vielerlei Hinsicht. Dies ist eins davon.
Delphi-Quellcode:
In dieser Funktion wird der SQL zusammengebaut.
function TDataModul.NaechsteNummerErmitteln(SQLString, FeldName: String): Integer;
begin GlobaleQry.Close; GlobaleQry.SQL.Clear; GlobaleQry.SQL.Add(SQLString); GlobaleQry.Open; Result := GlobaleQry.FieldByName(FeldName).AsInteger + 1; GlobaleQry.Close; end;
Delphi-Quellcode:
Somit kannst Du nun anfangen, die Nummern zu ermitteln.
function TDataModul.NaechsteNummerErmitteln(Tabelle, FeldName, BedingungsFeld, BedingungsWert: String; BedingungsFeldIsString: Boolean = False): Integer;
begin if BedingungsFeldIsString then Bedingungswert := '''' + Bedingungswert + ''''; result := NaechsteNummerErmitteln('Select max(' + FeldName + ') NUMM from ' + Tabelle + ' where ' + BedingungsFeld + ' = ' + BedingungsWert, 'NUMM'); end;
Delphi-Quellcode:
Mittlerweile bin ich bei fünf Funktionen, die sich mit der Ermittlung der nächsten fortlaufenden Nummer und der Ermittlung von Lücken befassen.
procedure TFormIrgendo.RechnungTblAfterInsert....
begin ... DataModul.RechnungTblPositionsnummer.AsInteger := NaechsteNummerErmitteln('Rechnung', 'Positionsnummer', 'Rechnungsnummer', RechnungTblRechnungsnummer.AsInteger); ... end; Ist also quasi ausgereift. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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-2025 by Thomas Breitkreuz