Hallo Sibylle
vorneweg: der Verweis auf die DAO-Library war’s offensichtlich
ist oft so…
Erklär mal den Algorithmus der Berechnung des Provisionssatzes
Algorithmus ist gut - das ist „gewachsen“…
Veranstaltungsverkäufer-Provisionen.
Es gibt unterschiedliche Veranstaltungstypen mit jeweils
eigenen Provisionssätzen und Staffelstufen. Welche Stufe
herangezogen wird, ist von der erzielten Summe über alle
Veranstaltungen eines Tages abhängig.
Das ist es im Prinzip…
…nur daß es da noch „Schallmauern“ bei einigen
Veranstaltungen gibt, deren Überschreitung für alle
Veranstaltungen des Tages die nächsthöhere Staffelstufe für
die Provisionsberechnung bedeutet…
…und Kundengruppen, die einen prozentualen Ab- oder
Aufschlag auf den Provisionssatz bei ihren eigenen
Bestellungen/die ganze Veranstaltung/den ganzen Tag bedeuten
(das kommt bisher darauf an, wer die Provisionsberechnung
bearbeitet - aber „man denkt da mal drüber nach“…)…
…und daß sich die Provisionssätze alle naselang ändern, die
endgültigen Summen aber auch mal erst ein Jahr später
feststehen…
ok, versteh ich nicht wirklich ;-() Geeigneter wäre, den Tabellenaufabu zu beschreiben…
Aber ich hab da noch ein paar Details:
suchDatum As Date, fuerSumme As Double) As Double 'unbedingt
Double oder Currency benutzen
Dim ergebnis As Currency ’ dito
wieso?
Ich will doch Prozentwerte übergeben!?
Was soll denn „Prozentwerte“ heißen?
Real-Zahlen von 0,00 bis 100,00 ?
Die mußt Du auch berechnen und dabei bedenken, dass dadurch Summierungen und Divisionen entstehen. Der Datentyp „Single“ hat eine Genauigkeit von insgesamt 7 Stellen, d.h. man kann
0,000001 oder 99999,99 € z. B. GENAU darstellen und damit rechnen.
Wenn es aber ein paar Summierungen und Divisionen gibt, nehmen Rundungsfehler rapide zu und hinterher wundert man sich, wo denn nur der eine Cent geblieben ist 
Double (Gleitkommazahl) hat eine Genauigkeit von 15 Stellen, was für viele Berechnungen ausreichend sein sollte.
Currency (Währung, Festkommazahl) hat 8 Byte Länge mit 4 Stellen Genauigkeit hinter dem Komma.
’ Datum in US-Format umwandeln
Datum = Month(suchDatum) & „/“ & Day(suchDatum) & „/“ &
Year(suchDatum)
'das ist kein US-Datum, die # fehlen
die sind im (testhalber rausgeschmissenen) SQL-String
eingebaut - das war quick-and-dirty, weil ich diesen
Typen-Fehler hatte
Datum = format(suchDatum,"#mm/dd/yyyy#")
so stand’s da mal und tut’s auch wieder
'ich bevorzuge das ISO-Datum:
Datum = format(suchDatum,"#yyyy-mm-dd#")
die Access-Hilfe sagte „US-Datum“…
ja, die verschweigt halt das ISO-Format, US- geht ja auch, lediglich ich bevorzuge ISO…
statt Sternchen besser die Feldliste nehmen…und sortieren!
der komplette SQL-String ist unwesentlich länger - siehe
„Algorithmus“ 
es braucht nicht die komplette Feldliste sein, es reichen die Felder, die für Berechnungen benötigt werden. Selbst die Felder für die Where-Condition brauchen nicht in der Select-Liste aufgeführt zu sein.
ergebnis = rs(3) ’ 4.Feld ist was ?
ein Prozent-Wert
naja, offensichtlich soll es ein Feld mit Datentyp Single sein
, das ist klar, aber welche Bedeutung und welchen Namen hat das Feld? In der Select-Liste ist ja keine Reihenfolge vorgegeben, so dass es sich um das 4. Feld in der Ordinal-(Reihenfolge) der Tabelle handelt.
if Not rs.EOF Then ’ überflüssig
rs.MoveNext
Else
Exit Do
End If ’ überflüssig , unsinnig
pure Verzweiflung…
naja…
'vermutlich haut’s die Schleife kaputt, wenn kein DS vorhanden
ist.
Ja, eben…
Deshalb besser so:
Do Until rs.EOF
if rs(„abSumme“) > fuerSumme then
ergebnis = rs(3)
Exit Do
End If
rs.MoveNext
Loop
Die if-Bedingung brauche ich anders (hab ich), aber ich
verstehe nicht, warum ich das extra abfragen muß und nicht in
der Do-Bedingung mit OR unterbringen kann…?
weil dann in der DO-Bedingung ein Fehler entsteht. Es wird ja beim Ausführen des Statements gleichzeitig die Bedingung und auf rs.EOF geprüft. Bei nur rs.EOF wird ERST gecheckt, ob DS vorhanden sind, DANN werden vorhandene Werte geprüft.
rs.Close 'das ist sehr gut
Set rs = Nothing 'dito 
oh - danke…
das hat mir ein tobender Server-Admin auf alle Zeiten
eingebleut… *ggg*
Da hat er was Gutes getan… 
vermutlich lässt sich das GAnze mit einem Einzeiler schreiben:
ProvisionsSatzErmitteln =Currentdb.Openrecordset(„SELECT
Provisionssatz FROM ProvisionsSaetze where [abSumme] > " &
fuerSumme & " order by absumme“, dbOpenShnapshot)(0)
So nicht…
a) bräuchte ich "MAX von [absumme] WHERE ([abSumme] " &
fuerSumme & " order by absumme", dbOpenShnapshot)(0)
und
b) gibt’s da noch die neckischen Anpassungen der Staffelstufen
die sind sicher auch als SQl-String zu schreiben. Ansonsten kannst Du eine vorab erstellte und gespeicherte Abfrage mit irgendwelchen Berechnungen/Gruppierung auch in einem SQL-String benutzen:
Select irgendwas from abf_Abfrage where IrgendeinFeld=Irgendwas
Alles in allem danke ich Dir vielmals
Bitte sehr…
und viel Erfolg.
Gruß
Franz, DF6GL