REPORT ZSAVE_ALL.
* Tabla de campos en tabla. CUIDADO con colisiones o repeticiones.
TABLES: DD03L.
*Constante que se utiliza como almacenamiento Mximo
CONSTANTS: MEMMAX TYPE I VALUE 65497. "Longiud Mxima del Registro
* Tabla Interna que se utiliza como pila
DATA: BEGIN OF SAVE_ALL OCCURS 0,
COMIT TYPE I,
MODO(1),
TABLA(30),
DATOS(MEMMAX),
END OF SAVE_ALL.
* Rutina y programa de comprobacin de errores.
DATA: _RUTINA(30),
_PROGRAMA(30),
_COMMIT TYPE I VALUE 0.
*-------------------- Ejemplo
TABLES: ZM340.
BREAK-POINT.
SELECT * FROM ZM340.
PERFORM SAVE_TO_MEM USING 'UZM340'.
IF SY-DBCNT >= 4.
EXIT.
ENDIF.
ENDSELECT.
*-------------------- Ejemplo
FORM SEEK_FROM_MEM USING TABLA RUTINA PROGRAMA.
FIELD-SYMBOLS: <F>.
LOOP AT SAVE_ALL WHERE TABLA = TABLA.
ASSIGN (SAVE_ALL-TABLA) TO <F>.
<F> = SAVE_ALL-DATOS.
IF NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL.
PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA) IF FOUND.
ENDIF.
ENDLOOP.
ENDFORM.
FORM SAVE_ALL_MEM_TO_DB.
FIELD-SYMBOLS: <F>.
DATA: TODO(31).
LOOP AT SAVE_ALL.
CONCATENATE SAVE_ALL-MODO SAVE_ALL-TABLA INTO TODO.
ASSIGN (SAVE_ALL-TABLA) TO <F>.
<F> = SAVE_ALL-DATOS.
PERFORM SAVE_TO_DB USING TODO.
ENDLOOP.
PERFORM SAVE_REFRESH.
ENDFORM.
FORM SAVE_TO_MEM USING TABLA.
FIELD-SYMBOLS: <F>.
CLEAR: SAVE_ALL.
SAVE_ALL-TABLA = TABLA.
SHIFT SAVE_ALL LEFT.
SAVE_ALL-COMIT = _COMMIT.
ASSIGN (SAVE_ALL-TABLA) TO <F>.
SAVE_ALL-DATOS = <F>.
APPEND SAVE_ALL.
ENDFORM.
FORM SAVE_TO_DB USING TABLA.
FIELD-SYMBOLS: <TAB>, <TABI>, <TABY>.
DATA: MTAB(30), CAMPO(40), TIPOM(1),
WTAB(72) OCCURS 0 WITH HEADER LINE.
MTAB = TABLA.
TIPOM = TABLA+0(1).
SHIFT MTAB LEFT. ASSIGN (MTAB) TO <TAB>. ASSIGN (MTAB) TO <TABI>.
IF TIPOM CA 'DU'.
* Antes de UPDATE o DELETE nos hemos de posicionar.
CLEAR WTAB. REFRESH WTAB.
SELECT * FROM DD03L WHERE TABNAME = MTAB AND
KEYFLAG = 'X' AND
FIELDNAME NE 'MANDT'
ORDER BY POSITION.
WTAB = 'AND'.
IF SY-DBCNT = 1. CLEAR WTAB. ENDIF.
CONCATENATE WTAB DD03L-FIELDNAME '=' INTO WTAB SEPARATED BY ' '.
CONCATENATE MTAB '-' DD03L-FIELDNAME INTO CAMPO.
ASSIGN (CAMPO) TO <TABY>.
CASE DD03L-INTTYPE.
WHEN 'C' OR 'N'.
CONCATENATE WTAB ' ''' <TABY> '''' INTO WTAB.
ENDCASE.
APPEND WTAB.
ENDSELECT. BREAK-POINT.
SELECT SINGLE * FROM (MTAB) INTO <TABI> WHERE (WTAB).
IF SY-SUBRC NE 0.
IF NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL.
PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA).
ENDIF.
CHECK 1 = 2.
ELSE.
<TAB> = SAVE_ALL-DATOS.
ENDIF.
ENDIF.
CASE TIPOM.
WHEN 'D'. DELETE (MTAB) FROM <TAB>.
WHEN 'U'. UPDATE (MTAB) FROM <TAB>.
WHEN 'I'. INSERT (MTAB) FROM <TAB>.
WHEN 'M'. MODIFY (MTAB) FROM <TAB>.
ENDCASE.
CHECK ( NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL ).
PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA).
ENDFORM.
FORM SAVE_COMMIT_MEM. ADD 1 TO _COMMIT. ENDFORM.
FORM SAVE_ROLLBACK_MEM.
CHECK _COMMIT > 0.
LOOP AT SAVE_ALL WHERE COMIT = _COMMIT.
DELETE SAVE_ALL.
ENDLOOP.
_COMMIT = _COMMIT - 1.
ENDFORM.
FORM SAVE_REFRESH. REFRESH SAVE_ALL. CLEAR SAVE_ALL. ENDFORM.