Juni 21, 2021, 03:12:24

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Dsum mit zwei Kriterien

Begonnen von Wolle_M, Mai 11, 2021, 18:24:23

⏪ vorheriges - nächstes ⏩

Wolle_M

Hallo, bin neu im Bunde und benötige dringend Rat.
Ich habe eine Tabelle  mit folgenden Feldern:
Rechnr = Zahl
Menge = Zahl
Artikel = Text
Kategorie = Text
Einzelpreis = Währung

Ich möchte jetzt die Summe der Einträge [Menge]*[Einzelpreis] mit einer vorgegebenen Rechnungsnummer ohne die mit den Einträgen Zwischensumme im Feld Kategorie ermitteln. 
Meine Idee:
Nettosumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[Rechnr]=" + Str(Rechnungsnummer) And [Artikel] <> 'Zwischensumme')
Es erfolgt die Felermeldung "Typen unverträglich"
Was mache ich falsch ?
Ich hoffe Ihr könnt mir helfen.
Liebe Dank vorab.

MzKlMu

Mai 11, 2021, 18:33:09 #1 Letzte Bearbeitung: Mai 11, 2021, 18:56:08 von MzKlMu
Hallo,
Was willst Du denn mit der Str Funktion erreichen, Du machst ja aus der Zahl einen Text.
Verkettet werden muss mit & und nicht mit +. Wenn Zwischensumme in der Kategorie steht, so solltest Du auch die Kategorie verwenden und nicht den Artikel.

Nettosumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[Rechnr]= " & Me.Rechnungsnummer & " And [Kategorie] <> 'Zwischensumme'")Das Feld mit der Rechnungsnummer sollte auf dem Formular (Me.) sein.

Wobei noch anzumerken wäre, dass es eine Zwischensumme nicht geben sollte.
Da scheint es noch am Datenmodell zu hapern.
Gruß
Klaus

Wolle_M

Mai 12, 2021, 08:59:58 #2 Letzte Bearbeitung: Mai 12, 2021, 11:30:51 von MzKlMu
Hallo Klaus, danke für die schnelle Hilfe. Hast mir Stunden meines Lebens gerettet.
Leider bin ich aber noch nicht ganz auf dem laufenden mit meinem Verständnis.
Die Rechnungsnummer wird als Variable übergeben. So habe ich die Zeile so geschrieben:
Nettosumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[Rechnr]= " & Rechnungsnummer & " And [Kategorie] <> 'Zwischensumme'")Funktioniert !!!!
Was ich nicht verstehe, wenn ich folgende Zeile programmiere funktioniert es nicht:
Nettosumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[Rechnr]= " & Rechnungsnummer & ")Bei dem Kommando funktioniert es.
STRZwischensumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[RECHNR] =" + Str(Rechnungsnummer))Mein Programm läuft jetzt soweit zufriedenstellend, aber mich interessiert natürlich wo mein Lapsus im
Denkapparat vorliegt.
Vielleicht kannst du mir ja noch einmal auf die Sprünge helfen.

Liebe Grüße Wolfgang

DF6GL

Hallo,



ergänze in jedem (!)  Modulkopf "Option Explicit".  Kompiliere anschliessend den Code im VBA-Editor.
Eliminiere alle(!)  auftretenden Fehler.

ZitatDim Nettosumme As Double   ' oder As Currency    KEINE String-Variable!!!
Nettosumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[Rechnr]= " & Me!Rechnungsnummer & ")

falls Rechnungsnummer den Datentyp Zahl,Long hat.


Wenn Rechnungsnummer den DatenTyp Double besitzt und in der Rechnungsnummer Komma oder Punkt vorkommen, dann liegt ein Konstruktionsfehler vor und sollte dringend geändert werden.


ZitatSTRZwischensumme = DSum("[Menge]*[Einzelpreis]", "Rechnungsartikel", "[RECHNR] =" + Str(Rechnungsnummer))


erschließt sich mit gar nicht...


Zitatmein Lapsus im
Denkapparat vorliegt.

Vermutlich bei  Datentypendefinitionen, Syntax, und Tabellenaufaufbau   ;)

MzKlMu

Mai 12, 2021, 11:37:33 #4 Letzte Bearbeitung: Mai 12, 2021, 15:06:14 von MzKlMu
Hallo,
Anführungszeichen kann es in diesem Zusammenhang nur paarweise geben. In der 2. Codezeile in Deinem Beitrag #2 sind aber 5, das & und das " sind da überflüssig. Wie Du darauf kommst, ist ohnehin nicht nachvollziebar.
Was willst Du in der 3. Codezeile mit dem Str (vorn und als Funktion) ?
Das macht keinen Sinn. Die Frage hatte ich schon mal getellt, blieb aber unbeantwortet.

Zitat von: undefinedDie Rechnungsnummer wird als Variable übergeben.
Verstehe ich auch nicht. Wo kommt diese Variable her ?
Ein Variable muss doch deklariert (Dim ...) werden.
Außerdem muss eine Variablen ein Inhalt zugewiesen werden. Wie und wo machst du das ?
Was verstehst Du überhaupt in diesem Zusammenhang unter "Variable" ?

Auf den Hinweis mit der Zwischensumme bist du auch nicht eingegangen.
Gruß
Klaus

Wolle_M

Hallo zusammen, kurz als Anmerkung: Ich habe das Programm vor ca.25 Jahren als kompletter Neuling geschrieben.
Musste von Dbase umsteigen weil das nicht mehr gepflegt wurde.
Wie ich damals auf den Befehl mit dem " +Str(Rechnungsnummer)"  gekommen bin weiss ich leider nicht mehr.
Muss ich wohl experimentell und aus dem Netz ermittelt haben. Das Programm läuft aber damit einwandfrei bisher.
Da wir nun einen neuen Kunden haben der einen Rabatt auf die Rechnung erhält habe ich die Zwischensumme eingefügt
um diese vor der Abrechnung des Rabattes auszudrucken.
Soll so aussehen:
Menge Artikel1                            Einzelpreis  Gesamtpreis
Menge Artikel2                            Einzelpreis  Gesamtpreis
1    Artikel3=Zwischensumme Artikel1 + 2    Zwischensumme
1    Artikel4=Rabatt                    Rabattsumme

So sieht dann bespielsweise ein Eintrag für eine Rechnung in der Tabelle Rechnungsartikel aus.

ID    Rechnungs-Nr  Menge  Artikel        Kategorie    Einzelpreis  Gesamtpreis = Menge * Einzelpreis
19085 4              2    dfghj          Material      50,00€      und wird errechnet
19086 4              3    fghjk          Lohn          60,00€
19087 4              1     Zwischensumme  Zwischensumme 280,00 €
19088 4              1    Rabatt  60%    R            -168,00 €

Am Ende wird alles addiert und so erhalte ich die Rechnungssumme. Natürlich darf die Zwischensumme nicht mit addiert werden. Deshalb  " And [Kategorie] <> 'Zwischensumme'")"
Die Variable Rechnungsnummer ist als Integer definiert und wird mit der erwünschten Rechnungsummer belegt:
Rechnungsnummer = Forms![Rechnungen]![Rechnr].
So, nun hoffe ich ein wenig Licht ins dunkle gebracht zu haben?! Ist fast ein Roman geworden.
Mir fällt nichts ein was noch benötigt wird.
Danke nochmals an alle und macht einen alten Mann nicht so arg runter.
Liebe Grüße Wolle

Wolle_M

Mai 12, 2021, 18:00:54 #6 Letzte Bearbeitung: Mai 12, 2021, 18:46:40 von MzKlMu
Leide rist die Formatierung beim senden etwas durcheinander geraten.
Hier ein neuer Versuch.
So sieht dann bespielsweise ein Eintrag für eine Rechnung in der Tabelle Rechnungsartikel aus.

ID    Rechnungs-Nr  Menge    Artikel        Kategorie    Einzelpreis  Gesamtpreis = Menge * Einzelpreis
19085       4         2      dfghj          Material        50,00 €      und wird errechnet
19086       4         3      fghjk          Lohn            60,00 €
19087       4         1      Zwischensumme  Zwischensumme  280,00 €
19088       4         1      Rabatt  60%    R             -168,00 €

Wolle_M


MzKlMu

Mai 12, 2021, 18:45:52 #8 Letzte Bearbeitung: Mai 12, 2021, 18:55:38 von MzKlMu
Hallo,
wenn man sich etwas Mühe gibt, die Codetags benutzt und mit der Vorschau sich das Ergebnis ansieht, lassen sich Daten in Tabellenform übersichtlich anordnen. Ich habe es Dir oben mal gemacht.

Was hast Du denn jetzt eigentlich noch für ein Problem ?

PS:
Die Rechnungszeilen für den Rabatt und die Zwischensumme sind in der Tabelle ersatzlos überflüssig.
Die Zwischensumme lässt sich im Formular ganz einfach errechen und anzeigen, ebenso der Rabatt.
Im Formularfuß ein Feld für die Zwischensumme:
=Summe(Menge * Einzelpreis)Und ein Feld für den Rabatt:
=Summe(Menge * Einzelpreis * 0,6)Und für den Rechnungsbetrag:
=Summe(Menge * Einzelpreis)-Summe(Menge * Einzelpreis* 0,6)Tabellenfelder sind da völlig fehl am Platz und eine potentielle Fehlerquelle.
So sind die Werte automatisch stets aktuell.

Wo ist denn eigentlich der Rabatt (die 60%) gespeichert. Wie wird der festgelegt ?
Gruß
Klaus

Wolle_M

Hallo, eigentlich funktioniert alles.
Deshalb Danke für die Mühe.
Habe den Code entsprechend geändert und alles läuft nach Wunsch.
(Auch mit der Zwischensumme in der Tabelle.)
Mit berechnendem Feld im Bericht ist mit bekannt und wird auch genutzt bei mehreren Seiten im Ausdruck.
Will halt nicht zu viel ändern im den einzelnen Programmteilen.
Noch mal vielen Dank für die Hilfe und Gruß aus Wermelskirchen
Wolfgang