PDA

Vollständige Version anzeigen : Qeury mit Makroreader aufgezeichnet


Fösi
18.03.2009, 10:39
Hallo

Habe die Abrage mit dem Makroreader aufgezeichent.
Wie kann man diese Abfrage nun formatieren oder leserlicher machen.
Mit _ (Zeilenumbruch) klappt es nicht.

Gruss
Fösi


Sub test()
With ActiveSheet. _
QueryTables.Add(Connection:=Array(Array("ODBC;DBQ= P:\Bereiche\Logistik\Basisdaten\ ;DefaultDir=strDir ;Driver={Driver do Microsoft "), Array("Excel(*.xls)};DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=1;SafeTransactions=0 ;Threads=3" _
), Array(";UID=admin;UserCommitSync=Yes;")), _
Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Ergebnisse.Artikelnummer, Ergebnisse.Artikelname, Ergebnisse.Klassierung, Ergebnisse.Einkäufergruppe, Ergebnisse.Lagerbestand, Ergebnisse.Lagerumschlag FROM `P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag`.Ergebnisse Erge" _
, _
"bnisse WHERE (Ergebnisse.Artikelname Like 'ZBK%') AND (Ergebnisse.Sortimentscode='Aktiv') OR (Ergebnisse.Artikelname Like 'ZBV%') AND (Ergebnisse.Sortimentscode='Aktiv') OR (Ergebnisse.Artikelname Like 'ZBG%') AND (Ergebnisse.Sor" _
, _
"timentscode='Aktiv') ORDER BY Ergebnisse.Artikelnummer, Ergebnisse.Klassierung" _
)
.Name = "LagerumschlagfürPlanzahlen"
.SourceConnectionFile = strQuelle
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub

EarlFred
18.03.2009, 10:47
Hallo Fösi,

wichtig ist nicht nur das "_", sondern auch ein Leerzeichen davor. Dann klappt's auch!

Grüße
EarlFred

Fösi
18.03.2009, 12:26
Hallo EarlFred

Eben darum ist mir die Frage ja auch ein bisschen Peindlich.
Habe natürlich mit LeerschlagUnderline probiert.
Aber es funkt nicht.

Fösi

ebs17
18.03.2009, 12:42
Eine SQL-Anweisung ist ein String und muss in VBA zusätzlich zum Unterstrich für die Befehlsfortsetzung mit einem "&" verknüpft werden.

Zusätzlich sollte man diese Sonderzeichen nicht beliebig setzen:
With ActiveSheet. _

Fösi
18.03.2009, 12:51
Auch hier der gleiche Fehler!!!

ebs17
18.03.2009, 13:06
Das "beliebig" trifft nicht nur auf eine Stelle zu. Ein behobener Fehler macht Platz für die Anzeige des nächsten.

Ein Versuch:
Sub test()
With ActiveSheet
QueryTables.Add(Connection:=Array(Array("ODBC;DBQ= P:\Bereiche\Logistik\Basisdaten\; _
DefaultDir=strDir ;Driver={Driver do Microsoft "), Array("Excel(*.xls)}; _
DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5; _
ReadOnly=1;SafeTransactions=0;Threads=3"), Array(";UID=admin;UserCommitSync=Yes;")), _
Destination:=Range("A1")).CommandText = Array( _
"SELECT Ergebnisse.Artikelnummer, Ergebnisse.Artikelname, Ergebnisse.Klassierung," & _
" Ergebnisse.Einkäufergruppe, Ergebnisse.Lagerbestand, Ergebnisse.Lagerumschlag" & _
" FROM `P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag`.Ergebnisse" & _
" WHERE (Ergebnisse.Artikelname Like 'ZBK%') AND (Ergebnisse.Sortimentscode='Aktiv')" & _
" OR (Ergebnisse.Artikelname Like 'ZBV%') AND (Ergebnisse.Sortimentscode='Aktiv')" & _
" OR (Ergebnisse.Artikelname Like 'ZBG%') AND (Ergebnisse.Sortimentscode='Aktiv')" & _
" ORDER BY Ergebnisse.Artikelnummer, Ergebnisse.Klassierung")
.Name = "LagerumschlagfürPlanzahlen"
.SourceConnectionFile = strQuelle
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub

Zusätzlich gibt es Möglichkeiten, den Code durch geeignete Maßnahmen zu kürzen und damit die Übersicht zu erhöhen. Hier ein Beispiel, wo innerhalb der SQL-Anweisung ein Aliasname für die Tabelle verwendet wird
...
"SELECT T.Artikelnummer, T.Artikelname, T.Klassierung," & _
" T.Einkäufergruppe, T.Lagerbestand, T.Lagerumschlag" & _
" FROM `P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag`.Ergebnisse AS T" & _
" WHERE (T.Artikelname Like 'ZBK%') AND (T.Sortimentscode='Aktiv')" & _
" OR T.Artikelname Like 'ZBV%') AND (T.Sortimentscode='Aktiv')" & _
" OR (T.Artikelname Like 'ZBG%') AND (T.Sortimentscode='Aktiv')" & _
" ORDER BY T.Artikelnummer, T.Klassierung")
...

Fösi
18.03.2009, 13:40
Hallo Eberhard

Kommt immer noch eine Fehlermeldung.

Fösi

ebs17
18.03.2009, 14:39
Wie gesagt: Ein behobener Fehler macht Platz für die Anzeige des nächsten. Eine fehlende Klammer, Komma statt Semikolon o.ä., wer soll das auf Anhieb überblicken?

Nachdem Du aus dem gezeigten Beispiel die Regeln für die Zeilentrennung nachvollziehen kannst, würde ich das am vom Rekorder aufgezeichneten Originalcode im VBA-Editor schrittweise wiederholen. Einen Fehler bekommst Du sehr schön durch roten Text dargestellt.

Fösi
18.03.2009, 15:32
Hallo Eberhard

Habe es jetzt hingekriegt. So funktioniert die Abfrage.

Aber ist das wirklich das gelbe vom Ei?

Tschüss
Fösi
Sub Makro3()
'
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DBQ=P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag.xls; " _
), Array( _
"DefaultDir=P:\Bereiche\Logistik\Basisdaten;Driver={Driver do Microsoft " _
), Array( _
"Excel(*.xls)};DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8; " _
), Array( _
"PageTimeout=5;ReadOnly=1;SafeTransactions=0;Threads=3; UID=admin;UserCommitSync=Yes;")), Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Ergebnisse.Artikelnummer, Ergebnisse.Artikelname, Ergebnisse.Klassierung, " _
, _
"Ergebnisse.Einkäufergruppe, Ergebnisse.Lagerbestand, Ergebnisse.Lagerumschlag" _
, _
" FROM `P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag`.Ergebnisse Ergebnisse" _
, _
" WHERE (Ergebnisse.Artikelname Like 'ZBK%') AND (Ergebnisse.Sortimentscode='Aktiv')" _
, _
" OR (Ergebnisse.Artikelname Like 'ZBV%') AND (Ergebnisse.Sortimentscode='Aktiv')" _
, _
" OR (Ergebnisse.Artikelname Like 'ZBG%') AND (Ergebnisse.Sortimentscode='Aktiv')" _
, _
" ORDER BY Ergebnisse.Artikelnummer, Ergebnisse.Klassierung" _
)
.Name = "Axapta_LagerumschlagfürPlanzahlen"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceConnectionFile = _
"P:\Bereiche\Logistik\Basisdaten\Abfragen\Planzahlen.dqy"
.Refresh BackgroundQuery:=False
End With
End Sub

ebs17
18.03.2009, 17:45
Aber ist das wirklich das gelbe vom Ei?
Die Zeilenaufteilung muss man so treffen, dass man die Anweisung auch vom Sinn her erfassen kann (-> Code lesen und verstehen).
Einzelne Kommas auf eine eigene Zeile zu ziehen wäre nicht mein Geschmack.
Die SQL-Anweisung zu lesen fällt mir in meiner Darstellung leicht, bei Deiner ist es deutlich unübersichtlicher.

Am Ende ist diese Darstellung nur für den Leser (Entwickler). Der sollte es sich und dem Folgeleser übersichtlich gestalten.
Der Compiler (Codeausführung) schiebt intern eh alles wieder zusammen.

Fösi
19.03.2009, 07:08
Hallo Eberhard

Einzelne Kommas auf eine eigene Zeile zu ziehen wäre nicht mein Geschmack
Meiner eigentlich auch nicht.

Darum eingangs ja meine Frage:
Wie kann man diese Abfrage nun formatieren oder leserlicher machen.


Vielen Dank für deine Infos.
Gruss
Fösi

ebs17
19.03.2009, 09:45
Meiner eigentlich auch nicht.
Warum machst Du das dann? Diese Zeilentrennung hast Du doch vorgenommen. Lieber mal nur eine halbe Zeile als eine unübersichtliche Trennung.

Argumente für die Anweisung kannst Du auch vorab in Variablen ablegen und dann nur die Variablen einfügen. In Deiner Anweisung bieten sich dazu die Dateipfade und die SQL-Anweisung an. Damit bist Du auch flexibler in der Anwendung:
Sub Makro3()
Dim sDefaultDir As String
Dim sDatei As String
Dim sSQL As String

sDefaultDir = "P:\Bereiche\Logistik\Basisdaten"
' Datei könnte flexibel aus Filedialog entnommen werden
sDatei = "P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag.xls"
' Abfrage könnte variiert werden
sSQL = "SELECT T.Artikelnummer, T.Artikelname, T.Klassierung," & _
" T.Einkäufergruppe, T.Lagerbestand, T.Lagerumschlag" & _
" FROM `P:\Bereiche\Logistik\Basisdaten\T_Lagerumschlag`.Ergebnisse T" & _
" WHERE (T.Artikelname Like 'ZBK%') AND (T.Sortimentscode='Aktiv')" & _
" OR (T.Artikelname Like 'ZBV%') AND (T.Sortimentscode='Aktiv')" & _
" OR (T.Artikelname Like 'ZBG%') AND (T.Sortimentscode='Aktiv')" & _
" ORDER BY T.Artikelnummer, T.Klassierung"

With ActiveSheet.QueryTables.Add(Connection:=Array(Array("ODBC;DBQ=" & sDatei & ";"), _
Array("DefaultDir=" & sDefaultDir & ";Driver={Driver do Microsoft "), _
Array("Excel(*.xls)};DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8; "), _
Array("PageTimeout=5;ReadOnly=1;SafeTransactions=0;Threads=3; UID=admin; _
UserCommitSync=Yes;")), Destination:=Range("A1"))
.CommandText = Array(sSQL)
.Name = "Axapta_LagerumschlagfürPlanzahlen"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceConnectionFile = _
"P:\Bereiche\Logistik\Basisdaten\Abfragen\Planzahlen.dqy"
.Refresh BackgroundQuery:=False
End With
End Sub