W Pub: ABAP Prog Propios MIG Tab

  1. REPORT ZTABMIGRATION.
  2. *-- NOTA: Es necesario definir la tabla que se quiere utilizar.
  3. *--       Es dinmico, pero no mgico!
  4. TABLES: kblp, t001.
  5. *
  6. * Overview
  7. *   Este programa es capaz de descargar una tabla con sus
  8. *   caractersticas y subirla hacia otro sistema intentando meter
  9. *   los valores en los campos del mismo nombre.
  10. *   Es decir, una migracin de datos.
  11. *
  12. *  Parmetros
  13. *     tab      :: Nombre de la tabla a migrar
  14. *     *cfg*    :: Nombre del fichero con la descripcin de la tabla
  15. *     *in*     :: Nombre del fichero de entrada (datos descargados)
  16. *     *out*    :: Nombre del fichero de salida (datos a descargar)
  17. *     solokmpo :: Slo descargar los campos seleccionados
  18. *     fromto   :: Relaciona campos con diferentes nombres en las tablas
  19. *              :: Low  = Campo de BBDD
  20. *              :: High = Campo de fichero
  21. *     down     :: Se ejecutar el proceso de descarga
  22. *     up       :: Se ejecutar el proceso de carga de datos
  23. *     cmp      :: Se compar las descripciones tcnicas de tablas
  24. *     sinmandt :: No se tendr en cuenta el mandante
  25. *     test     :: Si marcado, no se grabaran tablas
  26. *     mupdate  :: Si ya existe el registro lo actualizamos
  27. *
  28. * Tips
  29. *   1) Si el contenido es muy grande es recomendable crear un job para
  30. *      que descargue los datos al host.
  31. *   2) Paciencia... Si va lento, crea jobs.
  32. *   3) Si quieres descargar clusters, modifica el source...
  33. *   4) Si el nombre de la tabla de origen y de destino es diferente
  34. *      slo tienes que editar el fichero de la estructura.
  35. *
  36. TABLES: sscrfields, dd03l. "Necesaria como apoyo.
  37.  
  38. PARAMETERS: tab LIKE dd03l-tabname DEFAULT 'KBLP'.
  39.  
  40. selection-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
  41. PARAMETER: file_cfg LIKE rlgrap-filename.
  42. PARAMETER: cfg_pc RADIOBUTTON GROUP bol,
  43. cfg_ho RADIOBUTTON GROUP bol.
  44. selection-SCREEN END OF BLOCK b01.
  45.  
  46. selection-SCREEN BEGIN OF BLOCK b02 WITH FRAME.
  47. PARAMETER: file_in LIKE rlgrap-filename,
  48. in_pc RADIOBUTTON GROUP bo2,
  49. in_ho RADIOBUTTON GROUP bo2.
  50. selection-SCREEN END OF BLOCK b02.
  51.  
  52. selection-SCREEN BEGIN OF BLOCK b03 WITH FRAME.
  53. PARAMETER: file_out LIKE rlgrap-filename,
  54. out_pc RADIOBUTTON GROUP bo3,
  55. out_ho RADIOBUTTON GROUP bo3.
  56. selection-SCREEN END OF BLOCK b03.
  57.  
  58. SELECT-options solokmpo FOR dd03l-fieldname NO intervals.
  59. SELECT-options fromto   FOR dd03l-fieldname.
  60. selection-SCREEN FUNCTION KEY 1.
  61.  
  62. PARAMETERS: down RADIOBUTTON GROUP che DEFAULT 'X',
  63. UP   RADIOBUTTON GROUP che ,
  64. cmp  RADIOBUTTON GROUP che ,
  65. sinmandt AS CHECKBOX DEFAULT 'X',
  66. mupdate AS CHECKBOX DEFAULT 'X',
  67. test AS CHECKBOX DEFAULT 'X'.
  68.  
  69. DATA: BEGIN OF stack OCCURS 0,
  70.   tabname LIKE dd03l-tabname,
  71.   fieldname LIKE dd03l-fieldname,
  72.   keyflag   LIKE dd03l-keyflag,
  73.   inttype   LIKE dd03l-inttype,
  74.   intlen    LIKE dd03l-intlen,
  75. END OF stack,
  76. stack_ori LIKE stack OCCURS 0 WITH HEADER LINE,
  77. stack_des LIKE stack OCCURS 0 WITH HEADER LINE,
  78. stack_aux LIKE stack OCCURS 0 WITH HEADER LINE,
  79. dump(65534) OCCURS 0 WITH HEADER LINE,
  80. txt(45),
  81. eax TYPE I,
  82. ecx TYPE I,
  83. edx TYPE I.
  84.  
  85. FIELD-symbols: <f>, <k>.
  86.  
  87. AT selection-SCREEN ON VALUE-request FOR file_cfg.
  88.   PERFORM help_me CHANGING file_cfg.
  89.  
  90. AT selection-SCREEN ON VALUE-request FOR file_in.
  91.   PERFORM help_me CHANGING file_in.
  92.  
  93. AT selection-SCREEN ON VALUE-request FOR file_out.
  94.   PERFORM help_me CHANGING file_out.
  95.  
  96. INITIALIZATION.
  97.   MOVE 'Soporte Campos' TO sscrfields-functxt_01.
  98.  
  99. AT selection-SCREEN.
  100.   CHECK sscrfields-ucomm = 'FC01'.
  101.   CLEAR stack_aux. REFRESH stack_aux.
  102.   PERFORM load_des TABLES stack_aux.
  103.   CLEAR solokmpo. REFRESH solokmpo.
  104.   solokmpo-SIGN = 'I'.
  105.   solokmpo-option = 'EQ'.
  106.   LOOP AT stack_aux.
  107.     solokmpo-low    = stack_aux-fieldname. APPEND solokmpo.
  108.   ENDLOOP.
  109.  
  110. END-OF-selection.
  111.   PERFORM check_fromto_solokmpo.
  112.   PERFORM load_des TABLES stack_ori.
  113.   MESSAGE s398(00) WITH 'Seleccionar fichero de Configuracin'.
  114.   CASE 'X'.
  115.     WHEN down.
  116.       PERFORM filtra_stack_ori.
  117.       PERFORM load_tab_data.
  118.       PERFORM save_filez TABLES stack_ori USING file_cfg cfg_pc cfg_ho.
  119.       MESSAGE s398(00) WITH 'Volcado de tablas'.
  120.       PERFORM save_filez TABLES dump USING file_out out_pc out_ho.
  121.     WHEN UP.
  122.       PERFORM load_filez TABLES stack_des USING file_cfg cfg_pc cfg_ho.
  123.       MESSAGE s398(00) WITH 'Seleccionar fichero de datos'.
  124.       PERFORM load_filez TABLES dump USING file_in in_pc in_ho.
  125.       PERFORM work_data.
  126.     WHEN cmp.
  127.       PERFORM load_filez TABLES stack_des USING file_cfg cfg_pc cfg_ho.
  128.       CHECK stack_ori[] NE stack_des[].
  129.       WRITE: / 'Comparando Tabla con fichero'.
  130.       PERFORM compare TABLES stack_ori stack_des.
  131.       WRITE: / 'Comparando fichero con tabla'.
  132.       PERFORM compare TABLES stack_des stack_ori.
  133.   ENDCASE.
  134.  
  135. *--- Rutinas propias
  136. FORM filtra_stack_ori.
  137.   CLEAR stack_aux. REFRESH stack_aux.
  138.   LOOP AT solokmpo.
  139.     READ TABLE stack_ori WITH KEY fieldname = solokmpo-low.
  140.     CHECK sy-subrc EQ 0.
  141.     stack_aux = stack_ori.
  142.     APPEND stack_aux.
  143.     AT LAST.
  144.       stack_ori[] = stack_aux[].
  145.     ENDAT.
  146.   ENDLOOP.
  147. ENDFORM.
  148.  
  149. FORM check_fromto_solokmpo.
  150.   LOOP AT fromto.
  151.     IF fromto-low IS INITIAL OR fromto-high IS INITIAL OR
  152.     fromto-option NE 'EQ' OR fromto-SIGN NE 'I'.
  153.       DELETE fromto.
  154.     ENDIF.
  155.   ENDLOOP.
  156.   LOOP AT solokmpo.
  157.     IF solokmpo-low IS INITIAL OR NOT solokmpo-high IS INITIAL OR
  158.     solokmpo-option NE 'EQ' OR solokmpo-SIGN NE 'I'.
  159.       DELETE solokmpo.
  160.     ENDIF.
  161.   ENDLOOP.
  162. ENDFORM.
  163.  
  164. FORM work_data.
  165. * Psicologa inversa: fromto-high = stack_des es el fichero
  166. *                     fromto-low  = stack_ori es la BBDDs
  167.   CLEAR edx.
  168.   LOOP AT dump.
  169.     CLEAR: eax.
  170.     LOOP AT stack_des.
  171.       IF sinmandt = 'X' AND stack_des-fieldname = 'MANDT'.
  172.         ADD stack_des-intlen TO eax.
  173.         CONTINUE.
  174.       ENDIF.
  175.       READ TABLE stack_ori WITH KEY tabname = stack_des-tabname
  176.       fieldname = stack_des-fieldname.
  177.       IF sy-subrc NE 0.
  178. * No existe el campo habr que buscar alternativa
  179.         READ TABLE fromto WITH KEY high = stack_des-fieldname.
  180.         IF sy-subrc EQ 0.
  181.           READ TABLE stack_ori
  182.           WITH KEY tabname = stack_des-tabname
  183.           fieldname = fromto-low.
  184.           IF sy-subrc EQ 0.
  185. * La relacion es coherente
  186.             stack_des-fieldname = fromto-low.
  187.           ELSE.
  188. * Divorcio! La relacin no es correcta.
  189.           ENDIF.
  190.         ELSE.
  191. * No tenemos campo relacionado.
  192.         ENDIF.
  193.       ELSE.
  194.         CONCATENATE stack_des-tabname '-' stack_des-fieldname
  195.         INTO txt.
  196.         CONDENSE txt NO-gaps.
  197.         ASSIGN (txt) TO <f>.
  198.         <f> = dump+eax(stack_des-intlen).
  199.       ENDIF.
  200.       ADD stack_des-intlen TO eax.
  201.     ENDLOOP.
  202.     ASSIGN (tab) TO <f>.
  203.     CHECK test IS INITIAL.
  204.     INSERT (tab) FROM <f>.
  205.     ADD 1 TO edx.
  206.     CHECK ( sy-subrc NE 0 AND NOT mupdate IS INITIAL ).
  207.     UPDATE (tab) FROM <f>.
  208.   ENDLOOP.
  209.   MESSAGE s398(00) WITH edx ' Registro grabados'.
  210. ENDFORM.
  211.  
  212. FORM compare TABLES ori STRUCTURE stack
  213.   des STRUCTURE stack.
  214.   LOOP AT ori.
  215.     READ TABLE des WITH KEY tabname   = ori-tabname
  216.     fieldname = ori-fieldname.
  217.     IF sy-subrc NE 0.
  218.       WRITE: / 'No encontrado:', ori.
  219.     ELSE.
  220.       IF ori-keyflag NE des-keyflag OR
  221.       ori-inttype NE des-inttype OR
  222.       ori-intlen  NE des-intlen.
  223.         WRITE: / 'Campos distintos:',
  224.         ori-fieldname, ori-inttype, ori-intlen.
  225.       ENDIF.
  226.     ENDIF.
  227.   ENDLOOP.
  228. ENDFORM.
  229.  
  230. FORM load_tab_data.
  231.   DATA: sytabix LIKE sy-tabix,
  232.         bkp LIKE dump.
  233.   SELECT * FROM (tab) INTO TABLE dump.
  234.   ASSIGN (tab) TO <k>.
  235.   LOOP AT dump.
  236.     sytabix = sy-tabix.
  237.     <k> = dump.
  238.     CLEAR: eax.
  239.     LOOP AT solokmpo.
  240.       CONCATENATE tab '-' solokmpo-low INTO txt.
  241.       ASSIGN (txt) TO <f>. "Valor
  242.       READ TABLE stack_ori WITH KEY fieldname = solokmpo-low.
  243.       bkp+eax(stack_ori-intlen) = <f>.
  244.       ADD stack_ori-intlen TO eax.
  245.       AT LAST.
  246.         dump = bkp.
  247.         MODIFY dump INDEX sytabix.
  248.       ENDAT.
  249.     ENDLOOP.
  250.   ENDLOOP.
  251. ENDFORM.
  252.  
  253. FORM load_des TABLES stack_tab.
  254.   SELECT * FROM dd03l INTO corresponding FIELDS OF TABLE stack_tab
  255.   WHERE  tabname   = tab
  256.   AND    as4local  = 'A'
  257.   AND    intlen    <> 0
  258.   ORDER BY POSITION.
  259. ENDFORM.
  260.  
  261. *{  Carga de Ficheros
  262. FORM load_filez TABLES my_tab
  263. USING p_filez
  264.       opc_pc
  265.       opc_ho.
  266.   CASE 'X'.
  267.     WHEN opc_pc.
  268.       PERFORM load_from_pc TABLES my_tab
  269. USING p_filez.
  270.     WHEN opc_ho.
  271.       PERFORM load_from_host TABLES my_tab
  272. USING p_filez.
  273.   ENDCASE.
  274. ENDFORM.
  275.  
  276. FORM save_filez TABLES my_tab
  277. USING p_filez
  278.       opc_pc
  279.       opc_ho.
  280.   CASE 'X'.
  281.     WHEN opc_pc.
  282.       PERFORM save_to_pc TABLES my_tab
  283. USING p_filez.
  284.     WHEN opc_ho.
  285.       PERFORM save_to_host TABLES my_tab
  286. USING p_filez.
  287.   ENDCASE.
  288. ENDFORM.
  289.  
  290. *{ Host Module
  291. FORM save_to_host TABLES my_tab
  292. USING p_filez.
  293.   OPEN DATASET p_filez FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  294.   LOOP AT my_tab.
  295.     TRANSFER my_tab TO p_filez.
  296.   ENDLOOP.
  297.   CLOSE DATASET p_filez.
  298. ENDFORM.
  299.  
  300. FORM load_from_host TABLES my_tab
  301. USING p_filez.
  302.   OPEN DATASET p_filez FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  303.   CHECK sy-subrc EQ 0.
  304.   DO.
  305.     READ DATASET p_filez INTO my_tab.
  306.     IF sy-subrc NE 0. EXIT. ENDIF.
  307.     APPEND my_tab.
  308.   ENDDO.
  309.   CLOSE DATASET p_filez.
  310. ENDFORM.
  311.  
  312. *{ PC Module
  313. FORM save_to_pc TABLES my_tab
  314. USING p_filez.
  315.   IF p_filez IS INITIAL.
  316.     CALL FUNCTION 'DOWNLOAD'
  317.       EXPORTING
  318.         filename                = p_filez
  319.         filetype                = 'ASC'
  320.       TABLES
  321.         data_tab                = my_tab
  322.       EXCEPTIONS
  323.         invalid_filesize        = 4
  324.         invalid_table_width     = 4
  325.         invalid_type            = 4
  326.         no_batch                = 4
  327.         unknown_error           = 4
  328.         gui_refuse_filetransfer = 4
  329.         customer_error          = 4
  330.         OTHERS                  = 4.
  331.   ELSE.
  332.     CALL FUNCTION 'WS_DOWNLOAD'
  333.       EXPORTING
  334.         filename                = p_filez
  335.         filetype                = 'ASC'
  336.       TABLES
  337.         data_tab                = my_tab
  338.       EXCEPTIONS
  339.         file_open_error         = 4
  340.         file_write_error        = 4
  341.         invalid_filesize        = 4
  342.         invalid_type            = 4
  343.         no_batch                = 4
  344.         unknown_error           = 4
  345.         invalid_table_width     = 4
  346.         gui_refuse_filetransfer = 4
  347.         customer_error          = 4
  348.         OTHERS                  = 4.
  349.   ENDIF.
  350.   CHECK sy-subrc NE 0.
  351.   MESSAGE e398(00) WITH 'Error al descargar fichero.'.
  352. ENDFORM.
  353.  
  354. FORM load_from_pc TABLES my_tab
  355. USING p_filez.
  356.   IF p_filez IS INITIAL.
  357.     CALL FUNCTION 'UPLOAD'
  358.       EXPORTING
  359.         filename                = p_filez
  360.         filetype                = 'ASC'
  361.       TABLES
  362.         data_tab                = my_tab
  363.       EXCEPTIONS
  364.         conversion_error        = 4
  365.         invalid_table_width     = 4
  366.         invalid_type            = 4
  367.         no_batch                = 4
  368.         unknown_error           = 4
  369.         gui_refuse_filetransfer = 4
  370.         OTHERS                  = 4.
  371.   ELSE.
  372.     CALL FUNCTION 'WS_UPLOAD'
  373.       EXPORTING
  374.         filename                = p_filez
  375.         filetype                = 'ASC'
  376.       TABLES
  377.         data_tab                = my_tab
  378.       EXCEPTIONS
  379.         conversion_error        = 4
  380.         file_open_error         = 4
  381.         file_read_error         = 4
  382.         invalid_type            = 4
  383.         no_batch                = 4
  384.         unknown_error           = 4
  385.         invalid_table_width     = 4
  386.         gui_refuse_filetransfer = 4
  387.         customer_error          = 4
  388.         OTHERS                  = 4.
  389.   ENDIF.
  390.   CHECK sy-subrc NE 0.
  391.   MESSAGE e398(00) WITH 'Error al cargar fichero.'.
  392. ENDFORM.
  393.  
  394. FORM help_me CHANGING p_filez LIKE rlgrap-filename.
  395.   CALL FUNCTION 'WS_FILENAME_GET'
  396.     EXPORTING
  397.       def_filename     = p_filez
  398.       MASK             = ',all files,*.*,data files,*.dat,text files,*.txt.'
  399.       MODE             = 'o'
  400.       TITLE            = 'Selecciona un fichero...'
  401.     IMPORTING
  402.       filename         = p_filez
  403.     EXCEPTIONS
  404.       inv_winsys       = 04
  405.       no_batch         = 04
  406.       selection_cancel = 04
  407.       selection_error  = 04.
  408. ENDFORM.