Hallo,
ich mal wieder. ::)
Es ja möglich im Abfragekriterium ein Steuerelement von einem Formular anzusprechen.Mit:
BetweenForms![Formularname]![Steuerelementnamevon] AND Forms![Formularname]![Steuerelementnamebis]
Ist es möglich alle Werte eines Listenfelds anzusprechen und als Kriterium zu nutzen, bei mir nimmt er sich mit dem Befehl nur den letzten Eintrag raus.
Wenn ja, wie?
Mfg Kladdi
Wo kommen denn die Werte des Listenfeldes her ?
Wenn sie aus einer Tabelle kommen, sollte man eher da ansetzen.....
Denn dann stehen die Werte ja wahrscheinlich irgendwie in Beziehung zu den DS'en.
Bei manuell hinzugefügten Listenfeldwerten die nichtin einer Tabelle sind, muss man dann anders vorgehen, aber da warte ich erst mal deine Antwort ab.
Steht das Listenfeld vorher schon in einer Abhängigkeit ? dann Sollte diese vorhergehende Abhängigkeit das Kriterium darstellen.
Naja ich hab auf einer Form ein Listenfeld um eine Auswahl treffen zu können. Die Werte kommen aus einer Tabelle.
Die ausgewählten Elemente werden in einem anderen Listenfeld aufgelistet unter dem Namen "Selected", um zu sehen welche man bereits gewählt hat.
Die Abfrage soll nun alle Elemente aus der Liste "Selected" als Kriterium nehmen.
Mfg Kladdi
Ohne da jetzt Zeit zu haben, dass in VBA zu formulieren, Mach ein Modul, darin eine Schleife, die für jeden Eintrag in "selected" eine String-Variable als Kette befüllt (etwa: "= "& [Eintrag1] & " OR " & [Eintrag2] & " OR " .........
Und ruf das Modul (die Funktion) in der Abfrage im Kriterium auf........
Ich weiss aber grad nicht genau, wieviel OR's Du nehmen kannst........
Ok ich probier's...Danke dir.
Hallo Bruno,
hab mir jetzt mit viel Hilfe einen funktionierenden Code zur Verkettung zusammenschustern können.
Nur bleibt die Abfrage immernoch leer, obwohl die Daten vorhanden sind.
Option Compare Database
Option Explicit
Function Liste() As String
Dim i As Variant
Dim strvalue As String
Dim frmSelectionExport As Form_frmSelectionExport
Set frmSelectionExport = Screen.ActiveForm
For i = 0 To frmSelectionExport.List16.ListCount - 1
strvalue = "tblBooking.[boRevenue Recognition Fiscal Year Month Display Code] = '" & frmSelectionExport.List16.ItemData(i) & IIf(Len(strvalue), "' Or " & strvalue, "'")
Debug.Print strvalue
Next i
Liste = strvalue
End Function
Der zugehörige Export-Code:
Private Sub Command3_Click()
Dim xlAnw As Object
Dim startmonth As Variant
Dim endmonth As Variant
' Export
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "qryExportSelection", "C:\Temp\Customer-Report.xls", , "Sheet1"
' format in Excel
Set xlAnw = CreateObject("excel.application")
xlAnw.Visible = False ' runs invisible in the background
xlAnw.Workbooks.Open FileName:="C:\Temp\Customer-Report.xls"
xlAnw.Sheets("Sheet1").Select
xlAnw.Rows("1:1").Select
xlAnw.selection.Font.Bold = True ' Letters are bold
xlAnw.Cells.Select
xlAnw.selection.Columns.AutoFit ' optimal width
xlAnw.ActiveWorkbook.Save
xlAnw.ActiveWorkbook.Close
xlAnw.Quit
Set xlAnw = Nothing
MsgBox ("Export completed!")
End Sub
Hast du eine Idee woran das liegen könnte?
Mfg Kladdi
Hallo,
ergibt dein verketter String einen schlüssigen SQL-String?
Verkürze zum Testen mal den Aufbau ...
For i = 0 To 1 'frmSelectionExport.List16.ListCount - 1
... und schau dann den GESAMTEN SQL-String an ob der auch vollständig und ausführbar ist.
Denn wenn die entsprechenden Daten vorhanden sind und durch die Abfrage nicht gefunden werden,
kann's eigentlich nur an genau dieser Abfrage liegen - vermutlich passt im Aufbau des SQL-Strings etwas nicht.
Hallo,
erstmal danke für eure Geduld mit mir.
Die Debug-Funktion ergab diesen String:
ZitattblBooking.[boRevenue Recognition Fiscal Year Month Display Code] = 'FY2012-04' Or tblBooking.[boRevenue Recognition Fiscal Year Month Display Code] = 'FY2012-02'
Der in meinen ungeübten Augen auch Sinn macht.
Hier einmal der SQL-View der Abfrage:
SELECT tblBooking.[boRevenue Recognition Fiscal Year Month Display Code]
FROM tblBooking
WHERE (((tblBooking.[boRevenue Recognition Fiscal Year Month Display Code])=Liste()));
Ich zähle z.B. nur 3 Hochkommas,
Da sie ja die Anführunszeichen ersetzen, sollten sie immer im Paar auftreten.........
Dann fällt mir in deinem Beitrag, den Du mir genau in diese Antwort hineingeseschrieben hast auf ;o), das das Verkettungs "OR" nicht richtig erkannt zu werden scheint. Wird es dann nicht immer in Großbuchstaben geschrieben ??????
Aua aua aua, IIF sollte man auch lesen..... sorry
Kein Problem, freu mich über jeden Ratschlag/Hilfe die ich kriegen kann...
An dem OR scheints nicht zu liegen...
Er verkettet sowohl mit dem kleingeschriebenen als auch mit dem großgeschriebenen OR
Aber der Wahrheits- und der Sonstwert muss in Abfragen mit Semikolon getrennt werden........
Und.....was soll denn bei der Len-Funktion verglichen werden ?
Neee, alles nicht..... teste grade bei mir in einer db und es funktioniert mit Kommas und ohne Vergleichsoperation bei der Len-Funktion.
Hallo,
so funktioniert das Ganze doch nicht...
Eher so (unchecked):
Public Sub CreateAbfrageSQL()
Dim i As Long
Dim strvalue As String
Dim frmSelectionExport As Form_frmSelectionExport
Set frmSelectionExport = Screen.ActiveForm
For i = 0 To frmSelectionExport.List16.ListCount - 1
strvalue = "tblBooking.[boRevenue Recognition Fiscal Year Month Display Code] = '" & frmSelectionExport.List16.ItemData(i) & IIf(Len(strvalue), "' Or " & strvalue, "'")
Next i
strvalue = "SELECT tblBooking.[boRevenue Recognition Fiscal Year Month Display Code] FROM tblBooking WHERE " & strValue
Currentdb!Querydefs!DeineAbfrage.SQL = strvalue
End Function
wobei noch zu fragen wäre, was denn mit dieser zusammengebauten Abfrage(-SQL-String) nun passieren soll...
Die Abfrage mit Werten soll als Excel-File exportiert werden.
Eigentlich geht es ja nicht darum, einen kompletten Abfrage SQL-String zu erstellen, sondern ein verkettetes Kriterium zu erstellen, welches in einer Abfrage mittels Funktionsaufruf gesetzt wird. Da wird das
Zitatstrvalue = "SELECT tblBooking.[boRevenue Recognition Fiscal Year Month Display Code] FROM tblBooking WHERE " & strValue
Currentdb.Querydefs!DeineAbfrage.SQL = strvalue
doch zu viel sein...... denke ich
Die Funktion Liste() muss ja nur das "Where" ergeben.
An und für sich muss die Funktion ja nur das Ergebnis
= 'FY2012-04' Or 'FY2012-02'
erzielen, damit es als Kriterium in der Abfrage den gewünschten Effekt erzielt.
Also, er exportiert schon mal Werte...nur nicht die richtigen...sind statt 6 Werten 9 Werte
Kleine Anmerkung noch, die Zeile funktionierts nur so:
ZitatCurrentdb.Querydefs!DeineAbfrage.SQL = strvalue
Hallo,
beides Mal ist es ein Irrweg.
Zitat
= 'FY2012-04' Or 'FY2012-02'
ist kein gültiger Where-Bedingungsausdruck
ZitatEigentlich geht es ja nicht darum, einen kompletten Abfrage SQL-String zu erstellen
doch, darum geht es, denn ohne den kompletten SQL-String schaftt man es nicht, in eine vorhandene Abfrage, nur den kompletten Where-Bedingungs-Ausdruck mittels Rückgabewert einer Funktion einzubauen...
OK,
das "!" ist falsch an dieser Stelle, habe das auch im Beitrag geändert..
Führ doch die Abfrage mal aus dem DB-Fenster (Navi-Bereich) heraus aus, bzw. öffne die mal im Abfrageentwurf und prüfe, ob die Bedingungen zutreffend sind.
Hmmmm,
wo ich mein eigenes Posting so sehe,
erkenne ich wildes Vermischen von SQL-Statements und den Statements im Abfrageeditor.......
wenn Du es im Abfrageeditor gelöst haben willst, dann darf, bei mir getestet, das Ergebnis der Funktion nur noch
'FY2012-04' Or 'FY2012-02'
sein.
Ich habe es mal mit 2 Namen gemacht, da geht es bei mir.....
siehe Anhang
[Anhang gelöscht durch Administrator]
in der Tat,
der Abfrageeditor (Abfrageentwurf) zeigt aber auch nur die "User-genehme" Ansicht der Abfrage... Schau Dir mal die "SQL-Ansicht" der Abfrage an...
Ist mir klar, aber wenn ich die Funktion Liste() im Abfrageeditor einfüge, dann sollte sie nur die "echten" Kriterien zurückliefern, denn der Editor wandelt das ganze ja selbständig in einen SQL-String um und hat dann ggfls. zu viele Informationen.
Mit der Zeile
strvalue = "'" & frmSelectionExport.List16.ItemData(i) & IIf(Len(strvalue), "' Or " & strvalue, "'")
in der Funktion sollte es im Abfrageeditor reichen.
Leider bin ich nicht der SQL-Spezi, ich muss mir hier mit der genehmen Form des Editors helfen.......
Und mit dieser Funktion:
Public Function Liste()
Dim strvalue As String
strvalue = "'Kaufmann' Or 'Doll'"
Liste = strvalue
End Function
läuft es bei mir....über den Abfrageeditor......
Darf ich mich mal kurz einschalten? :-X
Es funktioniert mit beidem...mehr oder minder...
Gebe ich als Kriterium Liste() an funktionierts beim ersten Mal super, aber danach nicht mehr.
Weil beim nächsten Öffnen der Datenbank steht nun nicht mehr Liste() als Kriterium sondern die x Einträge die ich beim letzten Mal ausgewählt hatte.
Wähle ich nun neue Einträge, nimmt er immernoch die Alten als Kriterium, sprich es passiert nichts.
Könntet ihr mir besser helfen wenn ihr eine Demo meiner DB hättet?
klar
Guten Morgen,
anbei mal meine Datenbank.
Das Formular über das das alles läuft heißt frmSelectionExport, die dazugehörige Query heißt qryExportSelection und das Modul mit der Function heißt Selection.
Mfg Kladdi
[Anhang gelöscht durch Administrator]
Hallo,
etwa so:
Private Sub Command3_Click()
Dim xlAnw As Object
Dim startmonth As Variant
Dim endmonth As Variant
' Export
CurrentDb.QueryDefs!qryExportselection.SQL = "SELECT * FROM tblBooking Where " & fncKrit
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "qryExportSelection", "C:\Temp\Customer-Report.xls", , "Sheet1"
.
.
.
.
.
End Sub
Public Function fncKrit()
Dim varItm As Variant
Dim strSqlFilter As String, i As Long
With Forms!frmSelectionExport!List16
' For Each varItm In .ItemsSelected
' strSqlFilter = strSqlFilter & " or [boRevenue Recognition Fiscal Year Month Display Code] = '" & .ItemData(varItm) & "'"
' Next varItm
For i = 0 To .ListCount - 1
strSqlFilter = strSqlFilter & " or [boRevenue Recognition Fiscal Year Month Display Code] = '" & .ItemData(i) & "'"
Next
If strSqlFilter <> "" Then
fncKrit = Mid(strSqlFilter, 5)
End If
End With
End Function
Hallo,
erstmal danke für deine Mühe.
Die SQL Zeile im Export zeigt nen Compile Error weil fncKrit "zweideutig" ist.
Ansonsten läufts, Problem bleibt weiterhin dass er sich die im letzten Durchlauf ausgewählten "merkt" und als Kriterium nimmt
und nicht die neu ausgewählten.
Könnte man das lösen indem man nach jedem Export die "Selected"-ListBox leert?
Mfg Kladdi
Hallo,
die vorhandene fncKrit wird ja nur verändert, nicht neu hinzugefügt....
Zitat"Könnte man das lösen indem man nach jedem Export die "Selected"-ListBox leert?"
na klar... ;)
Hallo,
Zitatdie vorhandene fncKrit wird ja nur verändert, nicht neu hinzugefügt....
Und das heißt? ;D
If Me.List16.ListCount > 0 Then
i = 0
j = Me.List16.ListCount - 1
Do Until i > j
Me.List16.RemoveItem (j - i)
i = i + 1
Loop
End If
Löscht nach jedem Export die ListBox, nur "speichert" sich
die Abfrage anscheinend die Werte vom letzten Mal
bzw. sollte sich die Function ja bei jedem mal neu "berechnen", was sie aber nicht tut.
UPDATE: Ah Moment, hab nochmal deinen Beitrag gelesen.
Dient die Function fncKrit dazu, denn die ist mir gänzlich unbekannt? :-[
Hallo,
mhmm, versteh nicht, wo das Problem liegt.
natürlich ist in der Abfrage die "alte" Bedingung solange gespeichert, bis deren SQL-Eigenschaft wieder neu gesetzt wird, was beim Klicken auf die Export-Schaltfläche passiert.
Wenn die Abfrage zwischenzeitlich anders "aussehen" soll, dann muss das eben zusätzlich gemacht werden.. das
UPDATE: *Schnell zurückruder*
Jetzt hab ichs verstanden...hab grad gesehen dass du die Function so genannt hast!
JAAAA! ES FUNKTIONIERT!
UNENDLICH vielen Dank an euch alle für eure Hilfe und eure Gedudl mit mir! :D
Mfg Kladdi