miércoles, 12 de octubre de 2011

Traspasos

report ztraspasos line-size 185.
tables: lips, likp, disvariant, mara.
*VARIABLES PARA BATCH INPUT
data v_traspaso(20).
CONSTANTS:
CODE LIKE TSTC-TCODE VALUE 'MB1B'.
DATA: BDC_TAB LIKE STANDARD TABLE OF BDCDATA WITH HEADER LINE,
ERR_BI LIKE STANDARD TABLE OF BDCMSGCOLL WITH HEADER LINE.
*VARIABLES PARA GRABAR DISPOSICION
data: gx_variant like disvariant.
data: g_variant like disvariant.
data: g_variant_save value 'U'.
data: g_variant_flag.
data: estado(10).
*TABLA INTERNA PARA LOS DATOS
data begin of i_datos occurs 0 .
DATA: EXTRN like CFPAR-EXTRN,
VBELN like LIPS-VBELN,
ERDAT like LIPS-ERDAT,
kodat like likp-kodat,
POSNR like LIPS-POSNR,
MATNR like lips-matnr,
WERKS like lips-werks,
LGORT like lips-lgort,
LFIMG like lips-lfimg,
VRKME like lips-vrkme,
NTGEW like lips-ntgew,
BRGEW like lips-brgew,
ARKTX like lips-arktx.
data end of i_datos.

*TABLA INTERNA DE LOTES
data begin of i_mchb occurs 0.

data:
VBELN like LIPS-VBELN,
POSNR like LIPS-POSNR,
MATNR like mchb-matnr,
WERKS like mchb-werks,
Lgort like mchb-lgort,
charg like mchb-charg,
clabs like mchb-clabs,
MATNR2 like mchb-matnr,
WERKS2 like mchb-werks,
Lgort2 like mchb-lgort,
charg2 like mchb-charg,
clabs2 like mchb-clabs.

data end of i_mchb.

data begin of i_mchbtemp occurs 0.

data:
VBELN like LIPS-VBELN,
POSNR like LIPS-POSNR,
MATNR like mchb-matnr,
WERKS like mchb-werks,
Lgort like mchb-lgort,
charg like mchb-charg,
clabs like mchb-clabs,
MATNR2 like mchb-matnr,
WERKS2 like mchb-werks,
Lgort2 like mchb-lgort,
charg2 like mchb-charg,
clabs2 like mchb-clabs.

data end of i_mchbtemp.


data: begin of i_likp occurs 0,
vbeln like likp-vbeln,
kodat like likp-kodat.
data end of i_likp.
*PARA ALV
type-pools: slis.
data: gt_fieldcat type slis_t_fieldcat_alv with header line,
gs_layout type slis_layout_alv,
g_repid like sy-repid.

*PARAMETROS
selection-screen begin of block list with frame title text-001.

select-options:
p_vbeln for lips-vbeln,
p_kodat for likp-kodat obligatory,
p_erdat for lips-erdat,
p_werks for lips-werks obligatory default '0030',
p_lgort for lips-lgort obligatory default '0014',
p_matnr for lips-matnr.
parameter v_todosl as checkbox.
selection-screen end of block list.

selection-screen begin of block list2 with frame title text-002.
parameter p_varia like disvariant-variant default '/STD'.
parameter modo(1) default 'A'.

selection-screen end of block list2.

include zalv.
*PARA SELECCIONAR LA VISUALIZACION
at selection-screen output.

clear g_variant.
g_variant-report = sy-repid.
g_variant-username = sy-uname.

if p_varia is initial and
g_variant_flag is initial.
perform get_default_variant_f14 using p_varia.
g_variant_flag = 'X'.
endif.

at selection-screen on value-request for p_varia.
perform variant_inputhelp_f14 using p_varia.

at user-command.
break-point.
initialization.

g_repid = sy-repid.

start-of-selection.

perform trae_datos.
PERFORM obt_descrip_campos_tabla USING g_repid 'I_DATOS'.
layout-box_fieldname = 'EXTRN'.
layout-box_tabname = 'I_DATOS'.

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

*&---------------------------------------------------------------------*
*& Form TRAE_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form trae_datos.

select vbeln kodat from likp into table i_likp
where kodat in p_kodat
and erdat in p_erdat.

if sy-subrc ne 0.
message i368(00) with 'No hay información'.
exit.
endif.

select * from lips into corresponding fields of table i_datos
for all entries in i_likp
where vbeln eq i_likp-vbeln
and werks in p_werks
and lgort in p_lgort
and matnr in p_matnr.
"and posnr < 900000.

*PASAMOS EL CAMPO KODAT(fecha pick)
loop at i_datos.
read table i_likp with key vbeln = i_datos-vbeln.
if sy-subrc = 0.
i_datos-kodat = i_likp-kodat.
modify i_datos.
endif.
endloop.

endform. " TRAE_DATOS



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

form set_status using rt_extab type slis_t_extab.

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

endform.

*PARA VISUALIZACION
*&---------------------------------------------------------------------*
*& Form variant_inputhelp_f14
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_p_varia text
*----------------------------------------------------------------------*
form variant_inputhelp_f14 using p_variant like g_variant-variant.

* Esta rutina funciona como un search help recuperando los layouts
* creados por el usuario

data h_exit.

clear gx_variant.

call function 'REUSE_ALV_VARIANT_F4'
exporting
is_variant = g_variant
i_save = g_variant_save
importing
e_exit = h_exit
es_variant = gx_variant
exceptions
not_found = 1
program_error = 2
others = 3.

if sy-subrc is initial and h_exit is initial.
g_variant-variant = gx_variant-variant.
p_variant = gx_variant-variant.
else.
message id sy-msgid type 'S'
number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

endform. "variant_inputhelp_f14


*&---------------------------------------------------------------------*
*& Form get_default_variant_f14
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_VARIANT text
*----------------------------------------------------------------------*
form get_default_variant_f14 using p_variant like g_variant-variant.

* Recupera datos para luego poder recuperar los diferentes layouts....
gx_variant = g_variant.
clear gx_variant-variant.
clear gx_variant-text.

if not p_variant is initial.
gx_variant-variant = p_variant.
endif.

call function 'REUSE_ALV_VARIANT_DEFAULT_GET'
exporting
i_save = g_variant_save
changing
cs_variant = gx_variant
exceptions
wrong_input = 1
not_found = 2
program_error = 3
others = 4.

case sy-subrc.
when 0.
p_variant = gx_variant-variant.
when 2.
clear p_variant.
endcase.

endform. "get_default_variant_f14

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

FORM USER_COMMAND USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
*EN CASO DE TRASPASOS
data i_datos2 like i_datos occurs 0 with header line.
i_datos2[] = i_datos[].
CASE r_ucomm.
WHEN '%LOT'. "si presiona el boton lotes
"Loop a los que se hayan seleccionado
delete i_datos2 where extrn <> 'X'.
Loop at i_datos2 where EXTRN = 'X'.
"Bloqueamos las entregas
at new vbeln.
CALL FUNCTION 'ENQUEUE_EVVBLKE'
EXPORTING
MODE_LIKP = 'E'
MANDT = SY-MANDT
VBELN = i_datos2-vbeln
X_VBELN = ' '
_SCOPE = '2'
_WAIT = ' '
_COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
message e386(00) with 'Error al bloquear Entrega' i_datos2-vbeln.
ENDIF.
endat.
endloop.

"una vez bloqueadas las entregas traemos los lotes de esas entregas
select matnr lgort werks charg clabs from mchb into corresponding
fields of
table i_mchb
for all entries in i_datos2 where
matnr = i_datos2-matnr
and lgort = i_datos2-lgort
and werks = i_datos2-werks
and not clabs = 0.

loop at i_mchb.
i_mchb-matnr2 = i_mchb-matnr.
i_mchb-werks2 = i_mchb-werks.
i_mchb-lgort2 = '0010'.
i_mchb-charg2 = i_mchb-charg.
i_mchb-clabs2 = i_mchb-clabs.
modify i_mchb.
endloop.

if sy-subrc = 0.
"una vez seleccionados los lotes dejamos solo la cantidad necesaria
"para cada entrega
"en caso que vengan materiales iguales.
" data i_mchbtemp like i_mchb occurs 0 with header line.
clear i_mchbtemp.
refresh i_mchbtemp.

loop at i_datos2.

loop at i_mchb where matnr = i_datos2-matnr.
i_mchb-vbeln = i_datos2-vbeln.
i_mchb-posnr = i_datos2-posnr.

if i_datos2-lfimg > i_mchb-clabs and i_datos2-lfimg <> 0.
i_datos2-lfimg = i_datos2-lfimg - i_mchb-clabs.
move-corresponding i_mchb to i_mchbtemp.
read table i_mchbtemp with key matnr = i_mchb-matnr
clabs = i_mchb-clabs charg = i_mchb-charg.
i_mchb-clabs = 0.
append i_mchbtemp.

modify i_mchb.
elseif i_datos2-lfimg = i_mchb-clabs and i_datos2-lfimg <> 0.
move-corresponding i_mchb to i_mchbtemp.
i_mchb-clabs = 0.
i_datos2-lfimg = 0.
read table i_mchbtemp with key matnr = i_mchb-matnr
clabs = i_mchb-clabs charg = i_mchb-charg.
append i_mchbtemp.
modify i_mchb.
"exit.
elseif i_datos2-lfimg < i_mchb-clabs and i_datos2-lfimg <> 0.
move-corresponding i_mchb to i_mchbtemp.
read table i_mchbtemp with key matnr = i_mchb-matnr
clabs = i_mchb-clabs charg = i_mchb-charg.

i_mchb-clabs = i_mchb-clabs - i_datos2-lfimg.
i_mchbtemp-clabs2 = i_datos2-lfimg.
i_datos2-lfimg = 0.
append i_mchbtemp.

modify i_mchb.
"exit.
endif.

if v_todosl = 'X'.
if i_mchb-clabs2 = i_mchb-clabs.
move-corresponding i_mchb to i_mchbtemp.
i_mchbtemp-clabs2 = 0.
append i_mchbtemp.
endif.
endif.

endloop.
endloop."i_datos2



"Mandamos el listado de los lotes para que lo modifique o lo acepte
PERFORM obt_descrip_campos_tabla USING g_repid 'I_MCHBTEMP'.
layout-box_fieldname = ''.
layout-box_tabname = ''.
PERFORM camb_descrip_campos_tabla USING 'CLABS2'
'transpasar'.

PERFORM asignar_edit_campo USING 'CLABS2' 'X'.
PERFORM carac_gen_listado.
estado = 'lotes'.
PERFORM visualizar_lista TABLES I_MCHBTEMP USING 'I_MCHBTEMP'
g_repid .

endif.
WHEN '&TRA'. "si presiona el boton traspasos
if estado is initial.
message e368(00) with 'Aun no ha seleccionado los lotes'.
else.
"comprobamos que no esten agarrando lotes de mas
data suma like i_mchbtemp-clabs.
loop at i_mchb.
suma = 0.
loop at i_mchbtemp where charg = i_mchb-charg.
suma = i_mchbtemp-clabs2 + suma.
if suma > i_mchb-clabs2.
message e138(00) with 'Error en lote' i_mchb-charg
' solo hay disponibles ' i_mchb-clabs.
endif.
endloop.
endloop.

"ya selecciono los lotes, de acuerdo a estos se manda llamar la
"un batch input a la MB1B con los traspasos que sean necesarios
PERFORM f_traspasa.
if v_traspaso = 'sin errores'.
PERFORM f_modificaentrega.
endif.
Clear i_MCHB.
refresh i_MCHB.
endif."estado initial.

ENDCASE.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form f_traspasa

*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_traspasa.
DATA IMARA LIKE MARA OCCURS 0 WITH HEADER LINE.

Select matnr meins from MARA into corresponding fields of table IMARA
for all entries in I_MCHB
where MATNR = I_MCHB-MATNR.

DATA COPY_SYTABIX LIKE SY-TABIX.
loop at i_mchb.
i_mchb-clabs2 = i_mchb-clabs2 - i_mchb-clabs.
modify i_mchb.
if i_mchb-clabs2 = 0.
delete i_mchb.
endif.
endloop.

read table i_mchb index 1.
if sy-subrc = 0.

MOVE SY-TABIX TO COPY_SYTABIX.

* Apertura de un JD para las transacciones erróneas
*AT FIRST.
*PERFORM BDC_OPEN.
*ENDAT.

* Proceso de cada registro (cada registro es una transacción)
REFRESH BDC_TAB. "<------------------ Borrar la transacción anterior

perform DYNPRO using 'X' 'SAPMM07M' '0400'.
perform DYNPRO using '' 'BDC_CURSOR'
'MKPF-BUDAT'.
*perform DYNPRO using '' 'BDC_OKCODE'
* '=NPE'.
perform DYNPRO using '' 'RM07M-BWARTWA'
'311'.
perform DYNPRO using '' 'RM07M-WERKS'
i_mchb-werks.
perform DYNPRO using '' 'RM07M-LGORT'
i_mchb-lgort.
perform DYNPRO using '' 'XFULL'
'X'.
perform DYNPRO using '' 'RM07M-XNAPR'
'X'.
perform DYNPRO using '' 'RM07M-WVERS3'
'X'.
perform DYNPRO using '' 'BDC_OKCODE'
'=NPE'.
data i_mchblines like sy-tabix.
describe table i_mchb lines i_mchblines.
data xmeins(10).
LOOP AT I_MCHB.
read table imara with key matnr = i_mchb-matnr.
write imara-meins to xmeins.
perform DYNPRO using 'X' 'SAPMM07M' '0410'.
*perform DYNPRO using '' 'BDC_CURSOR'
* 'MSEG-UMLGO'.

perform DYNPRO using '' 'BDC_OKCODE'
'/00'.

perform DYNPRO using '' 'MSEG-MATNR'
i_mchb-matnr.
perform DYNPRO using '' 'MSEG-ERFMG'
i_mchb-clabs2 .
read table IMARA with key matnr = i_mchb-matnr.

perform DYNPRO using '' 'MSEG-ERFME'
xmeins.
perform DYNPRO using '' 'MSEG-WERKS'
i_mchb-werks.
perform DYNPRO using '' 'MSEG-LGORT'
i_mchb-lgort.
perform DYNPRO using '' 'MSEG-CHARG'
i_mchb-charg.
perform DYNPRO using '' 'MSEG-UMLGO'
i_mchb-lgort2.
perform DYNPRO using '' 'DKACB-FMORE'
'X'.
if i_mchblines <> 1.
i_mchblines = i_mchblines - 1.
perform DYNPRO using '' 'BDC_OKCODE'
'=NPE'.
endif.


perform DYNPRO using 'X' 'SAPLKACB' '0002'.
perform DYNPRO using '' 'BDC_OKCODE'
'=ENTE'.
ENDLOOP.

perform DYNPRO using 'X' 'SAPMM07M' '0410'.
perform DYNPRO using '' 'BDC_CURSOR'
'MSEG-ERFMG'.
perform DYNPRO using '' 'BDC_OKCODE'
'=BU'.
perform DYNPRO using 'X' 'SAPLKACB' '0002'.
perform DYNPRO using '' 'BDC_OKCODE'
'=ENTE'.

* Escribimos los mensajes de cada transacción para que salgan agrupa-
* dos con el mensaje de 'sin errores' o 'con errores' de su transacc.
* correspondiente. Para ello es necesario limpiar la tabla ERR_BI en
* cada transacción ya que el sistema no la limpia cuando llama a la
* transacción.
REFRESH ERR_BI.
CALL TRANSACTION 'MB1B' USING BDC_TAB MODE MODO MESSAGES INTO ERR_BI.
NEW-LINE.
IF SY-SUBRC = 0.
*WRITE:'Transacción', COPY_SYTABIX LEFT-JUSTIFIED, ': sin errores'.
v_traspaso = 'sin errores'.
ELSE.
v_traspaso = 'con errores'.
*WRITE:'Transacción', COPY_SYTABIX LEFT-JUSTIFIED, ': con errores'.
* Adición de la transacción errónea al JD para procesarlo on-line
* PERFORM BDC_INSERT.
ENDIF.

ENDIF."<--------------------------- I_MCHB tiene algo

ENDFORM. " CALLTRANSACTION

*&---------------------------------------------------------------------*
*& Form DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DYNPRO USING VALUE(DYNBEGIN)
VALUE(NAME)
VALUE(VALUE).

CLEAR BDC_TAB.
IF DYNBEGIN = 'X'.
BDC_TAB-PROGRAM = NAME.
BDC_TAB-DYNPRO = VALUE.
BDC_TAB-DYNBEGIN = 'X'.
ELSE.
BDC_TAB-FNAM = NAME.
BDC_TAB-FVAL = VALUE.
condense BDC_TAB-FVAL.
ENDIF.
APPEND BDC_TAB.
CLEAR BDC_TAB.

ENDFORM. " DYNPRO
*&---------------------------------------------------------------------*
*& Form f_modificaentrega
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_modificaentrega.
*<data i_mchbtmp like i_mchb occurs 0 with header line.
i_mchbtmp[] = i_mchbtemp[].
delete adjacent duplicates from i_mchbtmp comparing vbeln posnr.
"modificamos las entregas
data suma like i_mchbtmp-clabs2.
loop at i_datos where EXTRN = 'X'.


CALL FUNCTION 'DEQUEUE_EVVBLKE'
EXPORTING
MODE_LIKP = 'E'
MANDT = SY-MANDT
VBELN = i_datos-vbeln
X_VBELN = ' '
_SCOPE = '2'
_WAIT = ' '
_COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
message e386(00) with 'Error al desbloquear Entrega' i_datos-vbeln.
ENDIF.
commit work and wait.

suma = 0.
loop at i_mchbtemp where vbeln = i_datos-vbeln
and posnr = i_datos-posnr.
suma = suma + i_mcHbtemp-clabs2.
endloop.
"verificamos que la suma de los lotes sea igual a la cantidad que
"necesita la posicion
if suma = i_datos-lfimg.
"modificamos posicion
perform f_modpos.
else.
message e368(00) with 'No concuerda' suma ' con ' i_datos-lfimg.
endif.
endloop.

leave program.
ENDFORM. " f_modificaentrega
*&---------------------------------------------------------------------*
*& Form f_modpos
*&---------------------------------------------------------------------*
* Modifica una posicion en la entrega una vez que se traspaso material
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_modpos.
"verifica si es posicion delas miles si es asi borrala y modifica la
"original
data ymeins like mara-meins.
data zmeins(10).


REFRESH BDC_TAB.
*METERMOS NUMERO DE ENTREGA
perform DYNPRO using 'X' 'SAPMV50A' '4004'.
perform DYNPRO using '' 'BDC_CURSOR'
'LIKP-VBELN'.
perform DYNPRO using '' 'BDC_OKCODE'
'/00'.
perform DYNPRO using '' 'LIKP-VBELN'
I_DATOS-VBELN.
*IR A LA PESTAÑA DE PICKING
perform DYNPRO using 'X' 'SAPMV50A' '1000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=T\02'.


*SI ES POSICION DE LAS 1000 LA BORRAMOS
if i_datos-posnr > 1000 and i_datos-posnr < 2000 .
*BUSCAR POSICION DE LAS 1000
perform DYNPRO using 'X' 'SAPMV50A' '1000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=POPO_T'.
perform DYNPRO using 'X' 'SAPMV50A' '0111'.
perform DYNPRO using '' 'BDC_CURSOR'
'RV50A-POSNR
'.
perform DYNPRO using '' 'BDC_OKCODE'
'=WEIT'.
perform DYNPRO using '' 'RV50A-POSNR'
I_DATOS-POSNR.
*BORRAR POSICION DE LAS 1000
perform DYNPRO using 'X' 'SAPMV50A' '1000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=POLO_T'.
perform DYNPRO using '' 'BDC_CURSOR'
'LIPS-POSNR(01)'.
perform DYNPRO using '' 'RV50A-LIPS_SELKZ(01)'
'X'.
i_datos-posnr = i_datos-posnr - 1000.
endif.



*BUSCAR POSICION ORIGINAL
perform DYNPRO using 'X' 'SAPMV50A' '1000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=POPO_T'.

perform DYNPRO using 'X' 'SAPMV50A' '0111'.
perform DYNPRO using '' 'BDC_CURSOR'
'RV50A-POSNR'.
perform DYNPRO using '' 'BDC_OKCODE'
'=WEIT'.
perform DYNPRO using '' 'RV50A-POSNR'
I_DATOS-POSNR.
*CAMBIAR VALORES DE LA LINEA
perform DYNPRO using 'X' 'SAPMV50A' '1000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=CHSP_T'.
perform DYNPRO using '' 'LIPSD-G_LFIMG(01)'
i_datos-lfimg.
perform DYNPRO using '' 'LIPSD-PIKMG(01)'
i_datos-lfimg.
read table i_mchbtemp with key vbeln = i_datos-vbeln posnr =
i_datos-posnr.
perform DYNPRO using '' 'LIPS-LGORT(01)'
I_mchbtemp-LGORT2.

*HACER EL PICKING A LA POSICION
loop at i_mchbtemp where vbeln = i_datos-vbeln
and posnr = i_datos-posnr.

select single meins into ymeins from mara where matnr = i_datos-matnr.
write ymeins to zmeins.
perform DYNPRO using 'X' 'SAPMV50A' '3000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=POAN_T'.
perform DYNPRO using '' 'LIPS-CHARG(01)'
I_MCHBTEMP-CHARG2.
perform DYNPRO using '' 'LIPS-LGORT(01)'
I_MCHBTEMP-LGORT2.
perform DYNPRO using '' 'LIPS-LFIMG(01)'
I_MCHBTEMP-CLABS2.
perform DYNPRO using '' 'LIPS-VRKME(01)'
zMEINS.
endloop.

*PARA CADA LINEA DE LOTE AGREGARLA
perform DYNPRO using 'X' 'SAPMV50A' '3000'.
perform DYNPRO using '' 'BDC_OKCODE'
'=SICH_T'.

*LLAMA A LA TRANSACCION
CALL TRANSACTION 'VL02N' USING BDC_TAB MODE MODO.

if sy-subrc = 0.
message i368(00) with 'Se han modificado la entrega ' i_datos-vbeln
' posicion ' i_datos-posnr .


endif.


ENDFORM. " f_modpos

No hay comentarios: