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ção | Tipo | Conteúdo |
|---|---|---|
PARAMIXB[1] | Array de arrays | Os pedidos listados na janela, um por linha, por referência |
PARAMIXB[2] | Lógico | lNfMedic: nota de medição de contrato |
PARAMIXB[3] | Lógico | lUsaFiscal: 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ção | Nota comum | Nota de medição (lNfMedic) |
|---|---|---|
| 1 | Marcado (lógico) | Marcado (lógico) |
| 2 | Loja do fornecedor | Medição |
| 3 | Número do pedido | Contrato |
| 4 | Emissão (texto, DTOC) | Planilha |
| 5 | Origem: AE (autorização de entrega) ou PC | Loja do fornecedor |
| 6 | Número do pedido | |
| 7 | Emissão (texto) | |
| 8 | Origem: 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 SC7 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.
#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.
| PE | Momento na carga |
|---|---|
M120VLPC | Uma vez, sobre a lista de pedidos marcados, antes de carregar |
MT103VPC | Por item de pedido, dentro do laço de carga; só os itens aprovados entram na nota |
MT103NPC | Depois da carga, para ajustar as múltiplas naturezas |
MT103TXPC | Depois da carga, para ajustar moeda e taxa |
MT103FRE | Depois 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
- Vídeo
DesenvolvimentoReferência técnica
F340VALOK: o ponto de entrada que barra o OK da compensação a pagar
F340VALOK roda ao clicar OK na lista de títulos da compensação a pagar, recebe a lista em PARAMIXB e, retornando .F., mantém o usuário na lista.
- Vídeo
DesenvolvimentoReferência técnica
F340VLD: o ponto de entrada que barra a compensação no Contas a Pagar
F340VLD roda ao confirmar a primeira tela da compensação a pagar (FINA340), sem PARAMIXB. Retornando .F., a tela não fecha e nenhum título chega a ser listado.
- Vídeo
DesenvolvimentoReferência técnica
F40DELPR: o ponto de entrada que troca a baixa do provisório pela exclusão
F40DELPR roda ao abrir a substituição de título provisório no Contas a Receber, sem PARAMIXB. Retornando .T., o provisório é excluído em vez de baixado.