bin noch Anfänger in VB.
Habe ein VB6.0-Formular in das ich über ein Recordset Daten von der
Nordwind.mdb
laden will.
Das Feld Region (Tabelle Lieferanten) ist nicht überall gefüllt und
ich bekomme bei der
Navigation im Formular zwischen den Datensätzen die Fehlermeldung
"Ungültige Verwendung von Null" . Laufzeitfehler 94.
Woran kann das liegen?
Wenn ich nur die Datensätze auswähle bei denen im Feld Region Daten
drin stehen,
läuft es sauber durch und ich kann im Formular zwischen den
Datensätzen navigieren.
Gibt es einen Trick, damit man die Datensätze trotzdem zu den
Datensätzen navigieren
kann, bei denen bei Region nichts eingetragen ist?
Anbei mein Code, wenn es hilft.
***************************************
Global cn As ADODB.Connection
Global rs As ADODB.Recordset
Global Const Pfad As String = "D:\Programme\Microsoft
Office\Office\Samples\Nordwind.mdb"
------------------------------------------------------
Sub main()
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OleDB.4.0"
.ConnectionString = "Data Source=" & Pfad
.Open
End With
MsgBox "Datenbank angebunden"
Set rs = New ADODB.Recordset
With rs
.ActiveConnection = cn
.Source = "select * from Lieferanten where Land like
'Deutschland' or Land like 'USA';"
'.Source = "select * from Lieferanten where Region <> '""' ;"
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open
End With
MsgBox "Tabelle angebunden"
frmADOProg.Show
End Sub
--
Gruß
Franz
"Franz Gerber" <news...@freenet.de> schrieb im Newsbeitrag
news:#rJpnnudCHA.2220@tkmsftngp10...
habe jetzt nach Google-Suche eine annehmbare Lösung gefunden.
Wenn Region is NULL lasse ich das Textfeld me.txtRegion leeren.
Gibt bestimmt eine bessere Lösung, hoffe immer noch auf Eure
Hilfe, für eine bessere Lösung, aber laufen tut es jetzt.
Sub anzeigen()
Me.txtLieferantenNr = rs![Lieferanten-Nr]
Me.txtFirma = rs!Firma
Me.txtLand = rs!Land
If IsNull(rs!Region) Then
Me.txtRegion = Space(0)
Else
Me.txtRegion = rs!Region
End If
"Franz Gerber" <news...@freenet.de> schrieb im Newsbeitrag
news:#rJpnnudCHA.2220@tkmsftngp10...
> bin noch Anfänger in VB.
... keine Sorge, das ist heilbar. ;-)
> Habe ein VB6.0-Formular in das ich über ein Recordset Daten von der
> Nordwind.mdb
> laden will.
> Das Feld Region (Tabelle Lieferanten) ist nicht überall gefüllt und
> ich bekomme bei der
> Navigation im Formular zwischen den Datensätzen die Fehlermeldung
> "Ungültige Verwendung von Null" . Laufzeitfehler 94.
> Woran kann das liegen?
Das liegt daran, dass ein Feld in einem Datensatz nicht nur Texte oder
Zahlen, sondern z.B. auch einen Nullwert enthalten kann. Ein Nullwert hat
nichts mit der Zahl 0 zu tun, sondern heisst, das Feld enthält "nichts", ist
also schlicht und einfach leer. Eine Textbox erwartet in ihrer
Texteigenschaft aber einen Wert vom Typ String. Null ist aber kein String,
sondern eben Null (Nichts) und deshalb meckert VB wenn Du schreibst:
Textbox.Text = Null
Du bekommst den Fehler 94. Nichts anderes passiert, wenn
Recordset.Fields(x).Value einen Nullwert enthält (also leer ist) und Du
diesen Feldinhalt einer Textbox zuweist.
Textbox.Text = Recordset.Fields(x).Value
verursacht also auch den Fehler 94, wenn das Feld x leer ist (einen Nullwert
enthält).
Diesen Leer-Zustand eines Feldes kannst Du mit
if isNull(Recordset.Fields(x).Value ) then
msgBox "Das Feld " & _
Recordset.Fields(x).Name & _
" ist leer!"
end if
abfragen. Wenn Du also den Inhalt eines beliebigen Feldes eines Datensatzes
an eine Textbox übergeben willst, schreibst Du einfach:
if isNull(Recordset.Fields(x).Value) then
Textbox.Text = ""
else
Textbox.Text = Recordset.Fields(x).Value
end if
Es geht auch noch einfacher:
Textbox.Text = Recordset.Fields(x).Value & ""
Das Ergebnis der Verkettung von Recordset.Fields(x).Value mit dem String der
Länge 0 ("") ist in jedem Fall ein String. Falls Recordset.Fields(x).Value
einen Nullwert enthält ist das Ergebnis aus
Recordset.Fields(x).Value & ""
ein String der Länge 0. Also wieder ein "".
Falls Recordset.Fields(x).Value dagegen einen echten Wert (z.B. einen
Zahlenwert oder einen String mit einer Länge > 0 enthält ist das Ergebnis
ebenso ein String.
Im Falle eines Zahlenwertes (numerischer Datentyp) macht VB eine
automatische Typumwandlung von num.Wert nach String und verknüpft diesen
String mit dem String "". VB macht also tatsächlich sowas:
TextBox.Text = cStr(Recordset.Fields(x).Value) & ""
Wenn das Feld x jedoch einen String (z.B. "Mickymouse") enthält verbindet VB
einfach die beiden Strings
TextBox.Text = Recordset.Fields(x).Value & ""
und das Ergebnis in Textbox.Text ist dann eben der String "Mickymouse".
Wenn Dein Feld einen numerischen Datentyp hat dann kannst Du auch noch mit
der Format$()-Funktion arbeiten. Dies empfielt sich dann, wenn Du ohnehin
die Zahlenwerte formatiert ausgeben willst. Beispiel FeldTyp Single, Ausgabe
formatiert auf 2 Kommastellen:
Textbox.Text = Format$(Recordset.Fields(x).Value, "#,##0.00")
Das hat auch noch den Vorteil, dass Du zwischen dem Wert 0 (Zahl 0) und
einem leeren Feld unterscheiden kannst. Falls Recordset.Fields(x).Value
einen Nullwert enthält ist der Rückgabewert der obigen Format$-Funktion ein
String der Länge 0 (""). Enhält Recordset.Fields(x).Value aber eine 0 (Zahl
0) dann ist der Rückgabewert obiger Format$-Funktion der String "0,00".
> Wenn ich nur die Datensätze auswähle bei denen im Feld Region Daten
> drin stehen,
> läuft es sauber durch und ich kann im Formular zwischen den
> Datensätzen navigieren.
... jetzt weisst Du ja warum das so ist.
> Gibt es einen Trick, damit man die Datensätze trotzdem zu den
> Datensätzen navigieren
> kann, bei denen bei Region nichts eingetragen ist?
s.oben
entweder Abfrage auf
isNull(Recordset.Fields(x).Value)
oder einfach
Recordset.Fields(x).Value & ""
bzw. die dritte Variante mit
Format$(Recordset.Fields(x).Value, "Formatstring")
Unter
www.gssg.de -> VB-Tips -> Datenbank -> "ADO Demo MU2002"
findest du ein Beispielprogramm in dem Du Dir das oben beschriebene in der
Praxis ansehen kannst.
Den entsprechenden Code findest Du im Formmodul frmMain in der Sub
ShowData(). Diese Sub zeigt Dir auch noch, was Du sonst noch alles prüfen
musst, bevor Du einen Wert aus einem Feld eines Datensatzes an eine Textbox
übergibst, ohne dabei einen Fehler zu riskieren.
Gruß aus St.Georgen
Peter Götz
p.g...@gssg.de
www.gssg.de (mit VB-Tips u. Beispielprogrammen)
> Am schnellsten wahrscheinlich
> mit Access Datenbank exportieren auf nordwind2
> dann nordwind umbenennen auf nordold oder so, dann nordwind2 wieder
> auf nordwind umbenennen und wenn alles läuft dann nordold löschen.
Ob das besonders hilfreich ist, wenn Franz Gerbers Datensätze mal zufällig
aus einer anderen Datenbank als der Nordwind-DB kommen, scheint mir doch
recht zweifelhaft.
> das problem ist nämlich dass diese datensätze keine sind und
> damit eigentlich auch gar nicht existieren dürfen.
Wie sieht denn ein Datensatz aus der gar kein Datensatz ist?
> typisches reorganisationsproblem.
Wohl eher Dein typisches Verständnisproblem beim Objekttyp Recordset.
> vielleicht durch abstürze.
> wie man mit vb das macht, keine ahnung.
So macht man das mit VB:
if isNull(Recordset.Fields(x).Value) then
Textbox.Text = ""
else
Textbox.Text = Recordset.Fields(x).Value
end if
oder ganz einfach so:
Textbox.Text = Recordset.Fields(x).Value & ""
Diese beiden Methoden habe dazu noch den Vorteil, dass sie auch mit leeren
Feldern (Nullwert) funktionieren, die nicht in irgendeiner Tabelle der
Nordwind-Datenbank stehen.
Du hast sicher Recht. Auf Null sollte man generell natürlich abfragen
aber Null Values sollten auf jeden Fall bei indizierten Feldern
nicht vorkommen, bzw. gleich geskippt werden.
Nur falls das Problem doch darin bestünde dass
er Dummy-Datensätze reinschaufelt, dann
würde er schnell seine ganze Datenbank
zerschiessen.
Gruss D.B.
www.buehrer.biz
"Peter Götz" <p.g...@gssg.de> schrieb im Newsbeitrag
news:O9bB#D3dCHA.2060@tkmsftngp09...
"Dieter Bührer" <bue...@t-online.de> schrieb im Newsbeitrag
news:O5vqoT3dCHA.2284@tkmsftngp11...
> Hallo Götz
>
> Du hast sicher Recht. Auf Null sollte man generell natürlich abfragen
> aber Null Values sollten auf jeden Fall bei indizierten Feldern
> nicht vorkommen, bzw. gleich geskippt werden.
Bitte? Wieso das denn nicht? Es kann dafür durchaus gute Gründe
geben (z.B. bei FKs und ähnlichem)
[Fullquote umweltgerecht entsorgt, Nibbles recycled]
Könntest Du übrigens bei Gelegenheit nochmal bei
reinschauen? ;-)
Viele Grüße
Gerrit
--
-------------------------------------------------------
KUH-SOFT - Die Software von glücklichen Programmierern
Bahrenfelder Steindamm 100 - D 22761 Hamburg
eMail: kon...@kuh-soft.de
Home: http://www.kuh-soft.de
> Du hast sicher Recht. Auf Null sollte man generell natürlich abfragen
... nicht nur das.
Man sollte sich z.B. auch noch vergewissern, dass das angesprochene
Recordset überhaupt existiert, dass es geöffnet ist, dass es weder auf BOF
noch auf EOF steht und dass es überhaupt Datensätze enthält.
> aber Null Values sollten auf jeden Fall bei indizierten Feldern
> nicht vorkommen,
... und warum sollten die nicht vorkommen?
Es gibt eine Menge von Anwendungsfällen in denen ich z.B. in einem
Datumsfeld eintweder ein Datum/Uhrzeit oder eben kein Datum/Uhrzeit haben
möchte. Was sonst, als Null sollte in einem solchen Feld stehen, wenn eben
kein Datum gespeichert werden soll?
Oder ich möchte z.B. eine Reihe von bestimmten Messwerten in einer DB
speichern. Das entsprechende Feld kann entweder einen numerischen Wert
enthalten, wenn die entsprechende Messung durchgeführt worden ist, oder eben
einen Nullwert, wenn keine Messung durchgeführt worden ist. Der Wert 0 wäre
da nicht besonders hilfreich, da ich sonst nicht mehr zwischen einem
tatsächlich gemessenen Wert 0 und einer gar nicht ausgeführten Messung
unterscheiden könnte.
Ein Nullwert kann also sehr wohl sinnvoll sein und es gibt nun wirklich
keinen Grund, weshalb ein solcher Wert, in einem Feld (auch in einem
indizierten) nicht vorkommen sollte oder vorkommen dürfte.
> bzw. gleich geskippt werden.
s.oben.
Wie willst Du dann zwischen "kein Datum" und "Datum" unterscheiden, oder
eben zwischen "Messwert 0" und "kein Messergebnis" unterscheiden?
> Nur falls das Problem doch darin bestünde dass
> er Dummy-Datensätze reinschaufelt, dann
Was sind Dummy-Datensätze?
Ich rate mal, Du meinst damit Datensätze deren Felder (eines oder mehrere)
leer sind (Nullwert)
> würde er schnell seine ganze Datenbank
> zerschiessen.
Warum sollte ein Datensatz, dessen Felder Nullwerte enthalten eine Datenbank
"zerschiessen"?
Ich habe täglich mit Datenbanken zu tun, in denen es hunderttausende und
sogar mehrere Millionen von Datensätzen gibt, bei denen verschiedene Felder
auch mal Nullwerte enthalten. Den Datenbanken ist das völlig "wurscht".
Gruß aus St.Georgen
Peter Götz
p.g...@gssg.de
www.gssg.de (mit VB-Tip u. Beispielprogrammen)
vielen Dank an allen die mir geantwortet haben.
Werde mir das jetzt genauer anschauen, auch die ADO Demo MU2002.
--
Gruß
Franz
"Peter Götz" <p.g...@gssg.de> schrieb im Newsbeitrag
news:OsPTBE3dCHA.2060@tkmsftngp09...