Pragiva — Tecnologia na prática

M120VLPC valida os pedidos de compra marcados antes de carregá-los no documento de entrada

M120VLPC roda depois do OK na tela de seleção de pedidos de compra do documento de entrada, recebe a lista marcada e, ao retornar .F., cancela a carga inteira sem mensagem.

Desenvolvimento Referência técnica 4 min de leitura

Assista o vídeo

M120VLPC em resumo

Onde fica
função A103ProcPC(), que carrega no documento de entrada os pedidos de compra escolhidos na janela de seleção.
Quando dispara
depois que o usuário marca os pedidos e confirma a janela com OK, antes de qualquer item ser trazido para a nota.
PARAMIXB
{aF4For, lNfMedic, lUsaFiscal}. O primeiro elemento é a lista de pedidos exibida na janela, passada por referência.
Retorno
usado. .F. cancela toda a carga.
Serve para bloquear?
Sim, mas sem aviso próprio: o padrão apenas deixa de carregar e a nota segue como estava.
Consulta rápida5 seções

O nome engana: apesar do prefixo M120, o ponto de entrada é chamado dentro da rotina do documento de entrada (MATA103). Para o mecanismo geral de pontos de entrada, veja Ponto de entrada no Protheus. Para a diferença entre documento de entrada e pré-nota, veja Pré-nota ou documento de entrada.

O que o retorno faz de verdade

O padrão guarda o retorno numa variável lógica (inicializada com .T., então quem não tem o PE não é afetado) e envolve toda a carga num If sobre ela. Ao retornar .F.:

  • nenhum item de nenhum pedido marcado é carregado;
  • o tratamento de pedidos com produto bloqueado, o aviso de produto não cadastrado e os pontos de entrada seguintes da carga (MT103VPC, MT103NPC, MT103TXPC, MT103FRE) não rodam;
  • o rateio de frete, seguro e despesa e o refresh fiscal que fecham a rotina também ficam de fora.

A tela já foi fechada quando o PE dispara e o padrão não emite mensagem. Se você retorna .F. calado, o usuário vê a janela sumir e a nota continuar vazia. Sempre mostre um Help() ou aviso antes de retornar .F..

O que ele recebe

PosiçãoTipoConteúdo
PARAMIXB[1]Array de arraysOs pedidos listados na janela, um por linha, por referência
PARAMIXB[2]LógicolNfMedic: nota de medição de contrato
PARAMIXB[3]LógicolUsaFiscal: se a nota usa a função fiscal

Cada linha de PARAMIXB[1] tem o layout abaixo. Ele muda conforme a nota seja ou não de medição:

PosiçãoNota comumNota de medição (lNfMedic)
1Marcado (lógico)Marcado (lógico)
2Loja do fornecedorMedição
3Número do pedidoContrato
4Emissão (texto, DTOC)Planilha
5Origem: AE (autorização de entrega) ou PCLoja do fornecedor
6Número do pedido
7Emissão (texto)
8Origem: AE ou PC

Colunas adicionais de outros pontos de entrada da própria janela vêm depois dessas, sem deslocá-las.

A posição 1 é o que decide o que será carregado: o laço do padrão lê aF4For[nx][1] depois do PE. Como o array chega por referência e o laço lê o mesmo array depois, desmarcar uma linha dentro do PE tira aquele pedido da carga, sem cancelar os demais. Isso é uma alternativa ao .F. quando só alguns pedidos violam a regra.

Note também que o PE não recebe o fornecedor nem o número da nota. Se a sua regra precisa de dados do pedido, busque na pelo número do pedido.

Exemplo

A regra do exemplo: não misturar autorização de entrega e pedido de compra na mesma carga. Ela usa só o layout acima.

ADVPL / TLPP
#Include "Protheus.ch"

/*/{Protheus.doc} M120VLPC
Chamado em A103ProcPC(), depois do OK na seleção de pedidos de compra do
documento de entrada e antes de carregar os itens.
Impede misturar autorização de entrega (AE) e pedido de compra (PC).
@type function
@return logical, .F. cancela a carga dos pedidos
/*/
User Function M120VLPC()

    Local aPedidos := {}
    Local lMedicao := .F.
    Local nPosOrig := 0
    Local nI       := 0
    Local nQtdAE   := 0
    Local nQtdPC   := 0

    If Type("PARAMIXB") <> "A" .Or. Len(PARAMIXB) < 2 ;
        .Or. ValType(PARAMIXB[1]) <> "A" .Or. ValType(PARAMIXB[2]) <> "L"
        ConOut("[M120VLPC] PARAMIXB inesperado. Regra ignorada.")
        Return .T.
    EndIf

    aPedidos := PARAMIXB[1]
    lMedicao := PARAMIXB[2]

    // A coluna da origem muda de lugar na nota de medição.
    nPosOrig := IIf(lMedicao, 8, 5)

    For nI := 1 To Len(aPedidos)
        If aPedidos[nI][1]    // só as linhas marcadas serão carregadas
            If aPedidos[nI][nPosOrig] == "AE"
                nQtdAE++
            Else
                nQtdPC++
            EndIf
        EndIf
    Next nI

    If nQtdAE > 0 .And. nQtdPC > 0
        // O padrão não avisa nada: sem esta mensagem a carga some em silêncio.
        If !IsBlind()
            Help(" ", 1, "M120VLPC",, ;
                "Não misture autorização de entrega e pedido de compra na mesma nota.", 1, 0)
        Else
            ConOut("[M120VLPC] Carga recusada: AE e PC marcados juntos.")
        EndIf
        Return .F.
    EndIf

Return .T.

O exemplo sai cedo com .T. quando o PARAMIXB não tem o formato esperado e só retorna .F. quando a própria regra reprova.

Armadilhas

Assumir a posição da origem ou do número do pedido. Em nota de medição todas as colunas depois da primeira se deslocam. Leia PARAMIXB[2] e escolha a posição, como no exemplo.

Retornar .F. sem mensagem. O usuário não entende por que a nota ficou vazia e abre chamado.

Retornar Nil por esquecer o Return. O padrão usa o retorno direto em um If. Devolva sempre .T. ou .F..

Esperar que o PE valide cada item. Ele enxerga pedidos inteiros (uma linha por pedido), não os itens. Regra por item, como produto, saldo ou preço, pertence a MT103VPC, que roda por item de pedido carregado, ou à validação da linha da nota.

Ignorar rotina automática. Dentro de IsBlind() não há quem responda a diálogo; registre no console e retorne.

Os vizinhos

Os pontos de entrada abaixo participam da mesma carga, mas em momentos diferentes. Os nomes e o momento vêm do próprio fluxo do padrão; o comportamento de cada um fica para o artigo dele.

PEMomento na carga
M120VLPCUma vez, sobre a lista de pedidos marcados, antes de carregar
MT103VPCPor item de pedido, dentro do laço de carga; só os itens aprovados entram na nota
MT103NPCDepois da carga, para ajustar as múltiplas naturezas
MT103TXPCDepois da carga, para ajustar moeda e taxa
MT103FREDepois da carga, para ajustar frete, seguro e despesa

Para o nome de um PE que valida outra etapa do documento de entrada, veja MT103LOK.

Continue por aqui