For the full screen representation of some screens in CATT, a dump is generated with ASSIGN LENGTH NEGATIVE.
Cause and prerequisitesThis always occurs for screens with variable step loops and the following fields.
SolutionChange to the FORM routine FORM BLOW_LOOP in the include file MSCATF50 from line 19810. The function body must be completely replaced (up to line 20230).
Then insert the following program code:
FORM BLOW_LOOP.
DATA LOOPLINE LIKE IMPORT_F-LINE.
DATA NEWLINES TYPE I.
DATA NEWLREP TYPE I.
DATA REST TYPE I.
DATA RAHMEN_BOT TYPE I.
DATA LAST_USED_LINE TYPE I.
DATA BINPT_LINES TYPE I VALUE 22.
CHECK NOT IMPORT_H-VALP IS INITIAL.
DESCRIBE TABLE IMPORT_F LINES SY-TABIX.
* letzter Eintrag ist OKCODE mit line FF, also vorletzten Eintrag lese
SY-TABIX = SY-TABIX - 1.
READ TABLE IMPORT_F INDEX SY-TABIX.
* groesste Zeilennummer >= binpt_lines --> kein Platz
CHECK IMPORT_F-LINE < BINPT_LINES.
* Es ist vielleicht noch Platz auf dem Dynpro
IF IMPORT_F-LTYP = 'L'.
* Letzte Zeile ist ein Loop
NEWLINES = BINPT_LINES - ( IMPORT_F-LINE +
( IMPORT_F-LREP * IMPORT_F-LBLK ) - 1 )
ELSEIF IMPORT_F-FILL = 'R'
OR IMPORT_F-FILL = 'B'
OR IMPORT_F-FILL = 'T'.
* Letzte Zeile ist ein Block oder Rahmen oder TableControl
NEWLINES = BINPT_LINES - ( IMPORT_F-LINE + IMPORT_F-DIDX - 1 ).
ELSE.
NEWLINES = BINPT_LINES - IMPORT_F-LINE.
ENDIF.
* Anzahl der freien Zeilen bestimmt
CHECK NEWLINES > 0.
LAST_USED_LINE = BINPT_LINES - NEWLINES.
* Rahmenlinien am unteren Bildrand?
SORT IMPORT_F DESCENDING BY LINE COLN ASCENDING.
LOOP AT IMPORT_F
WHERE FILL = 'R'.
RAHMEN_BOT = IMPORT_F-LINE + IMPORT_F-DIDX - 1.
IF RAHMEN_BOT > LAST_USED_LINE.
NEWLINES = BINPT_LINES - RAHMEN_BOT.
LAST_USED_LINE = BINPT_LINES - NEWLINES.
ENDIF.
ENDLOOP.
SORT IMPORT_F ASCENDING BY LINE COLN.
* Loop kann vergroessert werden
* die kennung fuer den variablen Loop steht in lanf
LOOP AT IMPORT_F
WHERE LANF = IMPORT_H-VALP.
* Newlines kleiner Blockgroesse -> kein Vergroessern moeglich
IF NEWLINES < IMPORT_F-LBLK.
NEWLINES = 0.
LOOPLINE = 255.
EXIT.
ENDIF.
IF LOOPLINE = 0.
* alte Endezeile merken fuer die Verschiebung der nachfolgenden Felder
LOOPLINE = IMPORT_F-LINE + ( IMPORT_F-LREP * IMPORT_F-LBLK ).
IF IMPORT_F-LBLK > 1.
* fuer blockgreossen ungleich 1 die passende vergroesserung berechnen
REST = NEWLINES MOD IMPORT_F-LBLK.
SUBTRACT REST FROM NEWLINES.
NEWLREP = NEWLINES DIV IMPORT_F-LBLK.
ELSE.
NEWLREP = NEWLINES.
ENDIF.
ENDIF.
* loop vergroessern
ADD NEWLREP TO IMPORT_F-LREP.
MODIFY IMPORT_F.
ENDLOOP.
* alle nachfolgenden felder verschieben
LOOP AT IMPORT_F
WHERE LINE >= LOOPLINE
AND LANF <> IMPORT_H-VALP
AND LTYP <> 'O'.
ADD NEWLINES TO IMPORT_F-LINE.
MODIFY IMPORT_F.
ENDLOOP.
* Rahmen vergroessern
LOOP AT IMPORT_F
WHERE FILL = 'R'
AND LINE < LOOPLINE.
RAHMEN_BOT = IMPORT_F-LINE + IMPORT_F-DIDX - 1.
CHECK RAHMEN_BOT >= LOOPLINE.
ADD NEWLINES TO IMPORT_F-DIDX .
MODIFY IMPORT_F.
ENDLOOP.
ENDFORM. "BLOW_LOOP
No comments:
Post a Comment