![]() |
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 |
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:
und die zweite unit:
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;
Delphi-Quellcode:
Ich kann leider nicht erkennen, wo ich noch was anpassen müsste.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 VG Emilio |
Re: komplexe Berechnungen von abhängigen Datenbankfeldern
Emilio,
der Compiler meckert wohl zu Recht: Zitat:
marabu |
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 |
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 |
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 |
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 |
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? |
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! |
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:
und die Kalk-Unit:
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;
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 04:20 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