Text mehr als 1000 Zeichen

6. Mai 2008 12:51

Hallo liebes Forum,

ich habe da mal eine Frage.
Und zwar binde ich einer Codeunit ein COM Objekt ein, dass wiederum eine Funktion aufruft die einen Rückgabewert vom Typ String hat.

Ich habe leider das Problem, dass die maximale Größe 1000 vom Typ Text in NAV nicht ausreicht, um den Rückgabewert speichern zu können.

Gibt es für dieses Problem eine Lösung?

Ich bedanke mich im Vorfeld für die Mühen.

Gruß
Pierre

6. Mai 2008 13:10

Wenn ich das noch richtig in Erinnerung habe, dann sind nur 250 Zeichen erlaubt. Unabhängig davon würde ich empfehlen, von der Automation aus eine Funktion zur Rückgabe von Textteilen zu implementieren bzw. eine Wrapper Klasse zu schreiben, die eben das erledigt.

Möglich wäre auch, den Text in eine Datei zu schreiben und dann von NAV aus einzulesen (z.B. Blob).

6. Mai 2008 13:27

Oder eben die Zeichen gleich in ein Blob-Feld via Stream schreiben.
Ich habe so etwas in der Richtung auch schon mal gemacht.
Ich habe eine Funktion solange rekursiv aufgerufen, bis ich nichts mehr zurückbekommen habe.
Die inzwischen erhaltenen Strings habe ich in eine Big-Text Variable geschrieben und diese dann am Ende in ein Blob-Feld einer Tabelle gespeichert.

Nachteil ist jedoch, das du Blob-Felder nicht einfach in der Tabelle auslesen kannst, also wenn du mit Run eine Tabelle startest, sondern dort immer nur ein "*" siehst.

Gruß Schaarschi

6. Mai 2008 15:30

Vielen Dank für Eure antworten!

Hmm das ist natürlich alles nicht so ganz fein. Ich muss dem COM Objekt einen Parameter übergeben, der aus Navision kommt.

In 20 Fällen hat das mit dem Rückgabewert bestens geklappt :), aber jetzt habe ich eine Funktion, wo die Zeichen nicht ganz ausreichen. Naja ich versuch mal, ob ich die Funktion umgehen kann, bzw ob ich den Rückgabewert der Funktion kleiner gestalten kann.

6. Mai 2008 15:32

Das Problem hatte ich auch schon, habe eine Sicht erstellt mit einer Tabelle aus einer anderen Datenbank... und da gibts eben den SQL Typ Text.

Über konvertieren bekomme ich das angezeigt in Navision, aber es gibt absolut keinen Weg das abzuspeichern in meiner Navision Db geschweige denn in der fremdem DB dieses feld zu editieren... Naja Navision kann eben nicht alles (:-

6. Mai 2008 15:33

Was ich dir noch sagen kann ist, dass eine normale Textvariable bis 1024 Zeichen halten kann.
Es können jedoch nur 250 Zeichen in eine Tabelle gespeichert werden.
Das habe ich zumindest mal herausgefunden.
Somit könntest du zumindest deine 1000 Zeichen erst mal in einer Textvariable halten und sie dann weiterverarbeiten.

Schaarschi
Zuletzt geändert von Schaarschi am 6. Mai 2008 16:34, insgesamt 1-mal geändert.

6. Mai 2008 16:31

Ich muss kurz meine Aussage zu den 250 Zeichen bei COM revidieren. Hatte wohl irgendwelche wirren Zahlen im Kopf und da was verdummwechselt :)

9. Mai 2008 10:39

Hast Du es schon mit eine Variable vom Typ BigText versucht?

9. Mai 2008 10:42

@ Benjamin
Das Problem ist ja, das man eine BigText-Varaible nicht in eine Tabelle speichern kann, sondern das geht nur über ien Blob-Feld

Schöne Pfingsten an alle
Schaarschi

13. Mai 2008 20:52

Hallo Leute,

schau dir mal die Codeunit 397 Mail Funktion NewMessage an. Die Variable BSTRConverterBody könnte Dir weiterhelfen.

Schöne Grüße,
alterkaempfer

Re: Text mehr als 1000 Zeichen

13. August 2008 10:09

Hallo Pierre,

ich habe in der Codeunit die bei den Functions die lokale Variable mit Dimensions auf 20 eingestellt, sodaß ich insgesamt 20 * 1024 Zeichen Bodytext übergeben kann.

Anschließend habe ich den Abschnitt


Code:
IF Body <> '' THEN BEGIN
  BSTRConverterBody.ResetBSTR;
  BSTRConverterBody.AppendNextStringPortion(Body);
END;


auf:

Code:
REPEAT
  j+=1;
  IF Body[j] <> '' THEN BEGIN
    BSTRConverterBody.AppendNextStringPortion(Body[j]);
  END;
UNTIL j=20;


geändert.

Der Aufruf der Codeunit 397 erfolgt ebenfalls mit der dimensionierten Body-Variablen.

Schöne Grüße
Werner Proksch
Zuletzt geändert von Timo Lässer am 27. August 2008 09:24, insgesamt 1-mal geändert.
Grund: Programmcode in [code]-Tags gepackt

Re: Text mehr als 1000 Zeichen

13. August 2008 10:20

Hallo Pierre,

hast Du es mal mit einer Variable vom Typ Bigtext probiert?

BIGTEXT
Use this complex C/AL data type to handle large text documents.

This data type cannot be shown in a message window or be seen in the debugger.

The maximum length of a BigText variable is 2,147,483,647 characters and this corresponds to 2 GB.

Comments
You can use the BigText functions to manipulate a BigText variable, for example to extract part of a BigText variable or to add a text string to a BigText variable.

The normal string functions cannot be used with a BigText variable.

GETSUBTEXT
Use this function to retrieve part of a BigText variable


Gruß Tom

Re: Text mehr als 1000 Zeichen

27. August 2008 09:06

Hallo Zusammen,

sorry das ich mich erst jetzt wieder melde.
Ich habe sowohl die BigText Variante als auch den Weg über "BSTRConverterBody" versucht, doch leider hat das noch nicht so Recht hingehauen.

Nun was mich jetzt allerdings was stutzig macht ist, dass der Text(String) den ich vom COM Objekt in eine NAV Text Variable speichere doch nur eine Länge von 260 hat und nicht wie erwartet >1024. Dennoch erhalte ich die Meldung: "Die Länge des Textstrings überschreitet die Größe des Zeichenpuffers".

Die NAV Text Variable hat aber die max. Länge von 1024.

Was kann das noch sein?

Gruß
Pierre

Re: Text mehr als 1000 Zeichen

27. August 2008 09:33

PierreC82 hat geschrieben:"Die Länge des Textstrings überschreitet die Größe des Zeichenpuffers".

Die NAV Text Variable hat aber die max. Länge von 1024.

Was kann das noch sein?

Die Forensuche liefert zum Suchbegriff [search]Zeichenpuffer*[/search] 6 Beiträge aus 3 (+1) Themen. Vielleicht ist hier ja die Lösung versteckt.
Ansonsten fallen mir auf Anhieb nur noch folgende Ursache ein:
- Irgendein Funktionsparameter ist zu klein definiert

Re: Text mehr als 1000 Zeichen

5. September 2008 14:20

Hallo Timo,

danke für den Hinweis.

Ich habe mir jetzt überlegt, vom COM Objekt ein Array zurückgeben zu lassen.
Kann Navision ein Array von einem COM Objekt aufnehmen?

Das COM Objekt habe ich mit C# gebaut. Wie müsste in C# das Array aussehen?

Habe mir sowas in der Art vorgestellt.

Code:
string[] test;
            test = new string[20];
           

            test[1] = responseMap[0].ToString();
            test[2] = responseMap[1].ToString();
            test[3] = responseMap[2].ToString();
            return test


Hier gebe ich ein String[] test zurück den ich gern in NAV aufnehmen würde. Das hat so noch nicht geklappt.
Hat jemand noch eine Idee?

Danke Euch!!!
Gruß
Pierre