Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: viruzzz86 am Juli 02, 2020, 15:58:42

Titel: Abfragekriterium mit Schleife Variabel
Beitrag von: viruzzz86 am Juli 02, 2020, 15:58:42
Hallo,
ich habe hier zwar die Suchfunktion benutzt, konnte aber nichts finden bezüglich Abfragekriterien und Schleifen, daher wende ich mich auch gleich mit einem neuen Post an alle. Sollte doch irgendwo dieses Thema schon mal behandelt worden sein, dann bitte ich um Verzeihung und würde mich über einen Link freuen...

Ich arbeite seit einiger Zeit an einer Datenbank, welche mittlerweile mehrere Benutzer (FE-BE) täglich verwenden. Die Datenaufzeichnung funktioniert ausgezeichnet. Wir erfassen damit unsere Arbeitszeit welche wir diversen Projekten und Tätigkeiten zuordnen.
Die wesentlichen Daten werden in einer Tabelle gespeichert. Beim Auswerten habe ich jetzt aber leichte Schwierigkeiten, dies zu gruppieren und zu automatisieren.

Um das zu Vereinfachen habe ich folgenden Lösungsansatz angestrebt (Bin gerne für andere Lösungsvorschläge offen):
Großprojekte werden nach unseren Kunden benannt und bestehen aus mehreren Artikeln (Einzelprojekten) welche wir entwickeln. Dafür habe ich zwei Tabellen erstellt mit einer 1:N Beziehung um dies abzubilden.
tbl_KundenProjekt (imaginäre Beispieldaten)
[Kunden_ID] | [Kunde]
1          | McDonalds
2          | BurgerKing

tbl_Kundenprojektzuordnung (imag. Daten)
[Projekt_ID - Prim] | [Kunden_ID - Fremd] | [Projektname]
1                  | 1                  | ChickenNuggets
2                  | 1                  | BigMac
usw...


Da bei uns unterschiedlichste Schreibweisen verwendet werden (Bsp.: BigMac, Big Mac, Big-Mac,... etc) und in der Haupttabelle welche ich auswerten möchte nur die Projektnamen mit diesen unterschiedlichen Schreibweisen auftauchen, kann ich die Daten leider nicht direkt über den Kunden rausziehen.

ich probiere also das filterkriterium für die Abfrage folgendermaßen aufzubauen: like *Big*Mac* or *chicken*nuggets* or...


also zuerst hole ich mir die Daten mittels Recordset und füge sie mittels Schleife zu einem String welcher mein Filterkriterium sein soll

Dim filter As String
Dim filterfinal As String

Dim REC As Recordset
Set REC = CurrentDb.OpenRecordset("select * from tbl_KundenprojektZuordnung", DB_OPEN_DYNASET, dbSeeChanges)

Do Until REC.EOF    'Schleife setzt String zusammen'
filter = filter + Chr(34) & "*" & REC!Präfix & "*" & REC!Artikelnr & "*" & Chr(34) & " OR "
REC.MoveNext
Loop
REC.Close

'das letzte OR, sowie zwei Leerzeichen im String werden entfernt - 4 Satzzeichen weg
Dim Länge As Integer
Länge = Len(filter)
filterfinal = Left(filter, Länge - 4)

'String wird an globale Variable übergeben welche in einem Modul gespeichert ist
Glo_var_Kundenprojekt = filterfinal


Das Ganze funktioniert soweit. Mit realen Daten ergibt mein String zb. folgenden Wert
"*FM*10509*" OR "*FM*10510*" OR "*FM*10511*" OR "*FM*10512*"

Damit der String in der Abfrage abgerufen werden kann, muss dies über eine Funktion erfolgen. Diese ist natürlich auch in einem Modul untergebracht

Public Function Func_Kundenprojekte()
    Func_Kundenprojekte = Glo_var_Kundenprojekt
End Function



Leider funktioniert die Abfrage so nicht, wenn ich bei Kriterium "wie func_Kundenprojekte()" reinschreibe. Ich vermute dies liegt an den Anführungszeichen oder muss der String komplett anders zusammengesetzt werden? Kann mir diesbezüglich jemand Rat geben?

Fehler schein keiner auf. Abfrage bleibt nur leer.
wenn ich den String manuell reinschreibe funktioniert es

Hier mal die SQL-Ansicht der Abfrage mit der Funktion:
SELECT tbl_Zeiterfassung.ID, tbl_Zeiterfassung.Aufgabenkategorie, tbl_Zeiterfassung.Artikelfamilie, tbl_Zeiterfassung.Aufgabendetails, tbl_Zeiterfassung.Datum, tbl_Zeiterfassung.Kalenderwoche, tbl_Zeiterfassung.Dauer, tbl_Zeiterfassung.Soll, tbl_Zeiterfassung.Mitarbeiter, tbl_Zeiterfassung.[Projekt / Artikel], tbl_Zeiterfassung.Verschwendung, tbl_Zeiterfassung.[Datensatz gesperrt], tbl_Zeiterfassung.Datensatztyp, tbl_Zeiterfassung.Projektunterkategorie, tbl_Zeiterfassung.Präfix, tbl_Zeiterfassung.Artikelnummer, tbl_Zeiterfassung.Kommentar
FROM tbl_Zeiterfassung
WHERE (((tbl_Zeiterfassung.[Projekt / Artikel]) Like Func_Kundenprojekte()));

Hier die manuelle Eingabe welche funktioniert:SELECT tbl_Zeiterfassung.ID, tbl_Zeiterfassung.Aufgabenkategorie, tbl_Zeiterfassung.Artikelfamilie, tbl_Zeiterfassung.Aufgabendetails, tbl_Zeiterfassung.Datum, tbl_Zeiterfassung.Kalenderwoche, tbl_Zeiterfassung.Dauer, tbl_Zeiterfassung.Soll, tbl_Zeiterfassung.Mitarbeiter, tbl_Zeiterfassung.[Projekt / Artikel], tbl_Zeiterfassung.Verschwendung, tbl_Zeiterfassung.[Datensatz gesperrt], tbl_Zeiterfassung.Datensatztyp, tbl_Zeiterfassung.Projektunterkategorie, tbl_Zeiterfassung.Präfix, tbl_Zeiterfassung.Artikelnummer, tbl_Zeiterfassung.Kommentar
FROM tbl_Zeiterfassung
WHERE (((tbl_Zeiterfassung.[Projekt / Artikel]) Like "*fm*10509*" Or (tbl_Zeiterfassung.[Projekt / Artikel]) Like "*fm*10510*" Or (tbl_Zeiterfassung.[Projekt / Artikel]) Like "*fm*10511*" Or (tbl_Zeiterfassung.[Projekt / Artikel]) Like "*fm*10512*"));


natürlich habe ich probiert bei meinem String bei jedem OR-Kriterium auch die Tabelle mit anzugeben, dies hat leider nicht funktioniert. Kann jemand helfen?

gruß
Viruzzz
Titel: Re: Abfragekriterium mit Schleife Variabel
Beitrag von: ebs17 am Juli 02, 2020, 21:06:08
ZitatDas Ganze funktioniert soweit. Mit realen Daten ergibt mein String zb. folgenden Wert
"*FM*10509*" OR "*FM*10510*" OR "*FM*10511*" OR "*FM*10512*"
Damit kommst Du aber nicht auf einen Filter wie
Feld LIKE "X" OR Feld LIKE "Y" OR Feld LIKE "Z"Zudem kann man mit einer Funktion oder einer anderen Parameterübergabe nur jeweils einzelne Parameter übergeben und nicht ganze Ausdrücke wie hier mit Operatoren oder auch Parameterauflistungen.

Das Grundübel liegt hier:
filter = filter + Chr(34) & "*" & REC!Präfix & "*" & REC!Artikelnr & "*" & Chr(34) & " OR "Mit solchen zusammengesetzten (zusammengepappten) Informationen kann man schlecht arbeiten (Technik problematisch, Performance dramatisch verschlechtert). Das Zusammensetzen über Datensätze ist dann noch eine weitere Verschlimmerung.

Deine Daten nimmst Du (vollständig) aus einer Tabelle. Es ist einfach und übersichtlich, Deine zu filternde Tabelle mit jener, die Basis für das Recordset ist, über die beiden Felder in einer Abfrage zu verknüpfen.
Die Zieltabelle sollte selbstredend diese Feldinhalte auch atomar anbieten.
Titel: Re: Abfragekriterium mit Schleife Variabel
Beitrag von: Beaker s.a. am Juli 03, 2020, 15:43:09
@viruzzz86
ZitatDa bei uns unterschiedlichste Schreibweisen verwendet werden (Bsp.: BigMac, Big Mac, Big-Mac,... etc) und in der Haupttabelle welche ich auswerten möchte nur die Projektnamen mit diesen unterschiedlichen Schreibweisen auftauchen, kann ich die Daten leider nicht direkt über den Kunden rausziehen.
Da höre ich schon auf zu lesen.
In die "Haupttabelle" gehört ein Fremdschlüssel zu einer Projekttabelle,
und da steht nur einmal die gewünschte Schreibweise drin.
Die Verbindung von Kunde zu Projekt sollte in einer Zwischentabelle (n:m)
abgebildet werden, da es wohl wiederkehrende Projekte für unterschiedliche
Kunden gibt. Dann kannste dein ganzes OR- und LIKE-Gewurschtel vergessen.

Hier mal ein Link, den Eberhard früher gerne gepostet hat: Es war einmal (https://www.ms-office-forum.net/forum/showthread.php?t=289614&highlight=kleine+Excel) ...

gruss ekkehard