Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

oldValue

Begonnen von moellfe, Februar 27, 2013, 15:54:44

⏪ vorheriges - nächstes ⏩

moellfe

Hallo,

ich habe ein Problem mit der Eigenschaft "oldValue" in einem Formular.
Die RecordSource für dieses Formular ist eine Abfrage mit 2 Tabellen.
Immer dann wenn die Felder der 2. Tabelle mit oldValue angesprochen werden, kommt folgende Fehler-Meldung:
3251 - Operation wird für diesen Objekttyp nicht unterstützt.

Hier die Abfrage für die RecordSource:

SELECT tblArtikel.ARTNR, tblArtikel.Bezeichnung, tblArtikelStk.BruttoGewStk, tblArtikelStk.NettoGewStk
FROM tblArtikel LEFT JOIN tblArtikelStk ON tblArtikel.AArtNrStk = tblArtikelStk.ArtNrStk
WHERE (((tblArtikel.BARTNR)=[Forms]![frmArtikel]![BArtNr]) AND ((tblArtikel.ARTNR)=[Forms]![frmArtikel]![ArtNr]));

Hier der Code aus dem Before_Update Ereignis des Formulars:

Dim ctl As Control


40 With Me
...
...
...
160 For Each ctl In .Controls
170 If (ctl.ControlType = acTextBox Or ctl.ControlType = acCheckBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Or ctl.ControlType = acOptionGroup) Then
180 If ctl.Enabled = True And ctl.Visible = True Then
190 If Ungleich(ctl.oldValue, ctl) Then
...
... ' Log-Eintrag erzeugen
...
250 End If
260 End If
270 End If
280 Next ctl

290 End With

Kann mir jemand weiterhelfen?
Vielen Dank im Vorraus !

Wurliwurm

190 If Ungleich(ctl.oldValue, ctl) Then

Ich kenne zwar die Funktion "Ungleich" nicht, aber der Vergleich von einem Steuerelement.Value mit einem Steuerelement wird wohl nicht gehen.

bahasu

Hi,

was passiert, wenn Du
   If Ungleich(ctl.oldValue, ctl.value) Then
verwendest?

Harald
Servus

moellfe

Hallo Harald,

du hast natürlich Recht,

in der Zeile 190 muss nartürlich ctl.Value angesprochen werden.
Das ist aber nicht das Problem, sondern bei ctl.oldValue kommt die Fehlermeldung !

Gruß
Ferdinand


Wurliwurm

Was ist die Funktion Ungleich?

Wenn diese zwei Objekte auf Gleichheit vergleicht, dann ist sie ungeeignet, und es kann einfach mit
If ctl.oldValue <> ctl.value then
gearbeitet werden.

moellfe

Hallo Wurliwurm,

hier die Funktion Ungleich:

Public Function Ungleich(varString1 As Variant, varString2 As Variant) As Boolean

Dim bolVergleich As Boolean

   If Len(varString1) = 0 Or IsNull(varString1) Then
      bolVergleich = (Len(varString2) = 0 Or IsNull(varString2))
   Else
      If Len(varString2) = 0 Or IsNull(Len(varString2)) Then
         bolVergleich = False
      Else
         bolVergleich = (varString1 = varString2)
      End If
   End If
   
   Ungleich = Not bolVergleich

End Function

Das Problem ist aber nicht der Vergleich, sondern der Ausdruck ctl.oldValue. Dieser löst den Fehler aus und zwar nur bei den Feldern aus der 2. Tabelle (tblArtikelStk)

Gruß
Ferdinand

Wurliwurm

Okay, dann vergleicht die Funktion Ungleich im Prinzip nur Strings.

170 If (ctl.ControlType = acTextBox Or ctl.ControlType = acCheckBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Or ctl.ControlType = acOptionGroup) Then
...
190 If Ungleich(ctl.oldValue, ctl) Then


Hier werden Steuerelemente (also Objekte) eines Formulars durchlaufen und dann das Attribut oldValue ausgewertet. Wenn ein Steuerelement sich bei der If-Bedingung qualifiziert und anschließend oldValue benutzt wird, ohne daß das Steuerelement dieses Attribut hat, dann kommt zur Laufzeit natürlich ein Fehler. Dieser kann zur Kompilierungszeit noch nicht erkannt werden.

Stelle mal sicher, daß alle Steuerelementtypen oldValue kennen oder/und bei welchen Control der Fehler auftritt. Dazu würde ich folgendes einfügen vor der Zeile 190:
Debug.Print "ControlType: " & ctl.ControlType & ",  Name: " & ctl.Name

bahasu

Hi,

ich hatte mal einen ähnlichen Vergleich gemacht mit:
          StrComp(Nz(ctl.OldValue), Nz(ctl.Value), 0)
Also mit nz, um Null-Werte zu berücksichtigen, und
mit StrComp als access-eigene Vergleichsoperation.

Vielleicht hilft Dir das.

Harald
Servus