Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Leeres Ufo auslesen

Begonnen von MaxP, Dezember 04, 2024, 10:23:18

⏪ vorheriges - nächstes ⏩

MaxP

Hallo zusammen,

das besagte Ufo enthält keine Datensätze, da sie die Filtereigenschaften nicht erfüllen.

Wenn ich nun über
If not isNull(me!Ufo.form!ID) then Wert = me!Ufo.form!IDversuche, einen Wert auszulesen, wirft er trotz If eine Fehlermeldung raus.
AC müsste doch in diesem Fall eigentlich die Zeile ignorieren, oder?

Gruß
Max
Win 10 pro 64 bit, Access 2003

MzKlMu

Hallo,
was willst du denn auslesen wenn nix da ist?
Gruß Klaus

MaxP

Hallo,

Ac soll im Fall eines leeren Ufos gar nichts machen.
Ansonsten soll er die ID des fokusierten Datensatzes an das Steuerelement Wert übergeben.
Win 10 pro 64 bit, Access 2003

MzKlMu

Hallo,
der Sinn der If Zeile erschließt sich mir nicht.

Sinngemäß setzt Du den Wert des Feldes wenn es nicht Null auf den Wert des Feldes. Wenn der Wert nicht Null ist, hast Du diesen doch, wozu noch mal setzen ?

Kannst Du mal die Überlegung dahinter erklären ?

Was hast Du vor, mit dem fokusierten Datensatz ?
Gruß Klaus

PhilS

Zitat von: MaxP am Dezember 04, 2024, 10:23:18das besagte Ufo enthält keine Datensätze, da sie die Filtereigenschaften nicht erfüllen.

Wenn ich nun über
Code [Auswählen] Erweitern
If not isNull(me!Ufo.form!ID) then Wert = me!Ufo.form!IDversuche, einen Wert auszulesen, wirft er trotz If eine Fehlermeldung raus.
AC müsste doch in diesem Fall eigentlich die Zeile ignorieren, oder?
Wenn das Formular keine Datensätze hat, dann gibt es dieses Feld in diesem Sinne gar nicht.
Du solltest für diesen Fall prüfen:

me!Ufo.form.Recordset.Recordcount > 0
 Einen Wert kannst du dann aber auch nicht direkt setzten, sondern musst vorher erst einen Datensatz anlegen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

knobbi38

Hallo Max,

dafür habe ich mir mal eine universelle Funktion für DAO/ADO geschrieben:
Public Function HasRecords(ByRef pRecordset As Object) As Variant
  If Not pRecordset Is Nothing Then
    Debug.Assert InStr(TypeName(pRecordset), "Recordset") <> 0

    HasRecords = Not (pRecordset.BOF And pRecordset.EOF)
  End If
End Function

Damit kannst du deine Prüfung so gestalten:
' im Hauptformular:
if HasRecords(UfoControl.form.Recordset) then
  ' Zugriff auf das gebundene Steuerelement
  Wert = UfoControl.form.txtID.Value

  ' Alternativ Zugriff auf das Feld
  ' Wert = UfoControl.form.Controls("ID").Value
end if

Im Sinn von OOP und Datenkapselung würde man das aber alles ins Unterformular verlagern:
' Im Unterformular
Public Property Get ID() as Long
  if HasRecords(me.recordset) then
    ID = nz(me.[ID],0)
  end if
End Property

' Im Hauptformular dann so
lngWert = UFOControl.form.ID
Hier wird dann einfach eine 0 zurückgegeben, wenn kein Datensatz vorhanden ist oder die aktuelle ID. Setzt natürlich voraus, daß es keine ID mit 0 gibt. Das ist einfacher, als immer auf NULL abzufragen.

Gruß
Ulrich


MaxP

@ Klaus
Ich möchte beim Beenden des Programms die aktuell verwendeten Werte in der Werte-Tabelle speichern,
um sie beim nächsten Öffnen des Programms wieder aus der Werte-Tabelle zu laden.
So kann ich an der Sache weiter arbeiten, wo ich am Vortag aufgehört habe.

@ Phil
me!Ufo.form.Recordset.Recordcount > 0  Damit macht es, was ich will!

@ Ulrich
Danke für Deine Mühe. Aber der o.g. Code ist da eher mein Ding.

Danke an Euch!!

Gruß
Max
Win 10 pro 64 bit, Access 2003

Beaker s.a.

Hallo Ulrich,

Bezügl. OOP bin ich ja (noch) nicht auf deinem Niveau, aber
Public in einem UFo kommt mir nicht gerade "gekapselt" vor.
Oder bedeutet das eben, dass nur das UFo den Wert für "alle"
zur Verfügung stellt?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

knobbi38

@ekkehard:

Das UFO-Formular ist ein normales Formular (Klasse), das in ein SubForm-Control geladen und angezeigt wird. Es könnte auch einfach mit DoCmd.OpenForm geladen werden. Wird nun eine benutzerdefinierte Eigenschaft (Property) öffentlich gemacht, verhält sie sich genauso wie andere öffentliche Formulareigenschaften.

Zitat... dass nur das UFo den Wert für "alle" zur Verfügung stellt?
Wenn das Formular als UF geladen wird, ist so eine Eigenschaft nur für das HF sichtbar, weil man an das UF nur über das HF herankommt und somit das HF die Zugriffsregeln bestimmt. Würde das HF die Form Eigenschaft des SubForm-Steuerelements offenlegen, wäre die Sichtbarkeit dieser Eigenschaft für alle gültig, was i.d.R. aber nicht gemacht wird. Hierbei gilt die Regel, daß man Interna eines Objekts nicht einfach per Public Deklaration öffentlich machen sollte. 
 
Grüße
Ulrich

Beaker s.a.

Hallo Ulrich,

Danke für deine Ausführungen, mit denen ich aber noch nicht ganz
klar bin. Habe im Moment aber nicht genügend Zeit um noch man nach
zu haken.
Ich werde am WE einen neuen Thread damit eröffnen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Köbi

Kleine Frage
Ist ja ein interessanter Thread, aber weshalb wird er immer zu oberst angezeigt, obwohl er längst erledigt ist.

knobbi38

#11
Da hat wohl ein Moderator die Sticky Option gesetzt.

PhilS

Zitat von: knobbi38 am Februar 08, 2025, 23:12:26Da hat wohl ein Moderator die Sticky Option gesetzt.
Stimmt. Da ich keine Grund dafür erkennen kann, habe ich die Option entfernt.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Und ich komme seit 2 Monaten nicht dazu einen neuen Thread zu
meinen Unklarheiten zu erstellen.
Sch.. Rentnerdasein, - man hat einfach auch nicht mehr Zeit wie
vorher :-(.
Mal sehen, kommt Zeit, kommt Rat :-).
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Köbi

#14
Falscher Anhang