Neuigkeiten:

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

Mobiles Hauptmenü

Auswahlabfrage die bei Abschlagszahlungen bestimmte Monate herausfiltert

Begonnen von herb54, August 22, 2014, 19:26:51

⏪ vorheriges - nächstes ⏩

herb54

Hallo zusammen,
ich habe ein Problem mit einer Abfrage und komme einfach nicht auf die Lösung.
Ich habe eine Tabelle (tbl1) die die Felder: id (Schlüssel), Kunde, date1 (Datum der ersten Abschlagszahlung), ab1 (Abschlagszahlung1) usw. bis date7 bzw. ab7 enthält. Ich möchte über eine Abfrage die Abschlagszahlungen zB. für Januar rausfiltern und später in einem Formular über Dom Wert anzeigen. Über DatTeil funktioniert das Ganze nicht, weil es auch Kunden
gibt die z.B im Januar alle 7 Abschlagszahlungen und Kunden die ihre Abschlagszahlungen über 4 oder noch mehr Monate verteilen.
Wer kann mir hier helfen?
Grüße
Herbert



MzKlMu

Hallo,
das Datenmodell ist falsch. Diese Aufzählungsfelder (mit der Zahl hinten) verstoßen bereits gegen die 1.Normalform und sind demzufolge für eine Datenbank untauglich. Daher findest Du auch keine Lösung. Die Abschlagszahlungen müssen in eine extra Tabelle mit einem Bezug zum Kunden. Die Zahlungen stehen dann untereinander, je Zahlung ein Datensatz mit einem Datumsfeld für den Monat.
Dann kannst Du ganz bequem in einer Abfrage in der einen Datumsspalte nach Monat und Kunde filtern.
Domwert ist dann überflüssig.
Wer in einer Datenbank Domwert benötigt hat oftmals ein falsches Datenmodell.

Gruß Klaus

herb54

Hallo, erstmal vielen Dank! Ja, auf diese Weise ginge das sehr einfach. Das Problem liegt allerdings darin,
dass es sich bei dieser Datenbank um ein älteres Modell handelt, das so an die 17000 Kundendatensätze beinhaltet und nicht von mir ist (die Bilddatei ist nur ein Modell von mir). Ich schätze mal, das ist so 2003 bis 2004 erstellt worden (wobei ich gesehen habe, dass es sogar noch ältere Dateien gibt).
Ich müsste das Ganze jetzt auseinander reißen, oder versuchen eine Lösung mit den Gegebenheiten zu finden - und da tue ich mich wahrlich schwer!
Trotzdem vielen Dank für Deine Antwort!
Gruß
Herbert

DF6GL

Hallo,

Du könntest:

-- die Tabellendaten zunächst mit 7 Anfügeabfragen in eine zusätzliche Zwischentabelle überführen  und dann auswerten/abfragen (siehe Hinweis von MzKlMu).

-- mit 7 DSum()-Funktionen mit passenden Kriterien und deren Addition  in einer  berechneten Spalte einer Auswahlabfrage die Werte berechnen (demonstrativ und für Jan. 2014):

SumAb: nz(Dsum("ab1";"tbl1";"Format(Date1;'yyyy\/mm') = '2014/01'  And  Kunde = 'Meier');0) +
nz(Dsum("ab2";"tbl1";"Format(Date2;'yyyy\/mm') = '2014/01'   And  Kunde = 'Meier');0) +  .....


MzKlMu

Hallo,
mit 17000 DS würde ich mir die Arbeit machen und die DB umstrukturieren.
Dazu kann man einmalig 7 Anfügeabfragen nutzen um die normalisierte Tabelle zu erzeugen.
Die Auswertung wird zum Kinderspiel. Und trotz der dann max. 119.000 DS wird es keine Performanceprobleme geben. Geeignete Indizierung vorausgesetzt.
Mit dem jetzigen Aufbau wirst Du keine Freude haben.

Selbst wenn man bei dem jetzigen Aufbau bleibt und die Zwischentabelle nur bei Bedarf füllt (bzw. aktualisiert) wird das wahrscheinlich um ein vielfaches schneller sein als die DSum Version.
Gruß Klaus

herb54

Vielen Dank für Eure Hilfe! Ich hab mich noch mal schlau gemacht: Das Ganze wurde 2001 erstellt und hatte eine Excel-Tabelle als Vorlage. Es gab damals schon Überlegungen die Datenbank anders aufzubauen. Dies wurde jedoch abgelehnt, da man jahrelang mit der Excel-Tabelle gut zurechtkam. Das sind die sogenannten eingefahrenen Gleise!!! Nun muss ich mich mit diesem Sch... herumschlagen! Ich hatte schon überlegt, ob mich mit einem Recordset die ganzen Abschlagszahlungen und deren Datum in ein Datumsfeld hineinlese mit dem entsprechenden Schlüssel (id). Könnte man evtl. hier schon den Monat herausfiltern (DatPart)?

ebs17

Generell ja.
Man kann auch nach Kapstadt gelangen, wenn man zu Fuß geht.
Mit freundlichem Glück Auf!

Eberhard

herb54

Hallo Franz,
ich habe das mit den Anfügeabfragen mal ausprobiert. Das ist soweit prima wenn es um Auswertungen in der
Vergangenheit geht. Ich müsste einen Aktualisierungsbutton einfügen, der mir alle Anfügeabfraben nacheinander in der
richtigen Reihenfolge ausführt. Da taucht ein Problem auf: Und zwar die lästigen Aktualisierungsanzeigen von Access:
" Sie beabsichtigen eine Anfügeabfrage auszuführen...", "Sie beabsichtigen ... Zeilen anzufügen". Wie krieg ich den Mist weg, so dass ich den Button betätige und fertig!

Grüße
Herbert

DF6GL

Hallo,

indem Du die Abfragen nicht mit Docmd.RunSQL ausführst, sondern die Execute-Methode des Currentdb-Objektes verwendest:


Sub btnButton_Click()
Dim DB as Database
Set DB= Currentdb

DB.Execute "qry_Abfrage1",dbfailonerror
DB.Execute "qry_Abfrage2",dbfailonerror
.
.
.

Set DB = Nothing
End Sub

herb54


herb54

Hallo Franz,
noch eine Überlegung: Müsste man nicht jedes mal beim Aktualisieren die komplette bestehende Tabelle löschen bevor man die Anfügeabfragen ausführt? Denn sonst werden die alten Datensätze ja immer wieder angefügt, oder liege ich da falsch?

Grüße
Herbert

DF6GL

Hallo,

das könnte man mit einem (evtl. zusammengesetzten) eindeutigen Index lösen. Aus welchen Feldern sich dieser Index zusammensetzen kann, musst Du herausfinden..  Jedenfalls muss die Kombination der Felder einen bestimmten Datensatz eindeutig definieren.