Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SQL mit variablen Wert aus Zelle A2

Forumthread: SQL mit variablen Wert aus Zelle A2

SQL mit variablen Wert aus Zelle A2
Detlef
Hallo zusammen,
ich lese folgenden SQL aus einer TXT-Datei aus:
SELECT A.PART_BGVG, A.VTNR_SVTNR, A.VTNR_SVTNRNAME,BA.AUSWZEIT,
SUM(CASE WHEN BB.PRODSL_STUFE3_ID = 2010650
THEN BA.BES_BTR
ELSE 0
END) AS Transport
FROM DWHFB.FAKT_BESTAND_AGT BA
INNER JOIN DWHFB.DIM_VTNR A
ON (BA.PART_BGVG = A.PART_BGVG)
AND (BA.VTNR_ID = A.VTNR_VTNR)
INNER JOIN DWHFB.DIM_PRODSL BB
ON (BA.PART_BGVG = BB.PART_BGVG)
AND (BA.PRODSL_ID = BB.PRODSL_STUFE0_ID)
WHERE BA.AUSWZEIT >= '01.01.2009'
AND A.VTNR_SVTNR = 1234567
GROUP BY A.PART_BGVG, A.VTNR_SVTNR, A.VTNR_SVTNRNAME,BA.AUSWZEIT
Die SVTNR möchte ich gern variabel gestalten und aus der Zelle A2 des Arbeitsblattes PARA auslesen. Die Zelle trägt den Bereichsnamen rP1.SVTNR. Ich möchte den "harten" Eintrag im SQL z.B. durch Range("rP1.SVTNR").value ersetzen. Bin bisher bei allen möglichen Varianten gescheitert. Wenn ich das aus der TXT-Datei einlese, setzt der Code nicht den Inhalt der Zelle.
Es handelt sich um eine Oracle-Abfrage.
Bin für jeden Hinweis dankbar.
Gruß Detlef
Anzeige
AW: SQL mit variablen Wert aus Zelle A2
23.03.2010 10:56:31
Renee
Hi Detlef,
Zeig mal den VBA-Code, der jetzt die Txt-Datei statisch verarbeitet!
GreetZ Renée
AW: SQL mit variablen Wert aus Zelle A2
23.03.2010 10:57:19
xr8k2
Hallo Detlef,
Ist der "harte" SVTNR - Wert in der .txt immer gleich? Kann der in der .txt vielleicht durch eine durch eine spez. Textmarke ersetzt werden?
Zeig mal den Code zum Einlesen der .txt.
Gruß,
xr8k2
Anzeige
AW: SQL mit variablen Wert aus Zelle A2
23.03.2010 11:06:22
Detlef
Hallo,
hier der Code zum Einlesen der TXT:
Sub ProcSqlCreate_AA()

    Dim strSQLString As String
    Dim strFivServer As String
    Dim strFormKopSP As Integer
    Dim intFormKopZE As Integer
    Dim verz As String

    On Error Resume Next
    
    strFivServer = Range("rP1.FIVServer").Value
    verz = ActiveWorkbook.Path
        
    Open verz & "\SqlCreate_AA.txt" For Input As #1
    strSQLString = Input(LOF(1), 1)
    Close #1
        
    '***Position des Datenimports aus Oracle 
    strFormKopSP = 2 '***aufsetzen Importspalte 
    intFormKopZE = 2 '***aufsetzen Importzeile 

'    procSQL_Beginn 
    Call procOracle(strSQLString, strFivServer, strFormKopSP, intFormKopZE)
'    procSQL_Ende 
        
End Sub
und hier der Code für die Einbindung von Oracle:
Option Explicit
Sub procOracle(strSQLString As String, strSERVER As String, strFormKopSP As Integer, intFormKopZE As Integer)
    Dim cn         As Connection
    Dim rs         As Recordset
    Dim conn       As String
    Dim SQLString  As String
    Dim xx         As Worksheet   ' das Ziel-Tabellenblatt in Excel 
    Dim i          As Long
    Dim J          As Long
    Dim anzZeilen  As Long

'    On Error GoTo fehler 

    Set xx = ActiveSheet  '***das Ziel-Tabellenblatt in Excel 
    
    '***Die datenbank öffnen 
    Set cn = New ADODB.Connection

    Open "C:\AZ_DATEN\OraclePassW.txt" For Input As #1
    conn = Input(LOF(1), 1)
    Close #1

    conn = conn & ";DRIVER={Microsoft ODBC for Oracle};SERVER=" & strSERVER + ";"
    
    With cn
        .ConnectionString = conn
        .Open
    End With
    
    '***Definieren was geholt werden soll 
    SQLString = strSQLString
    
    Set rs = New ADODB.Recordset
    rs.Open SQLString, cn, adOpenDynamic, adLockReadOnly
    
    '***Die Feldnamen der Datenbanktabelle in die definierte Zeile der Exceltabelle schreiben 
   
    For J = 0 To rs.Fields.Count - 1
        xx.Cells(intFormKopZE, J + strFormKopSP) = rs.Fields.Item(J).Name '***und auf definerte Spalte aufsetzen 
    Next
        
    '***Jetzt alle Sätze holen und in die Exceltabelle schreiben 
    i = intFormKopZE '***auf Zeile 2 beginnen 
    rs.MoveFirst
    Do While rs.EOF = False
        i = i + 1
        For J = 0 To rs.Fields.Count - 1
        If IsNull(rs.Fields.Item(J).Value) = False Then
           xx.Cells(i, J + strFormKopSP) = rs.Fields.Item(J).Value '***und auf die definierte Spalte aufsetzen 
        End If
        Next
        rs.MoveNext
    Loop
    
    rs.Close
    cn.Close

    '***optimale Spaltenbreite einstellen 
'        Cells.Select 
'        Selection.Columns.AutoFit 
        
    Set rs = Nothing
    Set cn = Nothing
    Set xx = Nothing
    
fehler:
    Exit Sub
    
End Sub
Gruß Detlef
Anzeige
AW: SQL mit variablen Wert aus Zelle A2
23.03.2010 11:23:59
Renee
Hi Detlef,
' In der ersten Prozedur, nach...
strSQLString = Input(LOF(1), 1)
' einsetzen...
strSQLString = Replace(strSQLString, "1234567", Worksheets("PARA").Cells(2,1).Text))

GreetZ Renée
In der Hoffnung, Renée, ...
23.03.2010 11:35:03
xr8k2
... das die "1234567" nie irgendwo anders im SQL-String regulär auftauchen ;-)
Gruß,
xr8k2
Anzeige
AW: In der Hoffnung, Renée, ...
23.03.2010 12:26:23
Detlef
Hallo,
nein, kein Problem "1234567" war nur so als Beispiel. Im Original werden da eindeutige Platzhalter stehen z.B. PLH_SVTNR
Gruß Detlef
Dann halt, besser ...
23.03.2010 12:29:35
Renee
damit auch die Hoffnung nicht stirbt:
im Vorschlag war eh ein Fehler )-zuviel ;-)
    strSQLString = Replace(strSQLString, "A.VTNR_SVTNR = 1234567", _
"A.VTNR_SVTNR = " & Worksheets("PARA").Cells(2, 1).Text)
GreetZ Renée
Anzeige
AW: Dann halt, besser ...
23.03.2010 13:51:02
Detlef
Hallo Renée,
nehme gern auch besser. Sieht jetzt bei mir so aus.
    strSQLString = Replace(strSQLString, "A.VTNR_SVTNR=PLH_SVTNR", _
                           "A.VTNR_SVTNR = " & Worksheets("PARA").Range("rP1.SVTNR").Text)
Nochmals besten Dank an Euch beide.
Gruß Detlef
Anzeige
AW: super, vielen Dank (owT)
23.03.2010 11:39:02
Detlef
;
Anzeige
Anzeige

Infobox / Tutorial

SQL-Abfragen mit variablen Werten aus Excel-Zellen


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke im Projektfenster mit der rechten Maustaste auf dein Projekt und wähle „Einfügen“ > „Modul“.

  3. SQL-String einlesen: Verwende den folgenden Code, um den SQL-String aus der TXT-Datei zu laden:

    Sub ProcSqlCreate_AA()
        Dim strSQLString As String
        Dim verz As String
        verz = ActiveWorkbook.Path
    
        Open verz & "\SqlCreate_AA.txt" For Input As #1
        strSQLString = Input(LOF(1), 1)
        Close #1
  4. Variablenwert ersetzen: Um die SVTNR-Variable durch den Wert aus Zelle A2 zu ersetzen, füge folgendes hinzu:

    strSQLString = Replace(strSQLString, "A.VTNR_SVTNR = PLH_SVTNR", "A.VTNR_SVTNR = " & Worksheets("PARA").Range("rP1.SVTNR").Text)
  5. SQL ausführen: Führe den SQL-String mit der Oracle-Verbindung aus, indem Du den Code zum Ausführen der SQL-Abfrage einfügst.


Häufige Fehler und Lösungen

  • Fehler: SQL-String wird nicht aktualisiert
    Lösung: Stelle sicher, dass der Code zum Ersetzen des Wertes nach dem Einlesen des SQL-Strings erfolgt. Überprüfe, ob der Bereichsname „rP1.SVTNR“ korrekt ist.

  • Fehler: Verbindung zu Oracle schlägt fehl
    Lösung: Vergewissere Dich, dass die Verbindungsdaten korrekt sind und die ODBC-Treiber installiert sind.


Alternative Methoden

  • Direktes Ersetzen in einer SQL-Abfrage: Anstatt den Wert in den Text einzufügen, könntest Du Parameter in der SQL-Abfrage verwenden, wenn die Datenbank dies unterstützt. Dies kann sicherer und effizienter sein.

  • Nutzung von Named Ranges: Anstelle von festen Zellreferenzen kannst Du auch benannte Bereiche nutzen, um die Lesbarkeit des Codes zu erhöhen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du den SQL-String dynamisch gestalten kannst:

Sub DynamicSqlExample()
    Dim strSQLString As String
    Dim svtnr As String
    svtnr = Worksheets("PARA").Range("rP1.SVTNR").Text

    strSQLString = "SELECT * FROM Tabelle WHERE SVTNR = " & svtnr
    ' Füge hier den Code zum Ausführen der SQL-Abfrage hinzu
End Sub

Tipps für Profis

  • Debugging: Nutze die Debug.Print-Anweisung, um den SQL-String vor der Ausführung anzuzeigen. So kannst Du sicherstellen, dass alles korrekt ersetzt wurde.

  • Verwendung von Try-Catch: Implementiere error handling, um mögliche Laufzeitfehler zu vermeiden und den Code robuster zu gestalten.

  • Arbeiten mit ADODB: Um effizientere Datenbankabfragen durchzuführen, erwäge die Verwendung von ADODB für die Verbindung zur Datenbank.


FAQ: Häufige Fragen

1. Kann ich auch mehrere Werte aus Zellen einfügen?
Ja, Du kannst mehrere Replace-Anweisungen verwenden, um verschiedene Werte aus verschiedenen Zellen in den SQL-String einzufügen.

2. Was ist, wenn ich andere Platzhalter verwenden möchte?
Du kannst jeden beliebigen Platzhalter in Deinem SQL-String nutzen. Achte darauf, dass Du diese Platzhalter im Code korrekt ersetzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige