REPORT ZZBE0001. ************************************************************************ * * * Examples of optimized reading of database tables. * * * * * * A couple of forms encapsulating loading and reading of table t001. * * * Whether the code should be converted to a function module is in * * * the end a matter of form :-) ************************************************************************ * * * The following is the brainchild of : * * * Bent Hansen Systems Consultant Cap Gemini A/S (Denmark) * * * and is supplied as is - no warranties / no money return'd. ************************************************************************ TABLES : T001. DATA : COMPANY_NAME LIKE T001-BUTXT, COUNTRY_CODE LIKE T001-LAND1. * ... calling : CLEAR T001. T001-BUKRS = '1000'. "or variable or parameter or whatever .... PERFORM READ_T001. IF SY-SUBRC = 0. * ... t001 contains valid data ELSE. * ... error handling ENDIF. * ... * ... * ... CLEAR T001. T001-BUTXT = COMPANY_NAME. T001-LAND1 = COUNTRY_CODE. PERFORM ALTREAD_T001. IF SY-SUBRC = 0. * ... t001 contains valid data ELSE. * ... error handling ENDIF. *----------------------------------------------------------------------- * SAMPLE FORM : load db-table to internal table. * Precondition : db-table declared in global TABLES - statement, * prior to call key-fields of the structure 'T001' is * assigned values for the desired record. *----------------------------------------------------------------------- * APPLICABILITY : * The db-table should contain few records that are accessed a large * number of times each during the run of your program. *----------------------------------------------------------------------- FORM READ_T001. * * * length of primary key in bytes CONSTANTS : KEY_LEN TYPE I VALUE 7. * * * structure copying primary key STATICS : BEGIN OF T001_KEY, MANDT LIKE T001-MANDT, BUKRS LIKE T001-BUKRS, END OF T001_KEY, * * * internal table containing all (selected) records. I_T001 LIKE T001 OCCURS 10 WITH HEADER LINE, * * * result of reading with current contents of t001_key. T001_SUBRC LIKE SY-SUBRC. * * * at first call IF T001_KEY IS INITIAL. T001_KEY-MANDT = SY-MANDT. * * * physical read : NOTE order by to allow the SQL-engine to optimize * * * retrieval order at time of disc-access. SELECT * FROM T001 INTO TABLE I_T001 ORDER BY PRIMARY KEY. ENDIF. IF T001_KEY-BUKRS = T001-BUKRS. * * * if key is the same as last time => the result will be the same SY-SUBRC = T001_SUBRC. ELSE. T001_KEY-BUKRS = T001-BUKRS. READ TABLE I_T001 WITH KEY T001_KEY BINARY SEARCH. IF SY-SUBRC <> 0. * * * read table ... binary search will return * 0 - found, * 4 - not found in table, or * 8 - key larger than last key in itab. * so in order to conform with "standard" results from db-reads : T001_SUBRC = SY-SUBRC = 4. ENDIF. ENDIF. IF SY-SUBRC = 0. * * * transfer data to record in global data-space. T001 = I_T001. ENDIF. ENDFORM. *----------------------------------------------------------------------- * SAMPLE FORM : variation of the above. Conditions are the same but * you need to read records by non-key fields. * In this example the name and country-key of the company is given. *----------------------------------------------------------------------- FORM ALTREAD_T001. * * * length of freely selected search-key in bytes. CONSTANTS : KEY_LEN TYPE I VALUE 28. * * * structure copying search key STATICS : BEGIN OF T001_KEY, KEY_BUTXT LIKE T001-BUTXT, " char 25 KEY_LAND1 LIKE T001-LAND1, " char 3 END OF T001_KEY. * * * You may list all the fields to avoid duplicates of search-key, * but I never did get that type-writing class. STATICS : BEGIN OF I_T001 OCCURS 10. * * * the search-key must be the first part of the internal table. INCLUDE STRUCTURE T001_KEY. INCLUDE STRUCTURE T001. STATICS : END OF I_T001. STATICS : T001_SUBRC LIKE SY-SUBRC. * * * at first call IF T001_KEY IS INITIAL. * * * physical read : SELECT * FROM T001 INTO CORRESPONDING FIELDS OF I_T001. * * * fill in the search-key fields I_T001-KEY_BUTXT = T001-BUTXT. I_T001-KEY_LAND1 = T001-LAND1. APPEND I_T001. ENDSELECT. * * * in this form you have to manually sort the itab. SORT I_T001 BY BUTXT ASCENDING LAND1 ASCENDING. ENDIF. * * * NB : as this is NOT a unique key there may be more than one record * * * that satisfies the criteria. In this example we are content * * * with any of those. IF T001_KEY-KEY_BUTXT = T001-BUTXT AND T001_KEY-KEY_LAND1 = T001-LAND1. SY-SUBRC = T001_SUBRC. ELSE. T001_KEY-KEY_BUTXT = T001-BUTXT. T001_KEY-KEY_LAND1 = T001-LAND1. READ TABLE I_T001 WITH KEY T001_KEY BINARY SEARCH. IF SY-SUBRC <> 0. T001_SUBRC = SY-SUBRC = 4. ENDIF. ENDIF. IF SY-SUBRC = 0. MOVE-CORRESPONDING I_T001 TO T001. * * * .. or - possibly faster : T001 = I_T001+KEY_LEN. ENDIF. ENDFORM.