Forum des VBA-Tutorials

Prüfung Datensatz in Endlosformular Leer (Access)

Quatraxx, Sonntag, 23. April 2017, 13:47 (vor 215 Tagen)

Hallo,

Ich bin auf der Suche nach einer Möglichkeit, in einem Endlosformular, zu prüfen ob jedes Textfeld eines Datensatzes Daten enthält.

Habt ihr vielleicht eine Idee wie man das beim Öffnen eines Endlosformulares Prüfen könnte?

Freue mich auf eure Hilfe.

MfG
Quatraxx

Prüfung Datensatz in Endlosformular Leer

Martin Asal, Montag, 24. April 2017, 08:31 (vor 215 Tagen) @ Quatraxx

Hallo Quatraxx,

es stellt sich zuerst einmal die Frage, warum du so etwas auf Formularebene prüfen willst, und nicht auf Tabellenebene? Für ein Tabellenfeld gibt es die Eigenschaft "Eingabe erforderlich", was mit der Eigenschaft "Gültigkeitsregel" (für Feld oder Tabelle) noch weiter verfeinert werden kann. Fals das nicht reichen sollte, kann man immer noch mit Hilfe einer Abfrage Prüfungen aufbauen, bei Bedarf sogar per Aktionsabfrage gleich Felder automatisch ausfüllen etc. Mir fällt aber kein Fall ein, in der eine derartige Prüfung auf Formularebene nötig oder sinnvoll wäre.

Mit Hilfe eines Formulars kann man bequem auf den gerade angezeigten Datensatz zugreifen. Aber da du "Endlosformular" betonst, scheint dir schon aufgefallen zu sein, dass das im Endlosformular eben nicht mehr funktioniert: Access kann dann nämlich nicht mehr erkennen, welcher Datensatz gerade gemeint ist. Lösung: siehe oben.

Martin

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Dienstag, 25. April 2017, 21:02 (vor 213 Tagen) @ Martin Asal

Hallo Martin,

vielen Dank für deine Antwort.

Ich möchte gerne Prüfen ob in einem Datensatz in einer bestimmten Spalte ein Wert eingetragen ist. Ist kein Wert vorhanden soll ein Button durch ein Script deaktiviert werden.

Die Abfrage in der Tabelle mit der Voraussetzung das ein Wert in dem bestimmten Feld eingetragen sein muss Funktioniert an dieser stelle nicht da ich hier eine etwas kompliziertere Dreiecksbeziehung von Tabellen habe.

Viele Grüße
Quatraxx

Prüfung Datensatz in Endlosformular Leer

PhilS ⌂, Dienstag, 25. April 2017, 22:25 (vor 213 Tagen) @ Quatraxx

Ich möchte gerne Prüfen ob in einem Datensatz in einer bestimmten Spalte ein Wert eingetragen ist. Ist kein Wert vorhanden soll ein Button durch ein Script deaktiviert werden.

Wenn das Endlosformular mehrere Datensätze darstellt und du alle prüfen willst, ist das über die Oberfläche in einem Endlosform nicht (einfach) realisierbar, wie Martin bereits schrieb.
Jedoch kannst du eine Abfrage auf die Datenbasis der Endlosforms machen, um diesen Zustand zu ermitteln. Am einfachsten mit der DCount-Funktion.

Z.B. so:

Me.deinButton.Enabled = CBool(DCount("*","deineTabelle","gleicheKriterienWieFormular AND DasBestimmteFeld IS NULL"))

Wenn es nur um den jeweils aktuellen Datensatz geht, funktioniert das wie in einem normalen Formular auch.

Falls der Button pro Datensatz dargestellt wird, kannst du evtl. eine "Button-Attrappe" mit einer Textbox bauen und diese über eine Bedingte Formatierung deaktivieren.

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 06. Mai 2017, 15:43 (vor 202 Tagen) @ PhilS

Hallo PhilS,

Ich verstehe deine DCOUNT Funktion leider nicht so recht.
ich habe es bei mir jetzt noch mal so ausprobiert:
VarTest = DLookup("preRabatt", "tblPreis", "proNameRef =" & Me!proID)

Doch leider wird mir hier nur ein Wert von "0.22" oder "0.33" zurückgegeben mit dem ich nichts anfangen kann.
Und leider bekomme ich es noch nicht hin, dass mir das Formular diese Werte beim öffnen des
Formulars zurück gibt.

Hast du hier noch einen Tipp für mich?

Liebe Grüße
Quatraxx

Prüfung Datensatz in Endlosformular Leer

PhilS ⌂, Samstag, 06. Mai 2017, 16:15 (vor 202 Tagen) @ Quatraxx

VarTest = DLookup("preRabatt", "tblPreis", "proNameRef =" & Me!proID)

Doch leider wird mir hier nur ein Wert von "0.22" oder "0.33" zurückgegeben mit dem ich nichts anfangen kann.

Damit ermittelst du den Wert von preRabatt.
Mein DCount-Ausdruck soll prüfen, ob es irgendeinen Datensatz gibt, bei dem ein Feld leer ist. - So hatte ich deine ursprüngliche Anforderung verstanden.

Und leider bekomme ich es noch nicht hin, dass mir das Formular diese Werte beim öffnen des
Formulars zurück gibt.

Dann muss du den entsprechenden Code in Form_Load-Ereignis ausführen.

Mir ist aber im Moment nicht wirklich klar, woran es im Moment bei dir hängt.

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 06. Mai 2017, 16:53 (vor 202 Tagen) @ PhilS

Ich versuche mal meine DB etwas zu erkälten.
Das Endlosformular greift auf die Tabelle "tblWarenkorb" zu in der mehrere Produkte mit einem Preis(Brutto Preis) hinterlegt sind.

Jedes Produkt wird aber von mehreren Lieferanten angeboten die in der Datenbank bekannt sind.
Jeder Lieferant hat dabei seinen eigenen Rabattsätze (in Prozent) die einen Netto Preis ergeben. Diese Rabattsätze sind aber wiederum nicht in der "tblLieferanten" sondern in der "tblPreis" enthalten.

D.h ich habe die Tabellen "tblWarenkorb", "tblLieferanten" und "tblPreis" die untereinander alle verknüpft sind.

Das Endlosformular greift jetzt auf eine Abfrage zurück die alle Datensätze von tblWarenkorb enthält, sowie Hersteller etc.

den Preis bei einem Bestimmten Lieferanten ermittel ich mit einer Funktion in dem jeweiligen Textfeld:

=([proPreis]-DomWert("preRabatt";"tblPreis";"lieferantenNameRef = 1 and proNameRef = " & [proID])*proPreis])*[proMenge]

Wenn ich das jetzt richtig verstehe, würde deine DCount Funktion auf die Werte aus "tblWarenkorb" zugreifen oder?

Me.deinButton.Enabled = CBool(DCount("*","tblWarenkorb","gleicheKriterienWieFormular AND FledLieferantRabatt IS NULL"))

Das würde bei mir glaube ich nicht Funktionieren, weil in der "tblWarenkorb" ja kein Rabatt enthalten ist, sondern dieser extra ermittelt wird.

Würde es in meinem Datenbank Konstrukt überhaut funktionieren zu ermitteln ob das Textfeld mit dem Rabatt leer ist? Oder habe ich mich gerade nur vollkommen verlaufen...

Liebe Grüße
Quatraxx

Prüfung Datensatz in Endlosformular Leer

PhilS ⌂, Dienstag, 09. Mai 2017, 20:49 (vor 199 Tagen) @ Quatraxx

D.h ich habe die Tabellen "tblWarenkorb", "tblLieferanten" und "tblPreis" die untereinander alle verknüpft sind.

[...]

Me.deinButton.Enabled = CBool(DCount("*","tblWarenkorb","gleicheKriterienWieFormular AND FledLieferantRabatt IS NULL"))
[/inlinecode]
Das würde bei mir glaube ich nicht Funktionieren, weil in der "tblWarenkorb" ja kein Rabatt enthalten ist, sondern dieser extra ermittelt wird.

Richtig verstanden. Direkt basierend auf der Datenherkunft des Formulars funktioniert es tatsächlich nicht, aber du kannst eine Abfrage erstellen, die die Tabellen tblWarenkorb, tblLieferanten und tblPreis miteinander verbindet und diese Abfrage anstelle von tblWarenkorb in der DCount-Funktion verwenden.

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 13. Mai 2017, 13:44 (vor 195 Tagen) @ PhilS

Aber dann wird mit dem Command nur überprüft ob es überhaupt Produkte mit einem Preis von einem Lieferanten gibt oder?

gibt es evtl. so etwas wie eine Foreach Schleife, die in dem Endlosformular alle Textfelder von Lieferant durchgeht und hier nach einem Leeren Textfeld sucht?

Ich habe z.B. das hier gefunden, weiß aber nicht wie ich damit ein bestimmtes Textfeld überprüfen auslesen kann.

Dim rsf As Recordset
set rsf = Me.RecordsetClone
rsf.MoveFirst
Do Until rsf.EOF
With rsf
… hier kommt die eigentliche Aktion!
End With
rsf.MoveNext
Loop

Habt ihr evtl. eine Idee?

Liebe Grüße
Quatraxx

Prüfung Datensatz in Endlosformular Leer

PhilS ⌂, Samstag, 13. Mai 2017, 15:50 (vor 195 Tagen) @ Quatraxx

Aber dann wird mit dem Command nur überprüft ob es überhaupt Produkte mit einem Preis von einem Lieferanten gibt oder?

Nein. Deswegen in meinem Codebeispiel der fiktive Ausdruck gleicheKriterienWieFormular, der dafür sorgen soll, dass nur die Datensätze berücksichtigt werden, die auch im Endlosform dargestellt werden.

gibt es evtl. so etwas wie eine Foreach Schleife, die in dem Endlosformular alle Textfelder von Lieferant durchgeht und hier nach einem Leeren Textfeld sucht?

Ja, das kann man auch machen. Aber eine Schleife ist ...
1.) von der Performance i.d.R. wesentlich schlechter als eine SQL-Abfrage, und
2.) tendenziell fehlerträchtiger als ein deklaratives SQL-Statement.

Ich habe z.B. das hier gefunden, weiß aber nicht wie ich damit ein bestimmtes Textfeld überprüfen auslesen kann.

Du beziehst dich auf den Namen des (Tabellen/Abfrage)-Feldes in der Fields-Auflistung des Recordsets.

Aber ist denn das gesuchte Feld überhaupt im Recordset des Formulars? Ich hatte dich so verstanden, dass das mit einen Dlookup zusätzlich ermittelt wird.

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 13. Mai 2017, 16:33 (vor 195 Tagen) @ PhilS

Ich habe es hinbekommen.
So sieht jetzt der Fertige Code aus:

= CBool(DCount("preRabatt", "tblPreis", "lieferantenNameRef = 1 and proNameRef = " & [proID]))

Damit kann ich erstmal arbeiten :)

Vielen vielen Dank für deine Unterstützung!

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 20. Mai 2017, 13:00 (vor 188 Tagen) @ Quatraxx

Hallo,

leider habe ich mit der Programmzeile ein Problem:

= CBool(DCount("preRabatt", "tblPreis", "lieferantenNameRef = 1 and proNameRef = " & [proID]))

Leider greift diese Prüfung nur auf den ersten Datensatz in der Tabelle zurück. Wenn in diesem etwas steht, wird "True" zurückgegeben unabhängig davon ob in den anderen Datensätzen etwas steht oder nicht.

Habt ihr noch einmal einen Tipp für mich wie ich dieses Problem lösen kann?

LG
Quatraxx

Prüfung Datensatz in Endlosformular Leer

Quatraxx, Samstag, 20. Mai 2017, 14:16 (vor 188 Tagen) @ Quatraxx

Habe es nun doch noch hinbekommen.

Ich habe eine Schleife angewendet die alle Datensätze durchgeht und bei einem nicht Treffer eine Variable auf False setzt.


Dim rsf As Recordset
Dim varProdID As Integer
Dim VarQryTMP Boolean
Dim VarQry Boolean

Set rsf = Me.RecordsetClone
rsf.MoveFirst
    Do Until rsf.EOF
        With rsf
  varProdID = rsf!proID
  VarQryTMP = CBool(DCount("preRabatt", "tblPreis", "lieferantenNameRef = 1 and proNameRef = " & varProdID))

  if (VarQryTMP = false) then VarQry = False
           
        End With
    rsf.MoveNext
Loop

RSS-Feed dieser Diskussion
powered by my little forum