[Gelöst] Zeilenumbruch -> mit neuen Zeilen im Record

13. August 2008 15:26

Hallo die Damen und Herren,

ich brauche mal etwas Hilfe beim Programmieren von Zeilenumbrüchen im Lieferschein.
Und zwar habe ich mir dies wie folgt gedacht. Ich habe ein Stück Code geschrieben welches, wenn ein Feld eine bestimmte Länge hat, eine neue Zeile geschrieben wird.
Der Code funktioniert auch so wie er soll. Aber leider schreibt er die neuen Zeilen auch in die Tabellen zurück, wo ich einen Fehler bekomme das ich dies nicht darf "Sie haben nicht die Berechtigung in die Tabelle "Sales Shipment Line" zu schreiben."(Lizenz).

Ich habe den Code in den Trigger AfterGetRecord das "Sales Shipment Line" geschrieben:
Code:
REPEAT

INTCount := 1;
INTLängebisZeichenumbruch:=40;
INTPositiondesAnfang:=1;
TXTTabellenFeld:="Sales Shipment Line".Description;

IF STRLEN(TXTTabellenFeld) > INTLängebisZeichenumbruch THEN
  BEGIN

    REPEAT
    INTPositiondesAnfang := INTPositiondesAnfang + INTLängebisZeichenumbruch;
    TXTRestString:=COPYSTR(TXTTabellenFeld,INTPositiondesAnfang,INTLängebisZeichenumbruch);
 
      "Sales Shipment Line".INIT;
      "Sales Shipment Line"."Document No." := "Sales Shipment Line"."Document No.";
      "Sales Shipment Line"."Line No.":="Sales Shipment Line"."Line No." + INTCount;
      "Sales Shipment Line".Description:=TXTRestString;
      "Sales Shipment Line".INSERT;

      INTCount := INTCount + 1;

    INTLaengeRestString:=  STRLEN(TXTRestString);
    UNTIL INTLaengeRestString < INTLängebisZeichenumbruch
  END;

UNTIL "Sales Shipment Line".NEXT = 0;


Wie kann ich den Report so programmieren, dass er nur temporär die Daten hält und nichts in die Tabelle schreibt???
Für Hilfe und Anregungen wäre ich sehr dankbar.

MfG Marco
Zuletzt geändert von Marco.Zimmermann am 15. August 2008 09:16, insgesamt 1-mal geändert.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

13. August 2008 16:01

Marco.Zimmermann hat geschrieben:Wie kann ich den Report so programmieren, dass er nur temporär die Daten hält und nichts in die Tabelle schreibt???

Verwende kein DataItem, sondern eine Recordvariable und gebe ihr die Eigenschaft Temporary = Yes.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 08:48

Vielen Dank für die schnelle Antwort.

Leider beschäftige ich mich erst seit dem 01.07.08 mit Navision. Ich wollte daher in dem erstellten Report nicht so viel verändern.

Die Struktur des Reports sieht wie folgt aus.
Code:
Sales Shipment Header   <Sales Shipment Header>
  Integer                           CopyLoop
    Integer                           PageLoop
      Integer                       DimensionLoop1
      Sales Shipment Line   <Sales Shipment Line>
        Integer                   DimensionLoop2
      Integer                   Total
      Integer                   Total2


Kann man da mit Kopieren des Records nicht etwas machen oder muss ich den gesammen Report neu aufbauen???
Wenn Neuaufbau??, dann bräuchte ich bestimmt Hilfe....

Cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 09:33

Was ist jetzt dein Ziel?
Du möchtest du sozusagen eigene Sales Shipment Lines basteln und diese (statt echten Sales Shipment Lines) andrucken, richtig?

Folgende Schritte wären notwendig:
1. Ersetze in deinem veröffentlichten Quelltext "Sales Shipment Line" durch die vorher beschriebene temporäre Variable. In meinem Beispiel hier heißt sie TempRec

2. Ersezze DataItem "Sales Shipment Line" durch DataItem Integer. Dieses DataItem ist zuständig für den Durchlauf der temporären Variablen.
Eigenschaft DataItemTableView:
Code:
SORTING(Number) WHERE(Number=FILTER(1..))

Trigger OnAfterGetRecord:
Code:
IF Number = 1 THEN BEGIN
  IF NOT TempRec.FIND('-') THEN
    CurrReport.BREAK;
END ELSE
  IF TempRec.NEXT = 0 THEN
    CurrReport.BREAK;

3. In der dazu gehörigen Section kannst du die Texboxes, die da schon drin waren, auch drin lassen. Nur muss die SourceExpr um TempRec. vor dem Feldnamen ergänzt werden.

Wenn du das in Zukunft brauchen solltest, schau es dir aus dem Integer-DataItem des Reports 111 ab.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 10:38

Ja hier der ICH nochmal.

Danke erstmal ich denke wir sind da auf einen guten Weg zur Lösung meines Problemes.

Ich "denke" ich habe alles gemacht was du gesagt hast. Nur der Report steigt jedes mal an dieser Stelle aus???

Code:
IF Number = 1 THEN BEGIN
  IF NOT RecTempSalesShipmentLine.FIND('-') THEN
    CurrReport.BREAK;             <-------------Stelle wo er aussteigt!!!!!
END ELSE
  IF RecTempSalesShipmentLine.NEXT = 0 THEN
    CurrReport.BREAK;


Und die Report-Zeilen werden nicht mit gedruckt.

Kannst du mit mir da bitte nochmal helfen????? :-( :-(

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 11:35

Hast du in deinem ersten Quelltext ganz oben auch "Sales Shipment Line" ausgetauscht durch RecTempSalesShipmentLine?

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 12:05

Ja habe ich!!!

Mein OnAfterGetRecord im Neuen DataItem <Integer> früher "Sales Shipment Line" sieht wie folgt aus

Code:
IF Number = 1 THEN BEGIN
  IF NOT RecTempSalesShipmentLine.FIND('-') THEN
    CurrReport.BREAK;
END ELSE
  IF RecTempSalesShipmentLine.NEXT = 0 THEN
    CurrReport.BREAK;

IF NOT ShowCorrectionLines AND RecTempSalesShipmentLine.Correction THEN
  CurrReport.SKIP;

PostedDocDim2.SETRANGE("Table ID",DATABASE::"Sales Shipment Line");
PostedDocDim2.SETRANGE("Document No.",RecTempSalesShipmentLine."Document No.");
PostedDocDim2.SETRANGE("Line No.",RecTempSalesShipmentLine."Line No.");

RecTempSalesShipmentLine.SETRANGE("Document No.",RecTempSalesShipmentLine."Document No.");
RecTempSalesShipmentLine.FIND('-');
REPEAT

INTCount := 1;
INTLängebisZeichenumbruch:=29;
INTPositiondesAnfang:=1;
TXTTabellenFeld:=RecTempSalesShipmentLine.Description;

IF STRLEN(TXTTabellenFeld) > INTLängebisZeichenumbruch THEN
  BEGIN

    REPEAT
    INTPositiondesAnfang := INTPositiondesAnfang + INTLängebisZeichenumbruch;
    TXTRestString:=COPYSTR(TXTTabellenFeld,INTPositiondesAnfang,INTLängebisZeichenumbruch);
 
      RecTempSalesShipmentLine.INIT;
      RecTempSalesShipmentLine."Document No." := RecTempSalesShipmentLine."Document No.";
      RecTempSalesShipmentLine."Line No.":=RecTempSalesShipmentLine."Line No." + INTCount;
      RecTempSalesShipmentLine.Description:=TXTRestString;
      RecTempSalesShipmentLine.INSERT;

      INTCount := INTCount + 1;

    INTLaengeRestString:=  STRLEN(TXTRestString);
    UNTIL INTLaengeRestString < INTLängebisZeichenumbruch
  END;

UNTIL RecTempSalesShipmentLine.NEXT = 0;


Ich habe die Zeilen mal auskommentiert. Da bringt er die Fehlermeldung, dass sich keine Zeilen in dem Record Verkaufslieferzeilen befinden????
Kann dass das Problem sein??

Dem Record sind doch in den Globalen Variablen die Tabelle 111-Sales Shipment Line zugeordnet. ODER??

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 12:11

Marco.Zimmermann hat geschrieben:Mein OnAfterGetRecord im Neuen DataItem <Integer> früher "Sales Shipment Line" sieht wie folgt aus


Nein, den meine ich nicht. Ich meine deinen Quelltext in deinem Startbeitrag!

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 12:35

Wenn du die SalesShipmentLines durch Integer ersetzt hast (die SalesShipmentLines also nicht durchlaufen werden), ist schon klar, dass er immer abbricht, weil ja nichts drinsteht.

Problematisch ist evtl. noch folgende Zeile:
IF NOT ShowCorrectionLines AND RecTempSalesShipmentLine.Correction THEN


Meinst du hier if ((not Show..)and recTemp..)then ..
oder
If not(Show.. and RecTemp..)then?

Interpretiert wird´s nämlich als Fall 1.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 12:55

An Natalie:

Meine selbstgeschriebenen Zeilen stehen dann weiter unten im OnAfterGetRecord. Aber so weit kommt der ja gar nicht.


An McClane:

Die Zeile habe ich gar nicht geschrieben die ist Standard im Lieferschein. Weiß auch nicht für was die da ist? :?:

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 13:20

Dann wird die Zeile wohl stimmen :)

Aber nochmal zu meinem letzten Posting: du füllst deine temporären Zeilen, bevor du zu dem DataItem Integer kommst?

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 14:20

Danke für die Hilfe McClane!!!!

Die Daten werden doch über die Angabe in den Globalen Variablen gefüllt???? Oder nicht

Wenn nicht: Wie kann ich dies tun??

Bin halt noch in den Kinderschuhen vom Programmieren.... :cry:

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 14:40

Marco.Zimmermann hat geschrieben:Die Daten werden doch über die Angabe in den Globalen Variablen gefüllt???? Oder nicht

Ganz egal, in was für einer Sprache du programmierst: Wenn du eine Variable anlegst, reserviert das Programm nur Platz. Füllen musst du diesen Platz schon selber. Und genau das fand in diesem Quelltext schon statt, nur da noch mit falscher Variable:

Code:
"Sales Shipment Line".INIT;
"Sales Shipment Line"."Document No." := "Sales Shipment Line"."Document No.";
"Sales Shipment Line"."Line No.":="Sales Shipment Line"."Line No." + INTCount;
"Sales Shipment Line".Description:=TXTRestString;
"Sales Shipment Line".INSERT;


Und was mein Vorredner schon richtig sagte: Diese Befüllung muss natürlich vor der Abfrage statt finden. Deine Abfrage findet in deinem neuen DataItem Integer statt. Also muss die Befüllung davor statt finden (z.B. OnPreReport, oder auch in einem der früheren DataItems).

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 14:51

Die Varibalen habe ich doch schon geändert. Siehe Beitrag 9 wenn du nach unten Scrollst.
Außerdem kommt es doch garnicht an den Punkt weil der Record vor noch leer ist.
Ich dachte der Record wird gefüllt, wenn ich ihn in den Globalen Variablen anlege. Oder???

Ich habe das Stück:

Code:
IF Number = 1 THEN BEGIN
  IF NOT RecTempSalesShipmentLine.FIND('-') THEN
    CurrReport.BREAK;
END ELSE
  IF RecTempSalesShipmentLine.NEXT = 0 THEN
    CurrReport.BREAK;


mal auskommentiert und da kam der Fehler das die Verkaufslieferzeilen leer sind. Das Stück Code sagt doch nur aus wenn kein Datensatz zu finden ist, dann breche den Trigger ab.

Ich hoffe ich habe mich mit meinem "Wissen" nicht ganz plammiert, weil es total falsch ist.

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 15:04

Deine Temptabelle musst du schon füllen :) So, wie Natalie das beschrieben hat.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 15:39

So also jetzt stehe ich auf dem Schlauch.... :?: Ich weiß net was ihr da meint :?:

Also ich erläutere nochmal was ich getan habe.

1.Schritt:
Standard Lieferschein-> Report 208 kopiert in Report 50047

2.Schritt:
Ändern des DataItem "Sales Shipment Line" in Integer mit der Eigenschaft: DataItemTableView->SORTING(Number) WHERE(Number=FILTER(1..))

3.Schritt:
Anlegen der Globalen Variable -->> Mit Eigenschaft Temporary:YES
Name: "RecTempSalesShipmentLine"
Type: "Record"
Subtype: "111 -> Sales Shipment Line"

4.Schritt:
Einfügen des Quellcodes von Natalie in den Trigger OnAfterGetRecord des neuen DataItem (früher: "Sales Shipment Line")
Code:

IF Number = 1 THEN BEGIN
  IF NOT RecTempSalesShipmentLine.FIND('-') THEN
    CurrReport.BREAK;
END ELSE
  IF RecTempSalesShipmentLine.NEXT = 0 THEN
    CurrReport.BREAK;


5.Schritt:
Einfügen meines Quellcodes in den Trigger OnPreDataItem des neuen DataItem (früher: "Sales Shipment Line")
Code:

RecTempSalesShipmentLine.SETRANGE("Document No.","Sales Shipment Header"."No.");
RecTempSalesShipmentLine.FIND('-');
REPEAT

INTCount := 1;
INTLängebisZeichenumbruch:=29;
INTPositiondesAnfang:=1;
TXTTabellenFeld:=RecTempSalesShipmentLine.Description;

IF STRLEN(TXTTabellenFeld) > INTLängebisZeichenumbruch THEN
  BEGIN

    REPEAT
    INTPositiondesAnfang := INTPositiondesAnfang + INTLängebisZeichenumbruch;
    TXTRestString:=COPYSTR(TXTTabellenFeld,INTPositiondesAnfang,INTLängebisZeichenumbruch);
 
      RecTempSalesShipmentLine.INIT;
      RecTempSalesShipmentLine."Document No." := RecTempSalesShipmentLine."Document No.";
      RecTempSalesShipmentLine."Line No.":=RecTempSalesShipmentLine."Line No." + INTCount;
      RecTempSalesShipmentLine.Description:=TXTRestString;
      RecTempSalesShipmentLine.INSERT;

      INTCount := INTCount + 1;

    INTLaengeRestString:=  STRLEN(TXTRestString);
    UNTIL INTLaengeRestString < INTLängebisZeichenumbruch
  END;

UNTIL RecTempSalesShipmentLine.NEXT = 0;


6. Schritt
Umschreiben aller Felder in der Selection mit SourceExp.: RecTempSalesShipmentLine. ...

Fertig!!! -->> Fehlermeldung: Keine Verkaufslieferzeilen innerhalb des Filters gefunden. Filter Belegnr.: VL7....... (Belegnummer aus dem Kopf)

Ich bin da jetzt mit meinem Latein am Ende!!! Wo liegt der Fehler bei mir???? :cry:

cu Marco

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 15:54

Marco.Zimmermann hat geschrieben:Ich bin da jetzt mit meinem Latein am Ende!!! Wo liegt der Fehler bei mir???? :cry:

Dass wir alle zu kompliziert gedacht haben und ich mangels Zeit deine Anforderung nicht gelesen habe.

Also zurück zu deiner Anforderung.
Kehren wir zum Originalbericht 208 zurück.
Das Einzige, was du möchtest, ist unter jede Zeile von "Sales Shipment Line" eine zweite zu setzen, falls das Feld Description eine Länge überschreitet.

Das würde ich so lösen:

  1. Lege eine neue globaleVariable (Boolean) namens z.B. TextZuLang ein.
  2. Im DataItem "Sales Shipment Line", OnAfterGetRecord schreibst du dieses:
    Code:
    ...
    TextZuLang = STRLEN(TXTTabellenFeld) > INTLängebisZeichenumbruch;
    ...
    - statt
    Code:
     REPEAT
        INTPositiondesAnfang := INTPositiondesAnfang + INTLängebisZeichenumbruch;
        TXTRestString:=COPYSTR(TXTTabellenFeld,INTPositiondesAnfang,INTLängebisZeichenumbruch);

          "Sales Shipment Line".INIT;
          "Sales Shipment Line"."Document No." := "Sales Shipment Line"."Document No.";
          "Sales Shipment Line"."Line No.":="Sales Shipment Line"."Line No." + INTCount;
          "Sales Shipment Line".Description:=TXTRestString;
          "Sales Shipment Line".INSERT;

          INTCount := INTCount + 1;

        INTLaengeRestString:=  STRLEN(TXTRestString);
        UNTIL INTLaengeRestString < INTLängebisZeichenumbruch

  3. Füge unterhalb von "Sales Shipment Line" ein neues DataItem Integer ein, welches eine Stufe weiter nach rechts alsl "Sales Shipment Line" eingerückt ist. DataItemTableView = SORTING(Number) WHERE(Number=CONST(1)).
    Schreibe in dort OnPreDataItem:
    Code:
    IF NOT TextZuLang THEN
      CurrReport.BREAK;

  4. Lass dir in der dazu gehörigen Body-Section die gewünschen Daten ausgeben.

Falls die Anforderung lautet: Beliebig viele Zeilen unterhalb, dann musst wieder mit einer temporären Recordvariable arbeiten.
Diese füllst du dann wie bisher im OnAfterGetRecord von "Sales Shipment Line". Lege aber auch hier ein eingerücktens DataItem Integer an mit DataItemTableView = SORTING(Number) WHERE(Number=FILTER(1..))
und dem vorgegebenen Quelltext im OnAfterGetRecord.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

14. August 2008 15:55

Tausch mal in Schritt 5
RecTempSalesShipmentLine.SETRANGE("Document No.","Sales Shipment Header"."No.");
RecTempSalesShipmentLine.FIND('-');
das RecTempSalesShipmentLine gegen eine neue Variable SalesShipmentLine, die nicht temporär ist. Darüber muss dann auch das repeat..until laufen. Damit liest du die Daten aus der Datenbank aus, modifizierst sie wie gewünscht, und schreibst sie in deine temporäre Tabelle.

Re: Zeilenumbruch -> mit neuen Zeilen im Record

15. August 2008 09:16

So Leute es ist vollbracht!!!! Ich habe FERTIG (Mit Hilfe von McClane und Natalie) <<-- GROSSEN DANK

Also ich habe eine neue Variable angelegt. RECSalesShipmentLine->Type: Record->Subtype: 111-"Sales Shipment Line" Eigenschaft:Temporary:No

Und mein Quellcode im OnPreDataItem sieht wie folgt aus.

Code:
RECSalesShipmentLine.SETRANGE("Document No.","Sales Shipment Header"."No.");
RECSalesShipmentLine.FIND('-');

RecTempSalesShipmentLine.COPY(RECSalesShipmentLine);

REPEAT

  INTCount := 1;
  INTLängebisZeichenumbruch:=30;
  INTPositiondesAnfang:=1;
  TXTTabellenFeld:=RECSalesShipmentLine.Description;

  IF STRLEN(TXTTabellenFeld) > INTLängebisZeichenumbruch THEN
    BEGIN

    RecTempSalesShipmentLine.INIT;
    RecTempSalesShipmentLine."Document No." :=RECSalesShipmentLine."Document No.";
    RecTempSalesShipmentLine."Line No.":=RECSalesShipmentLine."Line No.";
    RecTempSalesShipmentLine.Description:=
      COPYSTR(RECSalesShipmentLine.Description,INTPositiondesAnfang,INTLängebisZeichenumbruch);
    RecTempSalesShipmentLine.Quantity:=RECSalesShipmentLine.Quantity;
    RecTempSalesShipmentLine."Unit of Measure Code":=RECSalesShipmentLine."Unit of Measure Code";
    RecTempSalesShipmentLine.INSERT;
   
    REPEAT
   
      INTPositiondesAnfang := INTPositiondesAnfang + INTLängebisZeichenumbruch;
      TXTRestString:=COPYSTR(TXTTabellenFeld,INTPositiondesAnfang,INTLängebisZeichenumbruch);
   
      RecTempSalesShipmentLine.INIT;
      RecTempSalesShipmentLine."Document No." :=RECSalesShipmentLine."Document No.";
      RecTempSalesShipmentLine."Line No.":=RECSalesShipmentLine."Line No." + INTCount;
      RecTempSalesShipmentLine.Description:=TXTRestString;
      RecTempSalesShipmentLine.INSERT;

      INTCount := INTCount + 1;

      INTLaengeRestString:=  STRLEN(TXTRestString);
   
    UNTIL INTLaengeRestString < INTLängebisZeichenumbruch
   
    END
  ELSE
    BEGIN

    RecTempSalesShipmentLine.INIT;
    RecTempSalesShipmentLine."Document No." :=RECSalesShipmentLine."Document No.";
    RecTempSalesShipmentLine."Line No.":=RECSalesShipmentLine."Line No.";
    RecTempSalesShipmentLine.Description:=RECSalesShipmentLine.Description;
    RecTempSalesShipmentLine.Quantity:=RECSalesShipmentLine.Quantity;
    RecTempSalesShipmentLine."Unit of Measure Code":=RECSalesShipmentLine."Unit of Measure Code";
    RecTempSalesShipmentLine.INSERT;

    END;

UNTIL RECSalesShipmentLine.NEXT = 0;


Ich weiß da gibt es auch noch viel was man anders machen kann!!!! <<-- Ich ja noch Anfänger :-(

So dann nochmal Vielen Dank an die Beteiligten und ran an das nächste Problem!!!

cu Marco

Re: [Gelöst] Zeilenumbruch -> mit neuen Zeilen im Record

15. August 2008 10:35

Schöner wäre es bestimmt, wenn du das Textfeld nicht immer bei Erreichen der Maximallänge, sondern beim letzten Space davor trennst, und ein "If RecSalesShipmentLine.findset then" ..., damit es nicht in einen Fehler läuft, wenn keine Zeilen da sind.

Aber sonst mach dir keine Gedanken: so haben wir alle mal angefangen. Während meiner ersten sechs Wochen mit Nav war ich arg suizidgefährdet ;)