Programa para actualizar precios en los demás centros

10
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

Transcript of Programa para actualizar precios en los demás centros

Page 1: Programa para actualizar precios en los demás centros

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.

Page 2: Programa para actualizar precios en los demás centros

  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.

Page 3: Programa para actualizar precios en los demás centros

  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 .

Page 4: Programa para actualizar precios en los demás centros

* 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.

Page 5: Programa para actualizar precios en los demás centros

  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.

Page 6: Programa para actualizar precios en los demás centros

*      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.

Page 7: Programa para actualizar precios en los demás centros

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

Page 8: Programa para actualizar precios en los demás centros

*&---------------------------------------------------------------------**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.

Page 9: Programa para actualizar precios en los demás centros

*    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