Você está na página 1de 73

C3

C1
C2
C5
I1

I3
IF
H1
ID FATOR POR 1000

MIL
12,090.00 1000 12.09 500 6045
Corrigir o valor unitário
Valor total esta ok

12,090.00 1000 12.09

dividido por 10.000


Corrigir o valor unitário
Valor total esta ok
MIL
500 6045
TX ICMX BR DH 7462
TX ICMX BR DI 7467
TX ICMX BR DJ 7482
TX ICMX BR DK 7498
TX ICMX BR DM 7510
TX ICMX BR DR 7551
TX ICMX BR J1 7928
TX ICMX BR J2 7930
TX ICMX BR J3 7935
TX ICMX BR J4 7948
TX ICMX BR J5 7962
TX ICMX BR J7 7977
TX ICMX BR JC 7993
TX ICMX BR JE 8006
TX ICMX BR JH 368622
TX ICMX BR JI 389510
TX ICMX BR JJ 389536
TX ICMX BR JV 1793622
TX ICMX BR K0 8022
TX ICMX BR K2 8042
TX ICMX BR K4 8063
TX ICMX BR K6 8098
TX ICMX BR KJ 2054523
TX ICMX BR KL 2054479
TX ICMX BR KS 2124370
5,259.78
8,766.30
1,749.61

15,775.69
29,614.29 J5
4,741.03
5,153.30
39,508.62
DH
J1 MM_ATIVO: ICMS(CIAP)/IPI

50,060.33
21,498.87
71,559.20

Valor unitário deverá dividir por 10.000


Fator de conversão não está dividindo.

MM_ATIVO: ICMS(CIAP)/DIFAL/IPI

557,959.96
139,869.24
697,829.20
ICMS(CIAP)/IPI

)/DIFAL/IPI
K6
H1
CG
JP
1 Valor unitário deverá dividir por (exemplo 10.000) Fator de conversão não está dividindo. (campo ekpo-
2 Formatação do campo de valores e dos textos de impostos

3 Verificar se vai ser necessário incluir o imposto de ST (Substituição Tributaria)


ndo. (campo ekpo-peinh)
Quando utiliza-se valor por um divisor ele não equaliza para verificar os valores (consd

4500001669 1001 10 14.11.2014 1011111 24,000.00


4500001674 1001 10 14.11.2014 1011111 24,000.00
4500001675 1001 10 14.11.2014 1011111 240
4500001665 1001 10 12.11.2014 1011111 30,000,969.55
4500001648 1001 10 13.11.2014 1011111 82
*&--------------------------------------------------------------
*&  Include           ZSINC_PRECO_MAT_ME
*&--------------------------------------------------------------
*& DESENVOLVIMENTO    : Verificação Preço Liquido               
*& DATA CRIAÇÃO       : 23/09/2013                              
*& DESCRIÇÃO          : Exit para verificar preço líquido ao cri
*&--------------------------------------------------------------
**Tipos
TYPES: BEGIN OF ty_ekpo_prec,
        ebeln TYPE ekpo-ebeln,
        aedat TYPE ekko-aedat,
        lifnr TYPE ekko-lifnr,
        matnr TYPE ekpo-matnr,
        werks TYPE ekpo-werks,
        netpr TYPE ekpo-netpr,
       END OF ty_ekpo_prec,

       BEGIN OF ty_ekpo_final,
        ebelp TYPE ekpo-ebelp,
        matnr TYPE ekpo-matnr,
        werks TYPE ekpo-werks,
        netpr TYPE ekpo-netpr,
        matkl TYPE ekpo-matkl,
       END OF ty_ekpo_final.

*Variáveis e tabelas internas
DATA: lt_ekpo_mat   TYPE TABLE OF uekpo,
      ls_ekpo_mat   TYPE bekpo,
      lt_ekpo_prec  TYPE TABLE OF ty_ekpo_prec,
      ls_ekpo_prec  TYPE ty_ekpo_prec,
      lt_ekpo_final TYPE TABLE OF ty_ekpo_final,
      ls_ekpo_final TYPE ty_ekpo_final,
      lt_fields     TYPE TABLE OF sval,
      lt_preco      TYPE TABLE OF zstmm_preco_liq,
      ls_preco      TYPE zstmm_preco_liq,
      ls_fields     TYPE sval,
      lc_status_mat TYPE xfeld,
      lv_percent    TYPE p DECIMALS 2,
      lv_msg1(50)   TYPE c,
      lv_msg2(50)   TYPE c,
      lv_msg3(50)   TYPE c,
      lv_log        TYPE c,
      lv_resposta   TYPE c,
      lv_texto(50)  TYPE c,
      lv_return     TYPE c,
      lv_matnr      TYPE ekpo-matnr,
      lv_altera     TYPE c,
      lv_data(10)   TYPE c,
      lv_servico    TYPE c.

**Dados para Log de erros
DATA: ls_log_handle      TYPE balloghndl,
      ls_log             TYPE bal_s_log,
      ls_msg             TYPE bal_s_msg,
      ls_msgno           TYPE symsgno,
      ls_display_profile TYPE bal_s_prof.

*break c14080004.
*CHECK sy-uname EQ 'C14080004'.

CHECK sy-uname NE 'C14080007'.

* Função que busca se a Exit está ativa ou não
CALL FUNCTION 'Z_Y_BC_VALIDA_EXIT'
  EXPORTING
    i_programa = 'ZXM06U43'
    i_include  = 'ZSINC_PRECO_MAT_ME'
  IMPORTING
    e_status   = lc_status_mat.

IF lc_status_mat EQ 'X' AND ( sy-tcode EQ 'ME21N' OR sy-tcode EQ
  lt_ekpo_mat[] = tekpo[].

**Criando o log inicial
  ls_log-extnumber  = 'Log de pedidos fora do preço'.
  CALL FUNCTION 'BAL_LOG_CREATE'
    EXPORTING
      i_s_log      = ls_log
    IMPORTING
      e_log_handle = ls_log_handle
    EXCEPTIONS
      OTHERS       = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  LOOP AT lt_ekpo_mat INTO ls_ekpo_mat.

    IF NOT ls_ekpo_mat-matnr IS INITIAL.

      CLEAR: ls_ekpo_prec, lv_percent,
             lv_msg1, lv_msg2, lv_msg3, ls_msg, lv_data.

      SELECT ekpo~ebeln ekko~aedat ekko~lifnr ekpo~matnr ekpo~we
             FROM ekpo INNER JOIN ekko ON ekpo~ebeln EQ ekko~ebe
             INTO ls_ekpo_prec
             WHERE ekpo~matnr EQ ls_ekpo_mat-matnr
               AND ekpo~werks EQ ls_ekpo_mat-werks
               AND ekko~lifnr EQ i_ekko-lifnr
               ORDER BY ekpo~ebeln DESCENDING.
      ENDSELECT.

      IF sy-subrc IS INITIAL.

*Calculando porcentagem (15%) sobre o valor do preço líquido ref
        lv_percent = ( 15 / 100 ) * ls_ekpo_prec-netpr.
        ls_ekpo_prec-netpr = ls_ekpo_prec-netpr + lv_percent.
**Verificando se o valor somado os 15% é maior que o que esta en
        IF ls_ekpo_mat-netpr GT ls_ekpo_prec-netpr.

          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
            EXPORTING
              input  = ls_ekpo_mat-matnr
            IMPORTING
              output = lv_matnr.

          lv_log = 'X'.
**Adicionando log
          ls_msg-msgty = 'E'.
          ls_msg-msgid = 'ZMM'.
          ls_msg-msgno = 000.
          CONCATENATE ls_ekpo_prec-aedat+6(2) ls_ekpo_prec-aedat
          CONCATENATE 'Material' lv_matnr 'excedeu 15%' INTO lv_
          CONCATENATE 'da ultima compra,' ls_ekpo_prec-ebeln INT
          CONCATENATE 'data' lv_data INTO lv_msg3 SEPARATED BY s
          ls_msg-msgv1 = lv_msg1.
          ls_msg-msgv2 = lv_msg2.
          ls_msg-msgv3 = lv_msg3.
          CALL FUNCTION 'BAL_LOG_MSG_ADD'
            EXPORTING
              i_log_handle = ls_log_handle
              i_s_msg      = ls_msg
            EXCEPTIONS
              OTHERS       = 1.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.

**Preenchendo tabela final com os materias fora do preço
          MOVE-CORRESPONDING ls_ekpo_mat TO ls_ekpo_final.
          APPEND ls_ekpo_final TO lt_ekpo_final.
          CLEAR ls_ekpo_final.
        ENDIF.
      ENDIF.
***Material em branco.
    ELSE.
      CLEAR: ls_ekpo_prec, lv_percent,
             lv_msg1, lv_msg2, lv_msg3, ls_msg, lv_data.

      SELECT ekpo~ebeln ekko~aedat ekko~lifnr ekpo~matnr ekpo~we
             FROM ekpo INNER JOIN ekko ON ekpo~ebeln EQ ekko~ebe
             INTO ls_ekpo_prec
             WHERE ekpo~matkl EQ ls_ekpo_mat-matkl
               AND ekpo~werks EQ ls_ekpo_mat-werks
               AND ekko~lifnr EQ i_ekko-lifnr
               ORDER BY ekpo~ebeln DESCENDING.
      ENDSELECT.

      IF sy-subrc IS INITIAL.
*Calculando porcentagem (15%) sobre o valor do preço líquido ref
        lv_percent = ( 15 / 100 ) * ls_ekpo_prec-netpr.
        ls_ekpo_prec-netpr = ls_ekpo_prec-netpr + lv_percent.
**Verificando se o valor somado os 15% é maior que o que esta en
        IF ls_ekpo_mat-netpr GT ls_ekpo_prec-netpr.

          lv_log = 'X'.
          lv_servico = 'X'.
**Adicionando log
          ls_msg-msgty = 'E'.
          ls_msg-msgid = 'ZMM'.
          ls_msg-msgno = 000.
          CONCATENATE ls_ekpo_prec-aedat+6(2) ls_ekpo_prec-aedat
          CONCATENATE 'Serviço' ls_ekpo_mat-matkl '(Item' ls_ekp
          CONCATENATE 'da ultima compra,' ls_ekpo_prec-ebeln INT
          CONCATENATE 'data' lv_data INTO lv_msg3 SEPARATED BY s
          ls_msg-msgv1 = lv_msg1.
          ls_msg-msgv2 = lv_msg2.
          ls_msg-msgv3 = lv_msg3.
          CALL FUNCTION 'BAL_LOG_MSG_ADD'
            EXPORTING
              i_log_handle = ls_log_handle
              i_s_msg      = ls_msg
            EXCEPTIONS
              OTHERS       = 1.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.

**Preenchendo tabela final com os materias fora do preço
          MOVE-CORRESPONDING ls_ekpo_mat TO ls_ekpo_final.
          APPEND ls_ekpo_final TO lt_ekpo_final.
          CLEAR ls_ekpo_final.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

**Caso alguma material tenho valor alterado - Exibir LOG e solic
  IF NOT lv_log IS INITIAL.

    CLEAR: ls_msg.
    ls_msg-msgty = 'E'.
    ls_msg-msgid = 'ZMM'.
    ls_msg-msgno = 000.
    ls_msg-msgv1 = 'Esta divergência de valores deverá ser justi
    CALL FUNCTION 'BAL_LOG_MSG_ADD'
      EXPORTING
        i_log_handle = ls_log_handle
        i_s_msg      = ls_msg
      EXCEPTIONS
        OTHERS       = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

**Lendo características do log
    CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
      IMPORTING
        e_s_display_profile = ls_display_profile
      EXCEPTIONS
        OTHERS              = 1.
    IF sy-subrc EQ 0.
**Alterando caracteristicas da janela de log
      ls_display_profile-no_toolbar = 'X'.
      IF lv_servico EQ 'X'.
        ls_display_profile-title      = 'Log de serviços fora do
      ELSE.
        ls_display_profile-title      = 'Log de materias fora do
      ENDIF.
      ls_display_profile-cwidth_opt = 'X'.
      ls_display_profile-start_col  = '45'.
      ls_display_profile-start_row  = '4'.
      ls_display_profile-end_col    = '180'.
      ls_display_profile-end_row    = '25'.
    ENDIF.

**Gerando o log na tela
    CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
      EXPORTING
        i_s_display_profile = ls_display_profile
      EXCEPTIONS
        OTHERS              = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

**Perguntando se o usuário quer justificar e criar o pedido.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar      = 'Justificativa'
        text_question = 'Deseja inserir uma justificativa, para 
        text_button_1 = 'Sim'
        icon_button_1 = 'ICON_CREATE_NOTE'
        text_button_2 = 'Não'
        icon_button_2 = 'ICON_CANCEL'
        start_column  = '45'
        start_row     = '4'
      IMPORTING
        answer        = lv_resposta.

    IF lv_resposta EQ '1'.

      LOOP AT lt_ekpo_final INTO ls_ekpo_final.

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            input  = ls_ekpo_final-matnr
          IMPORTING
            output = ls_ekpo_final-matnr.
*--Preenchendo justificativa
        ls_fields-tabname    = 'ZSTMM_PRECO_LIQ'.
        ls_fields-fieldname  = 'JUST'.
        ls_fields-field_obl  = 'X'.
        ls_fields-fieldtext  = 'Texto'.
        APPEND ls_fields TO lt_fields.
        CLEAR ls_fields.

        CLEAR: lv_texto,
               lv_return.
        IF lv_servico EQ 'X'.
          CONCATENATE 'Justificativa para serviço:' ls_ekpo_fina
        ELSE.
          CONCATENATE 'Justificativa para material:' ls_ekpo_fin
        ENDIF.

        CALL FUNCTION 'POPUP_GET_VALUES'
          EXPORTING
            popup_title     = lv_texto
            start_column    = '45'
            start_row       = '4'
          IMPORTING
            returncode      = lv_return
          TABLES
            fields          = lt_fields
          EXCEPTIONS
            error_in_fields = 1
            OTHERS          = 2.

        IF sy-subrc IS INITIAL.
          READ TABLE lt_fields INTO ls_fields WITH KEY fieldname
          IF sy-subrc IS INITIAL AND NOT ls_fields-value IS INIT
            ls_preco-ebeln      = i_ekko-ebeln.
            ls_preco-ebelp      = ls_ekpo_final-ebelp.
            ls_preco-lifnr      = i_ekko-lifnr.
            ls_preco-werks      = ls_ekpo_final-werks.
            ls_preco-matnr      = ls_ekpo_final-matnr.
            ls_preco-just       = ls_fields-value.
            ls_preco-aedat      = i_ekko-aedat.
            ls_preco-netpr      = ls_ekpo_final-netpr.
            APPEND ls_preco TO lt_preco.
            CLEAR: ls_preco, ls_fields.
            REFRESH lt_fields.
          ELSE.
***Deletando msg criada
            CALL FUNCTION 'BAL_LOG_DELETE'
              EXPORTING
                i_log_handle  = ls_log_handle
              EXCEPTIONS
                log_not_found = 1
                OTHERS        = 2.

***Gerando msg de erro parando o processamento
            MESSAGE e000(zmm) WITH 'Preço líquido excedeu 15%, f
          ENDIF.
        ENDIF.
      ENDLOOP.

***Deletando msg criada
      CALL FUNCTION 'BAL_LOG_DELETE'
        EXPORTING
          i_log_handle  = ls_log_handle
        EXCEPTIONS
          log_not_found = 1
          OTHERS        = 2.
    ELSE.
***Deletando msg criada
      CALL FUNCTION 'BAL_LOG_DELETE'
        EXPORTING
          i_log_handle  = ls_log_handle
        EXCEPTIONS
          log_not_found = 1
          OTHERS        = 2.

      MESSAGE e000(zmm) WITH 'Gravação cancelada preço líquido m
    ENDIF.
  ENDIF.
ENDIF.
IF NOT lt_preco[] IS INITIAL.
  EXPORT lt_preco TO MEMORY ID 'PRECO_LIQ'.
ENDIF.
ificar os valores (consderar o campo EKPO-PEINH)

BRL 16949 1,000


BRL 16949 1,000
BRL 16949 1
BRL 16949 10,000
BRL 16949 1
------------------------*

------------------------*
do                      *
                        *
ço líquido ao criar     *
------------------------*
N' OR sy-tcode EQ 'ME23N' OR sy-tcode EQ 'ME22N' ) AND ( sy-ucomm EQ 'MESAVE' OR sy-ucomm EQ 'YES' ).

-msgv4.
 lv_data.

kpo~matnr ekpo~werks ekpo~netpr UP TO 1 ROWS
ebeln EQ ekko~ebeln

preço líquido referente ao ultimo pedido
c-netpr.
 + lv_percent.
que o que esta entrando no pedido

OUTPUT'

s_ekpo_prec-aedat+4(2) ls_ekpo_prec-aedat(4) INTO lv_data SEPARATED BY '.'.
deu 15%' INTO lv_msg1 SEPARATED BY space.
po_prec-ebeln INTO lv_msg2 SEPARATED BY space.
g3 SEPARATED BY space.
UMBER sy-msgno
msgv3 sy-msgv4.

 do preço
ekpo_final.

 lv_data.

kpo~matnr ekpo~werks ekpo~netpr UP TO 1 ROWS
ebeln EQ ekko~ebeln

preço líquido referente ao ultimo pedido
c-netpr.
 + lv_percent.
que o que esta entrando no pedido

s_ekpo_prec-aedat+4(2) ls_ekpo_prec-aedat(4) INTO lv_data SEPARATED BY '.'.
kl '(Item' ls_ekpo_mat-ebelp ')' 'excedeu 15%' INTO lv_msg1 SEPARATED BY space.
po_prec-ebeln INTO lv_msg2 SEPARATED BY space.
g3 SEPARATED BY space.
UMBER sy-msgno
msgv3 sy-msgv4.

 do preço
ekpo_final.

xibir LOG e solicitar Justificativa.

 deverá ser justificada!'.

sy-msgno
sy-msgv4.
 serviços fora do preço!'.

 materias fora do preço!'.

sy-msgno
sy-msgv4.

iar o pedido.

tificativa, para criação do pedido?'
ço:' ls_ekpo_final-matkl INTO lv_texto SEPARATED BY space.

ial:' ls_ekpo_final-matnr INTO lv_texto SEPARATED BY space.

ITH KEY fieldname = 'JUST'.
lds-value IS INITIAL.

-ebelp.

-werks.
-matnr.

-netpr.
do excedeu 15%, favor inserir justificativas!'.

a preço líquido maior que 15%!'.
m EQ 'YES' ).

Você também pode gostar