jValidate — jValidate (enriquecimento)
Objetivo
jValidate é uma biblioteca compartilhada (não é uma tela própria) usada por praticamente todas as telas do ERP para validar códigos digitados pelo usuário contra as tabelas mestras (Pessoa, Item, Operação, Movimentação, CFO, Centro de Custo, Vendedor, etc.). Cada rotina Valida<Entidade> recebe o código informado, busca o registro no banco e, se ele não existir, estiver inativo ou não atender aos parâmetros exigidos pela tela chamadora (ex.: 'só aceito item de serviço', 'só aceito movimentação de saída'), interrompe a operação com uma mensagem de erro específica; se estiver tudo certo, devolve os dados do registro já carregados para a tela usar. O objetivo de negócio é garantir que nenhuma tela grave ou processe um documento referenciando um cadastro inexistente, inativo ou incompatível com a regra daquele fluxo específico (fiscal, contábil, estoque, comercial etc.).
Fluxo principal
- A rotina monta e executa um SELECT filtrando pelo código informado na tabela mestra correspondente. (-) —
source/jCommon/jValidate.pas:1206-1217 (ValidaPessoa) - Se o registro não existir, a rotina interrompe a operação levantando uma exceção de negócio (JException) com um código de mensagem do catálogo (ex.: E-0059, W-0116). (-) —
source/jCommon/jValidate.pas:1619-1620 (ValidaItem) - Se o registro existir mas estiver inativo (quando a tela pediu ValidaAtiva/ValidaAtivo=True) ou não bater com os Parâmetros exigidos pela tela (tipo de pessoa, tipo de item, tipo de operação, tipo de movimentação etc.), a rotina também bloqueia com uma mensagem específica explicando o que é aceito. (-) —
source/jCommon/jValidate.pas:1544-1557 (ValidaItem) - Se tudo estiver correto, a rotina preenche o objeto (record/classe) da entidade com os dados lidos, e a tela chamadora segue o fluxo usando esses dados (ex.: exibindo a descrição do código digitado, aplicando regras de preço, etc.). Algumas rotinas encadeiam outras validações relacionadas automaticamente (ex.: ValidaVendedor chama ValidaPessoa; ValidaBandaPneu chama ValidaDesenhoPneu). (-) —
source/jCommon/jValidate.pas:2670-2704 (ValidaVendedor)
Campos obrigatórios
| Campo | Condição | Mensagem | Fonte |
|---|---|---|---|
| Código da entidade (pessoa, item, operação, movimentação, CFO, etc.) | Sempre que uma tela chama um Valida<Entidade> com um código não vazio, esse código precisa existir na tabela correspondente; senão a rotina interrompe o fluxo com uma exceção (não é um simples aviso, é bloqueante). | source/jCommon/jValidate.pas:1204-1268 (ValidaPessoa) | |
| Empresa (Cd_Empresa) | Deve ser informada antes do Centro de Custo quando a rotina é chamada com ValidaEmpresa=True (comportamento padrão). | source/jCommon/jValidate.pas:5185-5231 (ValidaCentroCusto) | |
| Serviço (Cd_Servico) da NFSe | Deve ser informado antes de se poder informar/validar um Subserviço de NFSe. | source/jCommon/jValidate.pas:5387-5418 (ValidaSubServicoNFSe) | |
| Tipo/Local do Estoque (Cd_TipoLocal) antes do Local (Cd_Local) | Ao consultar Item x Local, se for informado o Local sem o Tipo de Local, a rotina rejeita. | source/jCommon/jValidate.pas:2564-2567 (ValidaItemLocal) |
Mensagens: causa e ação
%sA lista de SQL atingiu o limite de %d posições!%s
Causa: O relatório está tentando usar mais sub-consultas SQL (sub-relatórios) do que o limite máximo suportado pelo motor de relatórios.
Ação: Reduzir a quantidade de sub-relatórios/consultas vinculadas a esse relatório, ou acionar o suporte técnico/desenvolvimento para revisar o layout — não é algo que o usuário ajusta na tela de filtros.
Fonte: source/jCommon/jReport.pas:311-331 (TListSQLGeraRelatorio.Add)
Deseja Memorizar os Dados Informados neste Programa ?
Causa: O usuário está saindo de uma tela que tem campos de filtro marcados como memorizáveis (Tag=9) e a rotina foi chamada com Perguntar=True.
Ação: Responder Sim grava os valores digitados como padrão desse usuário/empresa/programa; Não descarta e mantém o comportamento anterior.
Fonte: source/jCommon/jDB.pas:964-996 (Grava_FiltroTag)
Erro "AtualizaParamsSQL": %s
Causa: Ocorreu uma falha ao montar/substituir os parâmetros do SQL de um relatório — geralmente decorrente de um parâmetro sem DataType definido.
Ação: Reportar ao suporte técnico o nome do relatório e a mensagem de erro interna (Ex.Message) exibida; é erro de configuração do relatório, não corrigível pelo usuário final.
Fonte: source/jCommon/jReport.pas:176-212 (TSQLGeraRelatorio.AtualizaParamsSQL)
Modelo de Código de Barras Inválido!
Causa: Deveria disparar quando o tipo de código de barras informado para o relatório não está na lista de tipos suportados, mas a condição do código compara o mesmo valor com vários literais usando 'and' (deveria ser 'or'), o que a torna sempre falsa.
Ação: Nenhuma ação do usuário resolve isso: é um bug de código (ver bug_conhecido). Se um tipo de código de barras inválido causar falha na impressão da etiqueta, reportar ao desenvolvimento citando esta rotina.
Fonte: source/jCommon/jReport.pas:295-309 (TSQLGeraRelatorio.SetTpCodBarras)
Não foi definido o DataType do parâmetro "%s"
Causa: Um parâmetro do SQL de um relatório foi passado sem um TFieldType reconhecido pela rotina (só trata Integer, Float, Date, DateTime, Time e String).
Ação: Reportar ao suporte/desenvolvimento o nome do relatório e do parâmetro citado na mensagem, para corrigir a definição do tipo do parâmetro no relatório.
Fonte: source/jCommon/jReport.pas:184-206 (TSQLGeraRelatorio.AtualizaParamsSQL)
O Caminho de Destino do Arquivo PDF não foi informado! Verifique.
Causa: O tipo de impressão escolhido foi 'PDF', mas o campo de caminho/pasta de destino do arquivo ficou vazio.
Ação: Informar o caminho de destino (pasta e, se aplicável, nome do arquivo) antes de gerar o relatório em PDF.
Fonte: source/jCommon/jReport.pas:610-631 (CarregarRelatorio)
O Usuário "%s" não possui cadastro nos Parâmetros de Usuário para a Empresa "%s" [ADM012]!%s Não foi possível selecionar a Impressora.
Causa: O usuário logado não tem registro cadastrado no programa de Parâmetros de Usuário (ADM012) para a empresa em que está tentando imprimir/gerar o documento.
Ação: Cadastrar o usuário no ADM012 para essa empresa, informando a impressora a ser usada para o tipo de documento (Nota/Cheque/Recibo/Duplicata).
Fonte: source/jCommon/jReport.pas:438-459 (Retorna_ImpressoraUsuario)
Selecione um Arquivo!
Causa: O usuário abriu a janela padrão do Windows para escolher um arquivo e cancelou/fechou sem selecionar nenhum.
Ação: Repetir a operação e efetivamente selecionar um arquivo antes de confirmar a janela.
Fonte: source/jCommon/jExplorer.pas:92-131 (SelecionaArquivos)
Selecione um Diretório!
Causa: O usuário abriu a janela de seleção de pasta e cancelou/fechou sem selecionar nenhuma.
Ação: Repetir a operação e efetivamente selecionar uma pasta antes de confirmar.
Fonte: source/jCommon/jExplorer.pas:83-90 (SelecionaArquivos)
Tipo de Impressão Inválida! Utilize "VIS", "IMP", "RAF" ou "PDF"
Causa: O código que chamou a geração do relatório passou um valor de tipo de impressão diferente dos quatro aceitos (Visualizar, Imprimir, Rascunho/Arquivo, PDF) — normalmente é um problema de parametrização de botão/tela, não uma escolha visível do usuário final.
Ação: Reportar ao suporte/desenvolvimento indicando de qual tela/botão partiu a chamada, para corrigir o valor enviado como tipo de impressão.
Fonte: source/jCommon/jReport.pas:620-628 (CarregarRelatorio)
Regras de negócio
jValidate.R001(verregras/jValidate/jValidate.R001.md)jValidate.R002(verregras/jValidate/jValidate.R002.md)jValidate.R003(verregras/jValidate/jValidate.R003.md)jValidate.R004(verregras/jValidate/jValidate.R004.md)jValidate.R005(verregras/jValidate/jValidate.R005.md)jValidate.R006(verregras/jValidate/jValidate.R006.md)jValidate.R007(verregras/jValidate/jValidate.R007.md)jValidate.R008(verregras/jValidate/jValidate.R008.md)jValidate.R009(verregras/jValidate/jValidate.R009.md)jValidate.R010(verregras/jValidate/jValidate.R010.md)jValidate.R011(verregras/jValidate/jValidate.R011.md)jValidate.R012(verregras/jValidate/jValidate.R012.md)jValidate.R013(verregras/jValidate/jValidate.R013.md)jValidate.R014(verregras/jValidate/jValidate.R014.md)jValidate.R015(verregras/jValidate/jValidate.R015.md)jValidate.R016(verregras/jValidate/jValidate.R016.md)
Perguntas frequentes
P: O usuário digitou um código que existe no cadastro, mas o sistema diz que não encontrou. Por quê?
R: As rotinas de validação (Valida*) buscam pelo código exato na tabela mestra (ex.: PESSOA, ITEM, OPERACAO, MOVIMENTACAO). Se o código foi digitado com espaço, zero à esquerda diferente do cadastro, ou pertence a outra empresa/tabela, a busca não encontra e a tela mostra 'não encontrado'. Peça para o usuário conferir o código exato na tela de cadastro correspondente.
Fonte: source/jCommon/jValidate.pas:1204-1268 (ValidaPessoa)
P: Por que o sistema recusa um Vendedor/Item/Operação/Seção/Grade dizendo que está inativo?
R: Várias telas passam ValidaAtiva=True (ou equivalente) ao chamar a validação; se o registro estiver com o campo 'Ativo' = Não no cadastro, a operação é bloqueada. É preciso reativar o cadastro (Vendedor, Item, Operação, Seção, Grade, Serviço de Pneu, Modelo de Pneu, Condição de Pagamento ou Observação Fiscal, conforme o caso) na respectiva tela de cadastro, ou usar outro código já ativo.
Fonte: source/jCommon/jValidate.pas:2685-2686 (ValidaVendedor), source/jCommon/jValidate.pas:1544-1545 (ValidaItem), source/jCommon/jValidate.pas:2945-2947 (ValidaOperacao)
P: Por que aparece mensagem dizendo que o usuário não tem permissão/cadastro para operar em determinada empresa?
R: A rotina ValidaEmpresaUsuaio confere se existe vínculo do usuário logado com a empresa na tabela USUARIOEMPRESA. Se não houver, bloqueia com W-0010. É preciso vincular o usuário àquela empresa na tela de cadastro de Usuário (aba de empresas permitidas).
Fonte: source/jCommon/jValidate.pas:2886-2902 (ValidaEmpresaUsuaio)
P: Por que o CFO informado numa nota de entrada (ou saída) é recusado mesmo estando cadastrado?
R: Quando a tela exige CFO de entrada, o código precisa começar com 1, 2 ou 3; quando exige CFO de saída, precisa começar com 5, 6 ou 7. Um CFO cadastrado só é aceito se o primeiro dígito bater com o sentido (entrada/saída) da operação naquela tela.
Fonte: source/jCommon/jValidate.pas:3844-3860 (ValidaCfo)
P: Por que apareceu a mensagem pedindo para informar a Empresa antes do Centro de Custo?
R: A validação de Centro de Custo exige que a Empresa já esteja preenchida na tela antes de validar/buscar o Centro de Custo (a busca depende da empresa). Oriente o usuário a preencher o campo Empresa primeiro.
Fonte: source/jCommon/jValidate.pas:5193-5198 (ValidaCentroCusto)
P: Por que não consigo cadastrar/selecionar um Subserviço de NFSe sem escolher o Serviço primeiro?
R: O sistema exige que o Serviço (Cd_Servico) esteja preenchido antes de aceitar um Subserviço, pois a busca do subserviço é feita pela combinação Serviço+Subserviço. Preencha o Serviço antes do Subserviço.
Fonte: source/jCommon/jValidate.pas:5396-5401 (ValidaSubServicoNFSe)
P: Apareceu a pergunta 'Deseja Memorizar os Dados Informados neste Programa?' ao sair de uma tela de filtro. O que isso faz?
R: Alguns programas marcam campos de filtro como 'fixos' (memorizáveis). Ao sair da tela, o sistema pergunta se quer salvar os valores digitados como padrão para a próxima vez que esse mesmo usuário abrir o mesmo programa naquela empresa. Responder Sim grava; Não descarta os valores digitados (não afeta os dados já salvos no sistema, só o filtro padrão da tela).
Fonte: source/jCommon/jDB.pas:964-996 (Grava_FiltroTag)
P: O usuário não consegue imprimir e aparece mensagem citando 'Parâmetros de Usuário' e '[ADM012]'. O que fazer?
R: O sistema não encontrou o cadastro do usuário nos Parâmetros de Usuário (programa ADM012) para aquela empresa, e por isso não sabe qual impressora usar. É preciso cadastrar o usuário no ADM012 para a empresa em questão, definindo a impressora.
Fonte: source/jCommon/jReport.pas:438-459 (Retorna_ImpressoraUsuario)
P: Ao tentar gerar um relatório em PDF, aparece 'O Caminho de Destino do Arquivo PDF não foi informado'. Por quê?
R: Quando o tipo de impressão escolhido é PDF, o sistema exige que o caminho (pasta/arquivo) de destino esteja preenchido antes de gerar. Informe o caminho de destino do PDF e tente novamente.
Fonte: source/jCommon/jReport.pas:627-631 (CarregarRelatorio)
P: Apareceu 'Selecione um Arquivo!' ou 'Selecione um Diretório!' numa tela de importação/exportação. Isso é erro do sistema?
R: Não é erro: essas mensagens só aparecem quando o usuário abre a janela padrão do Windows para escolher arquivo/pasta e cancela ou fecha sem selecionar nada. Basta repetir a operação e efetivamente escolher um arquivo ou uma pasta.
Fonte: source/jCommon/jExplorer.pas:67-135 (SelecionaArquivos)
Dúvidas em aberto (o código não responde)
- Qual é o texto exato (em português) mostrado ao usuário para cada código de mensagem (E-0032, E-0238, E-0290, W-0010, etc.)? — jValidate.pas só chama JException.Create('E-XXXX', [...]) com o código do catálogo; o texto fica em jMessage.pas/tabela de mensagens, que não foi lido nesta sessão. Descrevi o efeito e a causa a partir da lógica do código, não do texto literal.
- Quais telas (programas) chamam cada Valida<Entidade> com quais parâmetros preenchidos em TParamPessoa/TParamItem/TParamOperacao/TParamMovimentacao/TParamCfo/TParamTipoConta? — As mensagens de incompatibilidade (ex.: E-0242 'tipo de item incompatível', E-0276/E-0277 'tipo de operação incompatível') só disparam quando o chamador preenche esses parâmetros; sem ver os módulos de tela que os preenchem, não dá pra dizer em qual programa específico cada uma aparece.
- Qual é o valor da constante COUNT_SUB_RELATORIO_MAXIMO (limite de sub-relatórios/SQL)? — jReport.pas:316 usa essa constante na mensagem 'A lista de SQL atingiu o limite de %d posições!', mas a declaração não foi lida nesta sessão.
- A condição sempre-falsa em TSQLGeraRelatorio.SetTpCodBarras é um bug real ainda não corrigido ou código morto proposital (função nunca chamada com uso de fato)? — jReport.pas:299-301 compara a mesma variável Value a vários valores literais usando 'and' (deveria ser 'or'/lista IN); a validação 'Modelo de Código de Barras Inválido!' nunca dispara na prática.