Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: sandi am März 25, 2023, 12:48:32

Titel: Fehlender Werte mit Schleife
Beitrag von: sandi am März 25, 2023, 12:48:32
Hallo an die Profis hier,
ich bin noch VBA Anfängerin und habe folgende Aufgabe.
Ich habe eine Tabelle und möchte Fehlende Werte von bestimmten Feldern eines Datensatzes in der Tabelle ermitteln und mir das Ergebnis in einer Variablen" Fehlende_Werte" speichern lassen.
Also zu jedem Datensatz die Fehlenden Werte.

Tabelle = tblcheck_fit
Primary Key der Tabelle = check_fit_ID
Ich benutze Access 2016 und müsste dann mit ADODB arbeiten.
Meinen Idee wäre diese...

Option Compare Database
Option Explicit

Public Sub Miss_var()
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Miss As Integer
Dim i As Integer

Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM tblcheck_fit ", CurrentProject.Connection, adOpenStatic, adLockOptimistic
Do Until rs.EOF
' Hier die benötigen Felder der Tabelle zur ID
'und hier ist mein Problem, wie kann ich die Felder die es betrifft, in  der For Schleife durchsuchen
 For i = 'benötigte Felder die ich durchsuchen möchte'
  If IsNull(rs(i)) = True Then
  Miss = Miss + 1
  rs! Fehlende_Werte = Miss
  Debug.Print rs! check_fit_ID, rs!Fehlende_Werte
  End If
  Next
  rs.MoveNext
  Loop
End Sub

Oder nimmt man dann im SELECT nur die Felder die man benötigt?
Oder geht das auch mit einer Schleife mit bestimmter Indizierung für die Felder die es betrifft?
Wie geschrieben, ich bin noch Anfängerin.
Mit der Bitte um Vorschläge bzw. Lösungen.
Danke
Sandi
Titel: Re: Fehlender Werte mit Schleife
Beitrag von: sandi am März 25, 2023, 13:45:56
Also so funktioniert es, wenn ich die betreffenden Felder im Select reinhole..
Option Compare Database
Option Explicit

Public Sub Miss_var()
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Fehlende_Werte As Integer
Dim i As Integer
Dim Miss As Integer

Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "SELECT check_fit_ID, Spinning , Lunges , Squats , Fehlende_Werte FROM tblcheck_fit", CurrentProject.Connection, adOpenStatic, adLockOptimistic


Do While Not rs.EOF

  Miss = 0
 
  For i = 0 To rs.Fields.Count - 1
 
  If IsNull(rs.Fields(i)) Then
       Miss = Miss + 1
  End If
 
     rs!Fehlende_Werte = Miss
  Next i
    Debug.Print rs!check_fit_ID, rs!Fehlende_Werte
    rs.MoveNext
Loop

End Sub

Geht das auch mit einer Schleife mit bestimmter Indizierung für die Felder die es betrifft?
Gruß
Sandi
Titel: Re: Fehlender Werte mit Schleife
Beitrag von: PhilS am März 26, 2023, 13:57:24
Zitat von: sandi am März 25, 2023, 12:48:32Ich benutze Access 2016 und müsste dann mit ADODB arbeiten.
Nur nebenbei, weil es nichts mit der eigentlichen Fragestellung zu tun hat:
Es gibt keinen zwingenden Grund mit ADODB zu arbeiten. Du kannst genauso DAO verwenden und das wäre eher das übliche Vorgehen, weil Access (auch 2016) standardmäßig DAO verwendet und die entsprechende Bibliothek zwingend immer eingebunden ist, während ADODB eine zusätzliche, optionale Bibliothek ist.


Zitat von: sandi am März 25, 2023, 12:48:32Oder nimmt man dann im SELECT nur die Felder die man benötigt?

Oder geht das auch mit einer Schleife mit bestimmter Indizierung für die Felder die es betrifft?
Generell ist es empfehlenswert nur Daten abzufragen, die man auch wirklich benötigt. Daten müssen von der Festplatte gelesen, ggfls. über das Netzwerk transportiert, und schließlich im Arbeitsspeicher verwaltete werden. - Wenn man das mit Daten tut, von denen man vorher weiß, dass man sie gar nicht benötigt, ist das Ressourcenverschwendung, auch wenn man den Unterschied oft nicht merkt.

Jetzt zu deiner eigentlichen Frage:
Irgendwo/irgendwie musst du festlegen, welche Felder geprüft werden sollen. Für das Wo/Wie gibt es verschiedenen Möglichkeiten.
Deine Lösung aus den zweiten Beitrag, nur die benötigten Spalten im SQL anzugeben, ist wahrscheinlich die einfachste. Du solltest nur noch im Code ergänzen, dass die Spalten check_fit_ID und Fehlende_Werte nicht auf NULL geprüft werden. Das könntest du anhand der Spaltennamen machen.
[...]
  For i = 0 To rs.Fields.Count - 1

    If rs.Fields(i).Name <> "check_fit_ID" And rs.Fields(i).Name <> "Fehlende_Werte" Then
      If IsNull(rs.Fields(i)) Then
           Miss = Miss + 1
      End If
    End If
[...]


Alternativ könntest du die Spaltenindizes (i) so einschränken, dass nur die relevanten Spalten geprüft werden: For i = 1 To rs.Fields.Count - 2
Das halte ich aber eher für eine schlechte Idee, weil der Sinn dieses eher ungewöhnlichen Codes schlecht verständlich ist und bei einer Änderung der Abfrage evtl. plötzlich falsche Ergebnisse entstehen ohne das der Zusammenhang direkt klar ist.

Als weitere Alternative kannst du die Namen der relevanten Felder speichern. Entweder im Code als Konstanten/Literale, oder in einer Konfigurationstabelle. - Ob sich dieser Zusatzaufwand lohnt, müsste man im Gesamtkontext der Anwendung bewerten.




Titel: Re: Fehlender Werte mit Schleife
Beitrag von: sandi am März 28, 2023, 15:01:42
Vielen Dank für die Antwort,
dann definiere ich die Var im SELECT.
Gruß
Sandy