Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: noob3k am April 28, 2011, 15:05:26

Titel: Abfrage als Datensatzquelle zuweisen
Beitrag von: noob3k am April 28, 2011, 15:05:26
Aloha,

ich habe mal wieder 2. kleine Fragen :)

Also ich habe einige zahlreiche Erinnerungen die ich in einem Formular als Übersicht anlegen will.
Bsp.   
  "Innerhalb der nächsten 30 Tage laufen 27 Lizenzen ab"
  " 26 Lizenzen bereits abgelaufen"

Bei klick auf einen entsprechenden Button sollen dann die Datensätze in meinem Formular in dem ich die Datensätze anlege nur die 27 betroffenen Personen angezeigt werden.

Bisher hab ich dafür eine Abfrage die ich als Datensatzquelle dem Eingabeformular zuweisen möchte.

Nun meine Fragen:

1. Ist es besser für jede Erinnerung eine einzelne feste Abfrage zu erstellen und diese dann meinem Formular zuzuweisen. Oder die Abfrage zur Laufzeit in VBA erstellen und dann dem Formular zuweisen?? Welche Variante ist performanter und weniger speicherhungrig????

2. Wie kann ich meinem Eingabeformular eine neue Datensatzquelle zuweisen und es dann erst öffnen??
Forms!formular_name.RecordSource = "abfrage_name" funktioniert nur wenn das formular bereits geöffnet ist.
ich würde es aber gern dem geschlossenen Formular zuweisen und dann erst öffnen ?!?

hoffe es war einigermaßen verständlich :)


vielen dank

beste grüße
Titel: Re: Abfrage als Datensatzquelle zuweisen
Beitrag von: DF6GL am April 28, 2011, 22:26:16
Hallo,


ich denke , dass die Fragen aus einem falschen/unpassenden Blickwinkel gestellt sind:

1)
Wenn die Abfragen sich nur in der Angabe unterschiedlicher Kriterien unterscheiden, dann sind einzelne Abfragen ganz sicher fehl am Platz. Im Regelfall wird ja erst während der Bedienung eines Forms es nötig werden, andere Daten zu laden.
"performanter und weniger speicherhungrig" ist hier wohl nicht das Thema...  Ich würde eher fragen wollen, ob die Zuweisung an die Recordsource (und damit das erneute Laden des Form-Recordsets mit den gefilterten Daten) die richtige Methodik im akt. Fall ist oder es  nicht eher

a) eine Filterung des geladenen Recordset mit der Form-Filter-Methode
b) ein Positionierung des Forms (der Anzeige) auf den gewünschten DS
sein sollte.

Alle 3 Methoden haben ihre (unterschiedlichen) Eigenarten, bzw. speziellen Funktionalitäten.

2) Dei Recordsource kann auch schon "Beim Öffnen" des Forms zugewiesen werden.  Bei einem geschlossenen Form die Recordsource zu ändern, halte ich (wieder in diesem Fall) eher nicht für sinnvoll.

Warum würdest Du das gern so machen?


Titel: Re: Abfrage als Datensatzquelle zuweisen
Beitrag von: noob3k am Mai 02, 2011, 14:36:59
Hi,

vielen Dank für deine Antwort!

Also vlt hast du Recht, dass ich eine falsche Denkweise habe. Aber zum besseren Verständnis versuche ich es noch einmal zu erläutern.

Ich möchte ein Formular erstellen in dem versch. Erinnerungen angezeigt werden.
Also  wie oben genannt als Bsp. 
"Innerhalb der nächsten 30 Tage laufen 27 Lizenzen ab"
" 26 Lizenzen bereits abgelaufen"

"Innerhalb der nächsten 30 Tage laufen 12 TÜV-Plaketten ab"
usw.

Bei den Abfragen ändern sich also nicht nur die Datumskriterien sondern es sind versch. Abfragen für unterschiedliche Felder in mehreren Tabellen.

Das Zählen der betroffenen Datensätze würde ich über eine Abfrage realisieren, die dann ungebundene Textfelder in der Übersicht befüllt.
Also so etwa :

Private Sub Form_Current()
Dim strSQL As String
strSQL = "SELECT Count(pers_key) AS [test] FROM (erinnerungen) WHERE (((erinnerungen.test)>=Date()) AND ((Date())>=DateAdd(""m"",-1,[test])))"

Me!Text2 = CurrentDb.OpenRecordset(strSQL)(0)
End Sub


Das hätte ich dann halt in abgewandelter Form für ca. 15 Felder. Ist das zu inperformant weil zu viele auf einmal???

Meine Überlegung war dann, dass ich zum Aktualisieren der Datensätze ein Formular erstelle in dem nur ein Listenfeld mit den Namen und ein Feld zum aktualisieren des Datums ist.  Deshalb dachte ich, dass ich die Datensatzquelle des Formulars dynamisch ändere indem ich eine Abfrage zuweise je nachdem welche Erinnerung in dem Übersichtsformular ausgewählt wurde.

Es soll halt bei Klick auf einen Button hinter der Erinnerung einem anderen Formular eine Datensatzquelle zugewiesen werden und dieses Formular soll sich dann öffnen.

Kann ich denn einem Textfeld auch dynamisch einen Steuerelementinhalt zuweisen???  Weil das Feld für die Datumseingabe wäre ja jedes mal ein anderes.

Die einfachste Variante wäre natürlich für jede Erinnerung eine eigene Abfrage und ein eigenes kleines Formular zu erstellen. Da weiß ich aber nicht ob das die DB nicht sinnlos aufbläht und ob es da nicht eine bessere Variante gäbe?!?!?

Bin für jeden Denkanstoß dankbar :)

Viele Grüße
Titel: Re: Abfrage als Datensatzquelle zuweisen
Beitrag von: DF6GL am Mai 02, 2011, 15:58:13
Hallo,


naja, wenn Du ein Formular haben willst, das lediglich Abfrageergebnisse in Listenfeldern oder (jeweils ein Ergebnis) in Texfeldern anzeigen soll und diese Abfrageergebnisse von verschiedenen variablen Kritereinwerten abhängen, dann:

Erstelle ein ungebundenes Form mit den entspr. (Anzeige-) Listen-, bzw. Textfeldern.

Für die Angabe der zu berücksichtigenden Tabellenfelder und für die Angabe der akt. Kriterienwerte erstell weitere Textfelder, bzw. Kombis



Weiterhin erstell für jede Abfrageart ( z. B. "Innerhalb der nächsten 30 Tage laufen 12 TÜV-Plaketten ab" ist das Gleiche wie "Innerhalb der nächsten 30 Tage laufen 27 Lizenzen ab"

eine Schaltfläche, mit deren Ereignisprozedur der passende SQl-String mit den entspr. Kriteriumsfeldern zusammengebaut wird.


Beispiel:

Sub btnAbfrage1_Click()
Dim strSQL As String
strSQL = "SELECT Count([" & nz(Me!Tabellenfeldname,"*") & "])   FROM [erinnerungen] WHERE  [" &  nz(Me!Tabellenfeldname,"*") &  "]  between " &  format(nz(Me!Datumvon,Date),"\#yyyy-mm-dd\#")  & "  AND  " & Format(DateAdd("m",-1,Date),"\#yyyy-mm-dd\#")

Me!BezErgebnis1.Caption=nz(Me!ErgebnisBezeichnung,"AnzDS")
Me!AnzahlDS = CurrentDb.OpenRecordset(strSQL)(0)
End Sub


(ungetestet und ohne Fehlerbehandlung, z. B. Test von "Tabellenfeldname" auf Datentyp Datum/Uhrzeit in der Tabelle.  Das kann man aber im Vorfeld schon "plausibilisieren", indem dafür ein Kombifeld mit Wertliste benutzt wird, das nur Datumsfelder auflistet.)

Titel: Re: Abfrage als Datensatzquelle zuweisen
Beitrag von: noob3k am Mai 04, 2011, 20:15:02
Hi,

ich danke Dir vielmals. Hat alles funktioniert!


Ich bin aber noch auf eine andere Frage gestoßen, die ich hier mal schnell anhängen würde.

Und zwar beiße ich mir an einer einzelnen Abfrage irgendwie die Zähne aus.
Ich habe 2 Tabellen mit einer 1:n Beziehung.

Also als Bsp.
In der ersten Tabelle sind nur Namen in der 2. nur Adressen.  Eine Person kann mehrere Adressen haben. Für die Adressen hab ich jeweils einen Wert dazu gespeichert, quasi als Priorität. Nun möchte ich, dass nur die Adresse mit der höchsten Priorität für die Person ausgegeben wird.

Steh ich aber auf dem Schlauch weil als normale Abfrage spuckt er alle aus.

SELECT T1.namen, T2.adresse, Max(T2.prio) AS Maxvonprio
FROM T1 INNER JOIN T2 ON T1.T1_key = T2.T1_key
GROUP BY T1.namen,T2.adresse;


Was hab ich vergessen oder wo liegt der Fehler?  :(

Grüße