NULL oder "" durch Funktion

Moderator: ModerationP

NULL oder "" durch Funktion

Beitragvon agripina » 01. Jul 2022, 07:44

Hallo,
mit
Code: Alles auswählen
UPDATE tblArtikel SET Artikel = OhneZiffern([artikel])
wird das Feld der Tabelle durch die folgende Funktion geändert.
Ich vergaß anfangs bei ihr den Else-Teil
Code: Alles auswählen
Public Function OhneZiffern(s As String) As String
  If IsNumeric(Left(s, 3)) Then
    …
  Else
    ' OhneZiffern=s ' betroffenes Feld  wird geleert, wenn auskommentiert
End Function

Wenn der Else-Teil auskommentiert ist, führt das dazu, dass das Tabellenfeld geleert wird.
Wie kann man nun prüfen, was "Leer" ist.
Von der Funktion her, müsste es ja im Zustand "" sein. Oder wird es intern dann zu NULL umgewandelt?
Wie kann man das herausfinden?
Gruß Heinz
agripina
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 67
Registriert: 02. Sep 2018, 22:29

Re: NULL oder "" durch Funktion

Beitragvon Gast » 01. Jul 2022, 08:46

Der Rückgabewert kann nicht Null sein, da der Datentyp der Funktion ein String ist.
Und ein String kann in VBA nun mal nicht Null sein.
Gast
 

Re: NULL oder "" durch Funktion

Beitragvon knobbi38 » 01. Jul 2022, 09:11

Hallo Heinz,

anstatt immer wieder solche Fragen zu stellen, was hast du denn selber in Eigeninitiative schon ausprobiert, um festzustellen ob das Feld -leer- ist?

Gruß
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Re: NULL oder "" durch Funktion

Beitragvon agripina » 01. Jul 2022, 18:02

Hallo,
Und ein String kann in VBA nun mal nicht Null sein.

Im Zusammenhang mit folgendem bekommt man aber NULL.
Zum Überprüfen dies gemacht:
- das Feld als Mussfeld über eine Gültigkeitsregel eingestellt. Dies bewirkt, dass man einen Wert nicht einfach löschen kann und gezwungen ist, einen Leerstring, also "" einzugeben. Das wird akzeptiert.
- Dann mit DLookUp das Feld überprüft. Es kommt NULL und kein Leerstring.

In der Eingangsfrage wird der Else-Teil nicht ausgeführt, da auskommentiert.
Meine Frage bezieht sich hierauf, wie Access mit dem Rückfragewert (as String) umgeht.

Mit VBA scheint es kein Problem zu sein, die Gültigkeitsregel zu umgehen, da der Code läuft.
Oder ist das ein Fehlschluss? Mit DLookUp bekommt man NULL.

Aber meine Eingangsfrage zielte darauf ab, das nicht so umständlich in Erfahrung zu bringen. Zumal ich mir nicht sicher bin, ob das NULL-Ergebnis überhaupt richtig ist und nicht etwa durch DLookUp so hingebogen wird.

Habe gerade so etwas noch nie gefragt, da die Funktion erstmalig so von mir verwendet wird und erstmalig nachdachte, was mit as string als Rückgabewert bei fehlendem ELSE passiert. Da finde ich den Rat zu den Fragen unpassend.
Tut mir leid, Was ist also mit
Von der Funktion her, müsste es ja im Zustand "" sein. Oder wird es intern dann zu NULL umgewandelt?

Gruß Heinz
agripina
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 67
Registriert: 02. Sep 2018, 22:29

Re: NULL oder "" durch Funktion

Beitragvon EinGast » 01. Jul 2022, 18:19

Hallo agripina,
wie sieht der DLookup-Befehl genau aus?

Ansonsten kann auch über die Länge des Text-Tabellenfeldes festgestellt werden, was es enthält:

Code: Alles auswählen
SELECT
  Artikel,
  Len([Artikel]) AS Laenge
FROM
  tblArtikel


1) Größer 0 wird angezeigt bedeutet enthält Text
2) 0 wird angezeigt bedeutet "" (Leere Zeichenfolge)
3) Nichts wird angezeigt bedeutet NULL-Inhalt

Gruß
EinGast
EinGast
 

Re: NULL oder "" durch Funktion

Beitragvon KlausMz » 01. Jul 2022, 18:26

Hallo,
einen Leerstring, also "" einzugeben.
Wie gibst Du denn den ein ? So ohne weiteres kriegst Du doch "" gar nicht in ein Tabellenfeld. Und wie lautet die Güligkeitsregel ?
Warum willst Du hier überhaut einen Leerstring eingeben, das macht doch keinen Sinn.

Was willst Du überhaupt mit der Funktion erreichen? Und was genau willst Du jetzt eigentlich wissen?
Erkläre mal den Hintergrund Deiner Frage.

Ein leeres Tabellenfeld ist im Regelfall immer Null und wenn das Feld gefüllt sein muss, würde man es doch nicht mit einem Leerstring füllen.

Bei der gezeigten Funktion
Code: Alles auswählen
Public Function OhneZiffern(s As String) As String

kann der Übergabewert (s) und der Rückgabewert nicht Null sein, da beide als Strin deklariert sind.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: NULL oder "" durch Funktion

Beitragvon knobbi38 » 01. Jul 2022, 19:49

Hallo Heinz,

Mit VBA scheint es kein Problem zu sein, die Gültigkeitsregel zu umgehen, da der Code läuft.

Wie kommst du denn schon wieder darauf? Du ziehst Rückschlüsse auf Grund von Halbwissen, was nicht unbedingt richtig sein muß. Eine Gültigkeitsregel kann auch mit VBA nicht umgangen werden!

Was ist denn nun deine Gültigkeitsregel und deinen Dlookup kann man auch nicht verifizieren, weil weder Tabellendaten noch der DLookup-Befehl von dir hier angegeben worden sind.

Du kannst doch selber mal nachlesen, unter welchen Bedingungen DLookup einen NULL-Wert zurückgibt. Was meinst du, welcher Fall bei dir zutrifft? Wenn man in VBA auf NULL prüfen möchte, geht das übrigens nur mit IsNull().

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Re: NULL oder "" durch Funktion

Beitragvon agripina » 01. Jul 2022, 21:04

Hallo,
@EinGast
morgen teste ich das

@Klaus
So ohne weiteres kriegst Du doch "" gar nicht in ein Tabellenfeld.

Wie geschrieben ein Feld mit Gültigkeitsregel: Not NULL
Wird der Feldwert gelöscht, kommt die Gültigkeitsmeldung, gibt man zwei AZ ein ("") wird das akzeptiert.
Hier der Code im Direktbereich ID 573 ist der Satz, wo Artikel mit zwei AZ angegeben ist, um die Regel zu umgehen.
Code: Alles auswählen
s=DLookup("Artikel","tblArtikel","ArtikelID=573")
?s 'Wenn in das Feld "" eingegeben wird, wird das akzeptiert (es ist das Feld mit obiger Gültigkeitsregel.
'Wird der Wert im Feld gelöscht, kommt die Gültigkeitsmeldung "Bitte eingeben"; bei Eingabe von "" nicht)
?s
Null ' wenn "" eingegeben wurde.
?IsNull(s)
Wahr
?TypeName(s)
Null


@Ulrich
Eine Gültigkeitsregel kann auch mit VBA nicht umgangen werden!

Das hatte ich auch nicht behauptet, sondern als Frage aufgeworfen (s. Oder ist das ein Fehlschluss?).
Dasselbe für
Eine Gültigkeitsregel kann auch mit VBA nicht umgangen werden!

Ich hatte genau geschrieben, dass es mit dem fehlenden Else-Teil der Funktion geht.
Das ist es ja, was mich auch wunderte.
Mit Halbwissen hat das m.E, nichts zu tun, ohne mich damit jetzt als Wissender darstellen zu wollen; eher als Suchender, der das klären möchte. Darüber-Hinweggehen könnte man, ist aber nicht so mein Ding. Ich weiß, dass das manchmal nervt.
Edit:
DLookup war meine Idee, das zu checken. Hatte aber im Hinterkopf, dass hier eine bessere Idee kommt. EinGast hat da was, was mich interessiert. Gehe ich morgen an. Vielleicht geht´s noch anders. Ist ja alles fürs Hintergrundwissen. Meine Funktion läuft ja. Vielleicht auch verbesserungsfähig?
Gruß Heinz
agripina
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 67
Registriert: 02. Sep 2018, 22:29

Re: NULL oder "" durch Funktion

Beitragvon KlausMz » 01. Jul 2022, 22:48

Hallo,
ich habe jetzt immer noch nicht erkannt was jetzt Dein eigentliches Problem ist bzw. was der genaue Hintergrund Deiner Frage ist.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: NULL oder "" durch Funktion

Beitragvon knobbi38 » 01. Jul 2022, 23:36

Hallo Heinz,

Access verhält sich bei der Feldeigenschaft AllowZeroLength = true, also Leerstring, etwas ungewöhnlich aber nicht undokumentiert:
https://docs.microsoft.com/de-de/office/vba/access/concepts/miscellaneous/allowzerolength-property
Hier kannst du nachlesen, was die Einstellung bewirkt und was tatsächlich abgespeichert wird.

Interessant ist dabei, daß Dlookup in dem Fall tatsächlich anstatt einem Leerstring immer NULL zurück gibt, was aber bekannt ist. Wenn man das nicht so haben möchte, muß man sich selber ein eigenes DLookup schreiben, was im kommerziellem Bereich durchaus gemacht wird: http://allenbrowne.com/ser-42.html
Achte mal bei "DLookup() has several shortcomings:" auf Punkt 4!

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 4314
Registriert: 02. Jul 2015, 14:23

Re: NULL oder "" durch Funktion

Beitragvon EinGast » 02. Jul 2022, 06:17

Hallo agripina,
die Länge kann auch über Dlookup() abgefragt werden (Eingabe im VBA-Direktbereich):
Code: Alles auswählen
? DLookup( "Len(Artikel)" , "tblArtikel" , "ArtikelID=573" )

Ergebnis-Möglichkeiten:
1 oder höher -> Feld enthält Text
0 -> Feld enthält "" (Leere Zeichenfolge)
NULL -> Feldinhalt ist NULL

-----

Vielleicht noch interessant:

Wenn sowohl "Eingabe erforderlich" als auch "Leere Zeichenfolge" - also beides - auf "Ja" stehen, dann wäre die Gültigkeitsregel "Ist nicht Null" nicht nötig, weil keine Null-Einträge gespeichert werden können.

Es würde sich aber auch das Verhalten bei manueller Eingabe ändern. Die Eingabe eines einzelnen Leerzeichens (Space) oder ein Entfernen eines Eintrages mit der Del-Taste erzeugt dann nicht automtisch den üblichen NULL-Eintrag, sondern eine leere Zeichenfolge ("") im betreffenden Tabellenfeld.

Gruß
EinGast
EinGast
 

Re: NULL oder "" durch Funktion

Beitragvon agripina » 04. Jul 2022, 10:46

Hallo,
@Klaus
was der genaue Hintergrund Deiner Frage ist

s. auch Eingangspost.
Wenn der Else-Teil auskommentiert ist, führt das dazu, dass das Tabellenfeld geleert wird.
Wie kann man nun prüfen, was "Leer" ist.

Also letztlich um den Zustand des Feldes, wenn die Funktion keinen Rückgabewert bekommt, da der else-Teil auskommentiert ist, OhneZiffern=s also fehlt.
So ohne weiteres kriegst Du doch "" gar nicht in ein Tabellenfeld

Im Gegenteil, zwei Anführungszeichen muss man eingeben. Sie heben die Gültigkeitsregel des Feldes (Not Null) auf und man kann das Feld verlassen.

@einGast
0 -> Feld enthält "" (Leere Zeichenfolge)
NULL -> Feldinhalt ist NULL

Ich habe das mal getestet.
Code: Alles auswählen
? DLookup("Len(Artikel)" , "tblArtikel" , "ArtikelID=573" ) ' Zeile A
 0

Folgendes steht da im Widerspruch zum obigen 0 , was ja eine Leere Zeichenfolge sein soll.
Code: Alles auswählen
s=DLookup("Artikel","tblArtikel","ArtikelID=573")
?s
Null
?IsNull(s)
Wahr


@Ulrich
Im Link steht
Verwenden Sie die AllowZeroLength-Eigenschaft , um anzugeben, ob eine leere Zeichenfolge (" ") ein gültiger Eintrag in einem Tabellenfeld ist
.
Kann ich bei Acc2010 nicht bestätigen. Wird das Tabellenfeld auf Leere Zeichenfolge NEIN gestellt (mit Erforderlich NEIN und ohne Gültigkeitsregel), kann man den Wert löschen oder ein Leerzeichen eingeben und das Feld verlassen, also speichern, ohne dass Access meckert.
Hängt es damit zusammen, dass die Seite sich auf Access 2013 | Access 2016 bezieht? MS also nachgebessert hat?

Frage mich auch, was es für einen praktischen Nutzen haben soll, dass die Entwickler von Access zwischen NULL und "" unterscheiden. Das führt ja dazu, dass man ein Textfeld z.B. mit If [txtArtikel]=Null or [txtArtikel]= "" prüfen muss.
Nur der eine oder der andere Teil könnte ein falsches Ergebnis liefern.
Und das in der Tabelle ist noch differenzierter anzugehen.
Gruß Heinz
Zuletzt geändert von agripina am 04. Jul 2022, 10:50, insgesamt 1-mal geändert.
agripina
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 67
Registriert: 02. Sep 2018, 22:29

Re: NULL oder "" durch Funktion

Beitragvon KlausMz » 04. Jul 2022, 10:49

Hallo,
Deine Schilderungen sind für mich so verworren, dass ich nicht mehr mitkomme.

dass die Entwickler von Access zwischen NULL und ""
Versuche mal in ein Zahlenfeld "" einzugeben.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: NULL oder "" durch Funktion

Beitragvon agripina » 04. Jul 2022, 10:53

Hallo Klaus,
sorry, du musst natürlich "mitspielen".
Versuche mal in ein Zahlenfeld "" einzugeben

Es geht hier doch deutlich um ein Textfeld, nämlich Artikel.
Gruß Heinz
Edit
oder genauer: um ein Tabellenfeld vom Typ Text
agripina
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 67
Registriert: 02. Sep 2018, 22:29

Re: NULL oder "" durch Funktion

Beitragvon KlausMz » 04. Jul 2022, 10:58

Hallo,
der Hinweis auf Zahl war ein allgemeiner Hinweis zur Frage warum NULL und "" unterschieden wird.
sorry, du musst natürlich "mitspielen".
ich spiele die ganze Zeit schon mit. Aber kein Problem, werde mich aus deinen Themen zukünftig raushalten.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 40618
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 Gäste