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_CAMPOCONSULTATipo: Texto (nome de coluna da tabelaITEMusada na busca do PDV) Tamanho:VARCHAR(60)(domínioDOM_VARCHAR60) Valor padrão:NULL(na inserção o campo não é inicializado noAfterInsert; quando lido,COALESCEsubstitui por'CD_CODIGOBARRA')
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Caixa Rápido / PDV Consulta | MNF017 | Tela 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
| Campo | Tabela | Papel |
|---|---|---|
DS_CAMPOCONSULTA | PARMFATUR | Armazena o nome da coluna da tabela ITEM usada para localizar o produto no PDV |
CD_CODIGOBARRA | ITEM | Valor default quando o parâmetro está nulo |
CD_ITEM | ITEM | Chave primária — pode ser escolhida como campo de consulta |
Qualquer coluna de ITEM de texto | ITEM | Tecnicamente 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 tabelaITEM. 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):
- Em MFA001 → Parâmetros → Ambos → Opção 1 → campo "Campo de Consulta [MNF017]" fica vazio.
- Salve (F6).
- Abra o MNF017.
- Ao digitar um código na caixa de item, o sistema monta
WHERE CD_CODIGOBARRA = '<digitado>'(devido aoCOALESCEno SELECT inicial). - Resultado esperado: o PDV localiza o produto pelo código de barras.
Cenário B — Parâmetro = CD_ITEM:
- Em MFA001 → Opção 1 → "Campo de Consulta [MNF017]" =
CD_ITEM. - Salve (F6).
- Abra o MNF017 e digite, por exemplo,
123. - O sistema monta
WHERE CD_ITEM = '123'e localiza o produto pelo código interno. - 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:
- Em MFA001 → Opção 1 → "Campo de Consulta [MNF017]" =
XYZ(coluna inexistente). - Salve (F6).
- Abra o MNF017 e digite qualquer código.
- 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 tabelaITEM.
Valores aceitos / Regras
| Valor | Efeito prático |
|---|---|
| (em branco / NULL) | Usa CD_CODIGOBARRA (via COALESCE na query de parâmetros) |
CD_CODIGOBARRA | Busca produto pelo código de barras (GTIN/EAN) — comportamento padrão |
CD_ITEM | Busca produto pelo código interno sequencial |
Qualquer outra coluna de ITEM | Usa a coluna informada literalmente no WHERE (ex.: CD_REFERENCIA) |
Regras / Observações
- Sem validação na gravação: o MFA001 grava o valor como texto livre em um
TDBEditcomum (edtDS_CAMPOCONSULTA,UMFA001.dfmlinha 2673). Não há validação noBeforePostnem lookup contra o catálogo de colunas. - 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ãocd_item), sob pena deColumn unknown. - Risco de SQL injection: o valor é concatenado diretamente no
WHEREsemQuotedStrnem parametrização. Qualquer alteração do parâmetro por usuário mal-intencionado pode injetar trechos SQL. Manter acesso ao MFA001 restrito a administradores. - Limite de tamanho: 60 caracteres (
DOM_VARCHAR60). - 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)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MFA001/UMFA001.pas | 223 | Declaração edtDS_CAMPOCONSULTA: TDBEdit |
source/MFA001/UMFA001.dfm | 2182–2194 | lbl29 — Caption = 'Campo de Consulta' (rótulo) |
source/MFA001/UMFA001.dfm | 2421–2434 | lbl30 — Caption = '[MNF017]' (indicação da tela consumidora ao lado do campo) |
source/MFA001/UMFA001.dfm | 2673–2689 | edtDS_CAMPOCONSULTA — TDBEdit vinculado a DataField = 'DS_CAMPOCONSULTA' / DataSource = dmMFA001.dsPARMFATUR |
source/MFA001/UdmMFA001.pas | 80 | Declaração tabPARMFATURDS_CAMPOCONSULTA: TStringField |
source/MFA001/UdmMFA001.dfm | 858–862 | Field persistente TStringField — Size = 60, Origin = '"PARMFATUR"."DS_CAMPOCONSULTA"' |
source/MFA001/UdmMFA001.dfm | 1592 | Origem duplicada no segundo dataset de PARMFATUR |
source/MFA001/UdmMFA001.dfm | 2363 | Inclusão na lista de colunas do SELECT da tabela persistente |
source/MFA001/UdmMFA001.dfm | 2516 | Inclusão na lista de parâmetros do INSERT (:DS_CAMPOCONSULTA) |
source/MFA001/UdmMFA001.dfm | 2688 | Cláusula DS_CAMPOCONSULTA = :DS_CAMPOCONSULTA do UPDATE persistente |
Nota: o método
TdmMFA001.tabPARMFATURAfterInsert(UdmMFA001.paslinha 434 em diante) inicializa dezenas de campos padrão da PARMFATUR, mas não atribui valor inicial aDS_CAMPOCONSULTA. Por isso o registro nasce comNULLnesse campo.
Tela consumidora (MNF017 — Caixa Rápido / PDV)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MNF017/UMNF017.pas | 90 | Declaração da variável pública vDS_CAMPOCONSULTA: String em TfrmMNF017 |
source/MNF017/UMNF017.pas | 160 | Leitura do parâmetro no SELECT de PARMFATUR com fallback: COALESCE(P.DS_CAMPOCONSULTA, 'CD_CODIGOBARRA') |
source/MNF017/UMNF017.pas | 179 | Atribuição do valor em frmMNF017.vDS_CAMPOCONSULTA := Resultado[5] |
source/MNF017/UMNF017.pas | 955 | WHERE '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item) — validação de quantidade |
source/MNF017/UMNF017.pas | 977 | AND '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(sCd_Item) — busca dos dados do item ao inserir produto |
source/MNF017/UMNF017.pas | 1595 | Where '+vDS_CAMPOCONSULTA+' = ' + QuotedStr(edtSubMensagem.Text) — consulta de preço |
DDL
| Arquivo | Linha | Descrição |
|---|---|---|
docs/schema/tables/PARMFATUR.sql | 67 | Definiçã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.paslinhas 68, 79 — alias gerado porREPLACE(CT.DS_MACROCONTEXTO, '#', '') DS_CAMPOCONSULTAna leitura deCAMPOTABCONTEXTO.source/CPD009/UdmCPD009.dfmlinhas 291, 434, 549 — referências à colunaPARMFATUR.DS_CAMPOCONSULTAapenas como parte da lista de colunas do SELECT/UPDATE de PARMFATUR (cópia do CRUD), sem uso funcional.source/RCA006/UdmRCA006.dfmlinhas 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.