Pragiva — Tecnologia na prática

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.

Desenvolvimento Referência técnica 3 min de leitura

Assista o vídeo Ver o fluxograma

F340VALOK em resumo

Onde fica
função FA340OK(), o OK da lista de títulos da compensação a pagar (FINA340).
Quando dispara
ao clicar OK na lista de títulos, antes de qualquer gravação.
PARAMIXB
{aTitulos}, a lista de títulos da tela, marcados ou não.
Retorno
lógico decide; Nil mostra a pergunta padrão de confirmação.
Serve para bloquear?
Sim. .F. mantém o usuário na lista.
Consulta rápida5 seções

Este é o ponto de entrada da lista de títulos da compensação. A tela anterior, a dos dados da compensação, tem outro ponto de entrada, o F340VLD, que não recebe nada em PARAMIXB. Se a sua regra depende de quais títulos foram marcados, ela só pode estar aqui. Para o fluxo de compensação em si, veja Pagamento antecipado (PA) e compensação no Contas a Pagar.

O que acontece no OK

SimNãoNãoSimNil.T..F.SimNãoUsuário marca títulos e clica OKUsa sequência de diárioe o diário é inválido?Retorna .F.PE não é chamadoF340VALOK existe?Pergunta padrãoConfirma marcação de títulos?Executa o PERetornoSegue sem perguntarPermanece na listaValida total, saldo e grava

O padrão chama o ponto de entrada passando a lista de títulos em PARAMIXB[1] e usa o resultado como o retorno do OK. Três comportamentos importam:

Retorno do PEEfeito
.F.O diálogo não fecha. O usuário continua na lista, com as marcações como estavam, e pode ajustar e clicar OK de novo
.T.O diálogo fecha sem a pergunta “Confirma marcação de títulos?”
NilO padrão faz a pergunta e o retorno passa a ser a resposta do usuário

O Nil é o caminho natural quando a sua regra só quer barrar: devolva .F. no erro e Nil no resto, e a confirmação padrão continua existindo.

Armadilhas

Ele roda antes das validações de valor. Depois que o PE libera, o padrão ainda confere se o total marcado é maior que zero e se cabe no saldo, e só então abre a transação de gravação. O PE não vê o resultado dessas conferências; se a sua regra depende do total, calcule a partir da lista.

Não é chamado na compensação automática. Na execução automática a tela não é montada e o botão OK não existe. Regra que precisa valer também nesse caminho não pode morar só aqui.

Só o Nil é tratado como “sem opinião”. O padrão espera lógico ou Nil; um número ou texto devolvido por descuido pode quebrar o OK com erro de tipo.

Nem toda coluna da lista é número. No Brasil, saldo e valor a compensar (posições 5 e 6) são texto já formatado com Transform, não valor numérico. Para a regra de valor, não faça conta com essas colunas. A marcação (posição 8, lógica), o tipo (4) e a identificação do título (prefixo, número e parcela, posições 1 a 3) têm o mesmo significado em todas as localizações.

Disparado a cada clique no OK. Se o usuário for barrado e clicar de novo, o ponto de entrada roda de novo. Evite regra com efeito colateral, como gravar log ou enviar e-mail.

Posições de aTitulos que o exemplo usa

PosiçãoConteúdo
1Prefixo
2Número do título
3Parcela
4Tipo
8Título marcado para compensação (lógico)

No Brasil, a lista tem mais colunas (fornecedor, emissão, vencimento real, valores). Só use as que sua regra precisa, e confirme no seu release o que cada uma guarda antes de depender dela.

Exemplo

A regra: impedir a compensação de títulos de certos tipos, definidos em um parâmetro próprio (não existe no padrão; crie-o no Configurador). Se o parâmetro estiver vazio, o ponto de entrada não interfere.

ADVPL / TLPP
#Include "Protheus.ch"

/*/{Protheus.doc} F340VALOK
Executado em FA340OK(), ao clicar OK na lista de titulos da compensacao a pagar.
Barra a compensacao quando ha titulo marcado de tipo nao permitido.
@type function
@return logical, .F. mantem o usuario na lista; Nil mantem a pergunta padrao
/*/
User Function F340VALOK()

    Local aTitulos := PARAMIXB[1]
    Local cTipos   := AllTrim(SuperGetMv("MV_XTPNCMP", .F., ""))
    Local cLista   := ""
    Local nX       := 0

    // Sem parametro preenchido, nao opina.
    If Empty(cTipos)
        Return Nil
    EndIf

    For nX := 1 To Len(aTitulos)
        // Posicao 8: marcado. Posicao 4: tipo do titulo.
        If aTitulos[nX, 8] .And. ("|" + AllTrim(aTitulos[nX, 4]) + "|") $ ("|" + cTipos + "|")
            cLista += AllTrim(aTitulos[nX, 1]) + "/" + AllTrim(aTitulos[nX, 2]) + "/" + AllTrim(aTitulos[nX, 3]) + Chr(13) + Chr(10)
        EndIf
    Next nX

    If !Empty(cLista)
        MsgAlert("Estes titulos nao podem ser compensados:" + Chr(13) + Chr(10) + cLista, "Compensacao")
        Return .F.
    EndIf

// Nil: o padrao faz a pergunta de confirmacao.
Return Nil

O conteúdo do parâmetro é uma lista de tipos separados por |, por exemplo NF|FT. Confira no seu ambiente se ele existe:

Confira no seu ambienteSQL
SELECT X6_VAR, X6_TIPO, X6_DESCRIC, X6_CONTEUD
  FROM SX6010
 WHERE X6_VAR = 'MV_XTPNCMP'

Ajuste o sufixo 010 para o da sua empresa. Se a consulta voltar vazia, o parâmetro não foi criado e o código acima não bloqueia nada.

Quando usar outro

NecessidadeOnde
Validar a tela anterior (dados da compensação), sem a lista de títulosF340VLD

Para o mecanismo geral de chamada, veja Ponto de entrada no Protheus.

Continue por aqui