Neuigkeiten:

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

Mobiles Hauptmenü

Undefinierte Funktion ’NZ‘ in Ausdruck.

Begonnen von Mykis, Januar 15, 2023, 12:35:09

⏪ vorheriges - nächstes ⏩

Mykis

Hallo,

ein unklares Problem habe ich bei einem Nutzer des Pilzkartierungsprogramms Mykis. Bei ihm erscheint bei bestimmten Aufrufen die Fehlermeldung "Undefinierte Funktion 'NZ' in Ausdruck." Die NZ-Funktion hab ich in vielen Abfragen eingebaut und sie funktioniert allgemein problemlos. Wenn es mit Verweisen zusammenhängen sollte, müsste es auch bei anderen Nutzern auftreten. Das Programm läuft in allen gängigen Access-Versionen von 2003 bis 2019 in der 32 Bit Version. Was könnte an diesem einen Rechner diesen hartnäckigen Bug auslösen. Ich erwarte keine Lösung, aber vielleicht einen Hinweis, wo ich weiter suchen könnte.

LG
Frank
  •  

MzKlMu

Hallo,
ZitatWenn es mit Verweisen zudsammenhängen sollte, müsste es auch bei anderen Nutzern auftreten.
Wieso?
Bei anderen Usern könnten ja die Verweise stimmen.
Meiner Meinung nach können es nur die Verweise sein.
Gruß
Klaus
  •  

ebs17

Nz ist eine Funktion des Access-Objektes und nicht verweisabhängig, weil in allen Versionen vorhanden.

Gegenfrage ist: Worin genau wird Nz eingesetzt?
In Abfragen ist dazu das Wirken des Expression Service notwendig. Dieser wirkt nur in Aufrufen aus Access heraus. Daher Folgefrage: Von wo werden die fraglichen Anweisungen aufgerufen?

Alternative:
IIF(FieldA Is NULL, 0, FieldA)IIF ist Befehls-Bestandteil von Jet und immer verfügbar. Es ist zudem typensicher.
Mit freundlichem Glück Auf!

Eberhard
  •  

Mykis

Hallo Eberhard,

Zitat von: ebs17 am Januar 15, 2023, 13:02:31Gegenfrage ist: Worin genau wird Nz eingesetzt?

In Abfragen z.B. so: Nz([artlisten]![organ_substrat_id])

Zitat von: ebs17 am Januar 15, 2023, 13:02:31Von wo werden die fraglichen Anweisungen aufgerufen?

Die Abfragen werden z.B. beim Datenexport über den entsprechenden Button auf dem Formular aufgerufen.
Dein Alternativ-Code ist mir bis jetzt nicht bekannt.

Liebe Grüße
Frank
  •  

steffen0815

Hallo Frank,
welche Accessversion hat der fragliche Rechner?
Welche Verweise sind aktiviert?

Zumindest bei den älteren Accessversionen war es nmE. so, dass wenn ein Verweis "defekt" ist gar keine VBA-Funktion mehr gefunden wurde.
Gruß Steffen
  •  

MzKlMu

Hallo,
das oben gezeigte Beispiel mit Nz ist auch unvollständig, es fehlt der Ersatzwert.
Ist zwar optional, aber trotzdem sinnvoll.
Gruß
Klaus
  •  

Mykis

Hallo Steffen,

Zitat von: steffen0815 am Januar 15, 2023, 19:44:27welche Accessversion hat der fragliche Rechner?

der Rechner läuft mit Runtime 2010, wie einige andere Rechner, die ohne Proleme laufen.

Zitat von: steffen0815 am Januar 15, 2023, 19:44:27Welche Verweise sind aktiviert?



LG
Frank
  •  

Mykis

Hallo Klaus,

NZ Funktionen habe ich bis jetzt immer ohne Ersatzwert benutzt. Welchen Vorteil hätte dieser?

LG
Frank
  •  

Josef P.

#8
Hallo!

Ob es an einem defekten Verweis liegt, kannst du prüfen, wenn du die References-Auflistung von Access.Application in deiner Anwendung durchläufst und die IsBroken-Eigenschaft prüfst.
Wenn man im Code bei VBA-Funktion "VBA." oder "Access." (die jeweilige Bibliothek) davor stellt, können diese auch bei defekten Verweisen anderer Bibliotheken verwendet werden.

Andere Test-Möglichkeit:
Selbst eine Nz-Funktion in VBA schreiben und dann darin die Access-Funktion Nz nutzen.
Public Function Nz(ByVal Value As Variant, Optional ByVal ValueIfNull) As Variant
   Nz = Access.Nz(Value, ValueIfNull)
End Function
Der Code der Anwendung wird bei der Funktionssuche (wenn die Bibliothek nicht angegeben ist) zuerst durchsucht. Daher spielen in diesem Fall defekte andere Verweise keine Rolle.

Gruß
Josef


Mykis

Hallo Josef,

Zitat von: Josef P. am Januar 16, 2023, 09:19:50Ob es an einem defekten Verweis liegt, kannst du prüfen, wenn du die References-Auflistung von Access.Application in deiner Anwendung durchläufst und die IsBroken-Eigenschaft prüfst.

Meinst du das in etwa so?

Public Sub VerweisePruefenUndErneuern()
    Dim objReference As Reference
    Dim strGUID As String
    For Each objReference In References
        Debug.Print objReference.Name
        Debug.Print objReference.FullPath
        Debug.Print objReference.Guid
    Next objReference
End Sub

LG
Frank
  •  

Josef P.

#10
Hallo!

Bei FullPath könnte eventuell ein Fehler ausgelöst werden, falls der Verweis defekt ist. (Bin mir aber nicht sicher).

    Dim Msg As String
    Dim objReference As Access.Reference

    For Each objReference In Access.References
        Msg = Msg & vbNewLine & objReference.Name & ": " & objReference.IsBroken
    Next objReference
   
    VBA.MsgBox Msg
Msgbox, da Debug.Print bei einer Access-Runtime-Version vermutlich schlecht zu lesen ist. ;)


[OT]
Interessehalber wegen des Namens "VerweisePruefenUndErneuern"
Hast du das schon einmal in VBA einen defekten (IsBorken = True) Verweis korrigieren können?
Bei meinen Versuchen (mit Verweisen auf eine tlb in einem Verzeichnis (nicht COM-registriert), konnte ich den nicht ändern.
Einen neuen Verweis setzen (wenn GUID nicht bereits verknüpft ist) funktioniert, aber den defekten Verweis brachte ich nie raus.

Gruß
Josef

Mykis

Hallo Josef,

der Code ist nicht von mir, sondern aus dem Netz. Ich bin noch nicht so versiert in VBA.

Das Problem mit dem einen Rechner, der den Bug bringt ist, dass dort nur eine Runtimeversion installiert ist. Wenn auf diesen Rechner ein Verweis nicht funktioniert, könnte es ja auch an einer fehlenden oder anders bezeichneten Bibliothek liegen. Es wundert mich aber, das nur die Funktion "NZ undefiniert" sein soll, alles andere läuft. Welcher Verweis meiner Auswahl oben wären denn da verantwortlich? 

LG
Frank
  •  

ebs17

ZitatWelcher Verweis meiner Auswahl oben wären denn da verantwortlich?
Da Nz eine Accessfunktion ist, jener auf Access.
Danke für das aufmerksame Lesen.

Fehler, die nur auf einem Rechner vorkommen, können auch aus Datenfehlern resultieren, sprich die Datenherkunft kommt mit einigen "Besonderheiten" daher, die es
a) bei den anderen Installationen nicht gibt
b) entwicklungsseitig nicht eingeplant und behandelt sind.

Bei einer Fehlermeldung muss man auch prüfen, wer sie erzeugt.
Daneben können Formulierungen von Meldungen teilweise oder ganz falsch sein und somit eigentlich die Richtung der Analyse in falsche Bahnen lenken.
Mit freundlichem Glück Auf!

Eberhard
  •  

steffen0815

Hallo Frank,
nimm den Code von Josef aus #10 und baue diesen "hinter einem Befehlsknopf" im Startformular.
Der Nutzer auf dem Problemrechner kann dann auf diesen Knopf drücken und dir das Ergebnis mitteilen.

Gruß Steffen
  •  

Mykis

Hallo Steffen,

den Code habe ich erstmal in meine Datenbank eingebaut. Das Ergebnis hier:



Warum steht da überall "Falsch"? Bedeutet das in diesem Fall ales OK? :)

LG
Frank
  •