aximand
Goto Top

ADO VBA, was wenn kein Treffer gegen die Datenbank erfolgt

Hallo,

eigentlich habe ich was ganz einfaches vor:

Check in der Excel-Zeile ob Artikel xy in der Tabelle 'Artikeletiketten' vorhanden ist. Wenn ja, dann die Zelle des Wertes rot einfärben, wenn nicht, dann transparent lassen, oder nach erfolgter Nachbesserung von rot auf transparent wechseln.

For intSchleife = 2 To intZ
If intZ >= 2 Then strSQLQuery_CheckArtikelvorhanden = "Select Artikelnummer from ArtikelEtiketten where Artikelnummer = '" & Daten.Cells(intSchleife, intcolumn + 1) & "'"  

               
            rst.Open strSQLQuery_CheckArtikelvorhanden
    
            Do Until rst.EOF
            If Daten.Cells(intSchleife, intcolumn + 1).Value = rst.Fields("Artikelnummer").Value And Daten.Cells(intSchleife, intcolumn) = "" Then  
            Daten.Cells(intSchleife, intcolumn + 1).Interior.Color = RGB(230, 50, 50)
            Elseif Daten.Cells(intSchleife, intcolumn + 1).Interior.ColorIndex = xlNone
            bFArtikel = True
            End If
            rst.MoveNext

            Loop
            
    rst.Close

Das Problem ist natürlich, dass er bei einem Artikel "zzzzzz" keinen Treffer gegen die Datenbank findet. Und damit sofort der Recordset EOF ist, die Schleife "Do until" gar nicht durchlaufen wird.
Wie kann ich sowas abfangen, wenn die Abfrage keinen Datensatz zu Tage fördert?

Content-ID: 314467

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

Pjordorf
Pjordorf 05.09.2016 aktualisiert um 16:23:47 Uhr
Goto Top
Hallo,

Zitat von @Aximand:
Wie kann ich sowas abfangen, wenn die Abfrage keinen Datensatz zu Tage fördert?
Noch ein Elseif vor dein Do Until einbauen welches dann das tut was du möchtest wenn eben kein Treffer erzielt wird.

Oder ein if rst.count <=0 dann eben gar nicht erst dein Do Loop....

Deiner Phantasie sind in der Umsetzung keinerlei grenzen gesetzt.

Gruß,
Peter
Friemler
Friemler 05.09.2016 um 14:12:29 Uhr
Goto Top
Hallo Aximand,

Du benötigst ein Boolean-Flag (z.B. bArtikelFound), das Du vor der Schleife auf False und in der Schleife nur dann auf True setzt, wenn der Artikel gefunden wurde. Das Einfärben der Zelle (abhängig vom Zustand des Flags) verschiebst Du dann hinter die Schleife.

Gruß
Friemler
Aximand
Aximand 05.09.2016 um 16:43:46 Uhr
Goto Top
Leider ist rst.RecordCount immer -1, selbst wenn er Artikel findet.
129813
129813 05.09.2016 aktualisiert um 17:11:24 Uhr
Goto Top
Zitat von @Aximand:

Leider ist rst.RecordCount immer -1, selbst wenn er Artikel findet.
For this to work you need to movelast first then check the property RecordCount and then rewind the cursor.
https://dbwiki.net/wiki/Access_Anfänger:_RecordCount_liefert_falsch ...

But a simple
If rs.EOF then
   '...  
End if
before your loop does the same work.

Regards
joachim57
joachim57 05.09.2016 aktualisiert um 17:09:46 Uhr
Goto Top
Ich mein mich dunkel erinnern zu können, das der RecordCount unter VBA nach dem open nicht sauber initialisiert wird.
Probiere mal
rst.open
rst.movelast
rst.movefirst

Edit: ups Highload war schneller
Pjordorf
Pjordorf 05.09.2016 um 17:09:40 Uhr
Goto Top
Hallo,

Zitat von @Aximand:
Leider ist rst.RecordCount immer -1, selbst wenn er Artikel findet.
Dann würde dein rst.Movenext ebenfalls nicht funktionieren sowie deine Do Loop Schleife. Schau dir das noch mal genauer an.

Bevor du dein rst.RecordCount machst solltest du ein rst.MoveLast machen und dann erst dein rst.RecordCount.

Gruß,
Peter
GrueneSosseMitSpeck
Lösung GrueneSosseMitSpeck 05.09.2016 um 17:11:35 Uhr
Goto Top
war nicht BOF und EOF gleichzeitig true wenn das Recordset leer ist?
Ich erinner mich da noch an eine relativ krude Codezeile in einer VB Anwendung die ich früher mal aushilfsweise gepflegt hab.
Aximand
Aximand 07.09.2016 um 10:46:43 Uhr
Goto Top
Ja BOF ist auch true.

War wohl ein Gedankenfehler von mir da eine Schleife zu setzten. RecordCount ist in der Schleife tatsächlich irgendwie immer -1, warum auch immer. MoveLast wirft einen Fehler aus.

Wenn ich nach Artikel 0815 gegen die Datenbank suche und ich den Artikel finde, dann sollte doch eigentlich die Anzahl an Recordsets 1 sein?

Ich habs anders gelöst und "do while weg gelassen"


            If rst.EOF = True And rst.BOF = True Then
            Daten.Cells(intSchleife, intcolumn + 1).Interior.ColorIndex = xlNone
            
            ElseIf Daten.Cells(intSchleife, intcolumn + 1).Value = rst.Fields("Artikelnummer").Value And Daten.Cells(intSchleife, intcolumn) = "" Then  
            Daten.Cells(intSchleife, intcolumn + 1).Interior.Color = RGB(230, 50, 50)
            bFArtikel = True
            bArtikelFound = True
            End If