Tuesday, September 20, 2005

Avance proyectos

Nota: Este código funciona solo si está configurado un solo elemento PEP de primer nivel por proyecto.

*&---------------------------------------------------------------------*
*& Report ZBWR_DET_AVANCE_PROY *
*& *
*&---------------------------------------------------------------------*
REPORT ZBWR_DET_AVANCE_PROY .
*-----------------------------------------------------------------------
* AUTOR :
* FECHA :
* CLIENTE :
* DESCRIPCION : Determina avance de los proyectos ejecutando la
* transacción CNE1 y almacena la información en la tabla
* ZBW_T_AVANCEPS
* SOLICITUD :
*-----------------------------------------------------------------------
* MODIFICACIONES :
*-----------------------------------------------------------------------
INCLUDE ZBWX_BATCH_CNE1T.
INCLUDE ZBWX_BATCH_CNE1F.

*TOP-OF-PAGE.
*START PROGRAM**********************************************************
START-OF-SELECTION.
REFRESH : bdc_tab.
* Busca los proyectos en la tabla PROJ
PERFORM buscar_datos.
* Ejecuta la transacción CNE1 para cada proyecto
PERFORM main_job.
* Graba avance en tabla ZBW_T_AVANCEPS
PERFORM graba_tablaBW.

END-OF-SELECTION.



____________________________________________________________________________

ZBWX_BATCH_CNE1T
==============
*&---------------------------------------------------------------------*
*& Include ZBWX_BATCH_CNE1T *
*&---------------------------------------------------------------------*
*BD=====================================================================
TABLES: t100,
proj, "Tablas de Proyectos
RPSQT, "Avance de Proyectos
PRPS, "Tabla de Elementos PEP
ZBW_T_AVANCEPS, "Tabla Avance Proyectos - BW
ZPS_T_EXTRACTOR. "Tabla Avance Proyectos - BW


DATA: BEGIN OF ti_datain OCCURS 0,
perbl LIKE rkpln-perbl,
gjahr LIKE ccss-gjahr,
aufnr LIKE ccss-aufnr,
stagr LIKE ccss-stagr,
sme(18) TYPE c,
sma(18) TYPE c,
END OF ti_datain.

DATA: BEGIN OF ti_split OCCURS 0,
registro(100) TYPE c.
DATA: END OF ti_split.

DATA: BEGIN OF ti_proj OCCURS 0,
mandt like proj-mandt,
pspid LIKE proj-pspid,
pspnr LIKE proj-pspnr.
DATA: END OF ti_proj.

DATA: BEGIN OF bdc_tab OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF bdc_tab.

DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

DATA : w_trnc(4) TYPE c, "transaccion
w_screen(8) TYPE c, "ID screen
w_numscr(4) TYPE c, "numero screen
w_lines TYPE p, "entradas
w_job(12) TYPE c. "job name

DATA: w_datum(08),
w_mes(02),
w_mes1(02),
mesant(06),
objeto like prps-objnr,
avance like RPSQT-MEG001.

FIELD-SYMBOLS : TYPE ANY,
TYPE ANY.

DATA: lc_campo(12),
lc_suma like RPSQT-MEG001,
lc_suma_plan like RPSQT-MEG001,
lc_suma_real like RPSQT-MEG001,
lc_suma_plantot like RPSQT-MEG001,
lc_suma_realtot like RPSQT-MEG001,
contador type I,
contador_act type I,
mandante like rpsqt-mandt,
valoruno(2).


________________________________________________________________________-

ZBWX_BATCH_CNE1F
=============

*&---------------------------------------------------------------------*
*& Include ZBWX_BATCH_CNE1F *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form buscar_datos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM buscar_datos .
* Almacena todos los proyectos de la tabla PROJ en una tabla interna
SELECT mandt pspid pspnr
INTO TABLE ti_proj
FROM proj.
ENDFORM. " buscar_datos
*&---------------------------------------------------------------------*
*& Form main_job
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM main_job .
* Ejecuta transacción CNE1 por cada proyecto de la tabla PROJ
CLEAR bdc_tab.
REFRESH bdc_tab.

* Fijar Sociedad CO
w_trnc = 'OKKS'.
PERFORM call_okks.
PERFORM bdc_transaccion USING w_trnc.

* Crear Call Transaction para CNE1
CLEAR bdc_tab.
REFRESH bdc_tab.

w_trnc = 'CNE1'.
LOOP AT ti_proj.
CLEAR bdc_tab.
REFRESH bdc_tab.
PERFORM llenar_bdc_data.
PERFORM bdc_transaccion USING w_trnc.
ENDLOOP.
ENDFORM. " main_job
*&---------------------------------------------------------------------*
*& Form llenar_bdc_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM llenar_bdc_data .
PERFORM move_bdc USING:
'X' 'SAPLKAZB' '1000',
' ' 'BDC_OKCODE' '=RUN',
' ' 'RKAUF-TEST' ' ',
' ' 'BDC_SUBSCR'
'SAPLCNEV_01_MASTER_DATA 0550BLOCK1',
' ' 'LKP74-PSPID' ti_proj-pspid,
' ' 'LKP74-INCL_HIER' 'X',
' ' 'LKP74-INCL_AUF' 'X',
' ' 'BDC_SUBSCR'
'SAPLKAZB 2450BLOCK2',
' ' 'RPSCO_X-VERSN_EV' 'TOT',
' ' 'RKAUF-TO' '12',
' ' 'RKAUF-GJAHR' '9998'.
ENDFORM. " llenar_bdc_data
*&---------------------------------------------------------------------*
*& Form move_bdc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0027 text
* -->P_0028 text
* -->P_0029 text
*----------------------------------------------------------------------*
FORM move_bdc USING dynbegin prog_or_fnam dynpro_or_fval.
CLEAR bdc_tab.
IF dynbegin = 'X'.
MOVE: prog_or_fnam TO bdc_tab-program,
dynpro_or_fval TO bdc_tab-dynpro,
dynbegin TO bdc_tab-dynbegin.
ELSE.
MOVE: prog_or_fnam TO bdc_tab-fnam,
dynpro_or_fval TO bdc_tab-fval.
ENDIF.
APPEND bdc_tab.
ENDFORM. " move_bdc
*&---------------------------------------------------------------------*
*& Form bdc_transaccion
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM bdc_transaccion USING i_trnc.
REFRESH messtab.
CALL TRANSACTION i_trnc USING bdc_tab
MODE 'N'
MESSAGES INTO messtab.
IF sy-subrc NE 0.
PERFORM imprime_messtab.
ENDIF.
ENDFORM. " bdc_transaccion
*&---------------------------------------------------------------------*
*& Form imprime_messtab
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I_TRNC text
*----------------------------------------------------------------------*
FORM imprime_messtab.
DATA: lc_mstring(480).

WRITE: / 'CALL_TRANSACTION',
'CNE1',
'returncode:'(i05),
sy-subrc,
'Registro:',
sy-tabix.
LOOP AT messtab.
SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra
AND arbgb = messtab-msgid
AND msgnr = messtab-msgnr.
IF sy-subrc = 0.
lc_mstring = t100-text.
IF lc_mstring CS '&1'.
REPLACE '&1' WITH messtab-msgv1 INTO lc_mstring.
REPLACE '&2' WITH messtab-msgv2 INTO lc_mstring.
REPLACE '&3' WITH messtab-msgv3 INTO lc_mstring.
REPLACE '&4' WITH messtab-msgv4 INTO lc_mstring.
ELSE.
REPLACE '&' WITH messtab-msgv1 INTO lc_mstring.
REPLACE '&' WITH messtab-msgv2 INTO lc_mstring.
REPLACE '&' WITH messtab-msgv3 INTO lc_mstring.
REPLACE '&' WITH messtab-msgv4 INTO lc_mstring.
ENDIF.
CONDENSE lc_mstring.
WRITE: / messtab-msgtyp, lc_mstring(250).
ELSE.
WRITE: / messtab.
ENDIF.
ENDLOOP.
SKIP.
ENDFORM. " imprime_messtab
*&---------------------------------------------------------------------*
*& Form call_okks
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM call_okks.
* Fija Sociedad CO
PERFORM move_bdc USING:
'X' 'SAPLSPO4' '0300',
' ' 'BDC_OKCODE' '=FURT',
' ' 'SVALD-VALUE(01)' 'ENAP'.
ENDFORM. " call_okks

*&---------------------------------------------------------------------*
*& Form graba_tablaBW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM graba_tablaBW.
* Borra tabla de avance físico
delete from ZBW_T_AVANCEPS.

LOOP AT ti_proj.
mandante = ti_proj-mandt.
avance = 0.
* lc_suma_plan y lc_suma_real almacenan avance al final del mes anterior
* lc_suma_plantot y lc_suma_realtot almacenan avance a la fecha
lc_suma_plan = 0.
lc_suma_real = 0.
lc_suma_plantot = 0.
lc_suma_realtot = 0.
* Busca elemento PEP de primer nivel
select single * from PRPS
where PSPHI = ti_proj-pspnr
AND STUFE = 1.
* Si existe elemento PEP, busca el avance para el proyecto
if sy-subrc = 0.
objeto = prps-objnr.
select * from RPSQT
where OBJNR = prps-objnr
and acpos = 'AGREG'
and versn = 'TOT'
and gjahr <= sy-datum+0(4).

w_mes = sy-datum+4(2).
* Si el año leido es el actual, debe sumar avance hasta el mes actual,
* de lo contrario, suma todos los meses
if rpsqt-gjahr = sy-datum+0(4).
contador = w_mes.
w_mes1 = w_mes.
else.
contador = 12.
w_mes1 = 12.
endif.
DO contador TIMES.
CONCATENATE 'RPSQT-MEG0' w_mes1 INTO lc_campo.
ASSIGN (lc_campo) TO .
if rpsqt-wrttp = 'P1'.
* Tipo de valor plan
lc_suma_plantot = lc_suma_plantot + .
if not ( w_mes1 = w_mes
and rpsqt-gjahr = sy-datum+0(4) ).
lc_suma_plan = lc_suma_plan + .
endif.
elseif rpsqt-wrttp = 'P2'.
* Tipo de valor real
lc_suma_realtot = lc_suma_realtot + .
if not ( w_mes1 = w_mes
and rpsqt-gjahr = sy-datum+0(4) ).
lc_suma_real = lc_suma_real + .
endif.
endif.

w_mes1 = w_mes1 - 1.
if w_mes1 < 10.
concatenate '0' w_mes1 into w_mes1.
endif.
ENDDO.
endselect.
endif.

* Determina mes anterior para agregar el valor a la tabla
w_mes1 = sy-datum+4(2) - 1.
if w_mes1 < 10.
concatenate '0' w_mes1 into w_mes1.
endif.
concatenate sy-datum+0(4) w_mes1 into mesant.

* Agrega avance real al último mes finalizado
ZBW_T_AVANCEPS-MANDT = mandante.
ZBW_T_AVANCEPS-MESANIO = mesant.
ZBW_T_AVANCEPS-PSPID = ti_proj-PSPID.
ZBW_T_AVANCEPS-AVANCEFISICO = lc_suma_real.
ZBW_T_AVANCEPS-TIPOVALOR = 10.
ZBW_T_AVANCEPS-BUDAT = sy-datum.
INSERT ZBW_T_AVANCEPS.
* Agrega avance plan al último mes finalizado
ZBW_T_AVANCEPS-MANDT = mandante.
ZBW_T_AVANCEPS-MESANIO = mesant.
ZBW_T_AVANCEPS-PSPID = ti_proj-PSPID.
ZBW_T_AVANCEPS-AVANCEFISICO = lc_suma_plan.
ZBW_T_AVANCEPS-TIPOVALOR = 20.
ZBW_T_AVANCEPS-BUDAT = sy-datum.
INSERT ZBW_T_AVANCEPS.
* Agrega avance real a la fecha
ZBW_T_AVANCEPS-MANDT = mandante.
ZBW_T_AVANCEPS-MESANIO = sy-datum+0(6).
ZBW_T_AVANCEPS-PSPID = ti_proj-PSPID.
ZBW_T_AVANCEPS-AVANCEFISICO = lc_suma_realtot.
ZBW_T_AVANCEPS-TIPOVALOR = 10.
ZBW_T_AVANCEPS-BUDAT = sy-datum.
INSERT ZBW_T_AVANCEPS.
* Agrega avance plan a la fecha
ZBW_T_AVANCEPS-MANDT = mandante.
ZBW_T_AVANCEPS-MESANIO = sy-datum+0(6).
ZBW_T_AVANCEPS-PSPID = ti_proj-PSPID.
ZBW_T_AVANCEPS-AVANCEFISICO = lc_suma_plantot.
ZBW_T_AVANCEPS-TIPOVALOR = 20.
ZBW_T_AVANCEPS-BUDAT = sy-datum.
INSERT ZBW_T_AVANCEPS.

ENDLOOP.
ENDFORM. " graba_tablaBW

Resta un mes a la fecha

DATA: fecha(06),
mes(02),
year(04),
fecha_new(06).

fecha = '200501'.
mes = fecha+4(2).
year = fecha+0(4).

IF mes = '01'.
year = year - 1.
CONCATENATE year '12' INTO fecha_new.
CONDENSE fecha_new NO-GAPS.
ELSE.
mes = mes - 1.
UNPACK mes TO mes.
CONCATENATE year mes INTO fecha_new.
CONDENSE fecha_new NO-GAPS.
ENDIF.

fecha = fecha_new.