cp-com
Goto Top

Access 2010 Abfrage zusammenfassen (Dynamische Abfrage)

Ich habe mal wieder ein Datenbanken Problem. Ich möchte eine Auswertung einer Tabelle durchführen mittels eines Abfrage/Such Formulares.

Die Datenbank beinhaltet eine Tabelle mit Datensätzen, die über ein Formular erweitert werden. Bsp.: Ein Handy-Shop verkauft an 10 Standpunkten jeweils 32 verschiedene Handys.
So nun möchte ich für jeden Standpunkt Auswertungen machen können. Die Abfrage hierfür ist im Wesentlichen immer Gleich:

SELECT Count (xPhone) FROM Tabelle 
WHERE xPhone = TRUE AND Hamburg = TRUE 
AND Between #01/01/2011# AND #01/31/2011#

Erklärung: Ich möchte herausfinden, wie viele xPhone Handys ich im Januar 2011 am Standpunkt Hamburg verkauft habe. Die Standpunkte und die Handys sind dementsprechend natürlich Boolesche Werte.
Wenn ich nun jede Abfrage Manuel erstellen muss, und jeden Monat und das gesamte Jahr auswährten möchte käme ich nach meiner Rechnung auf 4160 Abfragen, die ich wegen dem Datum jedes Jahr erneuern müsste! Das möchte ich nicht ;)

Ich suche nach einer Lösung um das Ganze auf 32 Abfragen zu minimieren, also brauch ich eine Lösung, wo der Standpunkt und die beiden Datum dynamisch vom User verändert werden können.
Desweiteren soll dann die Abfrage als Bericht ausgegeben werden.


Für eure Hilfe bin ich sehr dankbar, sollte etwas noch unklar sein bitte ich dieses zu entschuldigen und werde es versuchen ausführlicher zu formulieren.


LG
cp-com

Content-ID: 176076

Url: https://administrator.de/contentid/176076

Ausgedruckt am: 15.11.2024 um 18:11 Uhr

thaenhusen
thaenhusen 10.11.2011 um 14:42:45 Uhr
Goto Top
Moin.

Ich würde ein Formular mit einer Klappbox über die Standorte und Zwei Kalenderfelder bauen und
beim Laden des Bericht des SQL-String zusammenbauen und als Report.Recordsource mitgeben.

Dann brauchst Du gar keine Abfragen bauen.

Beim Berichtladen sieht das dann so aus.

Me.RecordSource = "SELECT Count (xPhone) FROM Tabelle WHERE xPhone = TRUE AND " & Forms("Formularname").Standort &  " = TRUE AND Verkaufsdatum Between #"  & Forms("Formularname").StartDatum & "# AND #"  & Forms("Formularname").EndDatum & "#"  

Eleganter wäre wenn mann ein Feld Standort in den Daten hätte und nicht jetzt Standort als Boolean-Feld.

HTH
MK
cp-com
cp-com 10.11.2011 um 15:11:30 Uhr
Goto Top
Zitat von @thaenhusen:
Moin.

Ich würde ein Formular mit einer Klappbox über die Standorte und Zwei Kalenderfelder bauen und
beim Laden des Bericht des SQL-String zusammenbauen und als Report.Recordsource mitgeben.

Dann brauchst Du gar keine Abfragen bauen.

Danke für die schnelle Antwort.

Kannst du mir das vielleicht etwas näher erklären? Klingt schon mal sehr gut face-smile !
thaenhusen
thaenhusen 10.11.2011 um 15:24:41 Uhr
Goto Top
Moin.

Du musst ein Doofes Formular mit drei Feldern haben.
Wie oben beschrieben und einen Knopf zum Report öffnen.
Beim Knopf prüfst Du dann, ob gültige Werte gewählt wurden und öffnest dann den Report.

Im Öffnen-Ereignis des Reports rufst Du dann den Code aus dem vorigen Post auf,
Fehlerbehandlung dazu und die Sache ist geritzt.

Das kann ich nicht genauer erklären. Sonst schick mir mal ne Beispiel Datenbank mit drei Datensätzen und ich gucke mir das an.
Bin aber erst am Montag wieder im Lande...

HTH
MK
cp-com
cp-com 10.11.2011 um 15:51:09 Uhr
Goto Top
Hm ich muss mich glaube ich erst mal ein bisschen durch Report.Recordsource durchlesen. Vielleicht verstehe ich ja dann was du meinst ;)
vossi31
vossi31 10.11.2011 um 16:13:16 Uhr
Goto Top
Hallo cp-com,

wenn ich Dich richtig verstanden habe hast Du eine Tabelle u.a. mit den Feldern "Hamburg, Hannover, Bremen ...München", alle jeweils als boolsche Felder.
Dann würde ich erstmal denjenigen, der die Tabelle designt hat, fragen was das denn wohl soll. So wird das auf elegante Weise gar nichts.
Und was ihr macht wenn der nächste Standpunkt dazu kommt weiss ich auch nicht.

Henning
cp-com
cp-com 11.11.2011 um 08:22:20 Uhr
Goto Top
Moin Henning,

ich verstehe nicht wieso Boolean-Felder ein solches Problem mitsichbringen? Das es nicht das eleganteste ist, ist mir klar. Wo liegen die Probelme wenn ich einen neune Standpunkt hinzufüge (was in der Regel nicht vorkommen sollte)?
Ich lass mich gerne von einem Pulldown-Menu überzeugen :P. (Aber nicht vom wesentlichen abkommen).

LG
cp-com
cp-com 11.11.2011 um 08:52:27 Uhr
Goto Top
Ok ich hab es schon selber gemerkt :D Ich mache es mit Pulldown-Menu, vielen Dank für die Kritik.
cp-com
cp-com 11.11.2011 um 10:30:02 Uhr
Goto Top
Zitat von @thaenhusen:

> Me.RecordSource = "SELECT Count (xPhone) FROM Tabelle WHERE xPhone = TRUE AND " &  
> Forms("Formularname").Standort &  " = TRUE AND Verkaufsdatum Between #"  &  
> Forms("Formularname").StartDatum & "# AND #"  & Forms("Formularname").EndDatum &  
> "#"  
> 

Hat hierzu vielleicht jemand ein Beispiel Formular face-sad, sorry.
cp-com
cp-com 21.11.2011 um 14:33:12 Uhr
Goto Top
Sorry wenn ich nerve aber das Thema ist immer noch aktuell face-sad...
Muss ich für die o.g. VBA schon ein Bericht angelegt haben? Wird dieser durch den Code geändert?
Vielleicht kann mir jemand die Funktion auch nochmal erklären, bzw. einen guten Link dazu posten.

Vielen Dank
thaenhusen
thaenhusen 21.11.2011 um 16:39:41 Uhr
Goto Top
Moin.

Ja, der Bericht muss existieren und funktionieren. Mit dem Code jubelst Du quasi nur die Datenquelle unter.
Also einen Bericht für das konkrete Beispiel erstllen und dann beim Laden die RecordSource neu rein schieben.

HTH
MK
cp-com
cp-com 23.11.2011 um 09:47:35 Uhr
Goto Top
Private Sub Befehl8_Click()
Me.RecordSource = "SELECT Count (xPhone) FROM Haupt_Tbl WHERE xPhone = TRUE AND " & Forms("Formular1").Kombinationsfeld2 & " = TRUE AND verkaufDatum Between #" & Forms("Formular1").Text4 & "# AND #" & Forms("Formular1").Text6 & "#"  
DoCmd.OpenReport ReportName:="Auswertung", View:=acViewPreview  
End Sub
Fehlermeldung:
Laufzeitfehler '3075':

Syntaxfehler in Datum in Abfrageausdruck 'xPhone = TRUE AND Hamburg = TRUE AND verkaufDatum Between #01.01.2011# AND #31.01.2011'.

Klar ist mir beim Datum 31.01.2011, das die letzte # fehlt. Wie muss ich den Code oben anpassen? Ist der Rest soweit i.O.?
thaenhusen
thaenhusen 23.11.2011 um 10:53:59 Uhr
Goto Top
Moin.

Das kann schon mal nicht funktionieren, da Du versuchst dem Formular eine neue Datensatzherkunft zu geben.

Der Code:
Private Sub Befehl8_Click()

Dim db as Database
Dim rs as dao.Recordset
Dim SQL as String

SQL = "SELECT Count (xPhone) as cnt FROM Haupt_Tbl WHERE xPhone = TRUE AND " & Forms("Formular1").Kombinationsfeld2 & " = TRUE AND verkaufDatum Between " & cdate(Forms("Formular1").Text4) & " AND " & cdate(Forms("Formular1").Text6)  
set rs = db.openrecordset(SQL)

if not rs.eof then
  if rs![cnt] > 0 then 
    DoCmd.OpenReport ReportName:="Auswertung", View:=acViewPreview   
  end if
end if

set rs = nothing
db.close

end sub

gehört auf den Knopf im Formular. Darum könntest Du noch prüfen, ob es überhaupt Datensätze gibt etc. Aber das kannst Du auch später noch machen.

Im Report muss der Code dann irgendwie so aussehen:

Private Sub Report_Open(Cancel As Integer)
  Me.RecordSource = "SELECT FeldA, .., FeldZ FROM Haupt_Tbl WHERE xPhone = TRUE AND " & Forms("Formular1").Kombinationsfeld2 & " = TRUE AND verkaufDatum Between " & cdate(Forms("Formular1").Text4) & " AND " & cdate(Forms("Formular1").Text6)  
End Sub

FeldA, ..., FeldZ musst Du jetzt an die Tabellen-/Reportfelder anpassen.

Dein Code sieht sehr nach "QuickAndDirty" aus und Du scheinst VBA auch noch nicht wirklich verstanden zu haben.
Als erstes solltest Du Dir angewöhnen Namen vernünftig zu vergeben und nicht Befehl18 und Text6 in Formular1.

Da steigst Du in ein paar Wochen nicht mehr durch.

HTH
MK
Biber
Biber 23.11.2011 um 20:02:02 Uhr
Goto Top
[OT bzw. nur als Fussnote]

Zeile 08 im ersten Schnipsel hat einen Tippfehler
08 set rs = db.openrecortset(SQL)
Gemeint ist
08 set rs = db.openrecordset(SQL)

[/OT bzw. nur als Fussnote]
thaenhusen
thaenhusen 23.11.2011 um 20:45:02 Uhr
Goto Top
Moin Biber.

Danke für den Hinweis. Das musste etwas schnell gehen.
Habe ich eben korrigiert.

Schöne Grüße
MK
cp-com
cp-com 12.12.2011 um 08:35:44 Uhr
Goto Top
Hey,

sorry das ich mich jetzt erst melde.
Vielen Dank für die Hilfe MK.
Ich bekomme leider immer eine Fehlermeldung beim ausführen der Abfrage: "Benutzerdefinierter Typ nicht definiert", dabei ist diese Zeile 03. Dim db as Database
markiert (während wie Fehlermeldung auftritt). Wenn ich die Fehlermeldung dann wegklicke ist die Zeile 01. Private Sub Befehl8_Click() gelb markiert. (Befehl8 heißt be mir nun Auswertung umd ein bisschen Ordnung reinzubringen)

Ich hatte gegoogelt und rausgefunden das mir die Microsoft DAO 3.6 Object Library fehlt und das in Zeile 03. vor dem Database ein DAO. sein sollte.

Hmm ja wie ihr seht, ich bin nicht gerade talentiert für SQL, Access oder sonst etwas was mit Datenbanken zutun hat und würde das ganze am liebsten aufgeben - aber das geht leider nicht :D.

Ich würde nun gerne eine Beispieldatenbank der hier beschriebenen Datenbank hochladen das ihr euch vielleicht angucken könnte wo ich was falsch gemacht habe.
Gibt es die möglichkeit direkt im Forum etwas hochzuladen?

LG
thaenhusen
thaenhusen 12.12.2011 um 09:16:34 Uhr
Goto Top
Moin.

Hochladen geht so nicht.
Kannst es aber ja ins Netz legen und uns den Link posten oder per PN zu schicken.

HTH
MK
cp-com
cp-com 12.12.2011 um 09:49:08 Uhr
Goto Top
Hey,

hab ein Bekannten der wird das hoffentlich gleich hochladen, sobald ich ein Link habe schicke ich dir eine PN.

Vielen Dank