Memofelder in Abfrage-Funktionen

Angenommen, man möchte den Inhalt eines Memofeldes innerhalb einer Abfrage modifizieren. Ein einfacher Ansatz dafür ist das Erstellen einer benutzerdefinierte Funktion in einem Standardmodul, die dann in der Abfrage aufgerufen wird.

Die Abfrage liefert dann auch die erwarteten Daten - jedoch nur in der Datenblattansicht. Wenn man sie über DAO auswertet, werden nur die ersten 255 Zeichen des Memofeldes korrekt zurückgegeben - der Rest ist „Kauderwelsch“.

Kennt jemand das Problem und weiß einen Workaround???

Ein Beispiel:

  1. Lege eine neue Tabelle „MeineTabelle“ mit einem Memofeld „MeinMemo“ an und gib einge Daten (>255 Zeichen) ein.
  2. Erstelle eine Funktion in einem Standardmodul, die den Inhalt des Feldes zurückgibt

Public Function GetMemo(sMemo as String) as String
GetMemo = sMemo
End Function

  1. Erstelle eine Abfrage „MeineAbfrage“, die die Funktion GetMemo beinhaltet:
    Select GetMemo([MeinMemo]) as Memo From MeineTabelle;

  2. Führe die Abfrage aus. In der Datenblattansicht werden die korrekten Daten angezeigt.

  3. Lege eine weitere Funktion an, um die Abfrage per DAO auszuwerten:

Public Sub TestDAO()
Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset(„MeineAbfrage“, dbOpenSnapshot)
With rs
.MoveFirst
Do Until .EOF
Debug.Print !Memo
.MoveNext
Loop
End With
End Sub

  1. Schaue ins Testfenster: ab dem 255. Zeichen wird „Kauderwelsch“ ausgegeben.

Ich versteh nicht warum du das Feld MeinMemo über eine Funktion abfragen willst. Es wäre doch viel einfacher die Abfrage direkt auf der Tabelle zu definieren, und die Änderungen später zu machen. Davon mal Abgesehen gibt es glaube ich auch keine (vernünftige) Lösung für dein Problem!
Dieses Problem liegt in der Funktion GetMemo:

Public Function GetMemo(sMemo as String) as String
GetMemo = sMemo
End Function

Sie liefert einen String zurück, welcher dazu führt, dass in der Abfrage:

Select GetMemo([MeinMemo]) as Memo From MeineTabelle;

das Feld Memo den Datentyp Text bekommt. afaik gibt es keinen Ausweg aus dieser Situation. Man kann weder GetMemo so ändern, dass ein Memo zurückgeliefert wird, noch den Datentyp des Feldes Memo in der geöffneten Abfrage ändern.

Hi Andreas,

wofür benötigst Du eine Funktion die die Memo-Daten ausgibt?
Erstelle einfach eine Abfrage mit dem Memofeld. Anzeige und editieren ist jederzeit möglich.

In Deiner Funktion wird MEMO in STRING (255 Zeichen) gewandelt !!

Gruß
Wolfgang

Hallo Wolfgang,

wofür benötigst Du eine Funktion die die Memo-Daten ausgibt?

Weil der Inhalt des Memofeldes eben modifiziert werden soll. Das ist mit einer Funktion viel einfacher erledigt. Was ich da aufgeschrieben habe, war ja nur ein einfaches Beispiel, um den Sachverhalt nachvollziehen zu können.

In Deiner Funktion wird MEMO in STRING (255 Zeichen) gewandelt

Wieso? Die Funktion gibt doch genau das zurück, was im Memofeld drinsteht. Jedenfalls, wenn ich die Abfrage in der Datenblattansicht anzeige. Aber über DAO eben nicht …

uni

Hallo Hans,

Ich versteh nicht warum du das Feld MeinMemo über eine
Funktion abfragen willst. Es wäre doch viel einfacher die
Abfrage direkt auf der Tabelle zu definieren, und die
Änderungen später zu machen.

s. meine Antwort auf Wolfgang …

Sie liefert einen String zurück, welcher dazu führt, dass in
der Abfrage:
das Feld Memo den Datentyp Text bekommt.

Kann ja irgendwie nicht sein, denn die Abfrage liefert in der Datenblattansicht ja die richtigen Daten.

uni

Hallo Andreas,
wenn auf deine Frage zwei (im Grunde gleiche) Antworten gegeben werden, sollten diese eigentlich stimmen. Aber was solls Vertrauen ist gut … :smile:
Du kannst die „Behauptung“ von Wolfgang und mir ja mal selbst nachprüfen. Ändere deine Abfrage wie folgt:
Select GetMemo([MeinMemo]) as Memo,MeinMemo From MeineTabelle;
Den Typ der beiden Felder kannst du dir nun durch einfügen von:
Debug.Print rs!memo.type
Debug.Print rs!meinMemo.type
in deine Funktion testDAO anzeigen lassen. Du wirst sehen dass zwei verschiedene Zahlen da stehen. String(text) ist 10, memo weiss ich nicht aber wenn ich mich recht erinnere 12.
Hans