Pular para o conteúdo principal

Campo de Consulta de Produto no PDV

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 1 → "Campo de Consulta [MNF017]" Tabela: PARMFATUR.DS_CAMPOCONSULTA Tipo: Texto (nome de coluna da tabela ITEM usada na busca do PDV) Tamanho: VARCHAR(60) (domínio DOM_VARCHAR60) Valor padrão: NULL (na inserção o campo não é inicializado no AfterInsert; quando lido, COALESCE substitui por 'CD_CODIGOBARRA')

Telas impactadas​

MóduloCódigoDescrição
Caixa Rápido / PDV ConsultaMNF017Tela de vendas rápidas — usa o parâmetro para montar o WHERE das consultas de produto

Nenhum outro módulo Delphi consome este parâmetro. Não há referência em Scripts/ (stored procedures).

Procedures impactadas​

Nenhuma. O parâmetro é lido diretamente pelo Delphi (MNF017) e interpolado em SQL dinâmico executado pela tela.

Campos envolvidos​

CampoTabelaPapel
DS_CAMPOCONSULTAPARMFATURArmazena o nome da coluna da tabela ITEM usada para localizar o produto no PDV
CD_CODIGOBARRAITEMValor default quando o parâmetro está nulo
CD_ITEMITEMChave primária — pode ser escolhida como campo de consulta
Qualquer coluna de ITEM de textoITEMTecnicamente pode ser qualquer coluna (ex.: CD_REFERENCIA) — ver seção de regras

Comportamento / Uso​

O parâmetro define qual coluna da tabela ITEM é usada no filtro WHERE quando o operador digita um código/identificação do produto na tela de Caixa Rápido (MNF017).

Na abertura da tela, o MNF017 carrega o parâmetro (com fallback via COALESCE) e guarda em frmMNF017.vDS_CAMPOCONSULTA:

// source/MNF017/UMNF017.pas linhas 157-179
Consulta :=
'SELECT ' + #10 +
' P.CD_TABPRECO, P.CD_MOVSAIDA, P.TP_LISTAITEM, P.CD_LAYPEDVENDA, P.ST_FILTROITEM, ' + #10 +
' COALESCE(P.DS_CAMPOCONSULTA, ''CD_CODIGOBARRA''), P.DS_LOGOTIPO, P.ST_MOSTRARDEVENDO, ' + #10 +
...
'FROM PARMFATUR P ' + #10 +
'WHERE CD_EMPRESA = ' + IntToStr(sessao.empresa.cd_Empresa);
Resultado := ExecutaConsulta(dmMNF017.transaction, Consulta);
...
frmMNF017.vDS_CAMPOCONSULTA := Resultado[5];

Em seguida, o valor é interpolado diretamente nas queries de localização de produto do PDV. Três pontos do código usam a variável:

1) Validação de quantidade zero no subitem (linha 955):

// source/MNF017/UMNF017.pas linha 953-960
Consulta := 'SELECT I.CD_ITEM '+#10+
'FROM ITEM I '+#10+
'WHERE '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item);
Resultado := ExecutaConsulta(dmMNF017.transaction, Consulta);
if(Resultado[0] <> '') then
raise JException.Create('W-0000', ['A Quantidade do Produto '+Resultado[0]+' deve ser Maior que Zero! Verifique!'])
else
raise JException.Create('W-0000', ['O produto informado não está registrado! Verifique!']);

2) Busca dos dados do produto ao digitar código (linha 977):

// source/MNF017/UMNF017.pas linha 969-977
Consulta :=
'SELECT I.DS_ITEM, I.SG_UNIDMED, ' +
'I.SG_UNIDALT, I.PS_LIQUIDO, I.PS_EMBALAGEM, ' +
'I.CD_TIPOCALCULO, C.FT_CALCULO, C.TP_CALCULO, ' +
'C.TP_UNIDADE, I.ST_ATIVO, I.CD_GRUPO, I.CD_ITEM, ' +
'I.CD_BALANCA, I.ST_SEMENTE, I.CD_CONDFISCAL, I.CD_GRADE, I.TP_ITEM ' +
'FROM ITEM I, TIPOCALCULO C ' +
'WHERE I.CD_TIPOCALCULO = C.CD_TIPOCALCULO ' +
' AND '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item);

3) Consulta de produto com preço (linha 1595):

// source/MNF017/UMNF017.pas linha 1590-1595
Consulta := ' Select I.DS_ITEM, T.O_VL_PRECO, T.O_ST_PROMOCAO from ITEM I '+
' Left Join RETORNA_PRECOITEM(' +
Nulo(IntToStr(sessao.empresa.cd_Empresa),'I') + ', ' +
iTabela + ', I.CD_ITEM, ' +
Nulo(DateToStr(Date),'D') + ', NULL, NULL) T ON (1 = 1) ' +
' Where '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(edtSubMensagem.Text);

O valor é concatenado como texto na cláusula WHERE, ou seja, o conteúdo do parâmetro precisa ser obrigatoriamente um nome de coluna válido da tabela ITEM. Valores inválidos geram erro de SQL em tempo de execução (coluna desconhecida).

Simulação passo a passo​

Cenário A — Parâmetro em branco (padrão):

  1. Em MFA001 → Parâmetros → Ambos → Opção 1 → campo "Campo de Consulta [MNF017]" fica vazio.
  2. Salve (F6).
  3. Abra o MNF017.
  4. Ao digitar um código na caixa de item, o sistema monta WHERE CD_CODIGOBARRA = '<digitado>' (devido ao COALESCE no SELECT inicial).
  5. Resultado esperado: o PDV localiza o produto pelo código de barras.

Cenário B — Parâmetro = CD_ITEM:

  1. Em MFA001 → Opção 1 → "Campo de Consulta [MNF017]" = CD_ITEM.
  2. Salve (F6).
  3. Abra o MNF017 e digite, por exemplo, 123.
  4. O sistema monta WHERE CD_ITEM = '123' e localiza o produto pelo código interno.
  5. Resultado esperado: o PDV passa a aceitar o código sequencial do item em vez do código de barras.

Cenário C — Valor inválido:

  1. Em MFA001 → Opção 1 → "Campo de Consulta [MNF017]" = XYZ (coluna inexistente).
  2. Salve (F6).
  3. Abra o MNF017 e digite qualquer código.
  4. Resultado esperado: o sistema lança exceção de SQL (Column unknown: XYZ). O parâmetro não é validado pela MFA001 — é responsabilidade do operador informar uma coluna real da tabela ITEM.

Valores aceitos / Regras​

ValorEfeito prático
(em branco / NULL)Usa CD_CODIGOBARRA (via COALESCE na query de parâmetros)
CD_CODIGOBARRABusca produto pelo código de barras (GTIN/EAN) — comportamento padrão
CD_ITEMBusca produto pelo código interno sequencial
Qualquer outra coluna de ITEMUsa a coluna informada literalmente no WHERE (ex.: CD_REFERENCIA)

Regras / Observações​

  1. Sem validação na gravação: o MFA001 grava o valor como texto livre em um TDBEdit comum (edtDS_CAMPOCONSULTA, UMFA001.dfm linha 2673). Não há validação no BeforePost nem lookup contra o catálogo de colunas.
  2. Case-sensitive no Firebird: nomes de colunas no Firebird são armazenados em maiúsculas. Informe sempre o nome em caixa alta (CD_ITEM, não cd_item), sob pena de Column unknown.
  3. Risco de SQL injection: o valor é concatenado diretamente no WHERE sem QuotedStr nem parametrização. Qualquer alteração do parâmetro por usuário mal-intencionado pode injetar trechos SQL. Manter acesso ao MFA001 restrito a administradores.
  4. Limite de tamanho: 60 caracteres (DOM_VARCHAR60).
  5. Escopo restrito ao MNF017: nenhum outro módulo consulta o parâmetro. Pedidos normais (MPD002, MNF002, etc.) usam outros mecanismos de busca de item.

Referências no Código Fonte​

Formulário de parametrização (MFA001)​

ArquivoLinhaDescrição
source/MFA001/UMFA001.pas223Declaração edtDS_CAMPOCONSULTA: TDBEdit
source/MFA001/UMFA001.dfm2182–2194lbl29 — Caption = 'Campo de Consulta' (rótulo)
source/MFA001/UMFA001.dfm2421–2434lbl30 — Caption = '[MNF017]' (indicação da tela consumidora ao lado do campo)
source/MFA001/UMFA001.dfm2673–2689edtDS_CAMPOCONSULTA — TDBEdit vinculado a DataField = 'DS_CAMPOCONSULTA' / DataSource = dmMFA001.dsPARMFATUR
source/MFA001/UdmMFA001.pas80Declaração tabPARMFATURDS_CAMPOCONSULTA: TStringField
source/MFA001/UdmMFA001.dfm858–862Field persistente TStringField — Size = 60, Origin = '"PARMFATUR"."DS_CAMPOCONSULTA"'
source/MFA001/UdmMFA001.dfm1592Origem duplicada no segundo dataset de PARMFATUR
source/MFA001/UdmMFA001.dfm2363Inclusão na lista de colunas do SELECT da tabela persistente
source/MFA001/UdmMFA001.dfm2516Inclusão na lista de parâmetros do INSERT (:DS_CAMPOCONSULTA)
source/MFA001/UdmMFA001.dfm2688Cláusula DS_CAMPOCONSULTA = :DS_CAMPOCONSULTA do UPDATE persistente

Nota: o método TdmMFA001.tabPARMFATURAfterInsert (UdmMFA001.pas linha 434 em diante) inicializa dezenas de campos padrão da PARMFATUR, mas não atribui valor inicial a DS_CAMPOCONSULTA. Por isso o registro nasce com NULL nesse campo.

Tela consumidora (MNF017 — Caixa Rápido / PDV)​

ArquivoLinhaDescrição
source/MNF017/UMNF017.pas90Declaração da variável pública vDS_CAMPOCONSULTA: String em TfrmMNF017
source/MNF017/UMNF017.pas160Leitura do parâmetro no SELECT de PARMFATUR com fallback: COALESCE(P.DS_CAMPOCONSULTA, 'CD_CODIGOBARRA')
source/MNF017/UMNF017.pas179Atribuição do valor em frmMNF017.vDS_CAMPOCONSULTA := Resultado[5]
source/MNF017/UMNF017.pas955WHERE '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item) — validação de quantidade
source/MNF017/UMNF017.pas977AND '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item) — busca dos dados do item ao inserir produto
source/MNF017/UMNF017.pas1595Where '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(edtSubMensagem.Text) — consulta de preço

DDL​

ArquivoLinhaDescrição
docs/schema/tables/PARMFATUR.sql67Definição da coluna: DS_CAMPOCONSULTA DOM_VARCHAR60 (nula permitida, sem default)

Ocorrências não relacionadas (falsos positivos)​

Os arquivos abaixo contêm o literal DS_CAMPOCONSULTA, porém referem-se a alias de coluna em consultas de outra funcionalidade (campos SQL de templates de e-mail / contexto de email), sem relação com o parâmetro da PARMFATUR:

  • source/CFC014/UformCamposSQL.pas linhas 68, 79 — alias gerado por REPLACE(CT.DS_MACROCONTEXTO, '#', '') DS_CAMPOCONSULTA na leitura de CAMPOTABCONTEXTO.
  • source/CPD009/UdmCPD009.dfm linhas 291, 434, 549 — referências à coluna PARMFATUR.DS_CAMPOCONSULTA apenas como parte da lista de colunas do SELECT/UPDATE de PARMFATUR (cópia do CRUD), sem uso funcional.
  • source/RCA006/UdmRCA006.dfm linhas 3040, 3183, 3298 — idem, apenas replicação do CRUD de PARMFATUR sem leitura do valor.

Em Scripts/ (stored procedures/views Firebird) não há nenhuma referência a DS_CAMPOCONSULTA.