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-Key: 314467

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: Pjordorf
Pjordorf Sep 05, 2016 updated at 14:23:47 (UTC)
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
Member: Friemler
Friemler Sep 05, 2016 at 12:12:29 (UTC)
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
Member: Aximand
Aximand Sep 05, 2016 at 14:43:46 (UTC)
Goto Top
Leider ist rst.RecordCount immer -1, selbst wenn er Artikel findet.
Mitglied: 129813
129813 Sep 05, 2016 updated at 15:11:24 (UTC)
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
Member: joachim57
joachim57 Sep 05, 2016 updated at 15:09:46 (UTC)
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
Member: Pjordorf
Pjordorf Sep 05, 2016 at 15:09:40 (UTC)
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
Member: GrueneSosseMitSpeck
Solution GrueneSosseMitSpeck Sep 05, 2016 at 15:11:35 (UTC)
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.
Member: Aximand
Aximand Sep 07, 2016 at 08:46:43 (UTC)
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