1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Problem beim Subtrahieren zweier Spalten in Access

Discussion in 'Office-Programme' started by Der_Anfänger, Jan 28, 2010.

Thread Status:
Not open for further replies.
  1. Hallo ich habe folgendes Problem:

    Ich habe zwei Tabellen:

    tabelle_1 enthält die Anrechte von Empfängern auf eine bestimmte Stückzahl eines Artikels
    id_adressat ; zu_versenden ; id_artikel

    tabelle_2 hält fest, wie viel wovon bereits an wen versendet wurde
    id_adressat ; bereits_versendet ; id_artikel

    Wir ihr Euch denken könnt, habe ich jetzt eine Abfrage geschrieben, bei der die Spalten „zu_versenden“ und „bereits_versendet“ subtrahiert werden, um auszurechnen, ob und wie viel eventuell noch nachgesendet werden muss, mittels des Ausdrucks

    select ([tabelle_1].[zu_versenden] - [tabelle_2].[bereits_versendet]) AS nachzusenden

    Das funktioniert grundsätzlich auch.

    Die Tabellen sind in der Abfrage mit einem left join ausgehend von der Anrechte-Tabelle (1) verknüpft. Dies ist notwendig, weil ein bestimmter Artikel an einen bestimmten Adressaten ja vielleicht noch überhaupt nicht versendet worden ist; und dann gibt es in der Versand-Tabelle (2) natürlich auch noch keinen Datensatz.

    Und da liegt nun das Problem, denn wenn es keinen entsprechenden Eintrag in der Versand-Tabelle gibt, wird in der Ergebnisspalte „nachzusenden“ GAR NICHTS angezeigt.

    Ist vom Aufbau der Abfrage her auch irgendwie nachvollziehbar. Aber ich möchte natürlich, dass in dem Fall der Inhalt von „[tabelle_1].[zu_versenden]“ als Ergebnis angezeigt wird.

    Wie bekomme ich das hin?

    Viele Grüße und vielen Dank,

    Alexander
     
  2. Scasi

    Scasi Ganzes Gigabyte

    braucht's da wirklich eine eigene Tabelle für "bereits_versendet"?
    anonsten könntest Du für jeden neuen Satz in tabelle_1 auch gleich einen in tabelle_2 erstellen und mit 0 vorbelegen

    nur so aus der Hüfte ... ;)
     
  3. Hascheff

    Hascheff Moderator

    Hallo,
    die ganze Übersicht ist wohl nur erforderlich, wenn es auch passiert, dass ein Adressat einen Artikel mehrmals geschickt bekommt., also zu einem Datensatz in tabelle_1 mehrere DS in tabelle_2.
    Also braucht man zwei Tabellen.

    Du hast bei null DS in tabelle_2 ein Problem. Aber du wirst wohl auch bei zwei DS in tabelle_2 ein Problem haben.

    Ich empfehle, auf der Basis deiner Abfrage einen Bericht zu erstellen. Dort kannst du gruppieren, über tabelle_2 summieren, subtrahieren und Details ausblenden.
    Wenn du willst, schreib ich noch mal etwas ausführlicher, aber jetzt :wegmuss:
     
  4. Urs2

    Urs2 Megabyte

    Hallo Alexander,

    Ich arbeite nicht mit Access und kann das deshalb nicht selbst prüfen >
    Was gibt denn "[tabelle_2].[bereits_versendet]" zurück, wenn der Datensatz noch nicht existiert? Möglicherweise "NULL"...
    NULL ist keine Zahl, keine 0. Es ist einfach nichts!

    In VBA ergibt eine Subtraktion mit NULL >
    1000 - NULL = NULL
    ...also genau das was bei Dir angezeigt wird > NICHTS.

    Wenn es so ist hilft wohl nur Scasis Vorschlag, beim Erstellen von Satz1 auch gleich Satz2 zu erstellen, mit Wert 0.

    Gruss Urs
     
  5. Hascheff

    Hascheff Moderator

    Hallo Urs,
    mit "left join" meint der TO, die Abfrage zeigt zu jedem DS in tabelle_1 mindestens einen DS. Wenn in tabelle_2 kein passender DS existiert, enthält die Abfrage in den betreffenden Zellen NULL. Das ist kein Problem. Man fügt in die Abfrage zusätzlich ein berechnetes Feld ein:
    Wenn (IstNull([tabelle_2].[bereits_versendet]);0;[tabelle_2].[bereits_versendet])

    Damit löst man aber nicht das Problem der 1:n-Beziehung dieser beiden Tabellen.

    Mir fällt gerade ein, neben der in #3 skizzierten Lösung kann man auch so herangehen:
    Aus tabelle_2 wird erst eine Kreuztabelle erstellt. Damit fasst man mehrere DS mit Lieferung an den gleichen Adressaten zusammen. Diese Kreuztabelle verwendet man statt tabelle_2 in der schon erstellten Abfrage.
    Einen Bericht kann man dann immer noch erstellen.

    Welche Lösung vorteilhafter ist, kann ich von hier nicht entscheiden. Es hängt einerseits davon ab, wie viele verschiedene Teile geliefert werden und was man eigentlich sehen will.

    Gruß
    Hascheff
     
  6. Urs2

    Urs2 Megabyte

    Hallo Hascheff

    Du kennst ja meine Null-Kenntnisse in Access...
    Ich wollte ihm nur die Grundrechenarten mit Null näher bringen, die er ja offensichtlich nicht kannte.
    Bei allen 4 Rechenarten ist das Ergebnis immer Null, wenn irgendwo ein Null drin ist.

    In VBA kann man das auch mit IsNull(variableX) abfangen.
    Excel selbst kennt Null nicht, dort wird das "Ergebnis" dann wohl als #Wert oder #NV angezeigt.

    Gruss Urs
     
  7. Hascheff

    Hascheff Moderator

    Hallo Urs,
    stimmt, aber nun ist alles gesagt, bis der TO sich wieder meldet.

    > In VBA kann man das auch mit IsNull(variableX) abfangen.

    Wenn von Abfragen in Access die Rede ist, dann ist SQL gemeint, nur dass Access deutsche Schlüsselworte in englische SQL-Syntax übersetzt. Und SQL beherrscht natürlich IsNull().

    Gruß
    Hascheff
     
  8. Hallo Hascheff,

    ich habe es so gemacht wie Du gesagt hast:

    tabelle_2 durch eine Abfrage „wer_hat_was_bekommen“ ersetzt, die die Versandzahlen summiert und die übrigen Felder gruppiert.

    In meiner Ergebnistabelle benutze ich jetzt den Ausdruck

    (IIf(IsNull([wer_hat_was_bekommen].[bereits_versendet]),[tabelle_1].[zu_versenden],[tabelle_1].[zu_versenden]-[wer_hat_was_bekommen].[bereits_versendet])) AS nachzusenden

    Es klappt!

    Ich musste bloß noch die Funktionen etwas anpassen, weil mein Access scheinbar keine Semikolons mag und auch das Wörtlein „WENN“ nicht kennt.

    Vielen Dank und viele Grüße,

    Alexander
     
  9. Hascheff

    Hascheff Moderator

    Hallo Alexander,
    das kann daran liegen, dass ich aus dem Kopf geschrieben habe, aber es ist auch ein Unterschied, ob man in der SQL-Ansicht oder im Ausdrucks-Editor schreibt.
    > Wenn von Abfragen in Access die Rede ist, dann ist SQL gemeint, nur dass Access deutsche Schlüsselworte
    > in englische SQL-Syntax übersetzt.

    Gruß
    Hascheff
     
Thread Status:
Not open for further replies.

Share This Page