e2mario
Goto Top

MSACESS 2003 DSUM Funktion

Hallo Freunde,

ich habe wieder mal ein "kleines" VBA Access 2003 Problem.
Habe einen Onlineshop gebastelt und nun möchte ich die ausgeliefertern wie auch die noch zu liefernden Artikel als Info per Email versenden.
Hierfür habe ich eine Access Tabelle im Hintergrund laufen welche wie folgt aussieht.

Tabelle:
"fakt"

Felder:
Aufrtagsnummer
Menge Original
Gelieferte Menge


Die Tabelle sieht zB wie folg aus:

Auftragsummer 10000-001
Menge Original: 100
Gelieferte Menge 30

Auftragsnummer 10000-002 (da 1. Teillieferung)
Menge Original: 100
Gelieferte Menge: 20

Auftragsnummer 10000-003 (da 2. Teillieferung)
Menge Original: 100
Gelieferte Menge: 50

In der Tabelle steht daa dann so:
Auftragsnummer Menge Original Menge Gelieferte Menge ZU LIEFERN
10000-001 100 100 30
10000-002 100 100 20
10000-003 100 100 50

Wie kann ich nun per VBA Script ermitteln welche Menge bei der jeweiligen Zeile noch zu liefern ist.
Habe es mit DSUM versucht zusammenzuzählen und dann die Differenz wieder zu ermittlen, aber komme leider nicht klar.

Hoffe ihr wisst was mein Problem ist. Ich denke ich muss hier eine Funktion schreiben, weis jedoch nicht, wie ich das angehen soll.

DANKE für eure Hilfe. - Bin leider Access "Banause" face-smile

Lg

Content-ID: 182764

Url: https://administrator.de/forum/msacess-2003-dsum-funktion-182764.html

Ausgedruckt am: 22.12.2024 um 20:12 Uhr

NetWolf
NetWolf 29.03.2012 um 18:33:29 Uhr
Goto Top
Moin Moin,

alsoooo wenn ich das richtig sehe, willst du pro Lieferung einfach berechnen, was noch zu liefern ist.

1. Lieferung
Bestellmenge = 100
Rest = 100
jetzt geliefert = 20
noch zu liefern = 80

2. Lieferung
Bestellmenge = 100
Rest = 80
jetzt geliefert = 30
noch zu liefern = 50

usw.

Wie du sehen kannst, benötigst du 4 Felder (eigentlich nur 3 Felder) um das Gewünschte zu realisieren.
Direkt bei der Eingabe werden durch einfache mathematische Berechnung die Werte ermittelt.

Wichtig ist dabei das Feld REST, dass als Basis für deine Berechnung dient.

Grüße aus Rostock
Wolfgang
(Netwolf)
LianenSchwinger
LianenSchwinger 30.03.2012 um 07:34:51 Uhr
Goto Top
Hallo,

es ist eigentlich ganz banal.
Zum Ersten würde ich die Tabelle wie folgt aufbauen. Nenne wir sie z.B. Lieferlos

Auftragsnummer / Bestellmenge / Liefermenge / Lieferdatum

Dann brauchst Du nur noch ein SQL-Statment like

select Auftragsnummer, Bestellmenge, sum(Liefermenge) GelieferteMenge, Bestellmenge-sum(Liferemenge) OffeneMenge
from Lieferlos
group by Auftragsnummer, Bestellmenge

Dannn erhälst Du als Ergebnis:

10000 / 100 / 100 / 0

Gruß Jörg
e2Mario
e2Mario 30.03.2012 um 15:18:44 Uhr
Goto Top
Danke für Eure Antworten. Leider komme ich aber auch damit nicht klar, WEIL

den Aufbau der verfügbaren Accesstabelle kann ich leider nicht ändern. Ich muss mit den Feldern rechnen die hier sind.

Das Problem ist es, wie in meinem Beispiel angegeben, wenn ich die 2. Teillieferung mache muss ich die gelieferte Menge aus dem Auftrag 10000-001 und 10000-002 zusammenzählen.
(nur zur Info: die nächste Auftragsnummern würden dann 10001-001, 10002-001, 10003-001, 100004-001 etc. lauten. Die -002 -003 -004 am Ende kennzeichnen die Teillieferung.

Hier schaffe ich es leider nicht dass ich dem "lieben Access" vermittle dass 10000-001 und 10000-002 usw. zusammengehören und er hier die gelieferte Menge addieren soll.
Ich denke mit DSUM klappt es nicht weil eben 10000-001 und 10000-002 als unterschiedliche Aufträge gesehen werden.

Halleluja, ich hoffe ich bekomme das noch irgenwie gelöst.

Für jeden Tip sage ich schon mal DANKE.
LianenSchwinger
LianenSchwinger 30.03.2012 um 15:56:57 Uhr
Goto Top
... auch kein Problem. Davon ausgehend, dass die Auftragsnummer immer 5 stellig ist ...

select substr(Auftragsnummer,1,5) Auftrag, max(to_number(substr(Auftragsnummer,7,3))) Anzahl_Teillieferungen, max(Bestellmenge) Bestellmenge, sum(Liefermenge) Gelieferte_Menge, max(Bestellmenge)-sum(Liferemenge) Offene_Menge
from Lieferlos
group by substr(Auftragsnummer,1,5)

Ergebniss wenn für Auftrag 10000 die 2. Teillieferung erfolgt ist:

10000 / 2 / 100 / 50 / 50

Gruß Jörg
e2Mario
e2Mario 31.03.2012 um 14:32:31 Uhr
Goto Top
Hallo Jörg,

danke für deine Hilfe.
Aber was meinst du bei select substr(Auftragsnummer,1,5) Auftrag, mit AUFTRAG?
Fehlermeldung: Syntaxfehler (fehlender Operator) in Abfrageausdruck 'select substr(Auftragsnummer,1,5) Auftrag'.


Schöne Grüße und schönes Wochenende
e2Mario
e2Mario 31.03.2012 um 16:54:17 Uhr
Goto Top
Na ein "Stückchen" bin ich weitergekommen.
Access verlangt anstelle von "substr" --> "mid" und dann "as Auftrag"

Au weia, ob ich das noch hinbekomme...
LianenSchwinger
LianenSchwinger 01.04.2012 um 11:46:32 Uhr
Goto Top
Hallo,

wie kommt ihr nur mit Access klar. Das ist ja eine Katastrophe wenn man von Oracle kommt.
Ich habe das Ganze jetzt mal in Access nachgestellt und komme auf folgende Lösung

SELECT Left([Auftragsnummer],5) AS Auftrag, 
               Cint(Max(Mid([Auftragsnummer],7,3))) AS Anzahl_Lieferungen, 
               Max([Original Menge]) AS Original_Menge, 
               Sum([Gelieferte Menge]) AS Gelieferte_Menge, 
               Max([Original Menge])-Sum([Gelieferte Menge]) AS Offene_Menge
FROM Fakt
GROUP BY Left([Auftragsnummer],5);
Als Ergebnis erhältst Du für jeden Auftrag eine Zeile mit der Auftragsnummer, der Anzahl von Teillieferungen, der original Menge, der schon gelieferten Menge sowie die offene Menge.

Gruß Jörg

[Edit Biber] Codetags. [/Edit]
e2Mario
e2Mario 01.04.2012 um 13:54:36 Uhr
Goto Top
Hallo Jörg,

tja ich komme eben nicht mit Access klar, das ist das Problem face-smile
Getestet und funktioniert 1A.

Ich weis das ich dich schön langsam bestimmt nerve, aber ich würde das ganze ohne Gruppierung der Auftragsnummer benötigen da ich ja am Tag der Lieferung das Email mit der noch offenen Menge senden möchte.

Das Ergebnis sollte also so sein:

10000 1 100 20 80
10000 2 100 30 50
10000 3 100 50 0

Wenn "wir" das noch schaffen, bin ich am Ziel angelangt.

Übrigends auch DANKE für deine Sonntagsarbeit. Ob die jedoch für mich bezahlbar ist? face-smile

Lg Mario
LianenSchwinger
LianenSchwinger 01.04.2012 um 15:37:10 Uhr
Goto Top
Hallo Mario,

willst Du denn immer den Stand aller Teillieferungen Mailen oder doch nur die letzte mit der noch offenen Menge?
Im 2. Fall wäre das Ergebnis mein letzter Post.

1.Fall wäre:
SELECT Left(a.[Auftragsnummer],5) AS Auftrag, 
             CInt(Mid(a.[Auftragsnummer],7,3)) AS Lieferung, 
             Max(a.[Original Menge]) AS Original_Menge, 
             Max(a.[Gelieferte Menge]) AS Gelieferte_Menge,
             Max(a.[Original Menge]) - sum(b.[Menge]) As Offene_Menge
FROM fakt AS a 
LEFT JOIN (select left([Auftragsnummer],5) As Auftrag, 
                             CInt(Mid([Auftragsnummer],7,3)) as Teil,
                             [Gelieferte Menge] As Menge 
                   from Fakt) as b ON left(a.[Auftragsnummer],5) = left(b.[Auftrag],5)  and b.[Teil] <= CInt(Mid(a.[Auftragsnummer],7,3))  
GROUP BY Left(a.[Auftragsnummer],5), CInt(Mid(a.[Auftragsnummer],7,3));
Schönes Restwochenende

Gruß Jörg

[Edit Biber] Codetags. [/Edit]
e2Mario
e2Mario 01.04.2012 um 16:36:48 Uhr
Goto Top
Fall1 war genau das, was mich zum verzweifeln brachte.
Funktioniert 1A, liefert das gewünschte Ergebnis und wird schon morgen umgesetzt.

DANKE dir nochmals und schönes Wochenende.

Lg Mario
LianenSchwinger
LianenSchwinger 01.04.2012 um 16:51:59 Uhr
Goto Top
Hallo Mario,

freut mich,dass ich Dir helfen konnet.
Verstehst Du denn auch das Select-Statement?
Oder ist das unerheblich? Nicht, dass jemand die Lösung erklärt haben will. face-smile

Du hättest das ganze ja auch in VB machen können, indem Du auch die Auftragsnummer in 2 Teile trennst (Auftragsnummer und Lieferung) und dann die Summe von Gelieferte Menge für die Teillieferungen aufsummierst. Das Select-Statement macht praktisch nichts anderes.


Gruß Jörg
e2Mario
e2Mario 02.04.2012 um 10:06:18 Uhr
Goto Top
Guten Morgen Jörg,

nach ein paar Mal durchlesen, kann ich sagen, JA doch, ich weis wie und warum das heruauskommt was herauskommt face-smile. (ok, ich gebe es zu "google" hat mir auch etwas geholfen ;) )
Das wäre auch mein ursprünglicher Gedanke gewesen mit VB die Auftragsnummer in die 2 Teile zu trennen und dann eben zusammen zu zählen. Das Teilen der Nummer war nicht das Problem, aber
so "blöd" es klingt. Ich bin an der DSUM Formel gescheitert.

Wenn du einen VB Code auf Lager, und ein bisschen Zeit hast´, würde es mich freuen wenn du den auch posten könntest. So lerne und lerne ich dazu.

DANKE DIR!

Schöne Grüße Mario
LianenSchwinger
LianenSchwinger 02.04.2012 um 15:52:06 Uhr
Goto Top
Hallo Mario,

mit VB kenne ich mich garnicht aus sollte aber vom Prinzip nicht schwer sein.
Wenn ich mir die DSUM-Funktion ansehe könnte das ein Ansatz sein.

Dim sumMenge As Integer

sumMenge = DSum("[Gelieferte Menge]", "Fakt", "Left([Auftragsnummer],5) = Auftrag and Mid([Auftragsnummer],7,3) <= Lieferung")  

Vorher musst Du für jede Rückgabezeile von "select * from Fakt" die Auftragsnummer splitten und in die Variablen Auftrag und Lieferung speichern.

Gruß Jörg