data:
ltd_tlines like tline occurs 0 with header line,
lwa_header type thead.
*{ +@RMA6369
data: ls_id type thead-tdid,
ls_name type thead-tdname,
ls_objeto type thead-tdobject,
ls_lines type standard table of tline,
ls_header type thead,
ls_tabla type standard table of thead.
*} +@RMA6369
lwa_header-tdobject = 'EKKO'.
lwa_header-tdname = ip_ebeln.
lwa_header-tdid = 'F02'.
lwa_header-tdspras = 'S'.
ltd_tlines-tdformat = '*'.
ltd_tlines-tdline = ip_mblnr5.
append ltd_tlines.
call function 'SAVE_TEXT'
exporting
client = sy-mandt
header = lwa_header
savemode_direct = 'X'
tables
lines = ltd_tlines
exceptions
id = 1
language = 2
name = 3
object = 4
others = 5.
if sy-subrc <> 0.
* ----------ERROR.
else.
* ----------EXITO.
endif.
*{ +@RMA6369
ls_objeto = 'EKPO'.
concatenate ip_ebeln '00010' into ls_name.
ls_id = 'F01'.
call function 'SELECT_TEXT'
exporting
id = ls_id
language = sy-langu
name = ls_name
object = ls_objeto
importing
entries = sy-tfill
tables
selections = ls_tabla.
if sy-tfill = 0.
call function 'INIT_TEXT'
exporting
id = ls_id
language = sy-langu
name = ls_name
object = ls_objeto
importing
header = ls_header
tables
lines = ls_lines
exceptions
id = 1
language = 2
name = 3
object = 4.
else.
call function 'READ_TEXT'
exporting
id = ls_id
language = sy-langu
name = ls_name
object = ls_objeto
importing
header = ls_header
tables
lines = ls_lines
exceptions
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6.
endif.
call function 'EDIT_TEXT'
exporting
header = ls_header
save = 'X'
tables
lines = ls_lines.
call function 'SAVE_TEXT'
exporting
header = ls_header
savemode_direct = 'X'
tables
lines = ls_lines.
*} +@RMA6369
viernes, 4 de noviembre de 2016
martes, 18 de octubre de 2016
ABAP a SQL Server
En este turorial se enseñará cómo eliminar e insertar datos de ABAP a tablas de SQL server:
Se crea una clase SE24
ZCL_BC_EXTRACTOR_QV
METHOD INSERT_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_OPEN_SQL_ERROR,
LS_TEXTO TYPE STRING.
* Lógica para insertar los datos a Qlikview
TRY.
* Verificar tabla
IF DATA IS NOT INITIAL.
* Insertar los datos en la tabla de Qlikview
INSERT (TABNAME) CONNECTION (CON_NAME) FROM TABLE DATA.
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CATCH CX_SY_OPEN_SQL_ERROR INTO LO_SQL_ERROR.
LS_TEXTO = LO_SQL_ERROR->GET_LONGTEXT( ).
MESSAGE S001(ZTASA) WITH LS_TEXTO.
ENDTRY.
ENDMETHOD.
METHOD FORMAT_DATE.
CONSTANTS: LC_SPACE TYPE CHAR15 VALUE ' ',
LC_SEP TYPE CHAR01 VALUE '-'.
IF DATE IS NOT INITIAL OR DATE NE '00000000'.
* Formatea la fecha en formato SAP al formato en SQL
CONCATENATE DATE+0(4) LC_SEP DATE+4(2) LC_SEP DATE+6(2) LC_SPACE
INTO DATE_CHAR RESPECTING BLANKS.
ENDIF.
ENDMETHOD.
METHOD DELETE_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR,
LS_TEXTO TYPE STRING.
* Lógica para borrar los datos a Qlikview
TRY.
* Borrar los datos en la tabla de Qlikview
DELETE FROM (TABNAME) CONNECTION (CON_NAME) WHERE (CONDICION).
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.
LS_TEXTO = LO_SQL_ERROR->GET_LONGTEXT( ).
MESSAGE S001(ZTASA) WITH LS_TEXTO.
ENDTRY.
ENDMETHOD.
METHOD DELETE_ALL_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR.
* Lógica para borrar los datos a Qlikview
TRY.
* Borrar los datos en la tabla de Qlikview
DELETE FROM (TABNAME) CONNECTION (CON_NAME).
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.
ENDTRY.
ENDMETHOD.
Se crea un programa un programa ABAP, una tabla en R3 y una tabla en SQL con la misma estructura y nombre.
Nombre será el nombre de la tabla creada y PO_TABLA es el nombre de la tabla interna
* Clase conexión a base de datos QV
DATA : LO_EXTRACTOR TYPE REF TO ZCL_BC_EXTRACTOR_QV,
LS_FILTRO TYPE STRING,
LS_INICIO TYPE CHAR50,
LS_FIN TYPE CHAR50.
FIELD-SYMBOLS: <LS_FECHA> LIKE LINE OF GR_FECHA.
* Inicializar clase de conexión
* Creo el objeto
CREATE OBJECT LO_EXTRACTOR.
READ TABLE GR_FECHA ASSIGNING <LS_FECHA> INDEX 1.
IF SY-SUBRC = 0.
IF <LS_FECHA>-OPTION = 'BT'.
LS_INICIO = <LS_FECHA>-LOW.
LS_FIN = <LS_FECHA>-HIGH.
CONCATENATE 'FECHA BETWEEN ''' LS_INICIO ''' AND '''
LS_FIN '''' INTO LS_FILTRO RESPECTING BLANKS.
ELSEIF <LS_FECHA>-OPTION = 'EQ'.
LS_INICIO = <LS_FECHA>-LOW.
CONCATENATE 'FECHA = ''' LS_INICIO INTO LS_FILTRO RESPECTING BLANKS.
ENDIF.
* Borramos los registros
CALL METHOD LO_EXTRACTOR->DELETE_QV
EXPORTING
CON_NAME = ''BD_QLIKVIEW''
TABNAME = NOMBRE
CONDICION = LS_FILTRO.
ENDIF.
* Insertamos los registros
CALL METHOD LO_EXTRACTOR->INSERT_QV
EXPORTING
CON_NAME = 'BD_QLIKVIEW'
TABNAME = NOMBRE
DATA = PO_TABLA.
Se crea una clase SE24
ZCL_BC_EXTRACTOR_QV
METHOD INSERT_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_OPEN_SQL_ERROR,
LS_TEXTO TYPE STRING.
* Lógica para insertar los datos a Qlikview
TRY.
* Verificar tabla
IF DATA IS NOT INITIAL.
* Insertar los datos en la tabla de Qlikview
INSERT (TABNAME) CONNECTION (CON_NAME) FROM TABLE DATA.
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CATCH CX_SY_OPEN_SQL_ERROR INTO LO_SQL_ERROR.
LS_TEXTO = LO_SQL_ERROR->GET_LONGTEXT( ).
MESSAGE S001(ZTASA) WITH LS_TEXTO.
ENDTRY.
ENDMETHOD.
METHOD FORMAT_DATE.
CONSTANTS: LC_SPACE TYPE CHAR15 VALUE ' ',
LC_SEP TYPE CHAR01 VALUE '-'.
IF DATE IS NOT INITIAL OR DATE NE '00000000'.
* Formatea la fecha en formato SAP al formato en SQL
CONCATENATE DATE+0(4) LC_SEP DATE+4(2) LC_SEP DATE+6(2) LC_SPACE
INTO DATE_CHAR RESPECTING BLANKS.
ENDIF.
ENDMETHOD.
METHOD DELETE_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR,
LS_TEXTO TYPE STRING.
* Lógica para borrar los datos a Qlikview
TRY.
* Borrar los datos en la tabla de Qlikview
DELETE FROM (TABNAME) CONNECTION (CON_NAME) WHERE (CONDICION).
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.
LS_TEXTO = LO_SQL_ERROR->GET_LONGTEXT( ).
MESSAGE S001(ZTASA) WITH LS_TEXTO.
ENDTRY.
ENDMETHOD.
METHOD DELETE_ALL_QV.
DATA: LO_CONNECT TYPE REF TO CL_SQL_CONNECTION,
LO_SQL_ERROR TYPE REF TO CX_SY_NATIVE_SQL_ERROR.
* Lógica para borrar los datos a Qlikview
TRY.
* Borrar los datos en la tabla de Qlikview
DELETE FROM (TABNAME) CONNECTION (CON_NAME).
IF SY-SUBRC IS INITIAL.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
CATCH CX_SY_NATIVE_SQL_ERROR INTO LO_SQL_ERROR.
ENDTRY.
ENDMETHOD.
Se crea un programa un programa ABAP, una tabla en R3 y una tabla en SQL con la misma estructura y nombre.
Nombre será el nombre de la tabla creada y PO_TABLA es el nombre de la tabla interna
* Clase conexión a base de datos QV
DATA : LO_EXTRACTOR TYPE REF TO ZCL_BC_EXTRACTOR_QV,
LS_FILTRO TYPE STRING,
LS_INICIO TYPE CHAR50,
LS_FIN TYPE CHAR50.
FIELD-SYMBOLS: <LS_FECHA> LIKE LINE OF GR_FECHA.
* Inicializar clase de conexión
* Creo el objeto
CREATE OBJECT LO_EXTRACTOR.
READ TABLE GR_FECHA ASSIGNING <LS_FECHA> INDEX 1.
IF SY-SUBRC = 0.
IF <LS_FECHA>-OPTION = 'BT'.
LS_INICIO = <LS_FECHA>-LOW.
LS_FIN = <LS_FECHA>-HIGH.
CONCATENATE 'FECHA BETWEEN ''' LS_INICIO ''' AND '''
LS_FIN '''' INTO LS_FILTRO RESPECTING BLANKS.
ELSEIF <LS_FECHA>-OPTION = 'EQ'.
LS_INICIO = <LS_FECHA>-LOW.
CONCATENATE 'FECHA = ''' LS_INICIO INTO LS_FILTRO RESPECTING BLANKS.
ENDIF.
* Borramos los registros
CALL METHOD LO_EXTRACTOR->DELETE_QV
EXPORTING
CON_NAME = ''BD_QLIKVIEW''
TABNAME = NOMBRE
CONDICION = LS_FILTRO.
ENDIF.
* Insertamos los registros
CALL METHOD LO_EXTRACTOR->INSERT_QV
EXPORTING
CON_NAME = 'BD_QLIKVIEW'
TABNAME = NOMBRE
DATA = PO_TABLA.
lunes, 19 de septiembre de 2016
User Exit XK01 / MK01
Cuando se crea o modifica un proveedor y se ingresa un NIF ya existente SAP te da un mensaje de advertencia que el NIF ya existe, en este caso se hará la validación que no se deba ingresar un NIF ya existente por cada sociedad existente
*I_LFB1-BUKRS
*Primero se valida que el grupo de cuenta inicie con 'P'
IF i_lfa1-ktokk+0(1) = 'P'.
CLEAR ls_stcd1.
SELECT SINGLE a~stcd1 INTO ls_stcd1
FROM lfa1 AS a INNER JOIN lfb1 AS b ON
a~lifnr = b~lifnr
WHERE a~stcd1 = i_lfa1-stcd1 AND
b~bukrs = i_lfb1-bukrs.
*Si se crea acreedor
IF sy-subrc EQ 0 AND sy-tcode EQ 'MK01'.
MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
ENDIF.
*Si se modifica acreedor
IF sy-tcode EQ 'MK02'.
SELECT SINGLE a~lifnr INTO ls_lifnr FROM lfa1 AS a INNER JOIN lfb1 AS b ON
a~lifnr = b~lifnr
WHERE a~stcd1 = i_lfa1-stcd1
AND a~lifnr = i_lfa1-lifnr
AND b~bukrs = i_lfb1-bukrs.
IF sy-subrc EQ 0.
ELSE.
SELECT SINGLE * FROM lfa1 WHERE stcd1 = i_lfa1-stcd1.
IF sy-subrc = 0.
MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
Se usará el siguiente include ZXF05U01 y se pondrá lo siguiente :
IF sy-tcode EQ 'MK01' OR sy-tcode EQ 'MK02'.
*I_LFB1-BUKRS
*Primero se valida que el grupo de cuenta inicie con 'P'
IF i_lfa1-ktokk+0(1) = 'P'.
CLEAR ls_stcd1.
SELECT SINGLE a~stcd1 INTO ls_stcd1
FROM lfa1 AS a INNER JOIN lfb1 AS b ON
a~lifnr = b~lifnr
WHERE a~stcd1 = i_lfa1-stcd1 AND
b~bukrs = i_lfb1-bukrs.
*Si se crea acreedor
IF sy-subrc EQ 0 AND sy-tcode EQ 'MK01'.
MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
ENDIF.
*Si se modifica acreedor
IF sy-tcode EQ 'MK02'.
SELECT SINGLE a~lifnr INTO ls_lifnr FROM lfa1 AS a INNER JOIN lfb1 AS b ON
a~lifnr = b~lifnr
WHERE a~stcd1 = i_lfa1-stcd1
AND a~lifnr = i_lfa1-lifnr
AND b~bukrs = i_lfb1-bukrs.
IF sy-subrc EQ 0.
ELSE.
SELECT SINGLE * FROM lfa1 WHERE stcd1 = i_lfa1-stcd1.
IF sy-subrc = 0.
MESSAGE 'Nº ident.fis.1 ya existe' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
jueves, 18 de febrero de 2016
Infotipos
PC_PAYRESULT -> Todos los tipos de nomina
Infotipo 008 -> Nominas 6T20 Valor día, 6T21 Valor día asignación familiar
FTTP
ZBC_RFC_UTIL_BASE64_A_FTP
* Autor : Roberto Mejia Andrade *
* Consultora : Xternal *
* Módulo : SF *
* Fecha : 15.02.2016 *
* Req : R3_001 *
* Descripción: Guardar archivo en base 64 a FTP *
*----------------------------------------------------------------------*
DATA: ls_handle TYPE i,
ls_long TYPE i,
ls_valida TYPE flag,
ls_aux TYPE c LENGTH 255,
ls_aux1 TYPE string,
ls_aux2 TYPE string,
ls_user TYPE c LENGTH 300,
ls_clave TYPE c LENGTH 300,
ls_host TYPE c LENGTH 300,
ls_xst TYPE xstring,
ls_mensaje TYPE string,
ls_ruta TYPE c LENGTH 300,
ls_ruta1 TYPE c LENGTH 300,
ls_data TYPE c LENGTH 26200,
ls_dato TYPE string,
ltd_data LIKE STANDARD TABLE OF ls_data,
ltd_data1 LIKE STANDARD TABLE OF ls_data,
ltd_data2 LIKE STANDARD TABLE OF ls_data.
FIELD-SYMBOLS: <ls_arb64> TYPE zwut_arb64,
<ls_mensaje> TYPE zflmin..
* Si los parámetros IP_SVFTP o IP_USUAR no existen se obtendrán estos valores
* de la tabla ZTBC_DATA donde CODIG = 'X5
IF ip_svftp IS INITIAL.
SELECT SINGLE descr INTO ip_svftp FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'SERVERFTP'.
ENDIF.
IF ip_usuar IS INITIAL.
SELECT SINGLE descr INTO ip_usuar FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'USUARIOFTP'.
SELECT SINGLE descr INTO ip_clave FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'PASSFTP'.
ENDIF.
* Usar IP_RFCDS igual a 'SAPFTPA' para cuando la función se ejecuta como
* proceso en fondo, sino IP_RFCDS = 'SAPFTP'
IF sy-batch = 'X'.
ip_rfcds = 'SAPFTPA'.
ELSE.
ip_rfcds = 'SAPFTP'.
ENDIF.
ls_user = ip_usuar.
ls_clave = ip_clave.
ls_host = ip_svftp.
LOOP AT it_arb64 ASSIGNING <ls_arb64>.
* Estos datos servirán para la conexión con el FTP mediante la función FTP_CONNECT
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
user = ls_user
password = ls_clave
host = ls_host
rfc_destination = ip_rfcds
IMPORTING
handle = ls_handle
EXCEPTIONS
not_connected = 1
OTHERS = 2.
IF sy-subrc = 0.
CLEAR: ltd_data[], ls_ruta1, ls_valida.
ls_aux = <ls_arb64>-rtarc.
IF ls_aux IS NOT INITIAL.
IF ls_aux+0(1) = '/'.
CLEAR ls_aux+0(1).
ENDIF.
CONDENSE ls_aux NO-GAPS.
ls_long = strlen( ls_aux ).
ls_long = ls_long - 1.
IF ls_aux+ls_long(1) = '/'.
CLEAR ls_aux+ls_long(1).
ENDIF.
ENDIF.
CLEAR ls_long.
CONCATENATE <ls_arb64>-rtarc <ls_arb64>-nmarc INTO ls_ruta
SEPARATED BY '/'.
REPLACE ALL OCCURRENCES OF '//' IN ls_ruta WITH '/'.
CHECK ls_valida IS INITIAL.
CLEAR ltd_data[].
IF <ls_arb64>-tpope = 'B'.
* Elimina el archivo existente
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
CLEAR ls_ruta1.
ls_ruta1 = ls_ruta.
CONCATENATE 'del' ls_ruta INTO ls_ruta SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc = 0.
<ls_mensaje>-cmin = 'S'.
CONCATENATE ls_ruta1 ': Archivo eliminado'
INTO <ls_mensaje>-dsmin.
ELSE.
<ls_mensaje>-cmin = 'E'.
CONCATENATE ls_ruta1 ': Archivo no eliminado'
INTO <ls_mensaje>-dsmin.
ENDIF.
ELSEIF <ls_arb64>-tpope = 'C'.
SPLIT ls_aux AT '/' INTO ls_aux ls_aux1.
IF ls_aux1 IS INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
ELSE.
WHILE ls_aux1 IS NOT INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
SPLIT ls_aux1 AT '/' INTO ls_aux2 ls_aux1.
CONCATENATE ls_aux ls_aux2 INTO ls_aux SEPARATED BY '/'.
IF ls_aux1 IS INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
ENDIF.
ENDWHILE.
ENDIF.
* Crear los archivos
IF <ls_arb64>-bas64 IS NOT INITIAL.
* Pasamos de base 64 a xstring
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = <ls_arb64>-bas64
IMPORTING
bindata = ls_xst
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_input_data_error = 5
ssf_krn_invalid_par = 6
ssf_krn_invalid_parlen = 7
OTHERS = 8.
* Pasamos de xstring a binario
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = ls_xst
IMPORTING
output_length = ls_long
TABLES
binary_tab = ltd_data2.
* Función para cargar archivo al servidor FTTP
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
handle = ls_handle
fname = ls_ruta
blob_length = ls_long
* character_mode = 'X'
TABLES
blob = ltd_data2
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc = 0.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'S'.
CONCATENATE <ls_arb64>-nmarc ': Archivo cargado correctamente'
INTO <ls_mensaje>-dsmin.
ELSE.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'E'.
CONCATENATE <ls_arb64>-nmarc ': Archivo con errores / Atchivo no cargado'
INTO <ls_mensaje>-dsmin.
ENDIF.
ENDIF.
ENDIF.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
handle = ls_handle.
ELSE.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'E'.
CONCATENATE ls_host ': No se pudo conectar al servidor FTTP'
INTO <ls_mensaje>-dsmin.
EXIT.
ENDIF.
ENDLOOP.
* Autor : Roberto Mejia Andrade *
* Consultora : Xternal *
* Módulo : SF *
* Fecha : 15.02.2016 *
* Req : R3_001 *
* Descripción: Guardar archivo en base 64 a FTP *
*----------------------------------------------------------------------*
DATA: ls_handle TYPE i,
ls_long TYPE i,
ls_valida TYPE flag,
ls_aux TYPE c LENGTH 255,
ls_aux1 TYPE string,
ls_aux2 TYPE string,
ls_user TYPE c LENGTH 300,
ls_clave TYPE c LENGTH 300,
ls_host TYPE c LENGTH 300,
ls_xst TYPE xstring,
ls_mensaje TYPE string,
ls_ruta TYPE c LENGTH 300,
ls_ruta1 TYPE c LENGTH 300,
ls_data TYPE c LENGTH 26200,
ls_dato TYPE string,
ltd_data LIKE STANDARD TABLE OF ls_data,
ltd_data1 LIKE STANDARD TABLE OF ls_data,
ltd_data2 LIKE STANDARD TABLE OF ls_data.
FIELD-SYMBOLS: <ls_arb64> TYPE zwut_arb64,
<ls_mensaje> TYPE zflmin..
* Si los parámetros IP_SVFTP o IP_USUAR no existen se obtendrán estos valores
* de la tabla ZTBC_DATA donde CODIG = 'X5
IF ip_svftp IS INITIAL.
SELECT SINGLE descr INTO ip_svftp FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'SERVERFTP'.
ENDIF.
IF ip_usuar IS INITIAL.
SELECT SINGLE descr INTO ip_usuar FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'USUARIOFTP'.
SELECT SINGLE descr INTO ip_clave FROM ztbc_data
WHERE codig = 'X5' AND
argum = 'PASSFTP'.
ENDIF.
* Usar IP_RFCDS igual a 'SAPFTPA' para cuando la función se ejecuta como
* proceso en fondo, sino IP_RFCDS = 'SAPFTP'
IF sy-batch = 'X'.
ip_rfcds = 'SAPFTPA'.
ELSE.
ip_rfcds = 'SAPFTP'.
ENDIF.
ls_user = ip_usuar.
ls_clave = ip_clave.
ls_host = ip_svftp.
LOOP AT it_arb64 ASSIGNING <ls_arb64>.
* Estos datos servirán para la conexión con el FTP mediante la función FTP_CONNECT
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
user = ls_user
password = ls_clave
host = ls_host
rfc_destination = ip_rfcds
IMPORTING
handle = ls_handle
EXCEPTIONS
not_connected = 1
OTHERS = 2.
IF sy-subrc = 0.
CLEAR: ltd_data[], ls_ruta1, ls_valida.
ls_aux = <ls_arb64>-rtarc.
IF ls_aux IS NOT INITIAL.
IF ls_aux+0(1) = '/'.
CLEAR ls_aux+0(1).
ENDIF.
CONDENSE ls_aux NO-GAPS.
ls_long = strlen( ls_aux ).
ls_long = ls_long - 1.
IF ls_aux+ls_long(1) = '/'.
CLEAR ls_aux+ls_long(1).
ENDIF.
ENDIF.
CLEAR ls_long.
CONCATENATE <ls_arb64>-rtarc <ls_arb64>-nmarc INTO ls_ruta
SEPARATED BY '/'.
REPLACE ALL OCCURRENCES OF '//' IN ls_ruta WITH '/'.
CHECK ls_valida IS INITIAL.
CLEAR ltd_data[].
IF <ls_arb64>-tpope = 'B'.
* Elimina el archivo existente
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
CLEAR ls_ruta1.
ls_ruta1 = ls_ruta.
CONCATENATE 'del' ls_ruta INTO ls_ruta SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc = 0.
<ls_mensaje>-cmin = 'S'.
CONCATENATE ls_ruta1 ': Archivo eliminado'
INTO <ls_mensaje>-dsmin.
ELSE.
<ls_mensaje>-cmin = 'E'.
CONCATENATE ls_ruta1 ': Archivo no eliminado'
INTO <ls_mensaje>-dsmin.
ENDIF.
ELSEIF <ls_arb64>-tpope = 'C'.
SPLIT ls_aux AT '/' INTO ls_aux ls_aux1.
IF ls_aux1 IS INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
ELSE.
WHILE ls_aux1 IS NOT INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
SPLIT ls_aux1 AT '/' INTO ls_aux2 ls_aux1.
CONCATENATE ls_aux ls_aux2 INTO ls_aux SEPARATED BY '/'.
IF ls_aux1 IS INITIAL.
* Verificamos si existe la ruta
CONCATENATE 'dir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
IF sy-subrc NE 0.
* Procedemos a crear el directorio
CLEAR ls_ruta1.
CONCATENATE 'mkdir' ls_aux INTO ls_ruta1 SEPARATED BY space.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = ls_handle
command = ls_ruta1
TABLES
data = ltd_data
EXCEPTIONS
command_error = 1
tcpip_error = 2.
ENDIF.
ENDIF.
ENDWHILE.
ENDIF.
* Crear los archivos
IF <ls_arb64>-bas64 IS NOT INITIAL.
* Pasamos de base 64 a xstring
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = <ls_arb64>-bas64
IMPORTING
bindata = ls_xst
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_input_data_error = 5
ssf_krn_invalid_par = 6
ssf_krn_invalid_parlen = 7
OTHERS = 8.
* Pasamos de xstring a binario
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = ls_xst
IMPORTING
output_length = ls_long
TABLES
binary_tab = ltd_data2.
* Función para cargar archivo al servidor FTTP
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
handle = ls_handle
fname = ls_ruta
blob_length = ls_long
* character_mode = 'X'
TABLES
blob = ltd_data2
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3
OTHERS = 4.
IF sy-subrc = 0.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'S'.
CONCATENATE <ls_arb64>-nmarc ': Archivo cargado correctamente'
INTO <ls_mensaje>-dsmin.
ELSE.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'E'.
CONCATENATE <ls_arb64>-nmarc ': Archivo con errores / Atchivo no cargado'
INTO <ls_mensaje>-dsmin.
ENDIF.
ENDIF.
ENDIF.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
handle = ls_handle.
ELSE.
APPEND INITIAL LINE TO et_mensj ASSIGNING <ls_mensaje>.
<ls_mensaje>-cmin = 'E'.
CONCATENATE ls_host ': No se pudo conectar al servidor FTTP'
INTO <ls_mensaje>-dsmin.
EXIT.
ENDIF.
ENDLOOP.
martes, 26 de enero de 2016
Field exit va01
Objetivo: validar que el cliente tenga área de control de créditos
1. VA01 -> Se busca el elemento de datos del campo a validar, en este caso solicitante
3. Ponemos el siguiente código
DATA: ls_ctrl TYPE c LENGTH 1,
ls_kunnr TYPE kuagv-kunnr.
IF input IS NOT INITIAL AND sy-ucomm = 'SICH'.
CLEAR ls_ctrl.
* Leer flag desde tabla constantes para iniciar control
SELECT SINGLE low INTO ls_ctrl
FROM ztb_constantes
WHERE aplicacion = 'SD'
AND programa = 'MV45AFZZ'
AND campo = 'CTRL'.
* Si flag es igual a X ejecutar el control de existencia de la linea de credito del cliente
IF sy-subrc = 0 AND ( ls_ctrl = 'X' OR ls_ctrl = 'x' ).
SELECT SINGLE kunnr INTO ls_kunnr
FROM knkk
WHERE kunnr = input.
IF sy-subrc <> 0. " Si no tiene Área de control de crédito
MESSAGE 'El Cliente NO tiene Área de Control de Crédito asignada. Coordinar con el área de Ctas. X Cobrar'
TYPE 'E'.
ENDIF.
ENDIF.
3. Vamos al programa RSMODPRF, ejecutamos sin ponen ningún parámetro
1. VA01 -> Se busca el elemento de datos del campo a validar, en este caso solicitante
2.Vamos al programa RSMODPRF, ejecutamos, creamos la función FIELD_EXIT_KUNAG:
DATA: ls_ctrl TYPE c LENGTH 1,
ls_kunnr TYPE kuagv-kunnr.
IF input IS NOT INITIAL AND sy-ucomm = 'SICH'.
CLEAR ls_ctrl.
* Leer flag desde tabla constantes para iniciar control
SELECT SINGLE low INTO ls_ctrl
FROM ztb_constantes
WHERE aplicacion = 'SD'
AND programa = 'MV45AFZZ'
AND campo = 'CTRL'.
* Si flag es igual a X ejecutar el control de existencia de la linea de credito del cliente
IF sy-subrc = 0 AND ( ls_ctrl = 'X' OR ls_ctrl = 'x' ).
SELECT SINGLE kunnr INTO ls_kunnr
FROM knkk
WHERE kunnr = input.
IF sy-subrc <> 0. " Si no tiene Área de control de crédito
MESSAGE 'El Cliente NO tiene Área de Control de Crédito asignada. Coordinar con el área de Ctas. X Cobrar'
TYPE 'E'.
ENDIF.
ENDIF.
3. Vamos al programa RSMODPRF, ejecutamos sin ponen ningún parámetro
4. Buscamos nuestro elemento de datos y click en asignar Prog
Finalmente activamos y listo
Suscribirse a:
Entradas (Atom)