type TBuchung = record lfd: integer; art: char; // 'Z'=Zahlung. Alles andere: Abzüge usd: double; eur: double; kurs: double; rest_usd: double; end; procedure TForm1.Button2Click(Sender: TObject); procedure Dump(buchungen: array of TBuchung); var i: integer; buchung: TBuchung; marker: Char; vorzeichen: integer; begin for i := Low(buchungen) to High(buchungen) do begin buchung := buchungen[i]; {$REGION '"Circa" Marker (u) setzen'} if (buchung.art <> 'Z') and (buchung.rest_usd < 0) then begin if CompareValue(buchung.kurs, 0.0) = 0 then marker := '?' else marker := '~'; end else marker := ' '; // "circa" marker {$ENDREGION} if (buchung.art <> 'Z') then vorzeichen := -1 else vorzeichen := 1; memo1.Lines.Add(Format('%d %s %8.2f %8.2f%s %8.2f%s %8.2f', [buchung.lfd, buchung.art, buchung.usd*vorzeichen, buchung.eur*vorzeichen, marker, buchung.kurs, marker, buchung.rest_usd])); end; memo1.Lines.Add('----------'); end; var buchungen: array[0..5] of TBuchung; i, j: Integer; restschuld: Double; tmp: Double; abzug: Double; begin {$REGION 'Testdaten erzeugen'} buchungen[0].lfd := 1; buchungen[0].art := 'Z'; buchungen[0].usd := 100.00; buchungen[0].eur := 100.00 * 0.7; buchungen[1].lfd := 2; buchungen[1].art := 'Z'; buchungen[1].usd := 50.00; buchungen[1].eur := 50.00 * 0.8; buchungen[2].lfd := 3; buchungen[2].art := 'C'; buchungen[2].usd := 310.00; buchungen[3].lfd := 4; buchungen[3].art := 'C'; buchungen[3].usd := 20.00; buchungen[4].lfd := 5; buchungen[4].art := 'Z'; buchungen[4].usd := 90.00; buchungen[4].eur := 90.00 * 0.9; buchungen[5].lfd := 6; buchungen[5].art := 'Z'; buchungen[5].usd := 80.00; // bei $90 geht alles auf. Bei <$90 bleiben Schulden offen. buchungen[5].eur := buchungen[5].usd * 0.6; {$ENDREGION} {$REGION 'Berechnen'} // 1. "kurs" setzen (für Z) for i := Low(buchungen) to High(buchungen) do begin if buchungen[i].art <> 'Z' then continue; buchungen[i].kurs := buchungen[i].eur / buchungen[i].usd; end; // 2. "Rest" setzen for i := Low(buchungen) to High(buchungen) do begin if buchungen[i].art = 'Z' then buchungen[i].rest_usd := buchungen[i].usd else buchungen[i].rest_usd := 0.0; end; // 3. "Kurs" berechnen (für C) for i := Low(buchungen) to High(buchungen) do begin if buchungen[i].art = 'Z' then continue; buchungen[i].kurs := 0; restschuld := buchungen[i].usd; for j := Low(buchungen) to High(buchungen) do begin if buchungen[j].art <> 'Z' then continue; if CompareValue(buchungen[j].rest_usd, 0) = 0 then continue; tmp := restschuld; restschuld := restschuld - Min(restschuld, buchungen[j].rest_usd); abzug := Min(buchungen[j].rest_usd, tmp - restschuld); buchungen[j].rest_usd := buchungen[j].rest_usd - abzug; buchungen[i].kurs := buchungen[i].kurs + buchungen[j].kurs*(abzug/buchungen[i].usd); end; if CompareValue(restschuld, 0.0) = 1 then begin if CompareValue(restschuld, buchungen[i].usd) = 0 then buchungen[i].kurs := 0.0 // nicht definierbar! else buchungen[i].kurs := buchungen[i].kurs * (buchungen[i].usd / restschuld); // circa buchungen[i].rest_usd := -restschuld; end; end; // 4. "eur" setzen für 'C' anhand der neuen "kurs" for i := Low(buchungen) to High(buchungen) do begin if buchungen[i].art = 'Z' then continue; buchungen[i].eur := buchungen[i].usd * buchungen[i].kurs; end; {$ENDREGION} memo1.Clear; Dump(buchungen); end;