2.7k Aufrufe
Gefragt in Datenbanken von Mitglied (335 Punkte)
Hallo,

ich fürchte, ich muss heute gleich 2x fragen.

Ich erhalte Zahlungen, die sich auf ein Projekt oder Annex mit n Bestellnummern beziehen.

Diese Summe muss aber auf die Bestellnummern verteilt werden.

In Excel ist mir das einfach gelungen aber in Access weiß ich leider nicht, wie das geht.

Dieser Summenbetrag befindet sich in einer Textbox txt_Down_Payment. Wenn z. B. der Wert 1000 EUR für Projekt 1 vorgesehen ist, dann muss dieser Betrag auf alle Maschinen verteilt werden, die im Projekt 1 sind.

Sollte es Differenzen geben, so habe ich in Excel immer den zu niedrigen oder höheren Betrag auf die letzte Maschine im Projekt gerechnet. Sowas würde mir für Acces auch erst mal reichen.

Hättet Ihr vielleicht einen Tip?

Gruß

Peter

8 Antworten

0 Punkte
Beantwortet von marie Experte (2k Punkte)
Ich verstehe Dein Problem nicht. Wie hast Du es denn in Excel gemacht, was jetzt in Access nicht mehr geht?

Sollen die Einzelbeträge abgespeichert werden? Dann doch wohl gleich bei der Eingabe durch einen Code beim aktualisieren? Also zählen auf wie viele Maschinen der Betrag verteilt werden muss, den Betrag teilen, runden, und eintragen auf alle Maschinen, dann nochmal addieren und Differenzbetrag auf die letzte Maschine aufteilen. So hast Du es doch in Excel auch gemacht?

Oder hab ich was falsch verstanden?

Gruß marie
0 Punkte
Beantwortet von Mitglied (335 Punkte)
Hallo Marie,

in Excel habe ich es wie folgt gelöst.

Der Summenbetrag wurde auf einem Extra sheet erfasst und in einem anderen Sheet standen die Bestellnummern mit den einzelnen DDU Preisen pro Maschine. Einfaches teilen des Gesamtbetrages durch die Anzahl der Maschinen ist nie möglich gewesen weil diese verschiedene Merkmale haben. Deshalb habe ich die Formel immer nach "oben" sehen lassen. Also die Formel hat geprüft, ob weiter oben die Summe des erhaltenen Betrages schon aufgebraucht wurde. Im Grunde genommen ist das nichts weiter gewesen als die Summe der Werte des Projektes minus den bereits ausgegebenen Betrag. War nicht genügend Geld übrig, so wurde der Restbetrag auf die letzte Maschine gerechnet. Es spielte dabei keine Rolle, ob die Maschine vollständig bezahlt wurde oder nicht. Es ging nur darum, den gezahlten Betrag komplett zu verteilen.

Mir persönlich wäre es am liebsten, wenn die Summe, die für ein Projekt gezahlt wurde, sofort auf die Einzelwerte verteilt und gespeichert werden würde. Ein VBA Code wäre hier wahrscheinlich das Richtige, nur das eine Gleichverteilung nicht möglich ist.

Ich hoffe, dass es jetzt klarer beschrieben ist.

Danke für Deine Antwort.

Peter
0 Punkte
Beantwortet von rahi Experte (1.4k Punkte)
Hallo Peter,

hier mein spontaner Vorschlag. Erzeuge ein Formular mit einem Listbox-Feld für die Bestellnummern mit (erw.) Mehrfachauswahl, einem Betragfeld für die Zahlung und einem Button für die Aktion. Im Click-Event holst du alle Bestellnummern aus der Listbox raus und teilst den Betrag in einer variablen (soll eigentlich auf ganze Euro oder auf Cent gerundet werden?) durch die Anzahl der gelesenen Bestellnummern. Danach öffnest du ein Recordset mit einem where-Kriterium mit einer IN-Konstruktion und einer Kommaliste der Bestellnummern und weist den Betragfeld in einer while not rec.eof-Schleife den berechneten Teilwert zu. Für den letzten Record musst du dir noch was einfallen lassen, wie du den Rundungsrest verarbeitest. Hast du dir das so in etwa vorgestellt?

Gruß
Ralf

p.s. Wäre www.supportnet.de/t/2218049 nicht auch was für dich...
0 Punkte
Beantwortet von Mitglied (335 Punkte)
Hallo Ralf,

nein so leicht ist eben nicht :), weil eine Gleichverteilung der Preise nicht gegeben ist.

Ein Beispiel erläutert das vielleicht.

Ich habe ein Projekt P1 mit OrdNos 1-5. Die OrdNos haben aber unterschiedliche Preise, weil sie unterschiedliche Eigenschaften haben.

D. h.

P1 OrdNo 1 Preis 2
P1 OrdNo 2 Preis 5
P1 OrdNo 3 Preis 3
P1 OrdNo 4 Preis 2
P1 OrdNo 5 Preis 7
Total 19
Nun erhalte ich eine Zahlung von 18 für das Projekt P1.

D. h.

P1 OrdNo 1 Preis 2 Zahlung 2
P1 OrdNo 2 Preis 5 Zahlung 5
P1 OrdNo 3 Preis 3 Zahlung 3
P1 OrdNo 4 Preis 2 Zahlung 2
P1 OrdNo 5 Preis 7 Zahlung 6
Total 19 Total 18

Den verbleibenden Betrag habe ich in EXCEL immer auf die letzte OrdNo verteilt. Das ist kein MUSS, zeigt aber, dass das Geld für die Maschine nicht total fehlt, sondern nur noch ein Restbetrag nachgezahlt werden muss. Sollte eine bessere Lösung existieren, dann würde ich sie berücksichtigen.

Das Problem liegt wirklich in den unterschiedlichen Preisen.

Gruß

Peter
0 Punkte
Beantwortet von rahi Experte (1.4k Punkte)
Hallo Peter,

bei so einer guten Erklärung ist ein Beispielcode (pur, ohne Fehlerverarbeitung) fällig:
Private Sub PreisZuordnung_Click()

Dim rec As New ADODB.Recordset
Dim Preis As Long
Dim zahlung As Long

Preis = Me!Preis
rec.Open "SELECT * FROM tabelle1 where ProjektNr = '" & Me!ProjektNr & "' ORDER BY OrdNo", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
While Not rec.EOF
zahlung = rec!Preis - rec!zahlung
If zahlung > 0 And zahlung <= Preis Then
rec!zahlung = rec!zahlung + zahlung
rec.Update
Preis = Preis - zahlung
ElseIf zahlung > 0 Then
rec!zahlung = rec!zahlung + Preis
rec.Update
Preis = 0
End If
rec.MoveNext
Wend
rec.Close

End Sub

Wie immer musst du die Tabellenfelder deinen Bedürfnissen anpassen. Der Algorithmus ist so konstruiert, dass du auch 3x die Zahlung 7 dem Projekt zuordnen kannst. Er füllt dann die Zahlungsfelder korrekt auf. Falls zuviel bezahlt wird, können wir ja im letzten Schritt die Überweisung auf mein Konto einbauen ;-), denn der zuviel bezahlte Betrag wird hier einfach nur verschluckt. Da wäre zumindest eine Warnung angebracht. Passt's?

Gruß
Ralf
0 Punkte
Beantwortet von Mitglied (335 Punkte)
Guten Abend Ralf,

also diesen Code muss man sich auf der Zunge zergehen lassen.

Du hast mich mal wieder total begeistert.

Er funktioniert einfach super und ordnet sogar Nachzahlungen richtig zu.

Nur noch eine kurze Frage.

Um mit Kommastellen zu rechnen muss ich die Deklaration noch auf Double ändern, korrekt?

Kann das erst Morgen Abend nachprüfen, aber für das Wochenende steht das andere Thema an, was ich noch bearbeiten muss.

Nochmals Danke für Deine tolle Hilfe.

Gruß

Peter
0 Punkte
Beantwortet von rahi Experte (1.4k Punkte)
Hallo Peter,

die Umstellung auf Double ist Voraussetzung, auf jedenfall in der Tabelle. Im Code selbst hast du dann mit Rundungsungenauigkeiten zu tun. Beispiel: Du hast 10.000€ aufzusteilen auf drei Posten.. Fall 1 : du ordnest jeden Posten 3.333,333333333 zu, nicht wirklich prickelnd. Bei diesen Beträgen würde ich wahrscheinlich eher zwei mal 3.333€ und einmal 3.334€ zuordnen. Dazu experiementiere mal mit der Funktion Cint: cint(10000/3) ergibt 3.333, cint(10000*100/3)/100 ergibt 3.333,33.

Gruß
Ralf
0 Punkte
Beantwortet von rahi Experte (1.4k Punkte)
Hallo Peter,

Vergiss die Sache mit cint, das brauchst du bei meiner Lösung gar nicht, sorry.

Gruß Ralf
...