- REPORT ZTABMIGRATION.
- *-- NOTA: Es necesario definir la tabla que se quiere utilizar.
- *-- Es dinmico, pero no mgico!
- TABLES: kblp, t001.
- *
- * Overview
- * Este programa es capaz de descargar una tabla con sus
- * caractersticas y subirla hacia otro sistema intentando meter
- * los valores en los campos del mismo nombre.
- * Es decir, una migracin de datos.
- *
- * Parmetros
- * tab :: Nombre de la tabla a migrar
- * *cfg* :: Nombre del fichero con la descripcin de la tabla
- * *in* :: Nombre del fichero de entrada (datos descargados)
- * *out* :: Nombre del fichero de salida (datos a descargar)
- * solokmpo :: Slo descargar los campos seleccionados
- * fromto :: Relaciona campos con diferentes nombres en las tablas
- * :: Low = Campo de BBDD
- * :: High = Campo de fichero
- * down :: Se ejecutar el proceso de descarga
- * up :: Se ejecutar el proceso de carga de datos
- * cmp :: Se compar las descripciones tcnicas de tablas
- * sinmandt :: No se tendr en cuenta el mandante
- * test :: Si marcado, no se grabaran tablas
- * mupdate :: Si ya existe el registro lo actualizamos
- *
- * Tips
- * 1) Si el contenido es muy grande es recomendable crear un job para
- * que descargue los datos al host.
- * 2) Paciencia... Si va lento, crea jobs.
- * 3) Si quieres descargar clusters, modifica el source...
- * 4) Si el nombre de la tabla de origen y de destino es diferente
- * slo tienes que editar el fichero de la estructura.
- *
- TABLES: sscrfields, dd03l. "Necesaria como apoyo.
- PARAMETERS: tab LIKE dd03l-tabname DEFAULT 'KBLP'.
- selection-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
- PARAMETER: file_cfg LIKE rlgrap-filename.
- PARAMETER: cfg_pc RADIOBUTTON GROUP bol,
- cfg_ho RADIOBUTTON GROUP bol.
- selection-SCREEN END OF BLOCK b01.
- selection-SCREEN BEGIN OF BLOCK b02 WITH FRAME.
- PARAMETER: file_in LIKE rlgrap-filename,
- in_pc RADIOBUTTON GROUP bo2,
- in_ho RADIOBUTTON GROUP bo2.
- selection-SCREEN END OF BLOCK b02.
- selection-SCREEN BEGIN OF BLOCK b03 WITH FRAME.
- PARAMETER: file_out LIKE rlgrap-filename,
- out_pc RADIOBUTTON GROUP bo3,
- out_ho RADIOBUTTON GROUP bo3.
- selection-SCREEN END OF BLOCK b03.
- SELECT-options solokmpo FOR dd03l-fieldname NO intervals.
- SELECT-options fromto FOR dd03l-fieldname.
- selection-SCREEN FUNCTION KEY 1.
- PARAMETERS: down RADIOBUTTON GROUP che DEFAULT 'X',
- UP RADIOBUTTON GROUP che ,
- cmp RADIOBUTTON GROUP che ,
- sinmandt AS CHECKBOX DEFAULT 'X',
- mupdate AS CHECKBOX DEFAULT 'X',
- test AS CHECKBOX DEFAULT 'X'.
- DATA: BEGIN OF stack OCCURS 0,
- tabname LIKE dd03l-tabname,
- fieldname LIKE dd03l-fieldname,
- keyflag LIKE dd03l-keyflag,
- inttype LIKE dd03l-inttype,
- intlen LIKE dd03l-intlen,
- END OF stack,
- stack_ori LIKE stack OCCURS 0 WITH HEADER LINE,
- stack_des LIKE stack OCCURS 0 WITH HEADER LINE,
- stack_aux LIKE stack OCCURS 0 WITH HEADER LINE,
- dump(65534) OCCURS 0 WITH HEADER LINE,
- txt(45),
- eax TYPE I,
- ecx TYPE I,
- edx TYPE I.
- FIELD-symbols: <f>, <k>.
- AT selection-SCREEN ON VALUE-request FOR file_cfg.
- PERFORM help_me CHANGING file_cfg.
- AT selection-SCREEN ON VALUE-request FOR file_in.
- PERFORM help_me CHANGING file_in.
- AT selection-SCREEN ON VALUE-request FOR file_out.
- PERFORM help_me CHANGING file_out.
- INITIALIZATION.
- MOVE 'Soporte Campos' TO sscrfields-functxt_01.
- AT selection-SCREEN.
- CHECK sscrfields-ucomm = 'FC01'.
- CLEAR stack_aux. REFRESH stack_aux.
- PERFORM load_des TABLES stack_aux.
- CLEAR solokmpo. REFRESH solokmpo.
- solokmpo-SIGN = 'I'.
- solokmpo-option = 'EQ'.
- LOOP AT stack_aux.
- solokmpo-low = stack_aux-fieldname. APPEND solokmpo.
- ENDLOOP.
- END-OF-selection.
- PERFORM check_fromto_solokmpo.
- PERFORM load_des TABLES stack_ori.
- MESSAGE s398(00) WITH 'Seleccionar fichero de Configuracin'.
- CASE 'X'.
- WHEN down.
- PERFORM filtra_stack_ori.
- PERFORM load_tab_data.
- PERFORM save_filez TABLES stack_ori USING file_cfg cfg_pc cfg_ho.
- MESSAGE s398(00) WITH 'Volcado de tablas'.
- PERFORM save_filez TABLES dump USING file_out out_pc out_ho.
- WHEN UP.
- PERFORM load_filez TABLES stack_des USING file_cfg cfg_pc cfg_ho.
- MESSAGE s398(00) WITH 'Seleccionar fichero de datos'.
- PERFORM load_filez TABLES dump USING file_in in_pc in_ho.
- PERFORM work_data.
- WHEN cmp.
- PERFORM load_filez TABLES stack_des USING file_cfg cfg_pc cfg_ho.
- CHECK stack_ori[] NE stack_des[].
- WRITE: / 'Comparando Tabla con fichero'.
- PERFORM compare TABLES stack_ori stack_des.
- WRITE: / 'Comparando fichero con tabla'.
- PERFORM compare TABLES stack_des stack_ori.
- ENDCASE.
- *--- Rutinas propias
- FORM filtra_stack_ori.
- CLEAR stack_aux. REFRESH stack_aux.
- LOOP AT solokmpo.
- READ TABLE stack_ori WITH KEY fieldname = solokmpo-low.
- CHECK sy-subrc EQ 0.
- stack_aux = stack_ori.
- APPEND stack_aux.
- AT LAST.
- stack_ori[] = stack_aux[].
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM check_fromto_solokmpo.
- LOOP AT fromto.
- IF fromto-low IS INITIAL OR fromto-high IS INITIAL OR
- fromto-option NE 'EQ' OR fromto-SIGN NE 'I'.
- DELETE fromto.
- ENDIF.
- ENDLOOP.
- LOOP AT solokmpo.
- IF solokmpo-low IS INITIAL OR NOT solokmpo-high IS INITIAL OR
- solokmpo-option NE 'EQ' OR solokmpo-SIGN NE 'I'.
- DELETE solokmpo.
- ENDIF.
- ENDLOOP.
- ENDFORM.
- FORM work_data.
- * Psicologa inversa: fromto-high = stack_des es el fichero
- * fromto-low = stack_ori es la BBDDs
- CLEAR edx.
- LOOP AT dump.
- CLEAR: eax.
- LOOP AT stack_des.
- IF sinmandt = 'X' AND stack_des-fieldname = 'MANDT'.
- ADD stack_des-intlen TO eax.
- CONTINUE.
- ENDIF.
- READ TABLE stack_ori WITH KEY tabname = stack_des-tabname
- fieldname = stack_des-fieldname.
- IF sy-subrc NE 0.
- * No existe el campo habr que buscar alternativa
- READ TABLE fromto WITH KEY high = stack_des-fieldname.
- IF sy-subrc EQ 0.
- READ TABLE stack_ori
- WITH KEY tabname = stack_des-tabname
- fieldname = fromto-low.
- IF sy-subrc EQ 0.
- * La relacion es coherente
- stack_des-fieldname = fromto-low.
- ELSE.
- * Divorcio! La relacin no es correcta.
- ENDIF.
- ELSE.
- * No tenemos campo relacionado.
- ENDIF.
- ELSE.
- CONCATENATE stack_des-tabname '-' stack_des-fieldname
- INTO txt.
- CONDENSE txt NO-gaps.
- ASSIGN (txt) TO <f>.
- <f> = dump+eax(stack_des-intlen).
- ENDIF.
- ADD stack_des-intlen TO eax.
- ENDLOOP.
- ASSIGN (tab) TO <f>.
- CHECK test IS INITIAL.
- INSERT (tab) FROM <f>.
- ADD 1 TO edx.
- CHECK ( sy-subrc NE 0 AND NOT mupdate IS INITIAL ).
- UPDATE (tab) FROM <f>.
- ENDLOOP.
- MESSAGE s398(00) WITH edx ' Registro grabados'.
- ENDFORM.
- FORM compare TABLES ori STRUCTURE stack
- des STRUCTURE stack.
- LOOP AT ori.
- READ TABLE des WITH KEY tabname = ori-tabname
- fieldname = ori-fieldname.
- IF sy-subrc NE 0.
- WRITE: / 'No encontrado:', ori.
- ELSE.
- IF ori-keyflag NE des-keyflag OR
- ori-inttype NE des-inttype OR
- ori-intlen NE des-intlen.
- WRITE: / 'Campos distintos:',
- ori-fieldname, ori-inttype, ori-intlen.
- ENDIF.
- ENDIF.
- ENDLOOP.
- ENDFORM.
- FORM load_tab_data.
- DATA: sytabix LIKE sy-tabix,
- bkp LIKE dump.
- SELECT * FROM (tab) INTO TABLE dump.
- ASSIGN (tab) TO <k>.
- LOOP AT dump.
- sytabix = sy-tabix.
- <k> = dump.
- CLEAR: eax.
- LOOP AT solokmpo.
- CONCATENATE tab '-' solokmpo-low INTO txt.
- ASSIGN (txt) TO <f>. "Valor
- READ TABLE stack_ori WITH KEY fieldname = solokmpo-low.
- bkp+eax(stack_ori-intlen) = <f>.
- ADD stack_ori-intlen TO eax.
- AT LAST.
- dump = bkp.
- MODIFY dump INDEX sytabix.
- ENDAT.
- ENDLOOP.
- ENDLOOP.
- ENDFORM.
- FORM load_des TABLES stack_tab.
- SELECT * FROM dd03l INTO corresponding FIELDS OF TABLE stack_tab
- WHERE tabname = tab
- AND as4local = 'A'
- AND intlen <> 0
- ORDER BY POSITION.
- ENDFORM.
- *{ Carga de Ficheros
- FORM load_filez TABLES my_tab
- USING p_filez
- opc_pc
- opc_ho.
- CASE 'X'.
- WHEN opc_pc.
- PERFORM load_from_pc TABLES my_tab
- USING p_filez.
- WHEN opc_ho.
- PERFORM load_from_host TABLES my_tab
- USING p_filez.
- ENDCASE.
- ENDFORM.
- FORM save_filez TABLES my_tab
- USING p_filez
- opc_pc
- opc_ho.
- CASE 'X'.
- WHEN opc_pc.
- PERFORM save_to_pc TABLES my_tab
- USING p_filez.
- WHEN opc_ho.
- PERFORM save_to_host TABLES my_tab
- USING p_filez.
- ENDCASE.
- ENDFORM.
- *{ Host Module
- FORM save_to_host TABLES my_tab
- USING p_filez.
- OPEN DATASET p_filez FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
- LOOP AT my_tab.
- TRANSFER my_tab TO p_filez.
- ENDLOOP.
- CLOSE DATASET p_filez.
- ENDFORM.
- FORM load_from_host TABLES my_tab
- USING p_filez.
- OPEN DATASET p_filez FOR INPUT IN TEXT MODE ENCODING DEFAULT.
- CHECK sy-subrc EQ 0.
- DO.
- READ DATASET p_filez INTO my_tab.
- IF sy-subrc NE 0. EXIT. ENDIF.
- APPEND my_tab.
- ENDDO.
- CLOSE DATASET p_filez.
- ENDFORM.
- *{ PC Module
- FORM save_to_pc TABLES my_tab
- USING p_filez.
- IF p_filez IS INITIAL.
- CALL FUNCTION 'DOWNLOAD'
- EXPORTING
- filename = p_filez
- filetype = 'ASC'
- TABLES
- data_tab = my_tab
- EXCEPTIONS
- invalid_filesize = 4
- invalid_table_width = 4
- invalid_type = 4
- no_batch = 4
- unknown_error = 4
- gui_refuse_filetransfer = 4
- customer_error = 4
- OTHERS = 4.
- ELSE.
- CALL FUNCTION 'WS_DOWNLOAD'
- EXPORTING
- filename = p_filez
- filetype = 'ASC'
- TABLES
- data_tab = my_tab
- EXCEPTIONS
- file_open_error = 4
- file_write_error = 4
- invalid_filesize = 4
- invalid_type = 4
- no_batch = 4
- unknown_error = 4
- invalid_table_width = 4
- gui_refuse_filetransfer = 4
- customer_error = 4
- OTHERS = 4.
- ENDIF.
- CHECK sy-subrc NE 0.
- MESSAGE e398(00) WITH 'Error al descargar fichero.'.
- ENDFORM.
- FORM load_from_pc TABLES my_tab
- USING p_filez.
- IF p_filez IS INITIAL.
- CALL FUNCTION 'UPLOAD'
- EXPORTING
- filename = p_filez
- filetype = 'ASC'
- TABLES
- data_tab = my_tab
- EXCEPTIONS
- conversion_error = 4
- invalid_table_width = 4
- invalid_type = 4
- no_batch = 4
- unknown_error = 4
- gui_refuse_filetransfer = 4
- OTHERS = 4.
- ELSE.
- CALL FUNCTION 'WS_UPLOAD'
- EXPORTING
- filename = p_filez
- filetype = 'ASC'
- TABLES
- data_tab = my_tab
- EXCEPTIONS
- conversion_error = 4
- file_open_error = 4
- file_read_error = 4
- invalid_type = 4
- no_batch = 4
- unknown_error = 4
- invalid_table_width = 4
- gui_refuse_filetransfer = 4
- customer_error = 4
- OTHERS = 4.
- ENDIF.
- CHECK sy-subrc NE 0.
- MESSAGE e398(00) WITH 'Error al cargar fichero.'.
- ENDFORM.
- FORM help_me CHANGING p_filez LIKE rlgrap-filename.
- CALL FUNCTION 'WS_FILENAME_GET'
- EXPORTING
- def_filename = p_filez
- MASK = ',all files,*.*,data files,*.dat,text files,*.txt.'
- MODE = 'o'
- TITLE = 'Selecciona un fichero...'
- IMPORTING
- filename = p_filez
- EXCEPTIONS
- inv_winsys = 04
- no_batch = 04
- selection_cancel = 04
- selection_error = 04.
- ENDFORM.
Última modificación de la página el 04 November 2015 a las 15h04
Powered by
PmWiki