miércoles, 12 de octubre de 2011

Programa genera demanda

************************************************************************
*Programa que crea la demanda de materianles por medio de la MD61
*leyendo un archivo desde el servidor
************************************************************************


REPORT ZDEMANDA .


************************************************************************
* *VARIABLES
************************************************************************
data A(10).
data porc type i.
data archivo type localfile.
data tamano(10).
data g_repid like sy-repid.
data: lv_name TYPE salfile-longname.
data it_filedir type filedir occurs 0 with header line.
include zalv.
data OPENG(1).
data CSYSUBRC like Sy-subrc.

************************************************************************
* *TABLAS INTERNAS
************************************************************************
data i_zdemanda like zdemanda occurs 0 with header line.
*Tabla interna para alv
data: begin of i_out occurs 0,
check(1),
line(255).
data end of i_out.
*Tabla interna para cargar cada archivo
DATA: BEGIN OF i_table OCCURS 0,
l_line(1000) type c.
DATA: END OF i_table.
*Tabla interna para separar cada linea de el archivo
DATA: BEGIN OF i_split OCCURS 0,
line(1000) type c.
DATA: END OF i_split.
*Tablas para hacer el batch input
DATA: BDC_TAB LIKE STANDARD TABLE OF BDCDATA WITH HEADER LINE,
ERR_BI LIKE STANDARD TABLE OF BDCMSGCOLL WITH HEADER LINE.

************************************************************************
* *PARAMETROS DE SELECCION
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME title text-001.
PARAMETERS:
p_file TYPE rlgrap-filename OBLIGATORY DEFAULT
'C:\Inetpub\ftproot\operaciones\mrp\',
Mode(1) default 'N',
SESSION(1) default 'X',
p_separa(1) default ',',
pro as checkbox.

SELECTION-SCREEN END OF BLOCK block1.




************************************************************************
* *START-OF-SELECTION
************************************************************************
************************************************************************
START-OF-SELECTION.
g_repid = sy-repid.
lv_name = p_file.
*Traemos el contenido del directorio
CALL FUNCTION 'RZL_READ_DIR_LOCAL'
EXPORTING
name = lv_name
TABLES
file_tbl = it_filedir
EXCEPTIONS
argument_error = 1
not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*Eliminamos las que sean directorios o de tamaño = 0
loop at it_filedir.
i_out-line = it_filedir.
if not i_out-line cs '0000000000' and i_out-line cs 'PRON'.
append i_out.
endif.
endloop.

*Eliminamos de la lista los que ya fueron procesados
if pro <> 'X'.
loop at i_out.
split i_out-line at space into archivo tamano.
condense archivo.
select * from zdemanda into table i_zdemanda
where nombre = archivo.
if sy-subrc = 0.
delete i_out.
endif.
endloop.
endif.

*Lanzamos un alv con el listado y un campo check
clear i_zdemanda.
refresh i_zdemanda.
PERFORM obt_descrip_campos_tabla USING g_repid 'I_OUT'.
layout-box_fieldname = 'CHECK'.
layout-box_tabname = 'I_OUT'.
PERFORM camb_descrip_campos_tabla USING 'LINE'
'Archivo'.

PERFORM carac_gen_listado.
PERFORM visualizar_lista TABLES I_OUT USING 'I_OUT'
g_repid .


*&---------------------------------------------------------------------*
*& Form F_CARGA_FICHERO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I_TABLE text
* -->P_P_FILE text
*----------------------------------------------------------------------*
FORM F_CARGA_FICHERO TABLES i_table STRUCTURE i_table
USING P_P_FILE.

data: v_files type string.

v_files = p_p_file.

refresh i_table.

open dataset v_files for input in text mode.
if sy-subrc is initial.
do.
read dataset v_files into i_table.
if not sy-subrc is initial.
exit.
endif.
append i_table.
enddo.
endif.
close dataset v_files.

if sy-subrc ne 0.
write: /'No se Pudo cargar el archivo ', archivo .
else.
write: /'Se ha cargado el archivo ',archivo,' correctamente'.
endif.

ENDFORM. " F_CARGA_FICHERO


*&---------------------------------------------------------------------*
*& Form f_batch_MD61
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_batch_MD61.
Data: material(20),
centro(4),
periodo(1),
cantidad(10),
MENSAJE LIKE T100-TEXT,
COPY_SYTABIX LIKE SY-TABIX,
contador like sy-tabix value 0,
fecha like SCAL-WEEK,
fecha1 LIKE SCAL-DATE,
fecha2 like SCAL-DATE,
texto(100),
texto2(100),
si(1).

clear: contador, copy_sytabix,si,centro,periodo,material.

LOOP AT I_SPLIT.
contador = contador + 1.
move sy-tabix to COPY_SYTABIX.
if si is initial and contador > 3.
si = 'X'.
else.
si = ''.
endif.
if COPY_SYTABIX = 1.
centro = i_split-line.
endif.
if COPY_SYTABIX = 2.
periodo = i_split-line.
endif.
if COPY_SYTABIX = 3.
material = i_split-line.
endif.

IF COPY_SYTABIX > 3 AND SI = 'X'.
REFRESH BDC_TAB.
perform bdc_dynpro using 'SAPMM60X' '0100'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'AM60X-MATAW'
'X'.
perform bdc_field using 'AM60X-MATNR'
material.
perform bdc_field using 'AM60X-WERKS'
centro.
perform bdc_field using 'RM60X-VERSB'
'00'.
perform bdc_field using 'RM60X-ENTLU'
periodo.

*Obtenemos las fechas de acuerdo a la semana que indique el archivo

read table i_split index contador.
texto = i_split-line.
concatenate texto+3(4) texto+0(2) into texto.
move texto to fecha.
CALL FUNCTION 'WEEK_GET_FIRST_DAY'
EXPORTING
WEEK = fecha
IMPORTING
DATE = fecha1
EXCEPTIONS
WEEK_INVALID = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
fecha1 = fecha.
fecha2 = fecha.
SY-SUBRC = 0.
endif.

IF SY-SUBRC = 0.
fecha2 = fecha1 + 6.
concatenate fecha1+6(2) fecha1+4(2) fecha1+0(4) into fecha1.
concatenate fecha2+6(2) fecha2+4(2) fecha2+0(4) into fecha2.
perform bdc_field using 'RM60X-DATVE'
fecha1.
perform bdc_field using 'RM60X-DATBE'
fecha2.
perform bdc_dynpro using 'SAPLM60E' '0200'.
perform bdc_field using 'BDC_OKCODE'
'=PEIN'.
perform bdc_dynpro using 'SAPLM60E' '0200'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'BDC_CURSOR'
'RM60E-PLNMG(01)'.
perform bdc_field using 'PBPT-VERVS'
'X'.
perform bdc_field using 'RM60E-EDATU(01)'
i_split-line.
contador = contador + 1.
read table i_split index contador.
perform bdc_field using 'RM60E-PLNMG(01)'
i_split-line.
move i_split-line to cantidad.
contador = contador - 1.
perform bdc_dynpro using 'SAPLM60E' '0200'.
perform bdc_field using 'BDC_OKCODE'
'=SICH'.
REFRESH ERR_BI.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = porc
TEXT = A.

CALL TRANSACTION 'MD61' USING BDC_TAB MODE MODE MESSAGES INTO ERR_BI.
CSYSUBRC = SY-SUBRC.
commit work.
condense: material,texto.


IF CSYSUBRC = 0.

concatenate
'Centro:' centro
'**Material:'material
'**Semana:' texto
'**Cantidad:' cantidad
'**sin errores' into texto.
translate texto using '* '.
WRITE:/ texto color col_positive.
ELSE.

* Adición de la transacción errónea al JD para procesarlo on-line
if OPENG is initial.
perform open_group.
OPENG = 'X'.
endif.

PERFORM BDC_INSERT.
concatenate
'Centro:' centro
'**Material:' material
'**Semana:' texto
'**Con errores' into texto.
translate texto using '* '.
WRITE: / texto color col_negative.
LOOP AT ERR_BI.
SELECT SINGLE TEXT INTO MENSAJE
FROM T100
WHERE SPRSL = 'S' AND
ARBGB = ERR_BI-MSGID AND
MSGNR = ERR_BI-MSGNR.
NEW-LINE.
WRITE AT: 1 ERR_BI-DYNAME,
15 ERR_BI-DYNUMB,
20 ERR_BI-MSGTYP,
22 ERR_BI-MSGNR,
26 MENSAJE.
ENDLOOP.
ENDIF.
ENDIF."fecha
ENDIF.">3
ENDLOOP."I_SPLIT
ENDFORM. " f_batch_MD61


*----------------------------------------------------------------------*
* create batchinput session *
* Creamos una sesion de batch para los errores *
*----------------------------------------------------------------------*

FORM OPEN_GROUP.
IF SESSION = 'X'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'ZDEMANDA'
KEEP = 'X'
USER = SY-UNAME.
ENDIF.
ENDFORM.

*----------------------------------------------------------------------*
* create batchinput session *
* Cerramos una sesion de batch para los errores *
*----------------------------------------------------------------------*
IF SESSION = 'X'.

CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
ENDIF.

*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR BDC_TAB.
BDC_TAB-PROGRAM = PROGRAM.
BDC_TAB-DYNPRO = DYNPRO.
BDC_TAB-DYNBEGIN = 'X'.
APPEND BDC_TAB.
ENDFORM.

*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF SESSION = 'X'.
CLEAR BDC_TAB.
BDC_TAB-FNAM = FNAM.
BDC_TAB-FVAL = FVAL.
APPEND BDC_TAB.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_INSERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BDC_INSERT.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MD61'
TABLES
DYNPROTAB = BDC_TAB.
ENDFORM. " BDC_INSERT
*&---------------------------------------------------------------------*
*& Form close_group
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM close_group.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.

ENDFORM. " close_group

*---------------------------------------------------------------------*
* FORM SET_STATUS *
*---------------------------------------------------------------------*

form set_status using rt_extab type slis_t_extab.

set pf-status 'ZSTANDARD'. "Status nuevo
set titlebar 'T001'. "Titulo

endform.

*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*

FORM USER_COMMAND USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.

data: archivos type i, lineas type i.
data carchivos(5).
*CUANDO SE PRESIONE EL BOTON PROCESAR ARCHIVO
CASE r_ucomm.
WHEN '&PRO'. "si presiona el boton procesar
*CONTAMOS CANTIDAD DE ARCHIVOS SELECCIONADOS
loop at i_out where check = 'X'.
archivos = archivos + 1.
endloop.
move archivos to carchivos.
archivos = 0.
loop at i_out where check = 'X'.
archivos = archivos + 1.
move archivos to A.
condense: A, carchivos.
concatenate A '/' carchivos into A.
clear: archivo, tamano.
split i_out-line at space into archivo tamano.
i_zdemanda-fecha = sy-datum.
i_zdemanda-hora = sy-uzeit.
i_zdemanda-usuario = sy-uname.
i_zdemanda-nombre = archivo.
insert zdemanda from i_zdemanda.
concatenate p_file archivo into archivo.
perform f_carga_fichero tables i_table using archivo.
*Para cada linea del archivo cargado se hace una llamada a MD61
delete i_table where l_line = ''.
describe table i_table lines lineas.
loop at i_table.

split i_table at p_separa into table i_split.
perform f_batch_MD61.
skip.
porc = sy-tabix * ( 100 / lineas ).
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = PORC
TEXT = A.

endloop.
if OPENG = 'X'.
perform close_group.
skip.
WRITE: 'Los errores se pueden tratar en SM35 "ZDEMANDA", o corrija el
archivo e intente de nuevo.'
color col_total.
endif.
endloop."i_out-check = 'X'.
ENDCASE.
clear i_out.
refresh i_out.
ENDFORM.

No hay comentarios: