Neuigkeiten:

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

Mobiles Hauptmenü

Abschneiden/Truncate nach 255 Zeichen in spezieller Abfrage

Begonnen von Anke_71, Juni 06, 2012, 11:50:03

⏪ vorheriges - nächstes ⏩

Anke_71

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


bahasu

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

Servus

DF6GL

#2
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)"
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

bahasu

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]
Servus

DF6GL

Hallo Harald,

naja, vielleicht sieht Access den "&"-Operator (noch) nicht als "Berechnung" an...


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

bahasu

#5
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
Servus

database

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]

Anke_71

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!