Hallo
habe wieder eine Frage
Ich habe ein Kombinationsfeld erstellt und wollte, das dies nach Auswahl seinen Inhalt an eine Abfrage übergibt.
In die Abfrage habe ich
[Formulare]![frm_Listenerstellung]![Text22]
in die Kriterien eingefügt.
Was aber nach einigem Probieren ja nicht gehen kann, da hier die ID_WS (also eine Zahl) benötigt wird.
Außerdem würde ich gerne mehr wie eine ID_WS eingeben.
Habe dazu ein Textfeld erstellt, in das die Zahlen eingefügt werden können (Textausgabe klappt [=[Kombinationsfeld6]] nur Die ID nicht).
Frage jetzt muss ich hier völlig anders vorgehen oder kann man das mit einfachen Mittel nach meiner Idee umsetzen ?
Cord
Hallo,
ZitatWas aber nach einigem Probieren ja nicht gehen kann, da hier die ID_WS (also eine Zahl) benötigt wird.
das wäre an sich schon richtig. Was hast Du probiert?
Vermutlich ist das Kombi (wieso heißt das "Text22" ?) falsch aufgebaut und dessen Eigenschaften sollten sinngemäß so befüllt sein:
Datensatzherkunft: Select ID, Feld2, Feld3 from tblDeineTabelle order by Feld2
gebundene Spalte: 1
Spaltenanzahl: 3
Spaltenbreiten: 0cm;4cm;4cm
"Mehrfachwahl" geht nur mit einem Listenfeld mit entspr. Einstellung und Zusammenbau der Where-Condition mittels VBA.
Ein Auflisten von Zahlen in einem Textfeld allein funktioniert nicht, weil die Trennzeichen (hier Kommata als Teil der SQL-Syntax) nicht automatisch aus dem Textfeldinhalt (z. B.: "1,3,4,6") erkannt werden können.
Hallo Franz
TEXT22, weil ich das Textfeld erstellt habe und die Ausgabe des Kombinationsfeldes dorthin übergeben habe.
Das umschreiben des Kombifeldes habe ich probiert funktioniert sehr gut. Werde ich mir merken. ;) für später.
Listenfeld habe ich erstellt und auch kann auch mehrere Auswählen, in die Abfrage habe ich
[Formulare]![frm_Listenerstellung]![ListenFeldWorkshopBezeichnung]
eingefügt. Funktioniert aber leider nicht egal ob ich einen oder mehrere Anwähle.
Cord
Hallo,
lies meinen vorherigen Post nochmal genau....
Zitat"Mehrfachwahl" geht nur mit einem Listenfeld mit entspr. Einstellung und Zusammenbau der Where-Condition mittels VBA.
Gibt es denn irgendwo Anleitungen wo das tatsächlich erklärt wird ?
Habe leider nirgends mehr gefunden als die Erstellung.
Cord
Habe was gefunden
Private Sub ListenFeldWorkshopBezeichnung_AfterUpdate()
Dim var As Variant
Dim str
For Each var In Me.ListenFeldWorkshopBezeichnung.ItemsSelected
str = str & ";" & var
Next var
Me!Text34 = Mid(str, 2)
End Sub
Habe das ausprobiert und wird wunderbar an das Textfeld weitergegeben, aber ich musste feststellen, das die ID die im textfeld erscheint nicht die aus der tblWorkshops ist sondern eine die das Feld wohl selber vergibt.
Hallo,
erklärende Stellen gibt es viele, auch hier im Forum..
ZitatPrivate Sub ListenFeldWorkshopBezeichnung_AfterUpdate()
Dim var As Variant
Dim strStr as String
For Each var In Me.ListenFeldWorkshopBezeichnung.ItemsSelected
strStr = strStr & "," & Me.ListenFeldWorkshopBezeichnung.Column(0,var)
Next var
If Len(strStr) Then
strStr = Mid(strStr, 2)
End If
' ab hier strStr für eine Where-Condition verwenden oder für die Eigenschaft "Filter" eines Forms zur Filterung:
'
Me.Filter = "ID_WS in (" & strStr & ")
Me.FilterOn =true
End Sub
Danke nochmal für die Info.
Erklärungen habe ich versucht hier zu finden bin aber gescheitert.
Gibt es irgendwo eine Liste mit möglichen Befehlen für VBA und wie die Syntax sein muss ?
Auch für Sondergeschichten, wie das ich für meine Abfrage nicht nur ein Kriterium einfügen kann sondern Mehrere über die Auswahl im Listenfeld.
Die Ausgabe klappt super ins Textfeld aber jetzt muss das in die Abfrage über where wie du geschrieben hast.
Toll wäre wirklich sowas wie eine Liste falls es das gibt.
Inzwischen habe ich mir gedacht wäre es besser, die Abfrage über einen Button OK zu starten.
Muss ich die Übertragung dann erst machen oder soll die lieber im Combifeld sein ?
So viele Fragen für die ich keine Antworten finde, weil ich wahrscheinlich falsch frage :(
Im Object Browser habe ich den Befehl where nicht einmal gefunden
Cord
Hallo,
eine Liste so, wie Du Dir es vorstellst oder wünscht, gibt es nicht.
Zunächst musst Du auch unterscheiden zwischen SQL-Statements und deren Syntax (z. B. im Abfrageentwurf/Ansicht/SQL-Ansicht) und VBA-Code mit dessen Syntax, (z. B. im VBE, Aufruf mit <Strg><F11> aus Access heraus).
Für VBA kannst Du die Hilfe(taste) (F1) im VBA-Editor (VBE) bemühen.
Grundsätzlich wäre es aber angebracht, sich mit den Grundlagen von Access (einschließlich VBA) mittels Buch oder Tutorials und Beispiel-DBs zu beschäftigen.
Googlen hilft dabei...
http://www.vba-wissen.de/
Grundlegende Kenntnisse in (allgemeiner) Programmierung sind dabei eigentlich auch Voraussetzung, derweil Access eher eine Programmierumgebung darstellt, bzw. bereitstellt.
Einfach nur mit der Copy&Paste-Methode zu arbeiten, wird nicht zielführend sein.
Leider fehlt mir die Grundlage zum Programmieren.
Ich werde versuchen mich weiterzubilden und die Ozeane zwischen den Wissensinseln zu verkleinern.
Trotz allem sind viele Dinge mir nicht klar woher das Wissen kommt, wenn es nirgends eine DB für alle möglichen Befehle existiert.
Um die strStr in die Abfrage zu bekommen habe ich gesucht und das hier https://support.microsoft.com/de-de/help/509116 (https://support.microsoft.com/de-de/help/509116) gefunden. Habe das auch ausprobiert, aber kein Erfolg.
ZitatEinfach nur mit der Copy&Paste-Methode zu arbeiten, wird nicht zielführend sein.
Ist natürlich keine echte Lösung da muss ich dir leider Recht geben
Cord
Ps hatte geglaubt mit den Assistenten zum Ziel zu kommen weit gefehlt
Hallo,
na, dann zeig doch mal Deinen Versuch...
angepasste Ereignisprozedur, um eine Mehrfachauswahl für die Datenherkunft eines Kombifeldes zu benutzen:
ZitatPrivate Sub ListenFeldWorkshopBezeichnung_AfterUpdate()
Dim var As Variant
Dim strSQL as String
Dim strStr as String
Dim strKrit as String
For Each var In Me.ListenFeldWorkshopBezeichnung.ItemsSelected
strStr = strStr & "," & Me.ListenFeldWorkshopBezeichnung.Column(0,var)
Next var
If Len(strStr) Then
strStr = Mid(strStr, 2)
End If
strKrit = " Where ID_WS in (" & strStr & ") Order By Feld1" 'Where-Condition und mit Sortierung auf Feld1
strSQL = " Select ID, Feld1, Feld2 from tblDeineTabelle " 'SQL-String als Abfrage
strSQL = strSQL & strKrit SQL-String mit Kriterium erweitern
Me!Kombi2.Rowsource = strSQL
End Sub
Wohlgemerkt, dies ist nur eine von mehreren Methoden, Parameter als Where-Condition an eine Abfrage zu übergeben und soll zeigen, wie SQL und VBA gemischt werden kann.
Ziel ist es, an die Datensatzherkunft eines Kombis einen mit dynamischen Kriteriumswerten versehenen SQL-String (Abfrage) zuzuweisen.
Hallo Franz,
If Len(strStr) Then
Das finde ich nicht schön.
Gerade für Anfänger können solche "Verkürzungen" eher verwirrend sein.
Len gibt einen Longwert zurück, wie er in der OH nachlesen kann, und du
verwendest es als Boolean. Auch wenn's am Ergebnis nichts ändert würde
ich es immer so schreiben
If Len(strStr) > 0 Then
oder ganz ohne Len
If strStr <> vbNullString Then
gruss ekkehard
Hallo,
prinzipiell hast Du Recht, aber diese Konvertierungen begegnen einem in VBA auf Schritt und Tritt, auch an solchen Stellen, an denen es nicht bemerkt wird. Am schlimmsten (für Anfänger) zu verstehen, ist m. M. nach die Variant-Geschichte ("NULL", Sub-Datentypen)
True ist definiert als <> 0
False ist definiert als =0
Solange der Wertebereich (Long, Integer, Boolean) nicht überschritten/verletzt wird, ist es (bis auf die Tiefen des Maschinencodes (Assembler) ) egal, ob man Long-0 mit Boolean-0 (False) vergleicht.
?True gibt -1 zurück. Welchen Datentyp hat dann dieses "-1" ? Oder ?False entspr.?
IMHO ist es gerade für einen Anfänger eine gute Stelle, sich Gedanken über Vergleiche (eigentlich Ausdrücke) zu machen ;)
Aber : es ist nur meine Meinung ..
Jetzt bin ich wirklich durch.
Ich beantrage erstmal Bücher und fange an zu lesen. Ich hoffe solche Dinge sind da auch beschrieben.
@Franz Wenn ich den Code einfüge den du gepostet hast fragt er nach dem Kombi2 muss ich das erstellen? und wenn wofür ?
Ich werde das erstmal "zu Fuß" machen und nur die nötigen Abfragen erstellen und händisch starten, sodass ich das erstmal so nutze.
Genau wie ein Formular zur Erstellung oder Bearbeitung der einzelnen Teile trage ich dann erstmal so ein.
Wird wohl ein langer Weg, hatte meinem Chef gesagt ich möchte einen Kurs Access aber naja wie das denn so ist ....
Cord
Ps Danke an dich Franz und auch an Ekkehard
Hallo,
"Kombi2" ist der Name des Kombis (den ich jetzt nicht kenne) , das die gefilterten Datensätze anzeigen soll.
Den Namen musst Du natürlich an Deine Gegebenheiten anpassen.
Oder für was brauchst Du denn die Abfrage?
Sollte in die Kriterien einer Abfrage eingefügt werden, sodass ich über das Listenfeld aussuchen kann ob ich einen oder mehrere Workshops in einer Abfrage zusammenfasse.
Z.B. ich brauche nicht nur Klassenräume sonder auch Adminsection und Copiecentre
Cord
Ps Buch wollte ich dies bestellen https://www.amazon.de/gp/product/3836219417?pf_rd_p=9cadea0c-55f1-4f08-936d-e9b2b65b7197&pf_rd_r=S6R737EAHP9XW440AQY3
Hallo,
Deine Erklärung ist nicht brauchbar..
Ich interpretiere das so, als dass in einem Listenfeld mit Mehrfachauswahl mehrere Einträge markiert (ausgewählt) werden , die anschließend das Filter-Kriterium für ein Kombifeld bilden. Mit dem Kombifeld wird letztendlich der interessierende Datensatz bestimmt und z. B. mit dem Formular angezeigt.
Stimmt das so oder meinst Du es anders?
Das Buch kenne ich nicht, aber es ist sicher besser als Nichts ;)
Also von vorne :)
Ich habe eine Abfrage (abf_Lieferliste) in der auch die WorkshopID vorhanden ist. Über die WorkshopID möchte ich selektieren welche Workshops in der Abfrage angezeigt werden sollen. Dies ist über die Kriterien "zu Fuss" machbar aber nicht praktikabel.
In dem Formular habe ich ein Listenfeld erstellt, in dem die tblWorkshops zur Auswahl bereitsteht und mit deiner Hilfe auch die richtige ID überträgt.
Diese ID soll jetzt nicht nur in das Text34 Feld sondern auch in die Kriterien der Abfrage eingefügt werden. Wenn das nicht beides geht, egal Textfeld war nur zum schauen ob da überhaupt was passiert.
Eine besondere Schwierigkeit wird noch, das die Workshops mehrfach vorhanden sein können (zB 3 Klassenräume) aber da kümmere ich mich danach drum.
Ich hoffe jetzt ist die Erklärung besser.
Cord
Hallo,
und weiter:
WAS soll mit der Abfrage (abf_Lieferliste) gemacht werden, nachdem die Filterung passiert ist?
Bloßes Angucken hilft nicht weiter....
Vergiss doch mal das Textfeld.
ZitatEine besondere Schwierigkeit wird noch, das die Workshops mehrfach vorhanden sein können
Dann zeigt die Abfrage nicht nur die Workshops als solche an, sondern auch deren "Details"..
Das hätte für eine Filterung nach der WS_ID eher weniger Bedeutung. Es wäre sowieso, dann nach dem WSID-Fremdschlüssel zu filtern, wenn die dahinterliegende Db normalisiert ist (wäre).
Lad mal die DB hier hoch; datenreduziert, komprimiert/repariert und gezippt.
Habe die Hochgeladen mit allem, aber reduzierten Daten.
Die Formulare und Berichte sind teilweise nur Platzhalter also nicht wundern.
Das Formular um das es hier geht ist frm_Angebotsliste die anderen ergeben sich daraus.
Aus der Abfrage soll ein Bericht erstellt werden und später auch in Excel oder PDF exportiert werden. Ist in der DB hinterlegt.
Ok Verständnis denke ich: Nicht die Workshops werden selektiert sondern die Teile nach Workshop mein Fehler falsch Beschrieben.
Cord
Hallo,
Beispiel(!) anbei.
Hallo
einiges habe ich glaube ich verstanden zB ich kann eine Datenbank komplett ohne Beziehungen erstellen und die dann über INNER JOIN in den Abfragen erzeugen.
Die Befehlsschaltflächen muss ich umbenennen habe ich auch rausgefunden :) (cmdOK_frm.....)
Was ich nicht verstehe ist die Beziehung zwischen abf_Lieferliste und abf_Lieferliste_Templ. In dem VBA sind beide vorhanden und im SQL ist der einzige Unterschied der WHERE muss das immer so sein ? oder hast du das gemacht, das ich beides sehe ?
Habe mir auch das Makro umwandeln lassen und festgestellt, das die SQL Anweisungen dann drin stehen.
Was für mich heißt, die IF THEN Schleifen kann ich mir zum großen Teil sparen ?
Und über DoCmd. Und den Befehl der nötig ist kürzt das ganze und ist auch schneller ?
(zB: DoCmd.OpenReport "ber_Lieferliste", acViewReport, "", "", acNormal
)
Habe jetzt auch das Buch bekommen werde wohl Spass haben :P
Danke für das Beispiel und tut mir leid, das ich dich weiter nerfe.
Cord
PS schaue doch bitte die PN
PPS:
Hab noch was gefunden
was macht
Dim strSQL As String
im 2ten SUB finde das nicht wieder ?
Hallo,
eine Db ohne Beziehungen (und diese mit ref. Integrität) zu erstellen , ist immer ein Drahtseilakt, der in den meisten Fällen zum Absturz (des Autors) führt und der die Db frustriert in den Bach wirft.. ;)
Das A und O einer Db ist nun mal die korrekte Abbildung der realen Datenverhältnisse und der Abhängigkeiten voneinander (Tabellen und Beziehungen mit ref. Integr.) .
Alles weitere (Forms, Abfragen, Berichte ) bauen auf diesen Beziehungsgrundlagen auf und können auch nur dann richtige Ergebnisse liefern, bzw. funktionieren, wenn die "Basis" (Tabellendaten) in sich stimmig sind.
Die Methode mit den zwei Abfragen habe ich nur zur "Demonstration" gewählt.
"abf_Lieferliste_Templ" ist eine "Vorlage"- (Template-) Abfrage, die nur eine "Dummy"-Where-Condition besitzt ("((1()=1)"). Die Klammern sind an sich nicht nötig, Access macht die selber aufgrund seiner "Klammerwut". Die WC liefert insgesamt "True", so das die Abfrage ansonsten beliebig gestaltet werden kann, was die Select-Liste und die Tabelle(n) betrifft, solange das Ziel (Bericht mit den Daten) damit erreicht werden kann.
Soll nun eine Abfrage nach bestimmten Kriterien gefiltert werden, stellt man den Kriterien-String mit VBA zusammen und ersetzt (mit Replace) die Dummy-Bedingung durch den akt. Kriterien-String. Der so generierte SQL-String wird lediglich einer anderen Abfrage ("abf_Lieferliste") zugewiesen, die dann beliebig weiterverarbeitet werden kann. Im Beispiel habe ich lediglich die Abfrage geöffnet und angezeigt. Genauso gut kann diese Abfrage in der Datenherkunft eines Berichtes stehen, der dann die entspr. gefilterten Datensätze anzeigt. Oder die Abfrage kann mit OutputTo in ein Excel-Sheet exportiert werden, oder..., oder...
"Dim strSQL As String" steht im Modulkopf und gilt deshalb in allen Funktionen/Subs in diesem Modul. Ein der Variablen zugewiesener Werte steht in allen Funkt. /Subs in diesem Modul zur Weiterverarbeitung zur Verfügung.
DoCmd.OpenReport "ber_Lieferliste", acViewReport ', "", "", acNormal
öffnet den Bericht in der Berichtsansicht mit den Daten, die von der Abfrage geliefert werden, die in dessen Datenherkunft steht.
Guten Morgen und TGIF
Ich versuche mal zusammenzufassen.
Das Template kann ich weglassen und direkt in die Abfrage abf_Lieferliste die ID_WS über die WHERE einfügen.
strSQL = CurrentDb.QueryDefs("abf_Lieferliste
_Templ").SQL 'SQL-String der Abfrage
-VorlageWobei Lieferliste immer nur ein Beispiel bleibt.
Private Sub Befehl10_Click()
Dim var As Variant, strSQL As String
strSQL = CurrentDb.QueryDefs("abf_Lieferliste").SQL 'SQL-String der Abfrage
strKrit = " ID_WS in (" & strKrit & ")"
strSQL = Replace(strSQL, "((1)=1)", strKrit)
Debug.Print strSQL
CurrentDb.QueryDefs("abf_Lieferliste").SQL = strSQL
'DoCmd.OpenQuery "abf_Lieferliste"
DoCmd.OpenReport "ber_Lieferliste", acViewReport ' , "", "", acNormal
End Sub
Dann kann ich das Template komplett weglassen.
Warum kann ich nicht die Gleiche Abfrage für verschiedene Berichte nutzen ? und mir dort nur einblenden, was ich brauche ?
Oder ist das zur Übersichtlichkeit ?
Zitateine Db ohne Beziehungen (und diese mit ref. Integrität) zu erstellen , ist immer ein Drahtseilakt, der in den meisten Fällen zum Absturz (des Autors) führt und der die Db frustriert in den Bach wirft.. ;)
Das A und O einer Db ist nun mal die korrekte Abbildung der realen Datenverhältnisse und der Abhängigkeiten voneinander (Tabellen und Beziehungen mit ref. Integr.) .
Alles weitere (Forms, Abfragen, Berichte ) bauen auf diesen Beziehungsgrundlagen auf und können auch nur dann richtige Ergebnisse liefern, bzw. funktionieren, wenn die "Basis" (Tabellendaten) in sich stimmig sind.
Ok habe mich eh schon gefragt wie man das verwalten soll.
Zitat"Dim strSQL As String" steht im Modulkopf und gilt deshalb in allen Funktionen/Subs in diesem Modul. Ein der Variablen zugewiesener Werte steht in allen Funkt. /Subs in diesem Modul zur Weiterverarbeitung zur Verfügung.
Steht in der zweiten SUB auch wird dort aber doch nicht verarbeitet oder irre ich mich da ?
Habe die
, "", "", acNormal
gelöscht und sehe keine Veränderung im Bericht in der Hilfe steht was da reingehört ist wohl bei der Umwandlung von Makro in SQL unsinnigerweise eingefügt.
Danke für deine Gedult
Cord
Mein Fehler
geänderte Version funktioniert nicht
Holt sich nicht die Liste aus dem Listenfeld aber warum ?
Im Grunde bleibt doch alles gleich oder sehe ich das falsch ?
Cord
Hallo,
die xxxx_Temp kannst Du (hier in diesem Beispiel) nicht weglassen. Wozu wohl hab ich die verwendet?
Wenn Du die 1=1 - Condition in der Abfrage durch das akt. Kriterium ersetzt, ist eine weitere, bzw. andere Filterung auf diese Art und Weise nicht mehr möglich, das "1=1" ist ja ersetzt und wird nicht mehr gefunden.
ZitatWarum kann ich nicht die Gleiche Abfrage für verschiedene Berichte nutzen ? und mir dort nur einblenden, was ich brauche ?
Die Ausgangsfrage bezog sich doch auf verschiedene Anwendungen der Abfrage, also für Berichte und z. B. für Export nach Excel oder auch für ein Listenfeld...
Wenn Du nur einen Bericht damit anzeigen willst, dann brauchst Du das gaze Getöns nicht, sondern öffnest den Bericht, dessen Abfrage (Datenherkunft) keine Filterung, bzw. Where-Condition besitzt, lediglich mit Docmd.OpenReport und hierbei mit Übergabe des vorher erzeugten Kriterienstrings an dessen Where-Condition-Parameter.
Zitatdas "1=1" ist ja ersetzt und wird nicht mehr gefunden.
Klar ich Dussel
Also kann ich die Kriterien auch an den Bericht geben und sozusagen eine Abfrage generieren, die alle Möglichkeiten (Workshops) enthält und erst im Bericht oder Export filtern.
Gut ich mach mich wieder ans lesen.
Ich wünsche allen und insbesondere dir ein schönes goldenes Oktober WE und setze das hier auf erledigt.
Cord