[gelöst] Textfeld über 250 Zeichen?

22. September 2006 10:45

Hi,

ich bin noch nicht lange im Navision Umfeld tätig und steh grad vor folgendem kleinen Problemchen.
Beim Import einer Datei habe ich ein Beschreibungsfeld.
Dieses Feld ist auf 5000 Zeichen begrenzt. Wenn jetzt jemand wirklich fleißig am schreiben ist und im Beschreibungsfeld über die 250 Zeichen hinaus schreibt, knallts. :roll:
Gut ich kann den Text abschneiden, aber das ist ja eine unschöne Lösung.

Wie löst ihr das?
:?:
Zuletzt geändert von ESChris am 22. September 2006 11:16, insgesamt 1-mal geändert.

22. September 2006 10:53

Es ist leider so, dass die maximale Feldlänge für Textfelder in Navision 250 Zeichen beträgt. Memofelder kennt Navision (noch) nicht. Textvariablen können maximal 1024 Zeichen gross sein.

In deinem Fall bleibt nichts anderes übrig, als entweder den Text abzuschneiden, oder ihn in Portionen aufzuteilen und z.B. in eine Tabelle wie die Bemerkungen auf den Kontakten abzufüllen. Dort kann pro Record ein Text mit einer Länger von 80 Zeichen gespeichert werden (also 5000 / 80 = 63 Records)

22. September 2006 10:57

Hmmm,...
irgendwie schade, ...

Ist ja mit der Kirche ums Dorf!!!
Schon komisch, dass so eine Software auf 250 Zeichen begrenzt ist.
Wie kommts eigentlich dazu?
Gibts demnächst oder in der 5.0-Version eine Lösung?

@rotsch: Vielen Dank für deine schnelle Antwort!!!

Gruß
Chris

22. September 2006 11:05

Ich denke, diie 250 Zeichen sind eine Beschränkung der nativen DB. SQL kennt so was ja nicht. Und die SQL-Anbindung ist noch nicht so optimal wie sie das sein sollte/könnte.

Ob Version 5.0 das besser macht, weiss ich nicht. Ich denke jedoch nicht. Aber in einer späteren Version (6.0, 7.0?) wird diese Grenze sicher einmal fallen.

22. September 2006 21:19

Du könntest natürlich ein BLOB-Feld verwenden, um die Daten zu speichern. Ist aber mit Navision Mitteln nicht darzustellen, da brauchts dann spezielle Textfeld Tools, die ein OCX einbauen, in Mibuso.com gibts einige davon zum download, ich habe aber gerade keinen Link zur Hand....

27. September 2006 14:05

Eine etwas umständliche Lösung habe ich irgendwann mal programmiert.
Und zwar eine Anwendung wo ArtikelNr, und Beschreibungstext gepflegt werden (Manuell) , die Texte in Überlaenge werden zusammen mit der ArtikelNr in eine Textdatei geschrieben, diese Textdatei importiere ich mittels einen Dataport, und breche dementsprechend um so das der Text auf etliche Bemerkungszeilen des Artikels aufgeteilt werden. Keine Lösung aber vielleicht ein Denkanstoß :)

27. September 2006 19:43

@elTorito
genau diese Funktion hab ich auch gebaut, um mit XML die Artikelstammdaten aus BS oder Exact Pro zu importieren, wo es Notizfelder mit 64KB Größe gibt.
Die Funktion spaltet die Texte selbständig am letztmöglichen Leerzeichen vor der 80 bzw 50-Zeichen-Grenze je nach dem, ob es der Artikeltext oder die Artikelbemerkungen waren.
Wenn in den 80 Zeichen kein Leerzeichen ist, bricht er an Ort und Stelle notfalls mitten im Wort um und protokolliert den Artikel im Importfehlerprotokoll.

Wenn interesse an dieser Funktion besteht, suche ich sie mal raus und poste sie hier

27. September 2006 20:24

Ich habe solch eine Funktion auch mal geschrieben, jedoch finde ich die Sourcen nicht mehr.
Sicherlich dürften hier zahlreiche Besucher Interesse an dieser Funktion haben.

28. September 2006 02:08

Ok, hier nun die Funktion ParseNote(Sourcetext : BigText;DestTable : 'Artikel-Notiz, Textbausteinzeile')
Code:
Fehlermerker:=FALSE;
i:=1;
CASE DestTable OF
  0:   ZeilenLänge:=80;        //Bemerkungen (Artikelnotiz)
  1:   ZeilenLänge:=50;      //Textbaustein (Artikellangtext)
END;

WHILE i < Sourcetext.LENGTH DO BEGIN
  Position:=i;
  IF Sourcetext.GETSUBTEXT(extractedText,Position ,ZeilenLänge) >0 THEN BEGIN
    IF PADSTR(extractedText,1)='[' THEN BEGIN
      i:=STRPOS(extractedText,']');
      extractedText:=PADSTR(extractedText,i);
    END ELSE BEGIN;
      testzahl:=0;
      WHILE (testzahl <> 255) AND (testzahl <> 10)
        AND (Position+ZeilenLänge>i) AND ( i <= Sourcetext.LENGTH) DO BEGIN
        i:=i+1;
        Sourcetext.GETSUBTEXT(Testtext,i,1);
        testchar:=Testtext[1];
        testzahl:=testchar;
      END;
      IF i = Position + ZeilenLänge THEN BEGIN
        IF Sourcetext.GETSUBTEXT(Testtext,i,1) >0 THEN BEGIN
          WHILE (Testtext <> ' ') AND (Position<i) DO BEGIN
            i:=i-1;
            Sourcetext.GETSUBTEXT(Testtext,i,1);
          END;
          IF i<= Position THEN BEGIN
            i:=Position+ZeilenLänge-1;

            IF NOT Fehlermerker THEN BEGIN
              write2file('Die '+FORMAT(DestTable)+' konnte nicht sauber vor '
                         + FORMAT(ZeilenLänge) + ' Zeichen getrennt werden.');
              write2file('Bitte bearbeiten Sie die ' + FORMAT(DestTable) + ' nach dem Import.');
            END;
            Fehlermerker:=TRUE;
          END;
        END;
      END;
      Sourcetext.GETSUBTEXT(extractedText,Position,i-Position);
      i:=i+1;
    END;
    InsertNote(extractedText,DestTable)
  END;
END;

Sourcetext ist der zu parsende Text, der in eine BigText-Variable eingelesen wurde, Desttable bestimmt ob es Notiz oder Autotext ist.
die lokalen Variablen:
Code:
Name          DataType  Length
Position      Integer      
i             Integer      
extractedText Text       80
Testtext      Text       10
Fehlermerker  Boolean      
ZeilenLänge   Integer      
testchar      Char      
testzahl      Integer

Testzahl prüft den Text auf Chr(10) (LF) bzw chr(255) (Zeichen ohne Inhalt, entspricht Shift-Leertaste, als Dummy im XML-String, weil dort Linefeeds ausgefiltert werden), um einen festen Zeilenumbruch im Text zu berücksichtigen.
Write2file() ist eine Funktion, die den übergebenen Text als Zeile an eine Textdatei (das Fehlerprotokoll) anhängt. Durch die Variable Fehlermerker wird verhindert, dass während eines Parse-Vorgangs mehr als eine Fehlermeldung erzeugt wird.
Das schreiben der extrahierten Textzeilen übernimmt die Funktion InsertNote(TextValue : Text[80];DestTable : 'Note,Autotext')
Code:
IF DELCHR(TextValue,'>',' ')=''THEN EXIT;                 //keine Leerzeilen hinzufügen

    CASE DestTable OF
      0:
        WITH ItemNote DO BEGIN
          INIT;
          "Table Name":=3;
          "No.":="Import-Item-No.";
          Comment:=TextValue;
          CommentLine.SETRANGE("Table Name","Table Name");
          CommentLine.SETRANGE("No.","No.");
          CommentLine.SETRANGE(Date,WORKDATE);
          IF NOT CommentLine.FIND('-') THEN BEGIN
            Date := WORKDATE;
            "Line No.":= 10000;
          END ELSE BEGIN
            CommentLine.SETRANGE(Date);
            IF CommentLine.FIND('+') THEN
              "Line No.":=CommentLine."Line No." +10000;
          END;
          INSERT;
        END;

      1:
        BEGIN
          LangCode:='';
          TextNo:=1;
          ETHeader2.RESET;
          ETHeader2.SETRANGE("Table Name",2);
          ETHeader2.SETRANGE("No.","Import-Item-No.");
          ETHeader2.SETRANGE("Text No.",TextNo);
          ETHeader2.SETRANGE("Language Code",LangCode);
          IF NOT ETHeader2.FIND('-') THEN BEGIN
            ETHeader.INIT;
            ETHeader."Table Name":=2;
            ETHeader."No.":="Import-Item-No.";
            ETHeader."Language Code":=LangCode;
            ETHeader."Text No.":=TextNo;
            ETHeader.INSERT;
          END;

          WITH ExtratextLine DO BEGIN
            INIT;

            "Table Name":=2;
            "No.":="Import-Item-No.";
            "Language Code":=LangCode;
            "Text No.":=TextNo;
            Text:=TextValue;
            ETLine.SETRANGE("Table Name","Table Name");
            ETLine.SETRANGE("No.","No.");
            ETLine.SETRANGE("Language Code",LangCode);
            ETLine.SETRANGE("Text No.",TextNo);
            IF NOT ETLine.FIND('+') THEN
              "Line No.":= 10000
            ELSE
              "Line No.":=ETLine."Line No." +10000;
            INSERT;
          END;
       END;
    END;


die lokalen Variablen dazu:
Code:
Name          DataType Subtype
ItemNote      Record   Comment Line   
CommentLine   Record   Comment Line   
ETHeader      Record   Extended Text Header   
ETHeader2     Record   Extended Text Header   
ExtratextLine Record   Extended Text Line   
ETLine        Record   Extended Text Line   


Die globale Variable "Import-Item-No." beinhaltet die Artikelnummer des gerade bearbeiteten Artikels.

So, nun ist es zwar ein halber Roman geworden, aber vielleicht hilft es ja jemandem ...
Wahrscheinlich kann man die Funktionen auch noch optimieren, aber so funktioniert es auf jeden Fall. Geschrieben hatte ich die Funktionen vor fast einem Jahr, als ich gerade erst 2 Monate Erfahrung mit Navision überhaupt hatte ;-)

28. September 2006 17:17

Wow, sachen gibts :)

bei mir sind es inzwischen ca. 4 Wochen Erfahrung ;)

Danke!!!