Programa para actualizar precios en los demás centros
*&---------------------------------------------------------------------**& Report ZMM_ACTUALIZ_MAT_PRD*&*&---------------------------------------------------------------------**&Transacc: Zactprecio* Nombre: Actualización de precios mat. de prod.* Modulo: MM* Funcional: Fernando Simovic ([email protected])* Autor: Sergio Kenig ([email protected])* Modif:* Fecha:* Descripción: Actualización de precios materiales de producción*&---------------------------------------------------------------------*REPORT zmm_actualiz_mat_prd.
INCLUDE zmm_actualiz_mat_prd_top.
CLEAR bdc_tab.REFRESH bdc_tab.
START-OF-SELECTION.
PERFORM inicializar. PERFORM obtener_datos. PERFORM procesar_datos. PERFORM call_mr21.
END-OF-SELECTION.
*&---------------------------------------------------------------------**& Form OBTENER_DATOS*&---------------------------------------------------------------------*FORM obtener_datos. DATA: lv_index TYPE sy-tabix.
SELECT * FROM mara INTO TABLE t_mara WHERE mtart = p_tipom AND matnr IN s_mat.
IF t_mara[] IS INITIAL. EXIT. ENDIF.
SELECT * FROM mbew INTO TABLE t_mbew FOR ALL ENTRIES IN t_mara WHERE matnr = t_mara-matnr AND bwkey = 'P001' AND stprs > 0.
IF t_mbew[] IS INITIAL. EXIT.
ENDIF.
SELECT * FROM marc INTO TABLE t_marc FOR ALL ENTRIES IN t_mbew WHERE matnr = t_mbew-matnr AND werks IN s_centro AND werks NOT IN ('TDRF', 'CDRF', 'P001').
"Vuelvo a buscar articulos por tienda en la MBEW para no pisar articulos "que ya tienen precio. SELECT * FROM mbew INTO TABLE t_bew2 FOR ALL ENTRIES IN t_marc WHERE matnr = t_marc-matnr AND bwkey = t_marc-werks.
"Elimino articulos de t_mbew que ya tienen precio, o sea están en t_bew2. LOOP AT t_mbew. lv_index = sy-tabix. READ TABLE t_bew2 WITH KEY matnr = t_mbew-matnr bwkey = t_mbew-bwkey. IF sy-subrc IS INITIAL. if t_mbew-stprs = t_bew2-stprs. DELETE t_mbew INDEX lv_index. else. t_mbew-stprs = t_bew2-stprs. MODIFY t_mbew index lv_index. endif. ENDIF. ENDLOOP.
ENDFORM. " OBTENER_DATOS
*&---------------------------------------------------------------------**& Form PROCESAR_DATOS*&---------------------------------------------------------------------*FORM procesar_datos . DATA: aux_matnr LIKE mara-matnr, indice LIKE sy-tabix. DATA: w_num_aux(10) TYPE p DECIMALS 2.
"Recorro los materiales de P001. LOOP AT t_mbew INTO w_mbew.
"Para cada material, creo tantos registros como en centros esté catalogado. LOOP AT t_marc WHERE matnr = w_mbew-matnr. indice = sy-tabix. tdocs-material = w_mbew-matnr. tdocs-centro = t_marc-werks. tdocs-precioun = w_mbew-stprs. APPEND tdocs. ENDLOOP.
ENDLOOP.
SORT tdocs BY centro material.
LOOP AT t_marc. MOVE t_marc-werks TO tcen-centro. COLLECT tcen. ENDLOOP.
ENDFORM. " PROCESAR_DATOS
*&---------------------------------------------------------------------**& Form call_mr21*&---------------------------------------------------------------------*FORM call_mr21. DATA: aux_fecha(10) TYPE c, aux_campo(26) TYPE c, cont(2) TYPE n, nxtpage TYPE i.
MOVE p_fecha TO fecha_dia. CONCATENATE fecha_dia+6 fecha_dia+4(2) fecha_dia(4) INTO aux_fecha.
LOOP AT tcen. "Para cada centro
REFRESH bdc_tab. PERFORM dynpro USING 'SAPRCKM_MR21' '0201'. PERFORM campos USING 'MR21HEAD-BUDAT' aux_fecha. PERFORM campos USING 'MR21HEAD-BUKRS' 'DIVI'. PERFORM campos USING 'MR21HEAD-WERKS' tcen-centro. PERFORM campos USING 'BDC_OKCODE' '=ENTR'.
cont = 0. LOOP AT tdocs WHERE centro = tcen-centro.
cont = cont + 1.
CLEAR aux_campo. PERFORM dynpro USING 'SAPRCKM_MR21' '0201'.
CONCATENATE 'CKI_MR21_0250-MATNR(' cont ')' INTO aux_campo. PERFORM campos USING aux_campo tdocs-material.
CLEAR aux_campo. CONCATENATE 'CKI_MR21_0250-BWKEY(' cont ')' INTO aux_campo. PERFORM campos USING aux_campo tdocs-centro.
CLEAR aux_campo. CONCATENATE 'CKI_MR21_0250-NEWVALPR(' cont ')' INTO aux_campo.
CONDENSE tdocs-precioun NO-GAPS. REPLACE ',' IN tdocs-precioun WITH ''. REPLACE ',' IN tdocs-precioun WITH ''. REPLACE '.' IN tdocs-precioun WITH ','.
PERFORM campos USING aux_campo tdocs-precioun. PERFORM campos USING 'BDC_OKCODE' '=ENTR'.
nxtpage = cont MOD 9.* Se contabiliza de a un material en trx. MR21 por scroll FS 02/05/12* nxtpage = 0 .
* Fin de modificación de grabación en MR21 de a un material FS 02/05/12 IF nxtpage = 0. PERFORM dynpro USING 'SAPRCKM_MR21' '0201'. PERFORM campos USING 'BDC_OKCODE' '=SAVE'.
PERFORM call_transaction. REFRESH bdc_tab.
PERFORM dynpro USING 'SAPRCKM_MR21' '0201'. PERFORM campos USING 'MR21HEAD-BUDAT' aux_fecha. PERFORM campos USING 'MR21HEAD-BUKRS' 'DIVI'. PERFORM campos USING 'BDC_OKCODE' '=ENTR'. cont = 0. ENDIF. ENDLOOP.
PERFORM dynpro USING 'SAPRCKM_MR21' '0201'. PERFORM campos USING 'BDC_OKCODE' '=SAVE'.
PERFORM call_transaction. REFRESH bdc_tab.
ENDLOOP.
ENDFORM. "call_mr21
*&---------------------------------------------------------------------**& Form OBTENER_CENTROS_MATERIAL*&---------------------------------------------------------------------*FORM obtener_centros_material .*Obtengo centros donde existe cada material. DATA: BEGIN OF tcen OCCURS 0, matnr LIKE mbew-matnr, bwkey LIKE mbew-bwkey, END OF tcen. DATA: tdocs_aux LIKE tdocs OCCURS 0 WITH HEADER LINE.
IF tdocs[] IS INITIAL. EXIT. ENDIF.
* Obtengo todos los centros donde existe el material. SELECT * INTO CORRESPONDING FIELDS OF TABLE tcen FROM mbew FOR ALL ENTRIES IN tdocs WHERE matnr = tdocs-material.
* Para cada material de TDOCS lo duplico para cada centro de TCEN. tdocs_aux[] = tdocs[].
LOOP AT tdocs_aux. MOVE-CORRESPONDING tdocs_aux TO tdocs. LOOP AT tcen WHERE matnr = tdocs_aux-material AND bwkey NE tdocs_aux-centro. tdocs-centro = tcen-bwkey. APPEND tdocs. ENDLOOP. ENDLOOP.
SORT tdocs BY material centro.
ENDFORM. " OBTENER_CENTROS_MATERIAL*&---------------------------------------------------------------------**& Form FORMAT_NUMEROS*&---------------------------------------------------------------------*FORM format_numeros. LOOP AT tdocs. REPLACE '.' WITH ',' INTO tdocs-precioun. MODIFY tdocs INDEX sy-tabix. ENDLOOP.ENDFORM. " FORMAT_NUMEROS
*&---------------------------------------------------------------------**& Form dynpro*&---------------------------------------------------------------------*FORM dynpro USING name value. CLEAR bdc_tab. MOVE name TO bdc_tab-program. MOVE value TO bdc_tab-dynpro. MOVE 'X' TO bdc_tab-dynbegin. APPEND bdc_tab.ENDFORM. "dynpro
*&---------------------------------------------------------------------**& Form campos*&---------------------------------------------------------------------*FORM campos USING name value. CLEAR bdc_tab. MOVE name TO bdc_tab-fnam. MOVE value TO bdc_tab-fval. APPEND bdc_tab.ENDFORM. "campos
*&---------------------------------------------------------------------**& Form separa_por_mblnr_y_call_mr21_2*&---------------------------------------------------------------------**FORM separa_por_mblnr_y_call_mr21_2.* clear tdocs_aux2. refresh tdocs_aux2.* tdocs_aux2[] = tdocs[].* sort tdocs_aux2 by mblnr.*usamos tdocs para procesar separado por Número de documento material* clear tdocs. refresh tdocs.* data: MBLNR_x like mkpf-mblnr.* clear MBLNR_x.** loop at tdocs_aux2.* if sy-tabix = 1.* MBLNR_x = tdocs_aux2-mblnr.* MOVE-CORRESPONDING tdocs_aux2 to tdocs.* append tdocs.* else.
* if tdocs_aux2-mblnr ne mblnr_x.* perFORM call_mr21_2.* clear tdocs.* refresh tdocs.* endif.* MOVE-CORRESPONDING tdocs_aux2 to tdocs.* append tdocs.* MBLNR_x = tdocs_aux2-mblnr.* endif.* endloop.* perFORM call_mr21_2.*ENDFORM. "separa_por_mblnr_y_call_mr21_2***&---------------------------------------------------------------------**& Form CALL_TRANSACTION*&---------------------------------------------------------------------*FORM call_transaction. DATA: lv_txt(120) TYPE c. DATA: opt TYPE ctu_params.
opt-defsize = 'X'.
IF p_mode = 'X'. opt-dismode = 'A'. ELSE. opt-dismode = 'N'. ENDIF.
REFRESH itab.
CALL TRANSACTION 'MR21' USING bdc_tab OPTIONS FROM opt MESSAGES INTO itab.
READ TABLE itab WITH KEY msgtyp = 'E'. CLEAR ok.
LOOP AT itab.
CALL FUNCTION 'FORMAT_MESSAGE' EXPORTING id = itab-msgid lang = sy-langu no = itab-msgnr v1 = itab-msgv1 v2 = itab-msgv2 v3 = itab-msgv3 v4 = itab-msgv4 IMPORTING msg = lv_txt EXCEPTIONS not_found = 1 OTHERS = 2.
WRITE:/ lv_txt.
ENDLOOP.
ENDFORM. "CALL_TRANSACTION***&---------------------------------------------------------------------**& Form averiados_var_y_genericos_sets*&---------------------------------------------------------------------**FORM averiados_var_y_genericos_sets.* data: taux like tdocs OCCURS 0 WITH HEADER LINE. "tabla de referencia para ver que materiales ya pasaron* clear taux. refresh taux.**en tdocs_nuevos van los registros nuevos, hacemos append despues del loop.* clear tdocs_nuevos. refresh tdocs_nuevos.**corte x material* sort tdocs by material.* LOOP AT tdocs.* READ TABLE taux with key material = tdocs-material.* IF sy-subrc ne 0.* PERFORM obtengo_comp_sets." USING material_x.* PERFORM obtengo_var_gen." USING material_x.* PERFORM obtengo_averiados." USING material_x. "voy a mara con matnr_x* taux = tdocs.* APPEND taux.* ENDIF.* ENDLOOP.**agrego a tdocs los registros nuevos* APPEND LINES OF tdocs_nuevos to tdocs.** sort tdocs by material.** data: material_x like mseg-matnr.* clear material_x.* loop at tdocs.* if sy-tabix = 1.* material_x = tdocs-material.* else.* if tdocs-material ne material_x.* PERFORM obtengo_comp_sets USING material_x.* PERFORM obtengo_var_gen USING material_x.* PERFORM obtengo_averiados USING material_x. "voy a mara con matnr_x* material_x = tdocs-material.* endif.* ENDIF.* endloop.* PERFORM obtengo_comp_sets USING material_x.* PERFORM obtengo_var_gen USING material_x.* PERFORM obtengo_averiados USING material_x. "voy a mara con matnr_x.*ENDFORM. "averiados_var_y_genericos_sets**&---------------------------------------------------------------------**& Form obtengo_comp_sets
*&---------------------------------------------------------------------**FORM obtengo_comp_sets." USING material_x.* data: tstpo type stpo OCCURS 0 WITH HEADER LINE,* valor_set like tdocs-importe,* aux_denominador like tdocs-importe,* tdocs_set like tdocs OCCURS 0 WITH HEADER LINE.** clear valor_set.* replace ',' with '.' into tdocs-precioun.* valor_set = tdocs-precioun. "costo del Set* replace '.' with ',' into tdocs-precioun.** select single * from mara* where matnr = material_x and* where matnr = tdocs-material and* ATTYP = '10'.** IF sy-subrc = 0.* SELECT SINGLE * from mast* where matnr = material_x and* where matnr = tdocs-material and* stlan = '3'.* IF sy-subrc = 0.* clear tstpo. refresh tstpo.* SELECT * into table tstpo from stpo* where stlty = 'M' and* STLNR = mast-STLNR.* IF SY-subrc = 0.* clear tdocs_set. refresh tdocs_set.* clear aux_denominador.* LOOP AT tstpo.* SELECT single * from mbew* where matnr = tstpo-IDNRK and* BWKEY = 'C001'.* IF sy-subrc = 0.* tdocs_set-centro = tdocs-centro.* tdocs_set-mblnr = tdocs-mblnr.* tdocs_set-material = tstpo-IDNRK.* tdocs_set-cantidad = tstpo-menge.* if mbew-vprsv = 'V'.* tdocs_set-importe = mbew-verpr.* ELSEIF mbew-vprsv = 'S'.* tdocs_set-importe = mbew-stprs.* endif.* aux_denominador = aux_denominador + ( tdocs_set-cantidad * tdocs_set-importe ).* APPEND tdocs_set.* ENDIF.* ENDLOOP.* IF sy-subrc = 0.* El costo del Set, debe prorratearse en los componentes del set según la siguiente lógica* LOOP at tdocs_set.* tdocs_set-precioun = valor_set * ( tdocs_set-importe / aux_denominador ).* modify tdocs_set INDEX sy-tabix TRANSPORTING precioun.* ENDLOOP.* APPEND LINES OF tdocs_set to tdocs_nuevos.* ENDIF.* ENDIF.
* ENDIF.* ENDIF.**ENDFORM. "obtengo_comp_sets*&---------------------------------------------------------------------**& Form INICIALIZAR*&---------------------------------------------------------------------*FORM inicializar .
REFRESH tdocs. CLEAR tdocs.
REFRESH tcen. CLEAR tcen.
REFRESH bdc_tab. CLEAR bdc_tab.
ENDFORM. " INICIALIZAR
Top Related