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.