collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 72
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 1
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14071
  • stats Beiträge insgesamt: 67551
  • stats Themen insgesamt: 9101
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: SQL in VBA schneidet String ab  (Gelesen 2088 mal)

Offline AOT

  • Newbie
  • Beiträge: 23
SQL in VBA schneidet String ab
« am: Januar 11, 2018, 13:38:20 »
Liebes Forum,

ich habe folgenden Code um die Ergebnisse einer Abfrage "PublikationenWeb_Check" für einen Datensatz in ein Formular zu schreiben, in dem dieser Datensatz angezeigt wird. Die Motivation ist, dass diese Abfrage sehr komplex und wieder viele andere Abfragen zusammenfasst. Ich bekomme dann häufig den "Mehr Datenbanken können nicht geöffnent werden" Fehler, wenn ich noch andere Formulare benutze.


Private Function TitelAusgabe()
Dim rsTitel As DAO.Recordset
Dim strPublikation As String
Dim strSQL As String
Dim strTitel As String

strPublikation = Me.ID_pub

strSQL = "SELECT PublikationenWeb_Check.* FROM PublikationenWeb_Check WHERE PublikationenWeb_Check.ID_Pub = " & strPublikation & ";"
Debug.Print strSQL
Set rsTitel = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

    strTitel = rsTitel.Fields("Titel")
    Debug.Print strTitel
    Me.PublikationTitel = strTitel

Der SQL Code schaut also in der Abfrage nach, welcher Titel für die im Formular gerade anzeigte Publikation in der Abfrage ausgegeben wird. Dann wird dieser in das Textfeld des Formulars geschrieben.

Das Problem ist nun, dass der Titel bei einer Länge von mehr als 255 Zeichen abgeschnitten wird und zwar vor (!) dem Schreiben in das Formularfeld, so dass ich nicht glaube dass es etwas mit dem Textfeld im Formular zu tun hat.

Hier mal zwei Ergebnisse der Debug.Print Anweisungen. Bei der ersten ist strTitel wie oben angegeben eine String-Variable; beim zweiten Ergebnis habe ich die strTitel mal testweise als Variant deklariert: Keine Lösung, aber andere Ausgabe.

Wenn ich die SQL-Anweisung direkt für das Erstellen einer Abfrage benutze, dann funktioniert er.

Das Feld "Titel" in der Abfrage ist wiederum aus sehr vielen anderen Felder in verschiedenen Tabellen zusammengesetzt.

(1) strTitel als String:
SELECT PublikationenWeb_Check.* FROM PublikationenWeb_Check WHERE PublikationenWeb_Check.ID_Pub = 513;

Zigan, Lars; Schmitz, Ingo; Flügel, Alexandre; Knorsch, Tobias; Wensing, Michael; Leipertz, Alfred: Effect of Fuel Properties on Spray Breakup and Evaporation Studied for a Multihole Direct Injection Spark Ignition Injector, Energy and Fuels, 24, 4341-435 ?? 

(2) strTitel as Variant
SELECT PublikationenWeb_Check.* FROM PublikationenWeb_Check WHERE PublikationenWeb_Check.ID_Pub = 513;

Zigan, Lars; Schmitz, Ingo; Flügel, Alexandre; Knorsch, Tobias; Wensing, Michael; Leipertz, Alfred: Effect of Fuel Properties on Spray Breakup and Evaporation Studied for a Multihole Direct Injection Spark Ignition Injector, Energy and Fuels, 24, 4341-435????????

Schließlich noch eine Version, wo ich die Ausgabe des Titel direkt über
Debug.Print rsTitel.Fields("Titel")
veranlasst habe

SELECT PublikationenWeb_Check.* FROM PublikationenWeb_Check WHERE PublikationenWeb_Check.ID_Pub = 513;

Zigan, Lars; Schmitz, Ingo; Flügel, Alexandre; Knorsch, Tobias; Wensing, Michael; Leipertz, Alfred: Effect of Fuel Properties on Spray Breakup and Evaporation Studied for a Multihole Direct Injection Spark Ignition Injector, Energy and Fuels, 24, 4341-435???   ?



Ratlose Grüße
Jürgen
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 923
Re: SQL in VBA schneidet String ab
« Antwort #1 am: Januar 11, 2018, 13:59:08 »
Zitat
diese Abfrage sehr komplex und wieder viele andere Abfragen zusammenfasst
Da werden einige Operationen enthalten sein, die zu diesem Verhalten führen. Z.B. Gruppieren führt häufig zu einem Verkürzen => Analysieren.
Ggf. kann das helfen: Manipulation: Wie kann ich Memo-Felder sortieren bzw. gruppieren?

Die Kombination Memofeld und SQL ist an sich schon recht problematisch und wird schon daher etwas stiefmütterlich behandelt. In Datenbankfeldern speichert man typischerweise atomare Informationen (Stichwort Normalisierung 1. NF). Ein Text mit mehr als 255 Zeichen ist ganz sicher etwas anderes als eine atomare Information.

Einen Memotext durch mehrere komplexe Abfragen zu schicken, um ihn dann alleine für sich in einem Formalartextfeld anzuzeigen ist dann auch nicht eine glückliche Lösung. Da sollte man den eigenen Workflow grundlegend überdenken.
Mit freundlichem Glück Auf!

Eberhard
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1339
Re: SQL in VBA schneidet String ab
« Antwort #2 am: Januar 11, 2018, 14:09:18 »
Wenn komplex bedeutet, dass in der Abfrage der Titel gruppiert ist oder das DISTINCT-Prädikat eingesetzt ist, dürftes es mit Langen Text-/Memo-Feldern schwierig werden. Das Problem ist uralt, wird von Microsoft aber nicht behoben. Ansonsten kann man nur in der Tabelle über den Primärschlüssel, den Text herausziehen. Siehe auch FAQ 5.18.
Grüße von der (⌒▽⌒)
 

Offline AOT

  • Newbie
  • Beiträge: 23
Re: SQL in VBA schneidet String ab
« Antwort #3 am: Januar 12, 2018, 12:34:26 »
Hallo zusammen,

Vielen Dank für die Antworten. Dann muss ich es anders lösen.

Viele Grüße
Jürgen
 

Offline Frithjiof

  • Access-User
  • *
  • Beiträge: 74
Re: SQL in VBA schneidet String ab
« Antwort #4 am: Januar 12, 2018, 22:55:49 »
Hallo Jürgen

ich habe folgenden Code um die Ergebnisse einer Abfrage "PublikationenWeb_Check" für einen Datensatz in ein Formular zu schreiben

Also ohne zu zeigen wie das Feld "Titel" sich real zusammensetzt, verlangst du von dem Form Kaffeesatzleserei.
Soll heißen es wäre um helfen zu können schon nötig den SQL-String der Abfrage "PublikationenWeb_Check" zu sehen.

Frithjof
 

Offline AOT

  • Newbie
  • Beiträge: 23
Re: SQL in VBA schneidet String ab
« Antwort #5 am: Januar 15, 2018, 08:03:32 »
Zitat
Also ohne zu zeigen wie das Feld "Titel" sich real zusammensetzt, verlangst du von dem Form Kaffeesatzleserei.
Soll heißen es wäre um helfen zu können schon nötig den SQL-String der Abfrage "PublikationenWeb_Check" zu sehen.

Tut mir leid, wenn der Eindruck entstanden ist. Ich hatte angenommen, dass ich vielleicht einen Fehler in dem Zugriff auf die Abfrage mache, was sich dann ohne Kenntnis des SQL-Strings lösen liese. So ist es ja aber leider nicht. Die Abfrage "PublikationenWeb_Check" basiert aber wiederum auf Abfragen, die wieder auf Abfragen basieren. Da muss man sich den Gesamtaufbau dieses Teils der Datenbank anschauen und das wäre dann viel verlangt.

Viele Grüße
Jürgen
 

Offline Frithjiof

  • Access-User
  • *
  • Beiträge: 74
Re: SQL in VBA schneidet String ab
« Antwort #6 am: Januar 15, 2018, 10:55:03 »
Hallo Jürgen,

Ich hatte angenommen, dass ich vielleicht einen Fehler in dem Zugriff auf die Abfrage mache, was sich dann ohne Kenntnis des SQL-Strings lösen liese. So ist es ja aber leider nicht.

Richtig, das Auslesen des Feldinhaltes  "Titel" ist nicht die Ursache für ein Abschneiden des Strings.
Darum stellt sich erstens die Frage wo das Feld Titel definiert und zweitens welcher Inhalt eigentlich erwartet wird.

Die Abfrage "PublikationenWeb_Check" basiert aber wiederum auf Abfragen, die wieder auf Abfragen basieren. Da muss man sich den Gesamtaufbau dieses Teils der Datenbank anschauen und das wäre dann viel verlangt.

M.W. war es früher (Access 97,2000) nicht möglich Memofelder zu gruppieren. Um das zu erreichen war es notwendig, die Länge des Memofeldes mit z.B.  Left([Memofeld],80)  auf eine passable Größe, in diesem Fall auf 80 Zeichen, zu begrenzen. Heute schein Access das automatisch zu machen (habe ich gerade mal probiert), was kein Gewinn für den Anwender ist, wie wir hier sehen.

"Memofelder" von Abfrage zu Abfragen zu schleppen macht m.E. auch nur wenig Sinn, es sei denn man muss Zeit totschlagen. Da solltest du Lachtaubes obigen Rat folgen und den „langen Text“ also das Memofeld erst in die letzte Abfrage einbinden.

Frithjof
 

Offline AOT

  • Newbie
  • Beiträge: 23
Re: SQL in VBA schneidet String ab
« Antwort #7 am: Januar 15, 2018, 13:22:50 »
Zitat
"Memofelder" von Abfrage zu Abfragen zu schleppen macht m.E. auch nur wenig Sinn, es sei denn man muss Zeit totschlagen. Da solltest du Lachtaubes obigen Rat folgen und den „langen Text“ also das Memofeld erst in die letzte Abfrage einbinden.

Das hatte ich dann anscheinend schlecht formuliert. Genauso mache ich es. Es gibt kein Memofeld in einer Tabelle, sondern die Daten sind sehr atomisiert in vielen Tabellen gespeichert (Autoren, Artikel, Journals, etc) und werden dann erst für die Gesamtausgabe des Titels über mehrere Abfragen zusammengestellt. Auf die letzte Abfrage greife ich zu und hatte gehofft, dass sie Access-Einschränkungen nur wirken, wenn in diesem letzten Datenzugriff ein kritisches Element ist.

Vielen Dank und viele Grüße
Jürgen
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7426
Re: SQL in VBA schneidet String ab
« Antwort #8 am: Januar 15, 2018, 13:39:34 »
Hallo,
sobald die Letzte Abfrage gruppiert ist wird das Memo abgeschnitten.
Du solltest daher in allen beteiligten Abfragen das Memofeld nicht mit führen.
In die letzte Abfrage wird dann nur das Memofeld und das Schlüsselfeld aufgenommen und die Verknüpfung angelegt.
Diese dann allerletzte Abfrage darf nicht gruppiert sein.
Gruß
Klaus
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23446
Re: SQL in VBA schneidet String ab
« Antwort #9 am: Januar 15, 2018, 13:46:36 »
Hallo,

die Länge des anfänglich genannten String (264, lt. Notepad++)  übersteigt ja schon die max. Länge eines (berechneten) Abfragefeldes...


Was erwartest Du dann überhaupt?

Zitat
......24, 4341-435???   ?


Das "rote" Zeichen ist das 255ste Zeichen in diesem String.
Was sollen die "?" und Leerzeichen am Ende bedeuten? Bist Du auch sicher, dass dort keine (unsichtbaren) Sonderzeichen enthalten sind?
Vermutlich kommen diese durch fehlerhaftes  Zusammenfügen in den Abfragen zustande und führen dadurch zur Überschreitung der max. zulässigen Zeichen.

Insofern solltest Du den Zusammenbau des Titels unter die Lupe nehmen.

Dabei könnte man sich überlegen, den ellenlangen Titel in Autoren und den eigentlichen Titel , evtl. noch den "Nachgang" in zwei oder mehrere entspr. Einzelfelder zusammenzusetzen.

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1339
Re: SQL in VBA schneidet String ab
« Antwort #10 am: Januar 15, 2018, 14:12:39 »
Ich schlage vor, eine (temporäre) Zieltabelle anzulegen, in der besagtes Feld als Memofeld ausgelegt ist. Die Tabelle befüllst Du dann aus Deiner in eine Anfügeabfrage umgewandelten bisherigen Abfrage.
Grüße von der (⌒▽⌒)
 

Offline AOT

  • Newbie
  • Beiträge: 23
Re: SQL in VBA schneidet String ab
« Antwort #11 am: Januar 16, 2018, 10:01:35 »
Zitat
Ich schlage vor, eine (temporäre) Zieltabelle anzulegen, in der besagtes Feld als Memofeld ausgelegt ist. Die Tabelle befüllst Du dann aus Deiner in eine Anfügeabfrage umgewandelten bisherigen Abfrage.

Ich denke, diesen Weg werde ich gehen. Danke!

Ansonsten komme ich nicht darum herum, das Feld einmal in der ganzen Länge auszugeben. Ich brauche für Ausgabe in Berichten und für die Homepage den Titel so, wie er auch in einer Publikation zitiert werden. Dafür haben wir die Datenbank ja. In der Abfrage funktioniert das auch problemlos und die Anzeige in einem UFO, das auf der Abfrage basiert, auch. Ich wollte es bloß anders machen, weil ich beim Öffnen anderer Formulare im ganzen ein Problem mit zuviel aktiven Recordsets hatte.

Leere Zeichen sind sicherlich nicht enthalten. Das habe ich geprüft. Ich denke, es ist wirklich der Bug von Microsoft. Ich hatte es spaßhalber mal probiert das Feld "Titel" in der Abfrage mit Left() und Right() zusammenzusfassen. Das klapplt bei langen Titeln bei Left(); bei Right() bringt er einem scheinbar zufällige Zeichen irgendwo aus dem String (zumindest konnte ich keine Systematik erkennen).

Ganz generell: bei manchen Einsatzzwecken lassen sich Memofelder bzw. Felder mit langen Texten nicht umgehen. Jedes CMS ist eine Datenbank und hat Felder mit langen Texten, weil manchen Texte nunmal lang sind und nicht mehr aufgegliedert werden können. Access ist dann dann vielleicht nicht das richtige System.

Vielen Dank für Eure Hilfe!
Jürgen
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 923
Re: SQL in VBA schneidet String ab
« Antwort #12 am: Januar 16, 2018, 11:52:44 »
Zitat
die Daten ... werden dann erst für die Gesamtausgabe des Titels über mehrere Abfragen zusammengestellt
In diesem Prozess können auch Reserven + Probleme liegen. Statt einen Ablauf als gegeben hinzunehmen könnte man ihn auch auf den Prüfstand stellen.

Zitat
bei manchen Einsatzzwecken lassen sich Memofelder bzw. Felder mit langen Texten nicht umgehen
Das steht außer Frage. Aber man muss nicht zwingend lange Texte in Abfragen hin- und herschieben, schon weil das mal Datenmasse ist. Das Hin- und Herschieben kann man regelmäßig über eine entsprechende ID erledigen, und den Text holt man sich dann zur Anzeige nach den Verarbeitungen.

Zur Kritik an der Entwicklungsumgebung darf man auch immer etwas Selbstkritik hinzufügen.
Mit freundlichem Glück Auf!

Eberhard
 

Offline Frithjiof

  • Access-User
  • *
  • Beiträge: 74
Re: SQL in VBA schneidet String ab
« Antwort #13 am: Januar 16, 2018, 12:58:37 »
Hallo Jürgen,
In der Abfrage funktioniert das auch problemlos und die Anzeige in einem UFO, das auf der Abfrage basiert, auch.

Eben, das ist im Normalfall kein Problem

Ich wollte es bloß anders machen, weil ich beim Öffnen anderer Formulare im ganzen ein Problem mit zuviel aktiven Recordsets hatte.

Ja und da stellt sich die Frage, was genau machst du anders.
Hier im Forum kann dir nur geholfen werden, wenn wir sehen können was du machst.

Leere Zeichen sind sicherlich nicht enthalten. Das habe ich geprüft.

Was willst du damit sagen? Leere Zeichen = Leerzeichen? sind auch in Access erlaubt.

Ich denke, es ist wirklich der Bug von Microsoft.
Abgesehen davon, dass es sich m.E. nicht um ein Bug handelt, sondern um einen Schutz, scheint es nicht zu stimmen, denn DF6GL hat oben festgestellt, dass der fragwürdige String mehr als 255 Zeichen enthält.

Ich hatte es spaßhalber mal probiert das Feld "Titel" in der Abfrage mit Left() und Right() zusammenzusfassen. Das klapplt bei langen Titeln bei Left(); bei Right() bringt er einem scheinbar zufällige Zeichen irgendwo aus dem String (zumindest konnte ich keine Systematik erkennen).

Die Funktionen Left() und Right()  geben ganz "systematisch" die Anzahl Zeichen zurück, die angefordert werden.
right(titel,4) gibt die 4 rechten Zeichen des Strings Titel zurück
left(titel,4) gibt die 4 linken Zeichen des Strings Titel zurück
mid(titel,2,4)  gibt die 4 Zeichen ab Position 2 des Strings Titel zurück
Nix mit voodoo ;)

Ganz generell: bei manchen Einsatzzwecken lassen sich Memofelder bzw. Felder mit langen Texten nicht umgehen. Jedes CMS ist eine Datenbank und hat Felder mit langen Texten, weil manchen Texte nunmal lang sind und nicht mehr aufgegliedert werden können. Access ist dann dann vielleicht nicht das richtige System.

Access hat kein Problem mit Memofeldern. Nur der Umgang mit ihnen ist etwas anders als mit anderen Feldern.
Nehmen wir an in einer DB existieren 100.000 Berichte=Memofelder mit jeweils ca. 3.000 Zeichen.
Um letzteres Feld zu gruppieren, also alle doppelten Berichte zusammenzufassen, müssten im schlimmsten Fall ca. 5  Mrd. mal  3.000 Zeichen miteinander verglichen werden. Da sind dann selbst moderne Rechner etwas beschäftigt.

Also: Wenn es notwendig sein sollte Felder zu Strings zu verknüpfen, macht man das am Besten am Ende der multiplen Aktionen.
Abfragen sollten so gestaltet werden, dass arbeitsaufwendige, also zeitaufwendige Operationen nur mit den Daten durchgeführt werden auf die es letztlich ankommt.  Es ist unökonomisch alle „Titel“ von allen Herausgebern oder Autoren zusammenzusetzten, um am Ende nach „Günter Grass“, oder Jahrgang 2010 zu filtern.

Frithjof