W Pub: ABAP Rut SAVEALL

  1. REPORT ZSAVE_ALL.
  2. * Tabla de campos en tabla. CUIDADO con colisiones o repeticiones.
  3. TABLES: DD03L.
  4. *Constante que se utiliza como almacenamiento Mximo
  5. CONSTANTS: MEMMAX TYPE I VALUE 65497. "Longiud Mxima del Registro
  6.  
  7. * Tabla Interna que se utiliza como pila
  8. DATA: BEGIN OF SAVE_ALL OCCURS 0,
  9.         COMIT TYPE I,
  10.         MODO(1),
  11.         TABLA(30),
  12.         DATOS(MEMMAX),
  13.       END OF SAVE_ALL.
  14. * Rutina y programa de comprobacin de errores.
  15. DATA: _RUTINA(30),
  16.       _PROGRAMA(30),
  17.       _COMMIT TYPE I VALUE 0.
  18. *-------------------- Ejemplo
  19. TABLES: ZM340.
  20.    BREAK-POINT.
  21.    SELECT * FROM ZM340.
  22.       PERFORM SAVE_TO_MEM USING 'UZM340'.
  23.       IF SY-DBCNT >= 4.
  24.          EXIT.
  25.       ENDIF.
  26.    ENDSELECT.
  27. *-------------------- Ejemplo
  28. FORM SEEK_FROM_MEM USING TABLA RUTINA PROGRAMA.
  29.   FIELD-SYMBOLS: <F>.
  30.   LOOP AT SAVE_ALL WHERE TABLA = TABLA.
  31.     ASSIGN (SAVE_ALL-TABLA) TO <F>.
  32.     <F> = SAVE_ALL-DATOS.
  33.     IF NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL.
  34.        PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA) IF FOUND.
  35.     ENDIF.
  36.   ENDLOOP.
  37. ENDFORM.
  38.  
  39. FORM SAVE_ALL_MEM_TO_DB.
  40.   FIELD-SYMBOLS: <F>.
  41.   DATA: TODO(31).
  42.   LOOP AT SAVE_ALL.
  43.     CONCATENATE SAVE_ALL-MODO SAVE_ALL-TABLA INTO TODO.
  44.     ASSIGN (SAVE_ALL-TABLA) TO <F>.
  45.     <F> = SAVE_ALL-DATOS.
  46.     PERFORM SAVE_TO_DB USING TODO.
  47.   ENDLOOP.
  48.   PERFORM SAVE_REFRESH.
  49. ENDFORM.
  50.  
  51. FORM SAVE_TO_MEM USING TABLA.
  52.   FIELD-SYMBOLS: <F>.
  53.   CLEAR: SAVE_ALL.
  54.   SAVE_ALL-TABLA = TABLA.
  55.   SHIFT SAVE_ALL LEFT.
  56.   SAVE_ALL-COMIT = _COMMIT.
  57.   ASSIGN (SAVE_ALL-TABLA) TO <F>.
  58.   SAVE_ALL-DATOS = <F>.
  59.   APPEND SAVE_ALL.
  60. ENDFORM.
  61.  
  62. FORM SAVE_TO_DB USING TABLA.
  63.   FIELD-SYMBOLS: <TAB>, <TABI>, <TABY>.
  64.   DATA: MTAB(30), CAMPO(40), TIPOM(1),
  65.         WTAB(72) OCCURS 0 WITH HEADER LINE.
  66.   MTAB = TABLA.
  67.   TIPOM = TABLA+0(1).
  68.   SHIFT MTAB LEFT. ASSIGN (MTAB) TO <TAB>. ASSIGN (MTAB) TO <TABI>.
  69.   IF TIPOM CA 'DU'.
  70. * Antes de UPDATE o DELETE nos hemos de posicionar.
  71.      CLEAR WTAB. REFRESH WTAB.
  72.      SELECT * FROM DD03L WHERE TABNAME = MTAB AND
  73.                                KEYFLAG = 'X' AND
  74.                                FIELDNAME NE 'MANDT'
  75.                                ORDER BY POSITION.
  76.        WTAB = 'AND'.
  77.        IF SY-DBCNT = 1. CLEAR WTAB. ENDIF.
  78.        CONCATENATE WTAB DD03L-FIELDNAME '=' INTO WTAB SEPARATED BY ' '.
  79.        CONCATENATE MTAB '-' DD03L-FIELDNAME INTO CAMPO.
  80.        ASSIGN (CAMPO) TO <TABY>.
  81.        CASE DD03L-INTTYPE.
  82.           WHEN 'C' OR 'N'.
  83.                   CONCATENATE WTAB ' ''' <TABY> '''' INTO WTAB.
  84.        ENDCASE.
  85.        APPEND WTAB.
  86.      ENDSELECT. BREAK-POINT.
  87.      SELECT SINGLE * FROM (MTAB) INTO <TABI> WHERE (WTAB).
  88.      IF SY-SUBRC NE 0.
  89.         IF NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL.
  90.            PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA).
  91.         ENDIF.
  92.         CHECK 1 = 2.
  93.      ELSE.
  94.         <TAB> = SAVE_ALL-DATOS.
  95.      ENDIF.
  96.   ENDIF.
  97.   CASE TIPOM.
  98.     WHEN 'D'. DELETE (MTAB) FROM <TAB>.
  99.     WHEN 'U'. UPDATE (MTAB) FROM <TAB>.
  100.     WHEN 'I'. INSERT (MTAB) FROM <TAB>.
  101.     WHEN 'M'. MODIFY (MTAB) FROM <TAB>.
  102.   ENDCASE.
  103.   CHECK ( NOT _RUTINA IS INITIAL AND NOT _PROGRAMA IS INITIAL ).
  104.   PERFORM (_RUTINA) IN PROGRAM (_PROGRAMA).
  105. ENDFORM.
  106.  
  107. FORM SAVE_COMMIT_MEM. ADD 1 TO _COMMIT. ENDFORM.
  108.  
  109. FORM SAVE_ROLLBACK_MEM.
  110.   CHECK _COMMIT > 0.
  111.   LOOP AT SAVE_ALL WHERE COMIT = _COMMIT.
  112.     DELETE SAVE_ALL.
  113.   ENDLOOP.
  114.   _COMMIT = _COMMIT - 1.
  115. ENDFORM.
  116.  
  117. FORM SAVE_REFRESH. REFRESH SAVE_ALL. CLEAR SAVE_ALL. ENDFORM.