Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi komplexe Berechnungen von abhängigen Datenbankfeldern (https://www.delphipraxis.net/63021-komplexe-berechnungen-von-abhaengigen-datenbankfeldern.html)

marabu 15. Feb 2006 10:43

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Emilio, du wirst doch die Signatur von CalcRule01() an deine geänderten Bedürfnisse angepasst haben? A war bei meinem Beispiel ja noch Extended...

marabu

Emilio 15. Feb 2006 11:04

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Ups, hab ich mich doch verschrieben, ich meinte

die Variablen a = zuschlag und b = ProvSatz

sind als Integer deklariert, da sie solche sind.

Ich stell mal den neuen Code rein:

Unit Main:

Delphi-Quellcode:
procedure TForm1.cxLookupComboBox1PropertiesCloseUp(Sender: TObject);

var
  ekneu, bpneu, lvpneu , margeEneu, margeprozneu , provlvpneu, bruttolvpneu, bpaender, lvpaender, bruttolvpaender, BPALT, LVPAlt, BruttoLVPAlt : Extended;
  zuschlag, ProvSatz : Integer;
begin
  ekneu := StrToFloat(cxTextEdit1.Text);  
  BPAlt := StrToFloat(cxDBLabel5.Caption);
  LVPAlt := StrToFloat(cxDBLabel9.Caption);
  BruttoLVPAlt := StrToFloat(cxLabel17.Caption);
  ProvSatz := StrToInt(cxDBLabel13.Caption);
  zuschlag := StrToInt(cxLookupComboBox1.Text);

  CalcRule01(ekneu, bpneu, lvpneu, margeEneu, margeprozneu, provlvpneu, bruttolvpneu, bpaender, lvpaender, bruttolvpaender, BPALT, LVPAlt, BruttoLVPAlt, ProvSatz, zuschlag);

  cxLabel14.Caption := Format('EUR ' + '%8.2f', [bpneu]);
  cxTextEdit5.Text := Format('EUR ' + '%8.2f', [lvpneu]);
  cxTextEdit2.Text := Format('EUR ' + '%8.2f', [margeEneu]);
  cxTextEdit3.Text := Format('%5.2f', [margeprozneu]) + '%';
  cxTextEdit6.Text := Format('EUR ' + '%8.2f', [provlvpneu]);
  cxTextEdit4.Text := Format('EUR ' + '%8.2f', [bruttolvpneu]);
  cxLabel18.Caption := Format('%4.2f', [bpaender]) + '%';
  cxLabel19.Caption := Format('%4.2f', [lvpaender]) + '%';
  cxLabel24.Caption := Format('%4.2f', [bruttolvpaender]) + '%';
end;
und die zweite unit:

Delphi-Quellcode:

unit Kalk;

interface

procedure CalcRule01(EKAlt,BPAlt,LVPAlt,BruttoLVPAlt,MargeEAlt, MargeProzAlt, ProvLVPAlt, MwSt: Extended;
   zuschlag,ProvSatz: Integer;
   var ekneu, bpneu,lvpneu,margeEneu,margeprozneu,provlvpneu,bruttolvpneu,bpaender,lvpaender,bruttolvpaender,
   ekaender, margeEaender, margeprozaender, provlvpaender: Extended);

implementation

function f_bpneu(ekneu: Extended; zuschlag: Integer): Extended; forward;
function f_lvpneu(ekneu: Extended): Extended; forward;
function f_margeEneu(ekneu: Extended; lvpneu: Extended):Extended; forward;
function f_margeprozneu(ekneu: Extended; lvpneu: Extended):Extended; forward;
function f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Integer):Extended; forward;
function f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended; forward;
function f_ekaender(ekneu: Extended; EKAlt: Extended): Extended; forward;
function f_bpaender(bpneu: Extended; BPAlt: Extended): Extended; forward;
function f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended; forward;
function f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended): Extended; forward;
function f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended; forward;
function f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended; forward;
function f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended; forward;

function f_bpneu(ekneu: Extended; zuschlag: Integer): Extended;
  begin
    Result := ekneu + (ekneu * zuschlag / 100);
  end;

function f_lvpneu(ekneu: Extended): Extended;
  begin
    Result := ekneu/55*100;
  end;

function f_margeEneu(ekneu: Extended; lvpneu: Extended): Extended;
  begin
    Result := lvpneu-ekneu;
  end;

function f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
  begin
    Result := (1-(ekneu/lvpneu)*100);
  end;

function f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Integer): Extended;
  begin
    Result := (lvpneu-bpneu)*ProvSatz/100;
  end;

function f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended;
  begin
    Result := lvpneu+(lvpneu*MwSt/100);
  end;
 
function f_ekaender(ekneu: Extended; EKAlt: Extended): Extended;
  begin
    Result := (ekneu/EKAlt-1)*100;
  end;

function f_bpaender(bpneu: Extended; BPAlt: Extended): Extended;
  begin
    Result := (bpneu/BPAlt-1)*100;
  end;

function f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended;
  begin
    Result := (lvpneu/LVPAlt-1)*100;
  end;

function f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended): Extended;
  begin
    Result := (bruttolvpneu/BruttoLVPAlt-1)*100;
  end;

function f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
  begin
    Result := (margeEneu-MargeEAlt);
  end;

function f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
  begin
    Result := (margeEneu/MargeEAlt-1)*100;
  end;

function f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended;
  begin
    Result := (provlvpneu/ProvLVPAlt-1)*100;
  end;

procedure CalcRule01(EKAlt,BPAlt,LVPAlt,BruttoLVPAlt,MargeEAlt, MargeProzAlt, ProvLVPAlt,MwSt: Extended;
   zuschlag, ProvSatz: Integer;
   var ekneu, bpneu,lvpneu,margeEneu,margeprozneu,provlvpneu,bruttolvpneu,bpaender,lvpaender,bruttolvpaender,
   ekaender, margeEaender, margeprozaender, provlvpaender: Extended);
begin
  bpneu := f_bpneu(ekneu, zuschlag);
  lvpneu := f_lvpneu(ekneu);
  margeEneu := f_margeEneu(ekneu, lvpneu);
  margeprozneu := f_margeprozneu(ekneu, lvpneu);
  provlvpneu := f_provlvpneu(bpneu, lvpneu, ProvSatz);
  bruttolvpneu := f_bruttolvpneu(lvpneu, MwSt);
  bpaender := f_bpaender(bpneu, BPAlt);
  lvpaender := f_lvpaender(lvpneu, LVPAlt);
  bruttolvpaender := f_bruttolvpaender(bruttolvpneu, BruttoLVPAlt);
  ekaender := f_ekaender(ekneu, EKAlt);
  margeEaender := f_margeEaender(margeEneu, MargeEAlt);
  margeprozaender := f_margeProzaender(margeEneu, MargeEAlt);
  provlvpaender := f_provlvpaender(provlvpneu, ProvLVPNeu);
end;

end.

//Konstanten:
// EKAlt = cxDBLabel8
// BPAlt = cxDBLabel5
// LVPAlt = cxDBLabel9
// BruttoLVPAlt = cxDBLabel17
// MargeEAlt = cxDBLabel11
// MargeProzAlt = cxDBLabel12
// ProvLVPAlt = cxDBLabel14
// MwSt = cxDBLabel16
// ProvSatz = cxDBLabel13

// Variablen
// ekneu = cxTextEdit1
// zuschlag = cxLookupCombobox1
// bpneu = cxLabel14
// lvpneu = cxTextEdit5
// bruttolvpneu = cxTextEdit4
// margeEneu = cxTextEdit2
// margeprozneu = cxTExtEdit3
// provlvpneu = cxTextEdit6

// + die Variablen, welche die Veränderungen neu gegen alt "anzeigen" sollen
// ekaender = cxLabel15
// bpaender = cxLabel18
// lvpaender = cxLabel19
// bruttolvpaender = cxLabel24     +++ eingentlich obsolet, aberwassolls +++
// margeEaender = cxLabel25
// margeprozaender = cxLabel26
// provlvpaender = cxLabel27
Ich kann leider nicht erkennen, wo ich noch was anpassen müsste.

VG
Emilio

marabu 15. Feb 2006 11:38

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Emilio,

der Compiler meckert wohl zu Recht:

Zitat:

Zitat von Emilio
sowie die Fehlermeldung "nicht genügend wirkliche Parameter"

Die Signatur von CalcRule01() weist 24 Parameter aus, während dein Aufruf nur 15 Parameter mit Werten belegt. So geht das nicht. Noch ein kleiner Tipp: Integer-Variable nenne ich gerne iProzentSatz - das kleine i signalisiert mir den Typ. Diese Vorgehensweise erleichtert mir und anderen das Lesen in fremdem Code.

marabu

Emilio 15. Feb 2006 12:42

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Hi Marabu,

so, habs vervollständigt.

Die Fehlermeldung mit den ungenügenden Parametern ist weg.

Die Meldung "inkompatible Typen Integer und Extended" ist jetzt 2mal da und dazu die Meldung

"Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen."

Die einzigen beiden Integer-Werte sind [zuschlag] und [provSatz]; ändere ich diese auf Extended (in beiden Units an jeder Stelle) , so compiliert das Programm zwar, allerdings mit den Warnhinweisen, dass die (in Summe 9) Variablen möglicherweise nicht initialisiert worden sind.

Ist es notwendig alle Werte auf Extended einzustellen, selbst wenn sie es originär nicht sind?

Wie initialisiere ich die 9 Variablen?


Wie Du an meinen Fragen erkennen kannst, bewege ich mich auf Neuland.

VG
Emilio

marabu 15. Feb 2006 13:04

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Bei so vielen Parametern in einem Aufruf kann man schonmal die Übersicht verlieren. Es bleibt dir wohl nichts anderes übrig, als jeden Aufruf akribisch unter die Lupe zu nehmen. Jeder Parameter muss mit einem passenden Wert belegt werden, wobei du manchmal auf automatische Typanpassung durch den Compiler hoffen darfst. Einem Extended-Parameter kannst du so ungestraft einen Integer-Wert zuweisen - andersrum geht es nicht.

marabu

Emilio 15. Feb 2006 14:12

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Hi Marabu,

ich werd noch zum Elch: sofern ich einen der originären Werte auf Integer stelle, scheitert die Kompilierung mit der Meldung: "inkompatible blabla ; die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen."

Stelle ich alle Wert auf Extended ein, so kompiliert das Programm mit der bekannten Warnung das 9 Variablen (bpneu, lvpneu, margeEneu, margeprozneu, provlvpneu, bruttolvpneu, bpaender, lvpaender, ekaender) möglicherweise nicht initialisiert worden sind.
Ich kann nicht erkennen, dass ich bei diesen Variablen irgendwie anders vorgegangen bin als bei den anderen.

Das Programm stoppt dann in dem Moment wo das ComboboxOnCloseUp-Ereignis ausgelöst werden soll mit einer Meldung "EInvalidOp" ... 'ungültige Gleitkommaoperation! ..."

Wo schuht der Drück?

VG
Emilio

Emilio 15. Feb 2006 14:27

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Die Fehlermeldung mit den möglicherweise nicht initalisierten Variablen, verschwand, nachdem ich die Reihenfolge der Funktionszuweisungen in der Unit Calc geändert habe ... freu!

Die ungültige Gleitmittel-OP bleibt leider.

VG
Emilio

Emilio 15. Feb 2006 14:45

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
Ändere ich die Funktion, auf die die Gleitkomma-Fehlermeldung verweist in eine blödsinnige (bei der keine Division erfolgt), dann passiert bei den nachfolgenden Funktionen, die eine Division enthalten dasselbe. Ändere ich all diese Funktionen in einfache, dann läuft das Programm ohne Fehler, zeigt aber in den Ergebnisfelder nur Nullen an.

Hm, da kanns doch nicht nur an den Formeln liegen, oder?

Emilio 15. Feb 2006 14:59

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
:wall: Emilio is'n Dummi! - ekneu ist ja gar keine Variable, sondern in dieser CalcRule eine Konstante ...

dafür sind jetzt möglicherweise wieder 10 Variablen nicht initialisiert und die ERgebnisfelder sind alle "0" - aaaargh!

Emilio 15. Feb 2006 20:07

Re: komplexe Berechnungen von abhängigen Datenbankfeldern
 
@ Marabu,

würde mich mächtig freuen, wenn Du Deinen geschulten Blick noch einmal auf den Code werfen könntest;

Wie durch Geisterhand sind Warnungen mit möglicherweise nichtinitialisierten Variablen verschwunden (vielleicht hat DELPHI erkannt, dass ich veredlungsresistent bin und aufgegeben ...)
Das Programm läuft sauber aber bewirkt nicht das was es sollte. Die Felder die berechneten Werte anzeigen sollen, weisen nach einigem rumprobieren und überlegen immer nur den Wert "0" aus; zwar schön formatiert, aber wertlos. Eigentlich kann es doch nur so sein, dass zum Zeitpunkt der Berechnungen, das Feld [ekneu] oder cxTextEdit1 leer ist - isses aber (zumindest optisch) nicht. Ich komme nicht dahinter!


Delphi-Quellcode:
procedure TForm1.cxLookupComboBox1PropertiesCloseUp(Sender: TObject);

var
  ekneu, bpneu, lvpneu , margeEneu, margeprozneu , provlvpneu, bruttolvpneu, ekaender, bpaender, lvpaender, bruttolvpaender, margeEaender, margeprozaender, provlvpaender,
  EKAlt,BPAlt, LVPAlt, BruttoLVPAlt, MargeEAlt, MargeProzAlt, ProvLVPAlt, MwSt, Provsatz, zuschlag : Extended;

begin
  ekneu := StrToFloat(cxTextEdit1.Text);
  EKAlt := StrToFloat(cxDBLabel8.Caption);
  BPAlt := StrToFloat(cxDBLabel5.Caption);
  LVPAlt := StrToFloat(cxDBLabel9.Caption);
  BruttoLVPAlt := StrToFloat(cxDBLabel17.Caption);
  MargeEAlt := StrToFloat(cxDBLabel11.Caption);
  MargeProzAlt := StrToFloat(cxDBLabel12.Caption);
  ProvLVPAlt := StrToFloat(cxDBlabel14.Caption);
  MwSt := StrToFloat(cxDBLabel16.Caption);
  ProvSatz := StrToFloat(cxDBLabel13.Caption);
  zuschlag := StrToFloat(cxLookupComboBox1.Text);



  CalcRule01(ekneu, bpneu, lvpneu, margeEneu, margeprozneu, provlvpneu, bruttolvpneu, ekaender, bpaender,
  lvpaender, bruttolvpaender, margeEaender, margeprozaender, provlvpaender, EKAlt, BPALT, LVPAlt, BruttoLVPAlt, MargeEAlt, MargeProzAlt,ProvLVPAlt,MwSt,
  ProvSatz, zuschlag);

 
  cxTextEdit1.Text := Format('%m', [ekneu]);
  cxLabel14.Caption := Format('EUR ' + '%8.2f', [bpneu]);
  cxTextEdit5.Text := Format('EUR ' + '%8.2f', [lvpneu]);
  cxTextEdit4.Text := Format('EUR ' + '%8.2f', [bruttolvpneu]);
  cxTextEdit2.Text := Format('EUR ' + '%8.2f', [margeEneu]);
  cxTextEdit3.Text := Format('%5.2f', [margeprozneu]) + '%';
  cxTextEdit6.Text := Format('EUR ' + '%8.2f', [provlvpneu]);
  cxLabel18.Caption := Format('%4.2f', [bpaender]) + '%';
  cxLabel19.Caption := Format('%4.2f', [lvpaender]) + '%';
  cxLabel24.Caption := Format('%4.2f', [bruttolvpaender]) + '%';
  cxLabel25.Caption := Format('%8.2f', [margeEaender]);
  cxLabel26.Caption := Format('%4.2f', [margeprozaender]) + '%';
  cxLabel27.Caption := Format('%4.2f', [provlvpaender]) + '%';

end;
und die Kalk-Unit:

Delphi-Quellcode:
interface

procedure CalcRule01(EKAlt, ekneu, BPAlt,LVPAlt,BruttoLVPAlt,MargeEAlt, MargeProzAlt, ProvLVPAlt, MwSt, ProvSatz, zuschlag: Extended;

   var bpneu,lvpneu, bruttolvpneu, margeEneu, margeprozneu, provlvpneu, ekaender, bpaender, lvpaender, bruttolvpaender,
    margeEaender, margeprozaender, provlvpaender: Extended);

implementation

function f_bpneu(ekneu: Extended; zuschlag: Extended): Extended; forward;
function f_lvpneu(ekneu: Extended): Extended; forward;
function f_margeEneu(ekneu: Extended; lvpneu: Extended):Extended; forward;
function f_margeprozneu(ekneu: Extended; lvpneu: Extended):Extended; forward;
function f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Extended):Extended; forward;
function f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended; forward;
function f_ekaender(ekneu: Extended; EKAlt: Extended): Extended; forward;
function f_bpaender(bpneu: Extended; BPAlt: Extended): Extended; forward;
function f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended; forward;
function f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended): Extended; forward;
function f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended; forward;
function f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended; forward;
function f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended; forward;

function f_bpneu(ekneu: Extended; zuschlag: Extended): Extended;
  begin
    Result := ekneu + (ekneu * zuschlag / 100);
  end;

function f_lvpneu(ekneu: Extended): Extended;
  begin
    Result := ekneu/55*100;
  end;

function f_margeEneu(ekneu: Extended; lvpneu: Extended): Extended;
  begin
    Result := lvpneu-ekneu;
  end;


function f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
  begin
    Result := (1-(ekneu/lvpneu))*100;
  end;

function f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Extended): Extended;
  begin
    Result := (lvpneu-bpneu)*ProvSatz/100;
  end;

function f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended;
  begin
    Result := lvpneu+(lvpneu*MwSt/100);
  end;
 
function f_ekaender(ekneu: Extended; EKAlt: Extended): Extended;
  begin
    Result := (ekneu/EKAlt-1)*100;
  end;

function f_bpaender(bpneu: Extended; BPAlt: Extended): Extended;
  begin
    Result := ((bpneu+BPAlt)-1)*100;
  end;

function f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended;
  begin
    Result := (lvpneu+LVPAlt-1)*100;
  end;

function f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended): Extended;
  begin
    Result := (bruttolvpneu+BruttoLVPAlt-1)*100;
  end;

function f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
  begin
    Result := (margeEneu-MargeEAlt);
  end;

function f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
  begin
    Result := (margeEneu+MargeEAlt-1)*100;
  end;

function f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended;
  begin
    Result := (provlvpneu+ProvLVPAlt-1)*100;
  end;

procedure CalcRule01(EKAlt, ekneu, BPAlt,LVPAlt,BruttoLVPAlt,MargeEAlt, MargeProzAlt, ProvLVPAlt,MwSt, ProvSatz, zuschlag: Extended;
   
   var bpneu, lvpneu, bruttolvpneu, margeEneu, margeprozneu, provlvpneu, ekaender, bpaender, lvpaender, bruttolvpaender,
   margeEaender, margeprozaender, provlvpaender: Extended);
begin
  bpneu := f_bpneu(ekneu, zuschlag);
  lvpneu := f_lvpneu(ekneu);
  bruttolvpneu := f_bruttolvpneu(lvpneu, MwSt);
  margeEneu := f_margeEneu(ekneu, lvpneu);
  margeprozneu := f_margeprozneu(ekneu, lvpneu);
  provlvpneu := f_provlvpneu(bpneu, lvpneu, ProvSatz);
  ekaender := f_ekaender(ekneu, EKAlt);
  bpaender := f_bpaender(bpneu, BPAlt);
  lvpaender := f_lvpaender(lvpneu, LVPAlt);
  bruttolvpaender := f_bruttolvpaender(bruttolvpneu, BruttoLVPAlt);
  margeEaender := f_margeEaender(margeEneu, MargeEAlt);
  margeprozaender := f_margeProzaender(margeEneu, MargeEAlt);
  provlvpaender := f_provlvpaender(provlvpneu, ProvLVPNeu);
end;

end.

:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr.
Seite 2 von 5     12 34     Letzte »    

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