collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 82
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 1
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14111
  • stats Beiträge insgesamt: 68063
  • stats Themen insgesamt: 9168
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: VBA SQL Abfrage mit Variable füllen  (Gelesen 608 mal)

Offline sellrich

  • Newbie
  • Beiträge: 15
VBA SQL Abfrage mit Variable füllen
« am: September 11, 2018, 11:59:52 »
Hallo Liebe Community,

allen voran : Ich habe die Suchfunktion bereits verwendet. Leider war nichts dabei was als Lösung für mein Problem genutzt werden konnte. Eventuell zu speziell.

Ich bin kein VBA-Profi. Habe etwas in meiner Ausbildung zum FiSy gelernt aber da sind nur Basics vorhanden.

Nun zu meinem Anliegen :
Die SQL Abfrage besteht bereits. Sie wurde von meinem "Vorgänger" entworfen. Die Abfrage macht folgendes : Sie packt sich aus einer Access-Abfrage(E44765_DBSTAT_STV_D_SEL) die Ersten zwei Symbole. -> GB: Links([E44765_DBSTAT_STV_D]![RG_NR];2)
Die Ersten 2 Symbole definieren unseren Geschäftsbereich.

Syntax :
strSqlStat = "SELECT E44765_DBSTAT_STV_D_SEL.* FROM E44765_DBSTAT_STV_D_SEL WHERE " & _
' "(((E44765_DBSTAT_STV_D_SEL.GB)='K1' Or (E44765_DBSTAT_STV_D_SEL.GB)='L1' Or " & _
' " (E44765_DBSTAT_STV_D_SEL.GB)='M1' AND ((E44765_DBSTAT_STV_D_SEL.STAT_DAT)>=" & doub_00 & "));"   (durchgestrichene Teil irrelevant für meine Frage)

Nun möchte ich, dass die Werte 'K1' - 'L1' - 'M1' variable gestaltet werden kann. Dazu habe ich eine Tabelle erstellt aus der ich die Informationen in eine Variable packe :

z.B :
GBL = DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'Lager'")    -> wäre L1 in dem Fall.
GBM = DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'MBI'")      -> M1
GBK = DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'KASN'")    -> K1

Das ermöglicht es ohne anpassen des Codes die Geschäftsbereiche zu ändern - indem man einfach in der Tabelle den Wert ändert.

Meine Lösung :

strSqlStat = "SELECT E44765_DBSTAT_STV_D_SEL.* FROM E44765_DBSTAT_STV_D_SEL WHERE " & _
"(((E44765_DBSTAT_STV_D_SEL.GB)='" & GBL & "' Or (E44765_DBSTAT_STV_D_SEL.GB)='" & GBK & "' Or " & _
"(((E44765_DBSTAT_STV_D_SEL.GB)='" & GBM & "' AND ((E44765_DBSTAT_STV_D_SEL.STAT_DAT)>=" & doub_00 & "));"



Leider erhalte ich beim Ausführen des Codes einen Laufzeit-Fehler. Er zeigt mir danach den Code an. An sich sieht es genau so aus wie ich es haben möchte.

Syntax-Fehler in Abfrageausdruck. 
"(((E44765_DBSTAT_STV_D_SEL.GB)='L1' Or (E44765_DBSTAT_STV_D_SEL.GB)='K1' Or " & _
"(((E44765_DBSTAT_STV_D_SEL.GB)='M1' AND ((E44765_DBSTAT_STV_D_SEL.STAT_DAT)>=" & doub_00 & "));"

Kann mir jemand sagen was ich falsch mache? Liegt es eventuell daran, dass ich die Informationen aus einer Access-Abfrage packe?
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 931
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #1 am: September 11, 2018, 12:51:58 »
Zitat
Ich bin kein VBA-Profi.
Für eine gescheite Abfrage (SQL ist da die Sprache) ist das unrelevant.

Variablen sind für SQL schlecht geeignet: Variablen in Abfragen verwenden

Zu dem Fehler: Der Ausdruck sieht gar nicht so schlecht aus, wenn man von der fehlenden Übersicht absieht, und die Klammern habe ich auch nicht gezählt.
doub_00 ist was genau? Einzusetzende Variablen müssen entsprechend ihrem Datentyp SQL-gemäß formatiert werden.

Tipp für Übersicht: Bei nur einer Tabelle kann man den Tabellennamen bis auf den FROM-Teil weglassen, das OR-Kriterium wird kürzer und übersichtlicher:
strSqlStat = "SELECT * FROM E44765_DBSTAT_STV_D_SEL" & _
    " WHERE GB IN ('K1', 'L1', 'M1')"
Damit kann man auch sehr gut unmittelbar auf eine weitere Tabelle zugreifen:
strSqlStat = "SELECT * FROM E44765_DBSTAT_STV_D_SEL" & _
    " WHERE GB IN (SELECT aktGB FROM tbl_GB" & _
    " WHERE Geschäftsbereich IN ('Lager', 'MBI', 'KASN'))"

Mit freundlichem Glück Auf!

Eberhard
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1397
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #2 am: September 11, 2018, 12:53:14 »
Wenn ich das richtig verstanden habe, sollte dieser Code helfen.   strSqlStat = "SELECT *" & vbLf & _
                "FROM   E44765_DBSTAT_STV_D_SEL" & vbLf & _
"WHERE  GB IN ( SELECT aktGB" & vbLf & _
"               FROM   tbl_GB" & vbLf & _
"               WHERE  Geschäftsbereich IN" & vbLf & _
                "        ( 'Lager', 'MBI', 'KASN' ) ) AND" & vbLf & _
"       STAT_DAT >= " & doub_00
Grüße von der (⌒▽⌒)
 

Offline sellrich

  • Newbie
  • Beiträge: 15
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #3 am: September 11, 2018, 14:08:54 »
Vielen Dank für die schnellen Antworten.
Leider klappt das nicht. Vielleicht habe ich es etwas doof formuliert.

Folgendes ist bei uns der Fall : Wir verwenden eine Access Datenbank die wir für interne Verwendung aufbereiten. Mit einer Access Abfrage holen wir uns eine Information aus einer Warenwirtschaftsdatenbank. Nämlich wie erwähnt die ersten zwei Stellen einer Rechnungsnummer - die bei uns unsere Geschäftsbereiche darstellen. Warum das alles so ist, weiß ich leider nicht. Es liegt auch nicht an mir es anders oder besser zu machen. Ich habe lediglich den Auftrag es variable zu gestalten (falls möglich).

Die Abfrage filtert alle Varianten raus die bei der RGNr. vorkommen können. In unserem aktuellen Fall L1,K1,M1, etc..
Was sich aber ändert sobald ein Geschäftsbereich voll ist und es eine Zahl höher geht L2,K2 etc.
Das bedeutet, dass die Hauptinformation über den Geschäftsbereich, innerhalb meines Codes, über eben diese Abfrage "E44765_DBSTAT_STV_D_SEL.GB" kommt.

Syntax :
strSqlStat = "SELECT E44765_DBSTAT_STV_D_SEL.* FROM E44765_DBSTAT_STV_D_SEL WHERE " & _
' "(((E44765_DBSTAT_STV_D_SEL.GB)='K1'
So kann ich den Code ausführen und er macht was er soll. Ich hätte aber gerne (doof ausgedrückt) :

"SELECT E44765_DBSTAT_STV_D_SEL.* FROM E44765_DBSTAT_STV_D_SEL WHERE " & _
' "(((E44765_DBSTAT_STV_D_SEL.GB)=GBK (Variable aus Tabelle in dem Fall GBK = K1)

Die Variable GBK fülle ich wie oben gesagt mit ner Tabelle die ich beabsichtige manuell anzupassen, wenn die Geschäftsbereiche sich verändern. Der Code muss nicht zwingend übersichtlicher sein, da es nicht mein Werk ist. Ich bin nur derjenige der die Missetaten meines Vorgängers irgendwie etwas "verbessern" soll.

Hoffe es ist nun etwas klarer formuliert.
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1940
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #4 am: September 11, 2018, 16:01:26 »
@sellrich
Zitat
Leider klappt das nicht.
Ob solcher "Fehlerbeschreibung" brechen die meisten der Helfer hier
regelmässig in wahre Begeisterungsstürme aus.  ;)
Kommt eine Fehlermeldung ? -> bitte posten
Hast du den String mit Debug.Print gecheckt? -> nachholen und Ergebnis auch evtl. posten

edit:
Wollte doch folgenden Hinweis nicht vergessen, vielleicht geht's besser
mit einer Parameter-Abfrage.
Näheres hier: http://www.donkarl.com?FAQ6.16

gruss ekkehard


P.S. Zum komfortablen Prüfen in VBA zusammengesetzter SQL-Strings
kann ich dieses kleine Tool empfehlen: http://access-codelib.net/download/addins/SqlDebugPrint.zip
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1397
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #5 am: September 11, 2018, 16:10:55 »
Du siehst den Unterschied? In der Ausgansgangssituation wird 'K1' innerhalb der VBA-Zeichenkette verwendet und in Deiner steht dort K1 dort ohne Apostrophe. Literale Textwerte müssen in SQL so (doppelte Hochkommata (") wären auch erlaubt, verlangen allerdings innerhalb einer VBA-Zeichenkette eine weitere Verdopplung, was schwierig zu lesen ist.) gekennzeichnet werden, sonst kann es nicht ausgewertet werden.
Den ganzen Sermon vor den Feldnamen muss auch nicht aufgeführt werden, weil die Feldnamen bei einer Tabelle/Abfrage eindeutig sind.

   strSqlStat = "... WHERE GB = '" & DLookup(...) & "' AND ..."oder gleichwertig   strSqlStat = "... WHERE GB = """ & DLookup(...) & """ AND ..."
Grüße von der (⌒▽⌒)
 

Offline sellrich

  • Newbie
  • Beiträge: 15
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #6 am: September 12, 2018, 10:23:29 »
@Beaker s.a
Zitat
Kommt eine Fehlermeldung ? -> bitte posten
Hast du den String mit Debug.Print gecheckt? -> nachholen und Ergebnis auch evtl. posten

Verzeihung habe ich nicht bedacht. Es kam die gleiche Fehlermeldung wie zuvor.
"Laufzeitfehler - Syntax-Fehler in Abfrageausdruck."


Zitat
   strSqlStat = "... WHERE GB = '" & DLookup(...) & "' AND ..."

Das habe ich versucht umzusetzen.

 strSqlStat = " SELECT* FROM E44765_DBSTAT_STV_D_SEL " & _
                            "WHERE GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'Strecke'") & "'" & _
                            "AND ((E44765_DBSTAT_STV_D_SEL.STAT_DAT)>=" & doub_00 & ");"

Da sagt er mir "Überzählig: ) " Nehme ich die Klammer am Ende weg =" & doub_00 & ";"

Klappt es. Verstehe zwar nicht, wieso diese Klammer überflüssig ist. Aber so klappen zumindest mal die Tests. Vielen Dank bis hierhin. Ich werde es jetzt noch im endgültigen Programm testen. Melde mich wieder.


EDIT: Also einzeln funktioniert es. Wenn ich aber jetzt mehrere Bedingungen aneinander fügen möchte mit OR :

 strSqlStat = " SELECT* FROM E44765_DBSTAT_STV_D_SEL " & _
                            "WHERE GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'Strecke'") & "'" Or "GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'KASN'") & "'"

Kriege ich einen Laufzeitfehler '13':
Typen unverträglich.

und einen Zeilenumbruch mit & _ lässt er mich auch nicht mehr machen.. Hilfe ^^
« Letzte Änderung: September 12, 2018, 11:21:22 von sellrich »
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23498
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #7 am: September 12, 2018, 20:25:14 »
Hallo,

Zitat
strSqlStat = " SELECT* FROM E44765_DBSTAT_STV_D_SEL " & _
           " WHERE GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'Strecke'") & _
           " Or GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'KASN'")

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 931
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #8 am: September 12, 2018, 20:36:41 »
Grauselig. Ein DLookup ist eine vollständige Abfrage, verpackt in eine Accessfunktion, und sie holt genau einen Wert bzw. ersatzweise NULL.

DLookup im Dauerfeuer ist genau so sinnvoll als wenn man wegen jeder Flasche Bier  einzeln zum Getränkemarkt quer durch die Stadt und zurück fährt. Das "funktioniert" zwar bis zu gewissen Grenzen (wenn die Party etwas größer ist, reicht der Tag nicht aus), aber es dürfte teuer werden.
Mit freundlichem Glück Auf!

Eberhard
 


Offline sellrich

  • Newbie
  • Beiträge: 15
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #10 am: September 13, 2018, 08:30:19 »
Guten Morgen.
Erstmal vielen Dank @DF6GL für den Code. Er funktioniert einwandfrei. Ich merke einfach wie wichtig Kleinigkeiten sind. Ich hab gestern gefühlt alle Variationen ausprobiert, anscheinend alle außer diese. Danke!

@ebs17
Zitat
Grauselig. Ein DLookup ist eine vollständige Abfrage, verpackt in eine Accessfunktion, und sie holt genau einen Wert bzw. ersatzweise NULL.

Das mag sein. Ich bin mir auch ziemlich sicher, wenn jeder von euch das gesamte Projekt anschauen würde, wäre Hände über den Kopf zusammen schlagen die einzig mögliche Reaktion. Ist aber überhaupt nicht mein Projekt und da ich noch am lernen bin wird meine eigene Version irgendwann hoffentlich ansehnlicher.

Nur aus reiner Neugierde : Das DLookup habe ich verwendet, weil im Code an anderen Stellen es ebenso gehandhabt wird. Und ich einfach nicht weiß wie das sonst geht.
Wie geht es denn sonst besser? Aus reiner Neugierde, bin froh, dass der Code so läuft. Aber ich möchte ja auch etwas lernen.


Ich bin dankbar, dass ihr mir helfen konntet! Super Team hier. und sehr freundlich. Vielen dank!
« Letzte Änderung: September 13, 2018, 08:34:50 von sellrich »
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 931
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #11 am: September 13, 2018, 09:40:17 »
Zitat
Wie geht es denn sonst besser?
Auf die Bierflaschen bezogen: Schnapp Dir die nötige Anzahl an Bierkästen oder ein Faß, somit hättest Du den Weg einmal. Nachvollziehbar?

Hier würde man statt einem Dauerfeuer von Einzelabfragen eine richtige Abfrage machen, die alles auf einmal holt. SQL hat hat gerade seine Stärke in Methoden zur Massendatenverarbeitung - in Datenbanken kommen regelmäßig ein paar mehr Daten vor und wollen zeitnah verarbeitet sein.
Zitat
Aber ich möchte ja auch etwas lernen.
Lies doch Dein Thema noch einmal ganz von vorn. Mehrfach lesen schadet nicht.
Mit freundlichem Glück Auf!

Eberhard
 

Offline sellrich

  • Newbie
  • Beiträge: 15
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #12 am: September 26, 2018, 14:48:11 »
Zitat
Hier würde man statt einem Dauerfeuer von Einzelabfragen eine richtige Abfrage machen, die alles auf einmal holt. SQL hat hat gerade seine Stärke in Methoden zur Massendatenverarbeitung - in Datenbanken kommen regelmäßig ein paar mehr Daten vor und wollen zeitnah verarbeitet sein.

gerade das macht mir ja so Probleme. Ich weiß leider nicht wie ich diese "richtige Abfrage" machen soll.

Du hast auch Recht.
strSqlStat = " SELECT* FROM E44765_DBSTAT_STV_D_SEL " & _
           " WHERE GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'Strecke'") & _
           " Or GB = '" & DLookup("[aktGB]", "tbl_GB", "[Geschäftsbereich] = 'KASN'")
Das SQL Statement wird so zwar akzeptiert das Programm jedoch hängt sich nach längerer Zeit einfach auf. Keine Fehlermeldung, kein Laufzeitfehler - nichts.
Schätze, dass es an DLookup liegt?! Denn wenn ich es rückgängig mache und jede Möglichkeit fest rein schreibe geht es. Ich versteh´s nicht  ???
« Letzte Änderung: September 26, 2018, 14:53:18 von sellrich »
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1397
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #13 am: September 26, 2018, 16:54:42 »
Das zuletzt Gezeigte als SQL-Abfrage:SELECT q.*
FROM   E44765_DBSTAT_STV_D_SEL AS q
WHERE  q.GB IN ( SELECT aktGB
                 FROM   tbl_GB
                 WHERE  Geschäftsbereich IN ( 'Strecke', 'KASN' ) );
Grüße von der (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: sellrich

Offline sellrich

  • Newbie
  • Beiträge: 15
Re: VBA SQL Abfrage mit Variable füllen
« Antwort #14 am: September 27, 2018, 09:19:00 »
Meine Ausführung:
strSqlStat = "SELECT q.* FROM E44765_DBSTAT_STV_D_SEL AS q WHERE q.GB IN (SELECT aktGB FROM tbl_GB WHERE Geschäftsbereich IN ('Lager', 'MBI', 'KASN', Strecke',OT-Werkstatt'));"
Debug.Print Ergebnis :
SELECT q.* FROM E44765_DBSTAT_STV_D_SEL AS q WHERE q.GB IN (SELECT aktGB FROM tbl_GB WHERE Geschäftsbereich IN ('Lager', 'MBI', 'KASN', Strecke',OT-Werkstatt'));
Fehlermeldung im Anhang.
Vielen Dank für eure anhaltende Mühe, trotz meiner Unwissenheit.
 

 

Ufrm in Abhängigkeit eines Listfeldes füllen

Begonnen von west20Board Formular

Antworten: 18
Aufrufe: 11067
Letzter Beitrag März 10, 2011, 20:46:22
von database
Datensatzzähler in einer Abfrage

Begonnen von peterBoard Tabelle/Abfrage

Antworten: 6
Aufrufe: 13730
Letzter Beitrag Juni 16, 2010, 16:32:34
von cyorps
Abfrage für Terminüberschneidungen und visuelle Darstellung

Begonnen von centaurusBoard Tabelle/Abfrage

Antworten: 3
Aufrufe: 6312
Letzter Beitrag Januar 21, 2011, 21:30:14
von cy_one_1
Datenerfassung mit Abfrage

Begonnen von Daniel-GSBoard Tabelle/Abfrage

Antworten: 2
Aufrufe: 5497
Letzter Beitrag Mai 05, 2010, 22:52:18
von oma
SQL Abfrage DELETE rückgängig machen??

Begonnen von hmfmartinBoard Tabelle/Abfrage

Antworten: 1
Aufrufe: 7258
Letzter Beitrag Mai 08, 2010, 19:18:08
von MzKlMu