PDA

View Full Version : Spaltenüberschriften aus VBA sql-Statement in Excel ausgeben



rr2001
15-04-15, 12:25
geschätzte Leute,
leider werden bei diesem VBA-Script die in sql definierten Spaltenüberschriften (Filiale, Kunde und Inhalt) nicht mit in die Excel-Tabelle übernommen.
Hat jemand eine Idee?
LG
RR

Sub lesen()

Dim Filiale As String
Dim Kunde As String
Dim Inhalt As String

Set CS = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")

'Retrieve values from Cells on the sheet to use as selections in the query below
Filiale = ActiveSheet.Range("B1").Value
Kunde = ActiveSheet.Range("D1").Value
Inhalt = ActiveSheet.Range("F1").Value

'MsgBox (Filiale)

'ISeries connection String
ConnectString = "Driver={ISeries Access ODBC Driver};System=xxx.xxx.xx.x;Uid=xxxxxxxx;Pwd=xxxxx xxx;Library=xxxxxxxx;QueryTimeout=0"

CS.Open (ConnectString)

sqlstring = "select chd1cd as Filiale, chd3cd as Kunde, cthptx as Inhalt" & _
" from y2svgen.svkopfv1 "
sqlstring = sqlstring & " where chd1cd = '" & Filiale & "'"
If Kunde <> "" Then
sqlstring = sqlstring & " and chd3cd = '" & Kunde & "'"
End If
If Inhalt <> "" Then
sqlstring = sqlstring & " and upper(cthptx) like upper('%" & Inhalt & "%')"
End If

'Message box can be used for debugging the SQL statement
MsgBox (sqlstring)

RS.Open sqlstring, CS

'Clear Previous contents of Cells
Cells.Select
ActiveSheet.Range("A7:Z65535").ClearContents

'copy the Recordset to excel sheet starting at A7
ActiveSheet.Range("A7").CopyFromRecordset RS

'Close Connection And Recordset
RS.Close
CS.Close

'Reset cell back to A1
ActiveSheet.Range("A1").Select

End Sub

KingofKning
15-04-15, 12:44
Hallo,mußt Du mal suchen, war schon ein paar mal Thema hier.GG

TheDevil
15-04-15, 13:10
Hallo.
VBA kenne ich jetzt nicht so ... aber in c# mache ich folgendes. Ich fülle die Datatable und dann ...

DataColumnCollection dcc = mdtMailPlus.Columns;
for (int i = 0; i < mdtMailPlus.Columns.Count; i++)
{
oSheet.Cells[Zeile, i + Spalte] = dcc[i].ColumnName.ToString();
}

Vielleicht geht so was ja auch in VBA :-)
Gruß aus Flensburg
Ralf

Fuerchau
15-04-15, 14:39
Warum eigentlich so kompliziert?
Über Daten->Aus anderen Quellen->MS-Query kann man parametrierte SQL's definieren.
Parameter schreibt man in SQL mit "?", also
select ... from myfile where key1 = ? and key2 like '%' concat ? concat '%' ...
Die ? werden von MS-Query beim Ausführen angefordert.
Nach der Rückgabe nach Excel kann man über die Eigenschaften der Abfrage jedem ? eine Zelle zuordnen und auch entscheiden, ob die Feldüberschriften mit ausgegeben werden sollen.

Ansonsten musst du das halt wie oben beschrieben selber machen.

rr2001
15-04-15, 15:14
Geschätzter Fürchau,
deinen Vorschlag mit dem Query-Assistenten habe ich bereits früher angewendet.
Vba habe ich nur aus dem einen Grund verwendet, um das sql-Statement variabel zusammenstellen zu können. Ich möchte eine where bzw. and-Abfrage nur dann ausführen, wenn das entsprechende Filterfeld gefüllt ist. Hat man diese Möglichkeit auch mit dem Query-Assistenten?
LG
rr

Fuerchau
15-04-15, 16:15
Nein so nicht, aber mit intelligentem case-ausdruck könnte das klappen:).

rr2001
16-04-15, 10:00
hallo Fürchau,
also dein Vorschlag mit "key2 like '%' concat ? concat '%' ..." wunderbar, hat sofort geklappt!

Vielleicht noch ein paar Erläuterungen, wie ich eine where bzw. and-Abfrage nur unter bestimmten Bedingungen ausführen kann.

Vielen Dank!
RR

Fuerchau
16-04-15, 11:08
In embedded SQL kann ich den selben Parameter (Hostvariable) ja immer wieder nehmen. In ODBC benötige ich jedesmal ein neues "?". Aber wenn ich diese dann der selben Zelle zuweise dann geht es auch wieder.
Beispiel im Embedded:

where ... and
case
when ? = 0 then 1 -- Hier ggf. halt gegen Blank prüfen bei Zeichen
when keyx = ? then 1
else 0
end = 1
and ...

rr2001
17-04-15, 09:28
Problem gelöst.

Vielen Dank an alle Beteiligten.