13.10.11

SAP Note 28422 - Dump ASSIGN LENGTH NEGATIVE for display loop screen

Symptom:

For the full screen representation of some screens in CATT, a dump is generated with ASSIGN LENGTH NEGATIVE.

Cause and prerequisites

This always occurs for screens with variable step loops and the following fields.

Solution
Change 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