Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MSACESS 2003 DSUM Funktion

Frage Microsoft Microsoft Office

Mitglied: e2Mario

e2Mario (Level 1) - Jetzt verbinden

28.03.2012, aktualisiert 03.04.2012, 3170 Aufrufe, 13 Kommentare

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"

Lg
Mitglied: NetWolf
29.03.2012 um 18:33 Uhr
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)
Bitte warten ..
Mitglied: LianenSchwinger
30.03.2012 um 07:34 Uhr
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
Bitte warten ..
Mitglied: e2Mario
30.03.2012 um 15:18 Uhr
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.
Bitte warten ..
Mitglied: LianenSchwinger
30.03.2012 um 15:56 Uhr
... 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
Bitte warten ..
Mitglied: e2Mario
31.03.2012 um 14:32 Uhr
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
Bitte warten ..
Mitglied: e2Mario
31.03.2012 um 16:54 Uhr
Na ein "Stückchen" bin ich weitergekommen.
Access verlangt anstelle von "substr" --> "mid" und dann "as Auftrag"

Au weia, ob ich das noch hinbekomme...
Bitte warten ..
Mitglied: LianenSchwinger
01.04.2012 um 11:46 Uhr
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

01.
SELECT Left([Auftragsnummer],5) AS Auftrag,  
02.
               Cint(Max(Mid([Auftragsnummer],7,3))) AS Anzahl_Lieferungen,  
03.
               Max([Original Menge]) AS Original_Menge,  
04.
               Sum([Gelieferte Menge]) AS Gelieferte_Menge,  
05.
               Max([Original Menge])-Sum([Gelieferte Menge]) AS Offene_Menge 
06.
FROM Fakt 
07.
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]
Bitte warten ..
Mitglied: e2Mario
01.04.2012 um 13:54 Uhr
Hallo Jörg,

tja ich komme eben nicht mit Access klar, das ist das Problem
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?

Lg Mario
Bitte warten ..
Mitglied: LianenSchwinger
01.04.2012 um 15:37 Uhr
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:
01.
SELECT Left(a.[Auftragsnummer],5) AS Auftrag,  
02.
             CInt(Mid(a.[Auftragsnummer],7,3)) AS Lieferung,  
03.
             Max(a.[Original Menge]) AS Original_Menge,  
04.
             Max(a.[Gelieferte Menge]) AS Gelieferte_Menge, 
05.
             Max(a.[Original Menge]) - sum(b.[Menge]) As Offene_Menge 
06.
FROM fakt AS a  
07.
LEFT JOIN (select left([Auftragsnummer],5) As Auftrag,  
08.
                             CInt(Mid([Auftragsnummer],7,3)) as Teil, 
09.
                             [Gelieferte Menge] As Menge  
10.
                   from Fakt) as b ON left(a.[Auftragsnummer],5) = left(b.[Auftrag],5)  and b.[Teil] <= CInt(Mid(a.[Auftragsnummer],7,3))   
11.
GROUP BY Left(a.[Auftragsnummer],5), CInt(Mid(a.[Auftragsnummer],7,3));
Schönes Restwochenende

Gruß Jörg

[Edit Biber] Codetags. [/Edit]
Bitte warten ..
Mitglied: e2Mario
01.04.2012 um 16:36 Uhr
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
Bitte warten ..
Mitglied: LianenSchwinger
01.04.2012 um 16:51 Uhr
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.

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
Bitte warten ..
Mitglied: e2Mario
02.04.2012 um 10:06 Uhr
Guten Morgen Jörg,

nach ein paar Mal durchlesen, kann ich sagen, JA doch, ich weis wie und warum das heruauskommt was herauskommt . (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
Bitte warten ..
Mitglied: LianenSchwinger
02.04.2012 um 15:52 Uhr
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.

01.
Dim sumMenge As Integer 
02.
 
03.
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Server
gelöst Gruppenrichtlinien-Vorlage Office 2013 auf einem DC 2003 (5)

Frage von bluepython zum Thema Windows Server ...

Windows Netzwerk
Windows Server 2003 SBS Netzwerk durch neuen Server Ersetzen (9)

Frage von MultiStorm zum Thema Windows Netzwerk ...

LAN, WAN, Wireless
Hat On Networks PL500PS WLAN-Funktion? (4)

Frage von Andy1987 zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...