aximand
Goto Top

VBA Excel Recordset - Abfrage auf SQL-Server

Hallo,

ich habe ein neuerliches Problem.

Mitarbeiter sollen in einem Excel-Sheet die Artikelnummern ihrer benötigten Produkte runterschreiben.

Ich ermittle die Anzahl der Zeilen und möchte jetzt für die Anzahl der Zeilen eine Abfrage gegen den SQL-Server starten.


For intzeile = 2 to z (z= Gesamtanzahl der Zeilen, beginnt bei 2 weil in Zeile 1 Überschrift)

strArtikelnummer = Daten.Cells(intzeile, 1).Value

Select Bezeichnung from XYZ where Artikelnummer = strArtikelnumme

Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value (Zeile intzeile, Spalte 2 = Wert Bezeichnung aus dem Recordset

next intzeile


Mein Problem dabei ist, dass ich in der Schleife zwar zur nächsten Zeile mit der nächsten Artikelnummer komme, aber dann den Fehler 3021, BOF oder EOF = True oder Datensatz gelöscht bekomme.
Wobei BOF und EOF False sind und daher nur "gelöschter Datensatz" in Frage kommt?

Was ich in der Schleife mache:
For intzeile = 2 to z
Dim rst As New ADODB.Recordset
rst.ActiveConnection = conDB
rst.Open strSQLQuery
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value
rst.close

next intzeile

Das klappt eben nur bei dem ersten Durchlauf. Warum?


Gibt es eine andere Lösungsmöglichkeit, dass ich eine variable SQL-Abfrage durchführe die in Abhängigkeit der in den Zeilen niedergeschriebenen Artikelnummern steht?
verwaltung

Content-Key: 305786

Url: https://administrator.de/contentid/305786

Printed on: April 24, 2024 at 18:04 o'clock

Member: emeriks
emeriks May 31, 2016 updated at 14:33:42 (UTC)
Goto Top
Hi,
erstens: Bitte benutze Code-Tags!
Zweitens
Wo und wie legst Du "strSQLQuery" fest?

E.

VBA kann meines Wissens kein Dim innerhalb von Schleifen. bzw. immer nur ein Mal. Beim zweiten Mal steigt es dann aus. Wenn Du "on error resume next" aktiviert hast, dann verwendet er "rst" erneut, welches aber bereits geschlossen ist und nicht wiederverwendet werden kann.

Deshalb: Hol die Dim's aus der Schleife raus.

Dim rst as ADODB.Recordset
dim strSQLQuery as string
dim strArtikelnummer as Integer
For intzeile = 2 to z
  strArtikelnummer = Daten.Cells(intzeile, 1).Value
  strSQLQuery = "Select Bezeichnung from XYZ where Artikelnummer = " & strArtikelnumme  
  set rst = new ADODB.Recordset
  rst.ActiveConnection = conDB
  rst.Open strSQLQuery
  Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value  
  rst.close
next intzeile
Member: Aximand
Aximand May 31, 2016, updated at Jun 01, 2016 at 10:39:47 (UTC)
Goto Top
Hallo, ich hänge meine Idee einfach mal rein, wenn das noch nicht sauber strukturiert ist, dann sorry - hab hier noch nicht viel code gepostet und lerne dementsprechend noch:

strSQLQuery wird innerhalb der Schleife festgelegt, weil durch die Schleife auf die nächste Artikelnummer in der Folgezeile gezeigt wird.

Public Function Verwaltung()

Sheets("Daten").Select ' Auf das Datenblatt springen  
strServer = "zzzz"  
strDatenbank = "yyyyy"  

' Zähler für Anzahl der Zeilen, die erste Artikelnummer ist in Zeile 2  
'  
Dim intz As Integer
intz = Worksheets("Daten").UsedRange.Rows.Count - 1    'Zählen der Zeilen, - 1 weil oberste Zeile = Überschrift  
'  
' Spalten und Zeile als Variable  
'  
Dim introw As Integer
Dim intcolumn As Integer
'  
' ein weiterer Zähler für die Schleife "von  bis intz  
'  
Dim intschleife As Integer
'  
'  
Dim rst As New ADODB.Recordset


 Set conDB = New ADODB.Connection

        conDB.Provider = "SQLOLEDB"  
        conDB.Properties("Persist Security Info").Value = False  
        conDB.Properties("Data Source").Value = strServer  
        conDB.Properties("Initial Catalog").Value = strDatenbank  
        conDB.Properties("User ID").Value = "Test"  'strAnmeldename  
        conDB.Properties("Password").Value = ""   'strKennwort  
        conDB.Open
        
For intschleife = 2 To intz

   strArtikelnummer = Daten.Cells(intschleife, 1).Value

   strSQLQuery = "SELECT KHKArtikel.Bezeichnung1 AS Bezeichnung, " _  
                & "SUM(DISTINCT case when  KHKDispoArtikel.Type = 0 then KHKDispoArtikel.Menge else 0 end) AS bestellt, " _  
                & "SUM(DISTINCT case when KHKLagerplatzbestaende.Lagerkennung <> '70861' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '70137' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '70138' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '70888' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '70622' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '05' and " _  
                & "KHKLagerplatzbestaende.Lagerkennung <> '70861' then KHKLagerplatzbestaende.Bestand else 0 end) AS Gesamtbestand " _  
                & "FROM         KHKDispoArtikel inner JOIN " _  
                & "KHKLagerplatzbestaende ON KHKDispoArtikel.Artikelnummer = KHKLagerplatzbestaende.Artikelnummer AND " _  
                & "KHKDispoArtikel.AuspraegungID = KHKLagerplatzbestaende.AuspraegungID inner Join " _  
                & "KHKArtikel ON KHKDispoArtikel.Artikelnummer = KHKArtikel.Artikelnummer " _  
                & "where KHKDispoArtikel.Artikelnummer = '" **& strArtikelnummer **& "' GROUP by Bezeichnung1"  
                
                '& "KHKLagerplatzbestaende.Lagerkennung <> 'HL-WE' and " Wareneingangsregal zukünftig rausrechnen _  


rst.Open strSQLQuery

' Initialwerte für das ExcelSheet  
intcolumn = 1 

Daten.Cells(intschleife, intcolumn + 1) = rst.Fields("Bezeichnung").Value  
Daten.Cells(intschleife, intcolumn + 2) = rst.Fields("Gesamtbestand").Value  
Daten.Cells(intschleife, intcolumn + 3) = rst.Fields("bestellt").Value * -1  
rst.Close

Next intschleife

End Function
Member: emeriks
emeriks May 31, 2016 updated at 15:54:05 (UTC)
Goto Top
Nimm Code-Tags! Dann lese ich das vielleicht ...
Member: Aximand
Aximand Jun 01, 2016 at 10:37:26 (UTC)
Goto Top
brauchst Du nicht mehr zu lesen, weil sich das Problem selbst gelöst hat.

Das Problem lag darin, dass in einer gewissen Konstellation die Abfrage keinen Wert geliefert hat und damit eben auch kein Datensatz vorhanden war, EOF damit = true ist.

Geändert werden musste der zweite join von inner auf left. Problem gelöst.