Retracción de BPC a R3 : Para realizar esta acción , utilizaremos la BADI de BPC IF_UJ_CUSTOM_LOGIC~EXECUTE . En dicha BADI llamaremos a la función Z en BW , que cargará los datos en Cubo de BW desde un cubo de BPC. Luego llamaremos a dos BAPI de R3 via RFC , una para el modulo de CO y otra para el modulo FM . Aqui debajo , parte del codigo :
IF_UJ_CUSTOM_LOGIC~EXECUTE:
METHOD if_uj_custom_logic~execute.
DATA: ls_param LIKE LINE OF it_param,
l_param(30).
DATA: lv_data(4) TYPE c,
lv_gjahr(4) TYPE n.
DATA: wa_error TYPE uj0_s_message.
DATA : lv_uzeit TYPE sy-uzeit,
lv_zuser TYPE sy-uname,
lv_datum TYPE sy-datum.
*Ini Testing
READ TABLE it_param INTO ls_param WITH KEY hashkey = 'TIEMPO'.
IF sy-subrc EQ 0.
lv_data = ls_param-hashvalue.
ELSE.
EXIT.
ENDIF.
lv_gjahr = lv_data(4).
*Llamado a Retraccion
CALL FUNCTION 'ZBW001_RETRACBWR3'
EXPORTING
i_gjahr = lv_gjahr
IMPORTING
err_uzeit = lv_uzeit
err_zuser = lv_zuser
err_datum = lv_datum
EXCEPTIONS
error_cadena = 1
error_ejecucion_duplicada = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
*Error de Cadena
IF sy-subrc EQ 1.
wa_error-msgid = 'ZBW001'.
wa_error-msgty = 'E'.
wa_error-msgno = '003'.
APPEND wa_error TO et_message.
ELSEIF sy-subrc EQ 2. "Año Duplicado
CONCATENATE lv_datum '-' lv_uzeit '-' lv_zuser INTO wa_error-msgv1.
wa_error-msgid = 'ZBW001'.
wa_error-msgty = 'E'.
wa_error-msgno = '007'.
APPEND wa_error TO et_message.
ENDIF.
ENDMETHOD.
FUNCION :
DATA : lv_nameco TYPE tbtcjob-jobname,
lv_namefm TYPE tbtcjob-jobname.
DATA : lv_countfm TYPE tbtcjob-jobcount,
lv_countco TYPE tbtcjob-jobcount.
DATA: lt_param TYPE STANDARD TABLE OF rsparams,
wa_param TYPE rsparams,
ls_params TYPE pri_params,
l_valid TYPE c.
DATA : sdate TYPE tbtcjob-sdlstrtdt ,
stime TYPE tbtcjob-sdlstrttm .
DATA : lv_ok TYPE c.
*Validacion Ejercicio
PERFORM f_val_ejercicio USING i_gjahr
CHANGING lv_ok
err_zuser
err_uzeit
err_datum.
IF lv_ok IS INITIAL.
RAISE error_ejecucion_duplicada.
ENDIF.
IF i_notchain IS INITIAL.
*Ejecutar Cadena
PERFORM f_run_chain CHANGING lv_ok.
IF lv_ok IS INITIAL.
RAISE error_cadena.
ENDIF.
CHECK lv_ok = 'X'.
ENDIF.
*----------------------------
COMMIT WORK AND WAIT.
WAIT UP TO 20 SECONDS.
*----------------------------
*Name Job FM
PERFORM f_name_job USING 'FM'
CHANGING lv_namefm.
*Name Job CO
PERFORM f_name_job USING 'CO'
CHANGING lv_nameco.
*Parameters
wa_param-selname = 'SO_GJAHR'.
wa_param-kind = 'S'. " here P is parameter s is select-option
wa_param-option = 'EQ'.
wa_param-sign = 'I'.
wa_param-low = i_gjahr.
APPEND wa_param TO lt_param.
*Get Print Parameters
CALL FUNCTION 'GET_PRINT_PARAMETERS'
EXPORTING
no_dialog = 'X'
destination = 'LP01'
IMPORTING
valid = l_valid
out_parameters = ls_params.
*--------------------------------FM--------------------------------
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobgroup = 'RETRA' "GDP 25/08/2015
jobname = lv_namefm
IMPORTING
jobcount = lv_countfm
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
*Submit report to job
SUBMIT zbwbi002
WITH SELECTION-TABLE lt_param
VIA JOB lv_namefm
NUMBER lv_countfm
* USER 'BWREMOTE' "GDP 24/08/15
TO SAP-SPOOL WITHOUT SPOOL DYNPRO
SPOOL PARAMETERS ls_params
AND RETURN.
GET TIME.
sdate = sy-datum.
stime = sy-uzeit + 250.
*Schedule and close job.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_countfm
jobname = lv_namefm
sdlstrtdt = sdate
sdlstrttm = stime
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
invalid_target = 8
OTHERS = 9.
*sdlstrtdt = sdate
*--------------------------------CO--------------------------------
*Open Job CO
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobgroup = 'RETRA' "GDP 25/08/2015
jobname = lv_nameco
IMPORTING
jobcount = lv_countco
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
*Submit report to job
SUBMIT zbwbi001
WITH SELECTION-TABLE lt_param
VIA JOB lv_nameco
NUMBER lv_countco
* USER 'BWREMOTE' "GDP 24/08/15
TO SAP-SPOOL WITHOUT SPOOL DYNPRO
SPOOL PARAMETERS ls_params
AND RETURN.
GET TIME.
sdate = sy-datum.
stime = sy-uzeit + 250
.
*Schedule and close job.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_countco
jobname = lv_nameco
sdlstrtdt = sdate
sdlstrttm = stime
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
invalid_target = 8
OTHERS = 9.
*sdlstrtdt = sdate
*Actualizar Validacion Ejercicio
PERFORM upd_gjahr USING i_gjahr.
ENDFUNCTION.
UNO DE LOS PROGRAMAS QUE REALIZA LA RETRACCIÓN USANDO LA BAPI (FM) :
*==================================================================
* S T A R T - O F - S E L E C T I O N
*==================================================================
START-OF-SELECTION.
CLEAR : gt_datafm[],
gt_errorfm[].
*Busqueda de Datos Retracción
PERFORM f_get_data_retrac_fm CHANGING gt_datafm[]
gt_errorfm[].
*Llamar Retraccion
PERFORM f_retraccion_fm USING gt_datafm[]
CHANGING gt_errorfm[].
*&---------------------------------------------------------------------*
*& Form F_RETRACCION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- nbsp="" p2="" span="" text="">
*----------------------------------------------------------------------*
FORM f_retraccion_fm USING ptc_data TYPE tyt_fm
CHANGING ptc_error TYPE tyt_error.
CONSTANTS : lc_300(7) TYPE c VALUE 'DSH_300',
lc_bwd(3) TYPE c VALUE 'BWD'.
DATA: lv_per TYPE co_perab,
lv_cont(3) TYPE c.
DATA: lv_periodo(3) TYPE c.
DATA: ls_headerinfo TYPE bapiplnhdr,
lt_indexstructure TYPE TABLE OF bapiacpstru,
le_indexstructure TYPE bapiacpstru,
lt_coobject TYPE TABLE OF bapipcpobj,
le_coobject TYPE bapipcpobj,
lt_pervalue TYPE TABLE OF bapipcpval,
le_pervalue TYPE bapipcpval,
lt_totvalue TYPE TABLE OF bapipcptot,
lt_contrl TYPE TABLE OF bapipcpctrl,
lt_return TYPE TABLE OF bapiret2,
ls_commit_ret TYPE bapiret2,
ls_return LIKE LINE OF lt_return.
DATA : le_data LIKE LINE OF ptc_data,
le_datax LIKE LINE OF ptc_data.
DATA : lv_destination TYPE string.
*Obtener Destino RFC
SELECT SINGLE destination INTO lv_destination
FROM zbwt004 WHERE origen EQ sy-sysid.
IF sy-subrc NE 0 OR lv_destination IS INITIAL.
MESSAGE e006(zbw001).
ENDIF.
CONDENSE lv_destination.
*--------------------------------------------------------
PERFORM f_cargar_datos_para_bapi
USING gc_fikrs
gc_valtyp
gc_proces
gc_budcat
gc_versio
gc_doctyp
gc_budtyp
gc_docsta
gt_datafm[]
lv_destination
ptc_error[]
CHANGING ge_header
ge_header_add
gt_item[]
gt_period[] .
ENDFORM. "f_retraccion_fm-->
*&---------------------------------------------------------------------*
*& Form f_cargar_datos_para_bapi
*&---------------------------------------------------------------------*
* Arma la tabla BDC
*----------------------------------------------------------------------*
* -->PTI_ARCHIVO Archivo de entrada
* <--ptc_item artidas="" ind.="" nbsp="" oc.entrada:="" span="">
* <--ptc_period er="" individuales="" nbsp="" oc.entrada="" odos="" partidas="" span="">
* -->PVI_FIKRS Entidad CP
* -->PVI_VALTYP Tipo de Valor BCS
* -->PVI_WAERS Moneda de Transacción
* -->PVI_PROCES Proceso
* -->PVI_BUDCAT Categoría de Presupuesto
* -->PVI_VERSIO Versión
* -->PVI_DOCTYP Clase de Documento
* -->PVI_DOCDAT Fecha de Documento
* -->PVI_FISCYE Ejercicio
* -->PVI_RPMAX Período
* -->PVI_BUDTYP Clase de Presupuesto
* -->PVI_RESPPE Responsable
* -->PVI_TEXT50 Texto de Cabecera
* -->PVI_TEXTNA Nombre de Texto
* -->PVI_DOCSTATE Status de un documento de entrada de presupuesto
* <--pec_header atos="" cabecera="" de="" entrada="" nbsp="" p.documento="" span="">
* <--pec_header_add adicionales="" atos="" cabecera="" nbsp="" span="">
*----------------------------------------------------------------------*
FORM f_cargar_datos_para_bapi
USING pve_fikrs
pve_valtyp
pve_proces
pve_budcat
pve_versio
pve_doctyp
pve_budtyp
pve_docstate
ptc_datafm TYPE tyt_fm
pve_destination
ptc_error TYPE tyt_error
CHANGING pec_header TYPE zbapi_0050_header
pec_header_add TYPE zbapi_0050_header_add
ptc_item TYPE ztbapi_0050_item
ptc_period TYPE ztbapi_0050_period .
DATA: le_datafm TYPE ty_fm,
le_item TYPE zbapi_0050_item,
le_period TYPE zbapi_0050_period,
lv_item TYPE i.
DATA : lv_docdat TYPE sy-datum.
*Fecha Documento
lv_docdat = sy-datum.
*Cargar Cabecera
CLEAR lv_item.
PERFORM f_cargar_cabecera USING pve_fikrs
pve_proces
pve_versio
pve_doctyp
lv_docdat
pve_docstate
CHANGING pec_header.
*Info Add
PERFORM f_cargar_cabecera_add USING p_resp
p_text
p_name
CHANGING pec_header_add.
*Carga Items
LOOP AT ptc_datafm INTO le_datafm.
lv_item = lv_item + 1.
PERFORM f_cargar_item USING le_datafm-fiscper
pve_budcat
pve_budtyp
le_datafm-moneda
pve_valtyp
le_datafm
lv_item
CHANGING le_item
le_period.
APPEND le_item TO ptc_item.
IF le_period IS NOT INITIAL.
APPEND le_period TO ptc_period.
ENDIF.
*---Ejecutar BAPI
PERFORM f_ejecutar_bapi
USING pec_header
pec_header_add
ptc_item[]
pve_destination
CHANGING gt_log[]
ptc_error[]
ptc_period[].
CLEAR ptc_period[].
CLEAR ptc_error[].
CLEAR gt_log[].
CLEAR ptc_item[].
CLEAR lv_item.
ENDLOOP.
ENDFORM. " f_cargar_datos_para_bapi--pec_header_add> --pec_header>--ptc_period>--ptc_item>
*&---------------------------------------------------------------------*
*& Form F_EJECUTAR_BAPI
*&---------------------------------------------------------------------*
* Ejecutar BAPI_0050_CREATE
*----------------------------------------------------------------------*
* -->PTI_ITEM Doc.entrada: Partidas ind.
* -->PTI_PERIOD Doc.entrada CP: Períodos partidas individuales
* -->PTI_LOG Log de errores
* -->PEI_HEADER Datos de cabecera p.documento de entrada
* -->PEI_HEADER_ADD Datos cabecera adicionales
*----------------------------------------------------------------------*
FORM f_ejecutar_bapi
USING pei_header TYPE zbapi_0050_header
pei_header_add TYPE zbapi_0050_header_add
pti_item TYPE ztbapi_0050_item
pve_destination
CHANGING pti_log TYPE tyt_log
ptc_error TYPE tyt_error
pti_period TYPE ztbapi_0050_period.
* Local data
DATA: lv_lineas TYPE i, " Variable Cantidad de Registros Cargados
lt_return TYPE STANDARD TABLE OF bapiret2,
le_return TYPE bapiret2,
le_log TYPE tye_log,
lv_param(100) TYPE c,
le_item LIKE LINE OF pti_item,
le_period LIKE LINE OF pti_period .
DATA : lt_error TYPE STANDARD TABLE OF zbwt003,
lt_logdata TYPE STANDARD TABLE OF zbwt006,
le_error TYPE zbwt003,
le_logdata TYPE zbwt006.
CALL FUNCTION 'BAPI_0050_CREATE' DESTINATION pve_destination
EXPORTING
header_data = pei_header
header_data_add = pei_header_add
testrun = ''
TABLES
item_data = pti_item[]
* sender_item_data = pti_sender_item_
period_data = pti_period[]
* sender_period_data = i_sender_period_data
return = lt_return[].
READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION pve_destination
EXPORTING
wait = 'X'.
* Mensaje exitoso
LOOP AT pti_item INTO le_item.
CLEAR lv_param.
CONCATENATE 'CG' le_item-funds_ctr '-CC' le_item-cmmt_item '-AF' le_item-func_area
INTO lv_param.
MESSAGE s001(zbw001) WITH lv_param. "Mensaje Ok
IF sy-batch IS INITIAL.
WRITE :/ 'OK' , lv_param.
ENDIF.
* GRABAR LOG FM
CLEAR le_return.
READ TABLE lt_return INTO le_return WITH KEY type = 'S' .
*------Busqueda del periodo
SORT pti_period BY item_num.
READ TABLE pti_period INTO le_period
WITH KEY item_num = le_item-item_num
BINARY SEARCH.
IF sy-subrc EQ 0.
*-------Registro de Error DB
PERFORM f_fill_log USING le_item
le_period
pei_header
le_return-message_v2+8(10)
CHANGING le_logdata.
APPEND le_logdata TO lt_logdata.
ENDIF.
ENDLOOP.
*------Grabar en BD
MODIFY zbwt006 FROM TABLE lt_logdata.
IF sy-subrc EQ 0.
COMMIT WORK AND WAIT.
ENDIF.
ELSE.
gv_errorfm = 'X'. "GDP 16.11.2015
* Función para mostrar el log de mensajes
READ TABLE lt_return INTO le_return WITH KEY type = 'E'
id = 'FMKU'.
IF sy-subrc NE 0.
READ TABLE lt_return INTO le_return WITH KEY type = 'E'.
ENDIF.
SORT pti_period BY item_num.
IF sy-subrc EQ 0.
LOOP AT pti_item INTO le_item.
CLEAR lv_param.
CLEAR le_period.
CONCATENATE 'CG' le_item-funds_ctr '-CC' le_item-cmmt_item '-AF' le_item-func_area
INTO lv_param.
MESSAGE s002(zbw001) WITH lv_param le_return-message.
IF sy-batch IS INITIAL.
WRITE :/ 'NO OK' , lv_param.
ENDIF.
*------Busqueda del periodo
READ TABLE pti_period INTO le_period
WITH KEY item_num = le_item-item_num
BINARY SEARCH.
*-------Registro de Error DB
PERFORM f_fill_error USING le_item
le_period
pei_header
CHANGING le_error.
le_error-error = le_return-message.
APPEND le_error TO lt_error.
ENDLOOP.
ENDIF.
*------Grabar en BD
MODIFY zbwt003 FROM TABLE lt_error.
IF sy-subrc EQ 0.
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
ENDFORM. " F_RETRACCION
PARA CO , se usa la siguiente parte del Codigo :
FORM f_retraccion_co USING ptc_data TYPE tyt_cecosto.
CONSTANTS : lc_300(7) TYPE c VALUE 'DSH_300',
lc_bwd(3) TYPE c VALUE 'BWD'.
DATA: lv_per TYPE co_perab,
lv_cont(6) TYPE n,
lv_delta TYPE xfeld VALUE ' '.
DATA: lv_periodo(3) TYPE c.
DATA: ls_headerinfo TYPE bapiplnhdr,
lt_indexstructure TYPE TABLE OF bapiacpstru,
le_indexstructure TYPE bapiacpstru,
lt_coobject TYPE TABLE OF bapipcpobj,
le_coobject TYPE bapipcpobj,
lt_pervalue TYPE TABLE OF bapipcpval,
le_pervalue TYPE bapipcpval,
lt_totvalue TYPE TABLE OF bapipcptot,
lt_contrl TYPE TABLE OF bapipcpctrl,
lt_return TYPE TABLE OF bapiret2,
ls_commit_ret TYPE bapiret2,
ls_return LIKE LINE OF lt_return.
DATA : lt_error TYPE STANDARD TABLE OF zbwt003.
DATA : le_data LIKE LINE OF ptc_data,
le_datax LIKE LINE OF ptc_data.
DATA : lv_param(30) TYPE c.
* Declaration for RFC BAPI_COSTACTPLN_POSTPRIMCOST
DATA: lv_destination TYPE string.
DATA : lv_table(50) TYPE c.
DATA : lv_time(3) TYPE n.
*Obtener Destino RFC
SELECT SINGLE destination INTO lv_destination
FROM zbwt004 WHERE origen EQ sy-sysid.
IF sy-subrc NE 0 OR lv_destination IS INITIAL.
MESSAGE e006(zbw001).
ENDIF.
CONDENSE lv_destination.
CLEAR lv_cont.
**Tiempo Espera Entre BAPI
* SELECT SINGLE zval INTO lv_table
* FROM zbwt001 WHERE zname EQ 'RETR_TIME2'.
* IF sy-subrc NE 0.
* lv_time = 3.
* ELSE.
* lv_time = lv_table(3).
* ENDIF.
*Completar Estructuras BAPI
LOOP AT ptc_data INTO le_data.
le_datax = le_data.
*----Nueva Cuenta
AT NEW cuenta.
ADD 1 TO lv_cont.
CLEAR ls_headerinfo.
CLEAR le_indexstructure.
CLEAR le_coobject.
CLEAR lt_coobject[].
CLEAR lt_pervalue[].
CLEAR lt_indexstructure[].
CLEAR lt_return[].
CLEAR le_pervalue.
*---Estructura Cabecera
ls_headerinfo-co_area = le_datax-coarea.
ls_headerinfo-fisc_year = le_datax-fiscper(4).
ls_headerinfo-period_from = '01'.
ls_headerinfo-period_to = '12'.
ls_headerinfo-version = gc_version."p_versn.
ls_headerinfo-doc_hdr_tx = text-001.
ls_headerinfo-plan_currtype = 'C'.
ADD 1 TO lv_cont.
*---Estructura Indice
le_indexstructure-object_index = lv_cont.
le_indexstructure-value_index = lv_cont.
APPEND le_indexstructure TO lt_indexstructure.
le_coobject-object_index = lv_cont.
le_coobject-costcenter = le_datax-centrocosto."p_kostl.
le_coobject-acttype = ' '."p_lstar.
le_coobject-co_busproc = ' '."p_prznr.
le_coobject-orderid = ' '."p_aufnr.
le_coobject-wbs_element = ' '."p_pspel.
APPEND le_coobject TO lt_coobject.
*---Periodo
le_pervalue-value_index = lv_cont.
le_pervalue-cost_elem = le_datax-cuenta.
le_pervalue-trans_curr = le_datax-moneda.
le_pervalue-trans_currency_iso = le_datax-moneda.
ENDAT.
*----Valores Periodo
lv_periodo = le_data-fiscper+4(3).
CASE lv_periodo.
WHEN '001'.
le_pervalue-var_val_per01 = le_datax-monto.
WHEN '002'.
le_pervalue-var_val_per02 = le_datax-monto.
WHEN '003'.
le_pervalue-var_val_per03 = le_datax-monto.
WHEN '004'.
le_pervalue-var_val_per04 = le_datax-monto.
WHEN '005'.
le_pervalue-var_val_per05 = le_datax-monto.
WHEN '006'.
le_pervalue-var_val_per06 = le_datax-monto.
WHEN '007'.
le_pervalue-var_val_per07 = le_datax-monto.
WHEN '008'.
le_pervalue-var_val_per08 = le_datax-monto.
WHEN '009'.
le_pervalue-var_val_per09 = le_datax-monto.
WHEN '010'.
le_pervalue-var_val_per10 = le_datax-monto.
WHEN '011'.
le_pervalue-var_val_per11 = le_datax-monto.
WHEN '012'.
le_pervalue-var_val_per12 = le_datax-monto.
ENDCASE.
*---Fin Cuenta --Llamado Funcion RFC
AT END OF cuenta.
*----Periodo
APPEND le_pervalue TO lt_pervalue.
CLEAR lv_cont.
**----Tiempo Espera entre BAPI
* WAIT UP TO lv_time SECONDS.
*----Llamado RFC
CALL FUNCTION 'BAPI_COSTACTPLN_POSTPRIMCOST' DESTINATION lv_destination
EXPORTING
headerinfo = ls_headerinfo
delta = lv_delta
TABLES
indexstructure = lt_indexstructure
coobject = lt_coobject
pervalue = lt_pervalue
totvalue = lt_totvalue
contrl = lt_contrl
return = lt_return.
*---------------------------------------------------
SORT lt_pervalue BY value_index.
READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION lv_destination
IMPORTING
return = ls_commit_ret.
* Mensaje exitoso
LOOP AT lt_coobject INTO le_coobject.
CLEAR le_pervalue.
READ TABLE lt_pervalue INTO le_pervalue WITH KEY
value_index = le_coobject-object_index BINARY SEARCH.
CLEAR lv_param.
CONCATENATE 'CN' le_pervalue-cost_elem '-CC' le_coobject-costcenter
INTO lv_param.
MESSAGE s001(zbw001) WITH lv_param. "Mensaje OK
IF sy-batch IS INITIAL.
WRITE :/ 'OK' , lv_param.
ENDIF.
ENDLOOP.
ELSE. "Error
* Función para mostrar el log de mensajes
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc EQ 0.
gv_errorco = 'X'. "GDP 16.11.2015
LOOP AT lt_coobject INTO le_coobject.
CLEAR le_pervalue.
READ TABLE lt_pervalue INTO le_pervalue WITH KEY
value_index = le_coobject-object_index BINARY SEARCH.
IF sy-subrc NE 0.
CONTINUE.
ENDIF.
CLEAR lv_param.
CONCATENATE 'CN' le_pervalue-cost_elem '-CC' le_coobject-costcenter
INTO lv_param.
MESSAGE s002(zbw001) WITH lv_param ls_return-message.
IF sy-batch IS INITIAL.
WRITE :/ 'NO OK' , lv_param.
ENDIF.
*-------Registro de Error DB
PERFORM f_fill_error USING le_coobject
le_pervalue
ls_headerinfo
ls_return-message
CHANGING lt_error[].
ENDLOOP.
*------Grabar en BD
INSERT zbwt003 FROM TABLE lt_error.
IF sy-subrc EQ 0.
COMMIT WORK AND WAIT.
ENDIF.
CLEAR lt_error[].
ENDIF.
ENDIF.
ENDAT.
ENDLOOP.
ENDFORM. " F_RETRACCION