Validação de Duplicidade de Fornecedores e Clientes por Nome e CNPJ
O objetivo é implemnetar uma validação robusta para impedir o cadastro duplicado de fornecedores e clientes, utilizando a combinação de "Nome + CNPJ" como critério principal. Isso garante a integridade dos dados no sistema SAP.
Validação de Nome de Fornecedor Duplicado
Para verificar a existência de fornecedores com nomes idênticos, utilizaremos o Business Add-In (BAdI) BUPA_ADDR_CHECK. Este BAdI é acionado para validações de endereço e informações gerais do parceiro de negócios.
METHOD if_ex_bupa_addr_check~check.
DATA: lv_ok_code TYPE bu_fcode.
" Recupera o código de operação atual
CALL FUNCTION 'BUS_LOCATOR_OKCODE'
IMPORTING
ev_ok_code = lv_ok_code.
" Verifica se a operação é de salvamento ou confirmação de volta e se estamos na transação BP
IF ( lv_ok_code = 'BUS_MAIN_SAVE' OR ( lv_ok_code = 'BUS_MAIN_BACK' AND sy-ucomm = 'YES' ) ) AND
sy-tcode = 'BP' AND
sy-mandt IN ('140', '400', '900') AND " Filtra por mandantes específicos
iv_activity EQ '01' AND " Criação de parceiro de negócios
is_but000-bu_group = 'S001'. " Verifica o grupo de criação
FIELD-SYMBOLS: <fs_partner_role> TYPE any.
" Associa o campo do grupo de parceiros de negócios
ASSIGN ('(SAPLBUPA_DIALOG_JOEL)BUS_JOEL_MAIN-PARTNER_ROLE') TO <fs_partner_role>.
" Verifica se o parceiro é um fornecedor específico (exemplo: ZKD001X)
IF <fs_partner_role> EQ 'ZKD001X'.
" Consulta para verificar se já existe um fornecedor com o mesmo nome
SELECT SINGLE *
FROM lfa1
WHERE name1 EQ is_but000-name_org1. " is_but000-name_org1 contém o nome organizacional
" Se um registro for encontrado, exibe uma mensagem de erro
IF sy-subrc EQ 0.
MESSAGE 'Um fornecedor com este nome já existe. Por favor, verifique.' TYPE 'E'. " Mensagem de erro
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
Validação de CNPJ de Fornecedor Duplicado
A validação do CNPJ será implementada através de um "implicit enhancement" no formulário GT_BPTAXNUM_MODIFY dentro do programa LBUPA_BUTX_DIALOG. Esta abordagem permite injetar código na lógica existente sem modificar o programa original.
ENHANCEMENT 1 ZBP_VENDOR_TAXNUM_CHECK. " Versão ativa
" Verifica se a transação é 'BP' e os mandantes especificados
IF sy-tcode EQ 'BP' AND
sy-mandt IN ('140', '400', '900').
FIELD-SYMBOLS: <fs_creation_group> TYPE any,
<fs_partner_role> TYPE any.
DATA: lv_operation_code TYPE bu_fcode.
" Obtém o código da operação atual
CALL FUNCTION 'BUS_LOCATOR_OKCODE'
IMPORTING
ev_ok_code = lv_operation_code.
" Verifica se a operação é de salvar ou confirmar retorno
IF ( lv_operation_code = 'BUS_MAIN_SAVE' OR ( lv_operation_code = 'BUS_MAIN_BACK' AND sy-ucomm = 'YES' ) ).
" Associa os campos de grupo de criação e papel do parceiro
ASSIGN ('(SAPLBUPA_DIALOG_JOEL)BUS_JOEL_MAIN-CREATION_GROUP') TO <fs_creation_group>.
ASSIGN ('(SAPLBUPA_DIALOG_JOEL)BUS_JOEL_MAIN-PARTNER_ROLE') TO <fs_partner_role>.
IF <fs_creation_group> IS ASSIGNED AND <fs_partner_role> IS ASSIGNED.
" Verifica se o grupo de criação e papel do parceiro correspondem aos critérios
IF <fs_creation_group> EQ 'S001' AND <fs_partner_role> EQ 'ZKD001X'.
" Verifica se o CNPJ já existe para o fornecedor atual (em caso de alteração)
SELECT SINGLE *
FROM lfa1
WHERE lifnr EQ dfkkbptaxnum-partner. " dfkkbptaxnum-partner é o ID do fornecedor
" Se for um novo registro e o CNPJ não estiver vazio
IF sy-subrc NE 0 AND dfkkbptaxnum-taxnumxl IS NOT INITIAL.
" Consulta para verificar se já existe outro fornecedor com o mesmo CNPJ
SELECT SINGLE *
FROM lfa1
WHERE stcd5 EQ dfkkbptaxnum-taxnumxl. " stcd5 é o campo para CNPJ
" Se um registro com o mesmo CNPJ for encontrado, exibe erro
IF sy-subrc EQ 0.
MESSAGE 'Um fornecedor com este CNPJ já existe. Por favor, verifique.' TYPE 'E'. " Mensagem de erro
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDENHANCEMENT.