Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Kladdi am Februar 22, 2013, 09:17:11

Titel: Abfrage von Listenfeld
Beitrag von: Kladdi am Februar 22, 2013, 09:17:11
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am Februar 22, 2013, 12:51:22
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.

Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am Februar 22, 2013, 12:54:26
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am Februar 22, 2013, 13:40:54
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........
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am Februar 22, 2013, 13:43:15
Ok ich probier's...Danke dir.
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 14:04:17
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: database am März 05, 2013, 14:56:30
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 15:07:11
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()));


Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 15:13:16
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 15:21:44
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 15:23:23
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 05, 2013, 15:37:42
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...
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 15:41:07


Die Abfrage mit Werten soll als Excel-File exportiert werden.
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 15:47:41
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 15:51:49
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 15:55:00
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 05, 2013, 15:58:27
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...

Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 05, 2013, 16:01:28
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 16:05:29
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.
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 16:08:01
Ich habe es mal mit 2 Namen gemacht, da geht es bei mir.....

siehe Anhang

[Anhang gelöscht durch Administrator]
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 05, 2013, 16:08:53
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...
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 16:13:12
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.......
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 05, 2013, 16:27:51
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......
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 05, 2013, 16:29:47
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?
Titel: Re: Abfrage von Listenfeld
Beitrag von: 69bruno am März 06, 2013, 08:26:15
klar
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 06, 2013, 08:32:21
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]
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 06, 2013, 09:55:45
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

Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 06, 2013, 10:22:21
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 06, 2013, 10:41:15
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...   ;)
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 06, 2013, 10:47:01
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?  :-[
Titel: Re: Abfrage von Listenfeld
Beitrag von: DF6GL am März 06, 2013, 10:58:00
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
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 06, 2013, 11:06:28
UPDATE: *Schnell zurückruder*

Jetzt hab ichs verstanden...hab grad gesehen dass du die Function so genannt hast!
Titel: Re: Abfrage von Listenfeld
Beitrag von: Kladdi am März 06, 2013, 11:25:07
JAAAA! ES FUNKTIONIERT!
UNENDLICH vielen Dank an euch alle für eure Hilfe und eure Gedudl mit mir!  :D

Mfg Kladdi