Hallo,
ich habe ein Problem mit einer bereits funktionierenden Lösung und würde eine Erweiterung/Änderung des Codes benötigen:
Ausgangstabelle:
ID Textfeld
1 A
1 B
2 AAA
2 BBB
3 CCC
3 DD
3 EE
Ich möchte pro ID alle Inhalte in einer Zelle vereinigen, jede ID sollte nur einmal auftreten;
Wunschziel:
ID Textfeld
1 A;B
2 AAA;BBB
3 CCC;DD;EE
Die Lösung von Oma sieht aus wie folgt:
Modul:
Public Function SZ(ID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT Textfeld FROM DeineTabelle WHERE ID =" & ID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!Textfeld
rs.MoveNext
Loop
SZ = Mid(SZ, 2, 100)
rs.Close
Set rs = Nothing
End Function
Abfrage:
select ID, SZ([ID]) AS Ausgabe
from DeineTabelle
group by ID
Gruß Oma
--> das funktioniert prächtig, allerdings schneidet er mir das Feld "Ausgabe" nach 255 Zeichen ab. Da ich ja gerade mehrere Felder kombiniere, brauche ich unbedingt ein Memo-Feld (das Ganze wird schlussendlich dann eine Tabellenerstellungsabfrage).
Kann jemand helfen, wie man den Code entsprechend anpassen könnte, um ein Memo Feld zu generieren?
Anke
Moin Anke,
wäre hilfreich Deine "spezielle" Abfrage zu kennen. Vermutlich weist Du den Funktionswert einer Variablen zu.
Auch frage ich mich, warum erst ab 255 abgeschnitten wird.
Aufgrund der Zeile SZ = Mid(SZ, 2, 100) würde ich erwarten, dass bei 100 geschnitten wird.
Oder ist bei Dir real 255 drin?
Was passiert, wenn du eine Zeile in der Art: SZ = Mid(SZ, 2) verwendest?
Harald
Hallo,
berechnete Spalten in Abfragen werden immer bei 255 Zeichen abgeschnitten.
Das Füllen eines Memofeldes mit dem zusammengesetzen String sollte per separater Aktualisierungsabfrage erfolgen:
Public Function SZ(ID As Long) As String
Dim strSQL As String
Dim rs As DAO.Recordset
strSQL = "SELECT Textfeld FROM DeineTabelle WHERE ID =" & ID
Set rs = DBEngine(0)(0).OpenRecordset(strSQL)
Do While rs.EOF = False
SZ = SZ & "; " & rs!Textfeld
rs.MoveNext
Loop
SZ = Mid(SZ, 2) ' lediglich erstes Zeichen abschneiden
rs.Close
Set rs = Nothing
End Function
z. B.:
Currentdb.Execute "Update tblDeineTabelle set Memofeld = SZ(tblDeineTabelle.ID)"
Zitat von: DF6GL am Juni 07, 2012, 09:32:01
berechnete Spalten in Abfragen werden immer bei 255 Zeichen abgeschnitten.
Hallo Franz,
das hatte ich auch mal gelesen.
Bei dem heutigen Versuch (siehe Anlage in der Abfrage "Abfrage1" die Spalte F1_2) hatte ich aber 2 Felder mit je 255 Zeichen in einer Abfrage zusammenfügen können. Wo denke ich "falsch"?
Harald
[Anhang gelöscht durch Administrator]
Hallo Harald,
naja, vielleicht sieht Access den "&"-Operator (noch) nicht als "Berechnung" an...
Hallo Franz,
meine erste Vermutung für das Abschneiden war gewesen, was ich zuvor gelesen hatte: "berechnetes wird abgeschnitten".
Deshalb mein Versuch mit "&", wo nichts abgeschnitten wird.
Der nächste Versuch mit "+" schneidet auch nichts ab. Das betrachte ich mal als "angenehme" Überraschung.
Harald
Hallo,
@bahasu
Deine Abfrage funktioniert weil keine Gruppierung stattfindet.
Das Problem mit dem Abschneiden bei 255 Zeichen liegt an der Gruppierung!
In der Abfrage wird für das Feld ID 'Guppierung' angegeben und fürs Textfeld MUSS 'Ausdruck' angegeben werden - dann läufts
Im angehängten Beispiel werden für die ID 4 465 Zeichen in der Abfrage ausgegeben.
Ich habe die Function mit einem 'debug.Print' versehen um die Länge der Ausgabe im Direktberiech sichbar zu machen.
Wird das Textfeld gruppiert, werden zwar alle Zeichen eingelesen jedoch im Abfrageergebnis nicht angezeigt.
In der Tabelle habe ich das Textfeld als Memo deklariert um zum Testen eine Unmenge von Zeichen erfassen zu können.
[Anhang gelöscht durch Administrator]
Hallo, vielen Dank für die Hilfe!
Ich werde die Ansätze ausprobieren - ich hatte mir zwischenzeitlich auch eine Krücke mit einer Anfügeabfrage an eine Zieltabelle gebaut, in der ich das Zielfeld als MEMO Feld definiert hatte. Allerdings eine sehr umständliche Lösung!