Registriert seit: 14. Dez 2003
65 Beiträge
|
Re: komplexe Berechnungen von abhängigen Datenbankfeldern
17. Feb 2006, 23:53
Hi @all,
so funzt es, wenn alles in der UnitMain untergebracht ist:
Delphi-Quellcode:
interface
...
procedure DBLookupComboBox1CloseUp(Sender: TObject);
procedure cxTextEdit1KeyPress(Sender: TObject; var Key: Char);
procedure cxLookupComboBox1PropertiesCloseUp(Sender: TObject);
function f_bpneu(ekneu: Extended; zuschlag: Extended): Extended;
function f_ekaender(ekneu: Extended; EKAlt: Extended): Extended;
function f_bpaender(bpneu: Extended; BPAlt: Extended): Extended;
function f_lvpneu(ekneu: Extended): Extended;
function f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended;
function f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended;
function f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended): Extended;
function f_margeEneu(ekneu: Extended; lvpneu: Extended): Extended;
function f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
function f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
function f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
function f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Extended): Extended;
function f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended;
...
implementation
var
ekneu, zuschlag, bpneu, EKAlt, ekaender, BPAlt, bpaender, lvpneu, LVPAlt, lvpaender, bruttolvpneu,
MwSt, BruttoLVPAlt, bruttolvpaender, margeEneu, MargeEAlt, margeEaender, margeprozneu,
margeprozaender, provlvpneu, ProvSatz, provlvpaender, ProvLVPAlt : Extended;
...
function TForm1.f_bpneu(ekneu: Extended; zuschlag: Extended): Extended;
begin
Result := ekneu + (ekneu * zuschlag / 100);
end;
function TForm1.f_ekaender(ekneu: Extended; EKAlt: Extended):Extended;
begin
Result := ((ekneu/EKAlt)-1)*100;
end;
function TForm1.f_bpaender(bpneu:Extended; BPAlt: Extended):Extended;
begin
Result := ((bpneu/BPAlt)-1)*100;
end;
function TForm1.f_lvpneu(ekneu: Extended):Extended;
begin
Result := ekneu/55*100;
end;
function TForm1.f_lvpaender(lvpneu: Extended; LVPAlt: Extended): Extended;
begin
Result := lvpneu-LVPAlt;
end;
function TForm1.f_bruttolvpneu(lvpneu: Extended; MwSt: Extended): Extended;
begin
Result := lvpneu + (lvpneu*MwSt/100);
end;
function TForm1.f_bruttolvpaender(bruttolvpneu: Extended; BruttoLVPAlt: Extended):Extended;
begin
Result := ((bruttolvpneu/BruttoLVPAlt)-1)*100;
end;
function TForm1.f_margeEneu(ekneu: Extended; lvpneu: Extended): Extended;
begin
Result := lvpneu-ekneu;
end;
Function TForm1.f_margeEaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
begin
Result := margeEneu-MArgeEAlt;
end;
Function TForm1.f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
begin
Result := (1-(ekneu/lvpneu))*100;
end;
function TForm1.f_margeprozaender(margeEneu: Extended; MargeEAlt: Extended): Extended;
begin
Result :=((margeEneu/MargeEAlt)-1)*100;
end;
function TForm1.f_provlvpneu(bpneu: Extended; lvpneu: Extended; ProvSatz: Extended): Extended;
begin
Result := (lvpneu-bpneu)*ProvSatz/100;
end;
function TForm1.f_provlvpaender(provlvpneu: Extended; ProvLVPAlt: Extended): Extended;
begin
Result := ((provlvpneu/ProvLVPAlt)-1)*100;
end;
procedure TForm1.cxLookupComboBox1PropertiesCloseUp(Sender: TObject);
begin Beispielwerte
ekneu := StrToFloat(cxTextEdit1.Text); 1000,00
zuschlag := StrToFloat(cxLookupComboBox1.Text); 10,00
bpneu := f_bpneu(ekneu, zuschlag); 1100,00
EKAlt := qrypli.Fieldbyname('EK').AsFloat; 900,00
ekaender := f_ekaender(ekneu, EKalt); 11,11 (%)
BPAlt := qrypli.Fieldbyname('BP').AsFloat; 980,00
bpaender := f_bpaender(bpneu, BPAlt); 12,24 (%)
lvpneu := f_lvpneu(ekneu); 1818,18
LVPAlt := qrypli.Fieldbyname('LVP').AsFloat; 1600,00
lvpaender := f_lvpaender(lvpneu, LVPAlt); 218,18
MwSt := qrypli.Fieldbyname('MwStSatz').AsFloat; 16,00
bruttolvpneu := f_bruttolvpneu(lvpneu, MwSt); 2109,09
BruttoLVPAlt := qrypli.Fieldbyname('BruttoLVP').AsFloat; 1856,00
bruttolvpaender := f_bruttolvpaender(bruttolvpneu, BruttoLVPAlt); 13,64 (%)
margeEneu := f_margeEneu(ekneu, lvpneu); 818,18
MargeEAlt := qrypli.Fieldbyname('MARGE').AsFloat; 700,00
margeEaender := f_margeEaender(margeEneu, MargeEAlt); 118,18
margeprozneu := f_margeprozneu(ekneu, lvpneu); 45,00 (%)
margeprozaender := f_margeprozaender(margeEneu, MargeEAlt); 16,88 (%)
ProvSatz := qrypli.Fieldbyname('PSatz').AsFloat; 5,00
provlvpneu := f_provlvpneu(bpneu, lvpneu, ProvSatz); 35,91
ProvLVPAlt := qrypli.Fieldbyname('ProvLVP').AsFloat; 31,00
provlvpaender := f_provlvpaender(provlvpneu, ProvLVPAlt); 15,84 (%)
cxTextEdit1.Text := Format('%8.2f', [ekneu]);
cxLabel14.Caption := Format('EUR ' + '%8.2f', [bpneu]);
cxLabel15.Caption := Format('%4.2f', [ekaender]) + '%';
cxLabel18.Caption := Format('%4.2f', [bpaender]) + '%';
cxTextEdit5.Text := Format('EUR ' + '%8.2f', [lvpneu]);
cxLabel19.Caption := Format('%m', [lvpaender]);
cxTextEdit4.Text := Format('EUR ' + '%8.2f', [bruttolvpneu]);
cxLabel24.Caption := Format('%4.2f', [bruttolvpaender]) + '%';
cxTextEdit2.Text := Format('EUR ' + '%8.2f', [margeEneu]);
cxLabel25.Caption := Format('%m', [margeEaender]);
cxTextEdit3.Text := Format('%5.2f', [margeprozneu]) + '%';
cxLabel26.Caption := Format('%4.2f', [margeprozaender]) + '%';
cxTextEdit6.Text := Format('EUR ' + '%8.2f', [provlvpneu]);
cxLabel27.Caption := Format('%4.2f', [provlvpaender]) + '%';
unschön ist noch :
- das Feld cxTextEdit1, in welches der ekneu vom user eingetragen wird, sollte nach dem Eintragen formatiert werden ('EUR' + '%8.2f'); krieg ich aber(noch) nicht hin, da ich diesen Wert ja roh brauche.
- der Wert [ekaender] sollte besser als OnChange- oder OnEditValueChanged-Event(in cxTextEdit1) erscheinen - also aus der Combobox-procedure raus - krieg ich auch noch hin ...
jetzt kommt's:
Wie bereits erwähnt, kann es sein, dass der User mit dem lvpneu nicht einverstanden ist und diesen überschreibt. Dann sollten sich 10 Werte ändern (alle außer (ekneu), (bpneu), (ekaender), [bpaender]). Womöglich will er aber auch eine "fixe" Marge vorgeben und nur einen lvpneu ...
Also ich erkenne die Anforderungen, den Kram aufzusplitten als notwendig an.
Als erstes versuche ich jetzt den Code so umzustricken, dass er dem Beispiel von Marabu folgt und ich erkenne was ich im ersten Anlauf versaubeutelt habe.
Der Saft sei mit mir!
VG
Emilio
|