Tips and Tricks for the ABAP® Programming Language
Y9020027 – Relative Addressing of F fields / Problems (floating point)
- Partial association In this example, three N-fields are associated to a field symbol with “ASSIGN”. Each of the three N-fields is associated partially only to the same field symbol.
- Partial association In this example, the FFELD8 is used with different relative addressing. The offset is always divisible by 8, the field length is 8 bytes constantly. The following informations are somewhat difficult to integrate for “beginners”.
- Relative addressing of a F-field The same logic applies analogically as with the I-fields. Here, some elementary informations once more: Basically, it can be said that F-fields must be relatively addressed and be associated to a field symbol, except when using the same field length of the origin field as length and a multiple of the length as offset. This way, e.g. a field string with F-fields of equal length can be processed quite simple by a field symbol. The drawback: Uninvolved fields can e.g. be modified unintentionally by addressing errors. So, if an F-field is relatively addressed for an association to a field symbol, only other F-fields, being declared immediately after the origin field, should be addressed by this.
- Example 1 – Here, a relative addressing was chosen, that would cause a runtime error if being activated.
- Example 2 – FFELD8 is addressed with “FFELD8+8(8)” and associated to the field symbol . This way, the field FFELDX, following next in the declaration, is addressed however. So, with a modification of , FFELDX is modified. The declaration of ZFELD1 would imply, that padding bytes are inserted internally. This way, the relative addressing of FFELD8 points right into other F-fields. The wrong results are processed without any error message from the SP processor. So, ZFELD1 should remain in the program just as a comment.
- Example 3 – FFELD4 is addressed with “FFELD8+16(8)” and associated to the field symbol . This way, the field FFELDA, following next in the declaration, is addressed. So, with a modification of , FFELDA is modified. Because of the fixed length of F-fields, the modification of does not produce any “trash” (like in the case of PFELD6). A prerequisite is, however, that the respective F-fields were declared contiguously (avoid padding bytes).
- Example 4 – FFELD8 is relatively addressed by the two variables OFFX and LENX. The addressing points right into the data field NFELDX (because in our example 4, the address variable OFFX contains a “wrong” value). The addition of 111 to the field symbol is not performed, instead, something like a “MOVE” is made. The SP processor displays no error message. However, the target field NFELDX is modified.
- Summary: Caution is recommended also with relative addressing of F-fields. If addressing fields (e.g. OFFX or LENX) receive a wrong content, this causes errors. Sometimes, these errors are hard to localize (… the rest is known)
ABAP™-Source-Code
You can cut and paste the source code directly into the ABAP™-Workbench.
REPORT Y9020027 LINE-SIZE 130. "Release 3.1G, 4.5A ************************************************************************ * Copyright (c) 1999 by CT-Team, 33415 Verl, http://www.ct-software.com * * You can use or modify this report for your own work as long * as you don't try to sell or republish it. * In no event will the author be liable for indirect, special, * Incidental, or consequental damages (if any) arising out of * the use of this report. * ************************************************************************ BREAK-POINT. *//////////////////////////////////////////////////////////////////////* MOVE: 'TESTREPORT for "ASSIGN FFeld+o(l) TO <fs1>" ' TO SY-TITLE. *//////////////////////////////////////////////////////////////////////* *************** Declaration of variables ********************** FIELD-SYMBOLS <FS1>. *....................................................................... DATA: FFELD8(8) TYPE F VALUE '1022333'. "Unusual: Explicit 8 bytes *DATA: ZFELD1(2) TYPE N. "Here slack bytes are (DW border) * "necessary * "If you like computing error, please uncomment the above DATA: FFELDX(8) TYPE F VALUE '7777777'. DATA: FFELDA(8) TYPE F VALUE '7333213'. DATA: NFELDX(400) TYPE N. * DATA: OFFX(4) TYPE I VALUE 160. DATA: LENX(4) TYPE I VALUE 8. *//////////////////////////////////////////////////////////////////////* ************* Main Section ******************* *//////////////////////////////////////////////////////////////////////* * SKIP. WRITE: /5 'Example 1 **** inadmissible ASSIGN ***' COLOR 6. WRITE: /10 'Inadmissible ASSIGN: ''ASSIGN FFELD4+1(3) TO <FS1>'' '. * ASSIGN FFELD4+1(3) TO <FS1>. ULINE. SKIP 2. *----------------------------------------------------------------------- SKIP. ASSIGN FFELD8+8(8) TO <FS1>. "<-- Assigning of variable FFELDX !! *....................................................................... BREAK-POINT. WRITE: / 'ASSIGN command with FFELD8, but FFELDX will be assigned' COLOR 3. WRITE: /5 'Example 2'. PERFORM DISPLAY-FFELD USING FFELD8 'FFELD8'. WRITE: /10 'Content of FFELDX :', FFELDX. ULINE. SKIP 2. *----------------------------------------------------------------------- SKIP. ASSIGN FFELD8+16(8) TO <FS1>. "<-- Assiging a few FFELDA to <FS1> *....................................................................... BREAK-POINT. WRITE: / 'ASSIGN with FFELD8, but instead FFELDA is assigned' COLOR 3. WRITE: /5 'Example 3'. WRITE: /10 'Content of FFELDA :', FFELDA. PERFORM DISPLAY-FFELD USING FFELD8 'FFELD8'. WRITE: /10 'Content of FFELDA :', FFELDA. ULINE. SKIP 2. *----------------------------------------------------------------------- *....................................................................... BREAK-POINT. DO 4 TIMES. ASSIGN FFELD8+OFFX(LENX) TO <FS1>. "Zuordnung auf OFFX zu <FS1> WRITE: / 'ASSIGN command with FFELD8, es wird NFELDX zugeordnet' COLOR 5. WRITE: /5 'Example 4', 'DO-Schleife Nr.:', SY-INDEX. PERFORM DISPLAY-FFELD USING FFELD8 'FFELD8'. WRITE: /10 'Content of NFELDX+145(40) :', NFELDX+145(40). ULINE. SKIP 2. ADD 8 TO OFFX. ENDDO. *----------------------------------------------------------------------- *----------------------------------------------------------------------- * *//////////////////////////////////////////////////////////////////////* ************* Subroutines ******************* *//////////////////////////////////////////////////////////////////////* * ************************************************************************ * Display of data fields and field symbols * ************************************************************************ FORM DISPLAY-FFELD USING FFELD FNAME. * WRITE: /10 'Content of', FNAME, ':', FFELD. PERFORM FELDEIGENSCHAFTEN USING FFELD. * WRITE: /10 'Content of <FS1> :', <FS1>. PERFORM FELDEIGENSCHAFTEN USING <FS1>. *----------------------------------------------------------------------- ADD 111 TO <FS1>. "<-- Das Feldsybmol wird verwendet *----------------------------------------------------------------------- WRITE: /10 'ADD 111 TO <FS1>'. ULINE. *....................................................................... WRITE: /10 'Content of', FNAME, 35 ':', FFELD. WRITE: /10 'Content of <FS1>', 35 ':', <FS1>. *....................................................................... ENDFORM. ************************************************************************ * Determination of field properties (only for information) * ************************************************************************ FORM FELDEIGENSCHAFTEN USING ALLG. * DATA: FLAENGE(2) TYPE N. DATA: FTYP(1) TYPE C. DATA: FOUT(2) TYPE N. DATA: FDEZ(2) TYPE N. *....................................................................... ULINE. DESCRIBE FIELD ALLG LENGTH FLAENGE. WRITE: /10 'Field length :', FLAENGE. * DESCRIBE FIELD ALLG TYPE FTYP. WRITE: /10 'Field type :', FTYP. * DESCRIBE FIELD ALLG OUTPUT-LENGTH FOUT. WRITE: /10 'Output length :', FOUT. * DESCRIBE FIELD ALLG DECIMALS FDEZ. WRITE: /10 'Decimals :', FDEZ. SKIP 1. *....................................................................... ENDFORM. ************************************************************************ ************************************************************************ ******************* END OF PROGRAM *************************************