Parâmetro de Código de Barras de Embalagem (Caixa Master)
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 2 — campo "Código de Barras para Unidade Alternativa (Embalagem)" Tabela:
PARMFATUR.ST_CODIGOBARRACAIXAValor padrão:N(Não)
Habilita a leitura do código de barras da unidade alternativa (embalagem / caixa master) do produto — ou seja, o EAN impresso na caixa fechada em vez da unidade individual.
Quando ativado ('S'), o ERP passa a reconhecer também o valor do campo ITEM.CD_CODBARRAEMB durante a leitura de código de barras: se o operador passa o leitor em um EAN que não casa com um produto unitário (ITEM.CD_CODIGOBARRA) nem com um código de grade ou balança, o sistema ainda tenta localizar o produto pela embalagem, multiplicando automaticamente a quantidade lançada pelo fator da unidade alternativa (ITEM.PS_LIQUIDO — peso/quantidade por caixa) no módulo de balanço de estoque.
Este parâmetro controla também a visibilidade do parâmetro complementar ST_CODBARRASEMBALAGEM na própria tela MFA001 — só faz sentido definir "Utiliza Código de Barras Embalagem [MEQ015]" quando o reconhecimento por caixa master está ligado.
Telas impactadas
| Módulo | Código | Descrição | Contexto |
|---|---|---|---|
| Parâmetros Faturamento | MFA001 | Tela de configuração | Lê/grava o campo; controla visibilidade de ST_CODBARRASEMBALAGEM (cmbST_CODBARRASEMBALAGEM/lblST_CODBARRASEMBALAGEM) |
| Balanço de Estoque | MEQ015 | Conferência/contagem de estoque por leitura de código de barras | Único módulo que consulta explicitamente ST_CODIGOBARRACAIXA no Delphi: ativa a flag stConsultaEmbalagem para multiplicar a quantidade lançada pelo PS_LIQUIDO da embalagem quando o código lido é da caixa master |
Telas que consomem via VALIDA_CODIGOBARRA (efeito indireto)
A procedure VALIDA_CODIGOBARRA lê ST_CODIGOBARRACAIXA e, quando ligado, faz fallback para buscar o produto por ITEM.CD_CODBARRAEMB caso nenhuma outra via tenha encontrado o código. Todos os módulos que chamam VALIDA_CODIGOBARRA passam a reconhecer códigos de embalagem automaticamente:
MNF017, MNF001, MNF002, MNF009, MNF026, MNF035, MPD001, MPD002, MPD018, MPD031, MPD037, MPD053, MPD056, MPD084, MPD091, MPD092, MPD097, MRC045, MRE005, MTR004, TOF007, TPO001, MEQ002, MEQ008, MEQ013, MEQ014, MEQ015, MEQ058, MEQ072, CNF001, CEQ001.
Procedures impactadas
| Procedure | Arquivo | Descrição |
|---|---|---|
VALIDA_CODIGOBARRA | Scripts/VALIDA_CODIGOBARRA.sql | Lê PARMFATUR.ST_CODIGOBARRACAIXA (linha 44) e, quando o valor é 'S' e nenhuma outra rota localizou o item, busca o produto por ITEM.CD_CODBARRAEMB = :I_CD_CODIGOBARRA (linhas 280-305) |
Trecho relevante da procedure
-- VALIDA_CODIGOBARRA.sql (linhas 31, 44-47) — carga dos parâmetros
DECLARE VARIABLE V_ST_CODIGOBARRACAIXA DOM_CHAR1;
...
SELECT P.ST_CODBARRASBALANCA, P.CD_TABPRECO, P.ST_VALIDAITEMEMPRESA, P.ST_CODIGOBARRACAIXA
FROM PARMFATUR P
WHERE P.CD_EMPRESA = :I_CD_EMPRESA
INTO :V_ST_CODIGOBARRABALANCA, :V_TABPRECO, :V_ST_VALIDAITEMEMPRESA, :V_ST_CODIGOBARRACAIXA;
-- VALIDA_CODIGOBARRA.sql (linhas 277-307) — fallback por embalagem
-- ROGERIO 17/06/2015 - CHAMADO 99972
-- SE NÃO ENCONTROU O ITEM, E SE O PARAMETRO DE CODIGO DE BARRAS POR CAIXA ESTÁ ATIVO,
-- BUSCA O PRODUTO PELO CÓDIGO DE BARRAS DA EMBALAGEM
IF (V_ST_CODIGOBARRACAIXA = 'S') THEN BEGIN
IF (V_ST_VALIDAITEMEMPRESA = 1) THEN BEGIN
SELECT FIRST 1 I.CD_ITEM, P.O_VL_PRECO, I.PS_LIQUIDO
FROM ITEM I
LEFT JOIN RETORNA_PRECOITEM(:I_CD_EMPRESA, :I_CD_TABPRECO, I.CD_ITEM, CURRENT_DATE, NULL, NULL) P ON (1 = 1)
INNER JOIN ITEMEMPRESA E ON (E.CD_EMPRESA = :I_CD_EMPRESA AND E.CD_ITEM = I.CD_ITEM)
WHERE I.CD_CODBARRAEMB = :I_CD_CODIGOBARRA
INTO :O_CD_ITEM, :O_VL_UNITARIO, :O_QT_ITEM;
END
ELSE BEGIN
SELECT FIRST 1 I.CD_ITEM, P.O_VL_PRECO, I.PS_LIQUIDO
FROM ITEM I
LEFT JOIN RETORNA_PRECOITEM(:I_CD_EMPRESA, :I_CD_TABPRECO, I.CD_ITEM, CURRENT_DATE, NULL, NULL) P ON (1 = 1)
WHERE I.CD_CODBARRAEMB = :I_CD_CODIGOBARRA
INTO :O_CD_ITEM, :O_VL_UNITARIO, :O_QT_ITEM;
END
IF ( O_CD_ITEM IS NOT NULL ) THEN BEGIN
IF (O_QT_ITEM IS NULL) THEN O_QT_ITEM = 1;
O_VL_TOTAL = O_QT_ITEM * O_VL_UNITARIO;
O_CD_CODIGOBARRA = I_CD_CODIGOBARRA;
O_TP_CODIGO = 'N';
END
END
Campos envolvidos
| Campo | Descrição |
|---|---|
PARMFATUR.ST_CODIGOBARRACAIXA | Habilita fallback de busca por código de barras de embalagem ('S'/'N') |
PARMFATUR.ST_CODBARRASEMBALAGEM | Parâmetro complementar, só visível quando ST_CODIGOBARRACAIXA = 'S'; controla se o balanço de estoque MEQ015 multiplica a quantidade pelo fator da embalagem |
ITEM.CD_CODBARRAEMB | EAN impresso na caixa master / unidade alternativa do produto |
ITEM.CD_CODIGOBARRA | EAN da unidade unitária do produto (consultado antes, como via primária) |
ITEM.PS_LIQUIDO | Quantidade/peso por embalagem — usado pela MEQ015 para multiplicar a quantidade contada quando o código lido é da caixa master |
ITEM.SG_UNIDALT | Sigla da unidade alternativa (embalagem) |
I_CD_CODIGOBARRA | Entrada da procedure VALIDA_CODIGOBARRA: código lido no leitor |
O_CD_ITEM / O_VL_UNITARIO / O_QT_ITEM / O_VL_TOTAL / O_TP_CODIGO | Saídas da procedure: item localizado pela embalagem, preço unitário, quantidade (fator da caixa), total e tipo 'N' (normal) |
Opções disponíveis
N - Não (valor padrão)
| O que faz | Detalhe |
|---|---|
| Busca por código de barras da embalagem | Desabilitada |
VALIDA_CODIGOBARRA | Não executa o bloco de fallback — se o EAN não casar com ITEM.CD_CODIGOBARRA, ITEMCODIGOBARRA, ITEMGRADE.CD_CODIGOBARRA ou com os padrões de balança, retorna "produto não localizado" |
Parâmetro ST_CODBARRASEMBALAGEM na tela MFA001 | Oculto (label e ComboBox ficam Visible = False) — não é possível configurar comportamento da embalagem no MEQ015 |
| MEQ015 (Balanço de Estoque) | stConsultaEmbalagem = false — não aplica o fator PS_LIQUIDO da caixa master mesmo se o código lido fosse de embalagem |
Simulação passo a passo
- Vá em MFA001 → Faturamento → Opção 2 → campo "Código de Barras para Unidade Alternativa (Embalagem)" = "Não"
- Salve os parâmetros (F6)
- Observe que o campo logo abaixo, "Utiliza Código de Barras Embalagem [MEQ015]" (
ST_CODBARRASEMBALAGEM), desaparece da tela - No cadastro de produto (
ITEM), suponha que um produto "Refrigerante 2L" tenha:CD_CODIGOBARRA = '7894900010015'(unidade)CD_CODBARRAEMB = '17894900010012'(caixa com 6 unidades)
- Abra o PDV (MNF017) ou o balanço de estoque (MEQ015)
- Operador passa o leitor no código da caixa fechada
17894900010012 VALIDA_CODIGOBARRApesquisa o código em:ITEMGRADE.CD_CODIGOBARRA→ não encontraITEM.CD_CODIGOBARRA(via bloco posterior) → não encontra (esse EAN está noCD_CODBARRAEMB)- Padrões de balança → não se aplicam
ITEM.CD_CODBARRAEMB→ bloco não executa (parâmetro desligado)
- Retorna erro "Produto não cadastrado. Código de Barras Inválido!" (MEQ015) ou similar
Resultado esperado: Caixas fechadas não são reconhecidas pelo leitor. O operador precisa abrir a caixa e ler a unidade individual ou digitar manualmente. Este é o valor padrão, adequado para empresas que não cadastram EAN separado para caixa master.
Este é o valor padrão ao criar um novo registro no MFA001 (
UdmMFA001.pas:541→'N').
S - Sim
| O que faz | Detalhe |
|---|---|
| Busca por código de barras da embalagem | Habilitada |
VALIDA_CODIGOBARRA | Quando as demais rotas (grade, unitário, balança) não localizam o item, executa o bloco das linhas 280-307 buscando o produto por ITEM.CD_CODBARRAEMB = :I_CD_CODIGOBARRA |
| Filtro por empresa | Se PARMFATUR.ST_VALIDAITEMEMPRESA = 1, o SELECT inclui INNER JOIN ITEMEMPRESA (somente produtos liberados para a empresa atual); caso contrário, busca global em ITEM |
| Preço unitário | Obtido via RETORNA_PRECOITEM usando PARMFATUR.CD_TABPRECO da empresa |
Quantidade (O_QT_ITEM) retornada | Vem de ITEM.PS_LIQUIDO (quantidade por caixa); se for NULL, assume 1 |
O_TP_CODIGO retornado | 'N' (normal — a procedure não diferencia leitura de embalagem de uma leitura unitária para o consumidor) |
Parâmetro ST_CODBARRASEMBALAGEM na tela MFA001 | Visível — passa a ser possível configurar "Sim/Não" para o comportamento específico do balanço [MEQ015] |
| MEQ015 (Balanço de Estoque) | Se o operador estiver configurado com ST_CODBARRASEMBALAGEM = 'S', define stConsultaEmbalagem = true e, ao identificar que o EAN lido pertence a uma embalagem, multiplica a quantidade contada por ITEM.PS_LIQUIDO (Qtde := Qtde * StrToFloat(ResEmb[1])) |
Simulação passo a passo — fallback em VALIDA_CODIGOBARRA
- Vá em MFA001 → Faturamento → Opção 2 → "Código de Barras para Unidade Alternativa (Embalagem)" = "Sim" → F6
- Observe o campo "Utiliza Código de Barras Embalagem [MEQ015]" (
ST_CODBARRASEMBALAGEM) aparecer imediatamente logo abaixo (eventocmbST_CODIGOBARRACAIXAChange) - Cadastre (em TPO001/MPD008 ou
ITEM) um produto "Refrigerante 2L" com:CD_CODIGOBARRA = '7894900010015'CD_CODBARRAEMB = '17894900010012'PS_LIQUIDO = 6(6 unidades por caixa)
- Abra o PDV (MNF017) ou o MPD002
- Operador passa o leitor no código da caixa fechada
17894900010012 VALIDA_CODIGOBARRA:- Não encontra em
ITEMGRADE.CD_CODIGOBARRA - Não encontra em
ITEM.CD_CODIGOBARRA - Padrões de balança não se aplicam (não inicia com
'2'/'8'/'9'+ tamanho específico) V_ST_CODIGOBARRACAIXA = 'S'→ executa o bloco de fallbackSELECT ... FROM ITEM WHERE CD_CODBARRAEMB = '17894900010012'→ localiza o produto
- Não encontra em
- Retorna
O_CD_ITEM = <código do refrigerante>,O_QT_ITEM = 6,O_VL_UNITARIO = <preço unit>,O_VL_TOTAL = 6 × preço,O_TP_CODIGO = 'N' - O documento lança 6 unidades do produto automaticamente
Resultado esperado: O operador vende/movimenta a caixa inteira sem abrir — o sistema identifica a embalagem e lança a quantidade correta com base em PS_LIQUIDO.
Simulação passo a passo — balanço de estoque [MEQ015] com ST_CODBARRASEMBALAGEM = 'S'
- Com
ST_CODIGOBARRACAIXA = 'S', configure tambémST_CODBARRASEMBALAGEM = 'S'na tela MFA001 - Abra o MEQ015 — no
iniciaro módulo executa:// UMEQ015.pas:191-200Consulta := 'SELECT P.ST_CODIGOBARRACAIXA, P.ST_CODBARRASEMBALAGEM FROM PARMFATUR P WHERE P.CD_EMPRESA = ...';Resultado := ExecutaConsulta(dmMEQ015.transaction, Consulta);if ((Resultado[0] = 'S') and (Resultado[1] = 'S')) thenfrmMEQ015.stConsultaEmbalagem := true; - Operador informa quantidade
Qtde = 10(pretende contar "10 caixas") e passa o leitor no EAN da embalagem VALIDA_CODIGOBARRAretorna o produto (via fallback porCD_CODBARRAEMB)- MEQ015 detecta
stConsultaEmbalagem = true, consultaITEM.PS_LIQUIDOda embalagem lida e multiplica:// UMEQ015.pas:835-854Qtde := (Qtde * StrToFloat(ResEmb[1])) // 10 caixas × 6 un/caixa = 60 un - O balanço registra 60 unidades (e não 10) para aquele produto
Resultado esperado: O balanço de estoque interpreta corretamente que cada bipada na caixa representa PS_LIQUIDO unidades individuais, evitando subcontagem quando o operador conta por caixa em vez de abrir cada uma.
Interação com ST_CODIGOBARRA / ST_CODBARRASBALANCA / ST_CODBARRASEMBALAGEM
ST_CODIGOBARRA (PARMFATUR.ST_CODIGOBARRA)
| Aspecto | Detalhe |
|---|---|
| Relação | ST_CODIGOBARRA controla se o campo de código de barras aparece nos módulos de lançamento (Pedido/NF/Ambos). Sem esse campo visível, o operador não tem como passar o leitor → o fallback por embalagem nunca é acionado |
| Consequência | Para ST_CODIGOBARRACAIXA ter efeito útil nos módulos de venda/compra, ST_CODIGOBARRA precisa estar ligado no contexto correspondente |
| Independência | Os dois parâmetros são lidos em pontos diferentes da procedure VALIDA_CODIGOBARRA — ST_CODIGOBARRACAIXA atua apenas como fallback final |
Veja ST_CODIGOBARRA para detalhes.
ST_CODBARRASBALANCA (PARMFATUR.ST_CODBARRASBALANCA)
| Aspecto | Detalhe |
|---|---|
| Relação | Os dois campos são lidos no mesmo SELECT de VALIDA_CODIGOBARRA (Scripts/VALIDA_CODIGOBARRA.sql:44) |
| Ordem de avaliação | ST_CODBARRASBALANCA é testado antes — quando o código casa com o padrão de balança (EAN-13 iniciando com '2' ou 14 dígitos com '8'/'9'), a procedure já resolve o item por essa via e não chega ao fallback de embalagem |
| Complementaridade | Cobrem casos completamente diferentes (peso variável vs. caixa master) e podem estar ambos ligados sem conflito |
Veja ST_CODBARRASBALANCA para detalhes.
ST_CODBARRASEMBALAGEM (PARMFATUR.ST_CODBARRASEMBALAGEM)
| Aspecto | Detalhe |
|---|---|
| Dependência | ST_CODBARRASEMBALAGEM só é configurável quando ST_CODIGOBARRACAIXA = 'S' — o evento cmbST_CODIGOBARRACAIXAChange (UMFA001.pas:2552) controla lblST_CODBARRASEMBALAGEM.Visible e cmbST_CODBARRASEMBALAGEM.Visible dinamicamente |
| Escopo | Enquanto ST_CODIGOBARRACAIXA afeta toda a procedure VALIDA_CODIGOBARRA (ou seja, todos os módulos que a invocam), ST_CODBARRASEMBALAGEM é lido apenas pelo MEQ015 (balanço de estoque) para decidir se multiplica pelo PS_LIQUIDO |
| Regra combinada MEQ015 | stConsultaEmbalagem = (ST_CODIGOBARRACAIXA = 'S') AND (ST_CODBARRASEMBALAGEM = 'S') — ambos precisam estar ligados para multiplicar pelo fator da embalagem |
Tabela Comparativa Resumida
| Opção | Fallback por CD_CODBARRAEMB em VALIDA_CODIGOBARRA | Campo ST_CODBARRASEMBALAGEM na MFA001 | MEQ015 multiplica por PS_LIQUIDO | Uso típico |
|---|---|---|---|---|
| N (padrão) | Não executa | Oculto | Nunca | Empresas sem EAN separado para caixa master — operador sempre lê a unidade |
| S | Executa (última rota) | Visível e configurável | Somente se ST_CODBARRASEMBALAGEM = 'S' | Distribuidoras, atacadistas e mercados que cadastram CD_CODBARRAEMB por caixa e querem ler a embalagem inteira |
Referências no Código Fonte
Tela MFA001 (configuração)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MFA001/UMFA001.dfm | 3809-3810 | Label "Código de Barras para Unidade Alternativa (Embalagem)" com FocusControl = cmbST_CODIGOBARRACAIXA |
source/MFA001/UMFA001.dfm | 4339-4366 | Declaração do TwwDBComboBox cmbST_CODIGOBARRACAIXA (DataField = 'ST_CODIGOBARRACAIXA', Items = ('Sim'#9'S', 'Não'#9'N'), OnChange = cmbST_CODIGOBARRACAIXAChange) — localizado na aba Faturamento → Opção 2 (pagFatOp2, DFM linha 3656) |
source/MFA001/UMFA001.dfm | 4076-4090 | Label oculto lblST_CODBARRASEMBALAGEM ("Utiliza Código de Barras Embalagem [MEQ015]", Visible = False) — tornado visível pelo evento cmbST_CODIGOBARRACAIXAChange |
source/MFA001/UMFA001.dfm | 4879+ | TwwDBComboBox cmbST_CODBARRASEMBALAGEM (DataField = 'ST_CODBARRASEMBALAGEM') |
source/MFA001/UMFA001.pas | 432 | Declaração do componente cmbST_CODIGOBARRACAIXA: TwwDBComboBox |
source/MFA001/UMFA001.pas | 565-566 | Declarações lblST_CODBARRASEMBALAGEM / cmbST_CODBARRASEMBALAGEM |
source/MFA001/UMFA001.pas | 833 | Assinatura do evento cmbST_CODIGOBARRACAIXAChange(Sender: TObject) |
source/MFA001/UMFA001.pas | 2552-2564 | Implementação do evento: if (cmbST_CODIGOBARRACAIXA.Value = 'S') then lblST_CODBARRASEMBALAGEM.Visible := True; cmbST_CODBARRASEMBALAGEM.Visible := True; (e inverso quando <> 'S') |
source/MFA001/UdmMFA001.pas | 241 | Declaração do field tabPARMFATURST_CODIGOBARRACAIXA: TStringField |
source/MFA001/UdmMFA001.pas | 541 | Valor padrão no AfterInsert: tabPARMFATURST_CODIGOBARRACAIXA.ASString := 'N' |
source/MFA001/UdmMFA001.dfm | 257, 3137 | SELECT ... PARMFATUR.ST_CODIGOBARRACAIXA ... nas queries de carga e FetchRow |
source/MFA001/UdmMFA001.dfm | 1734-1737 | Definição do field tabPARMFATURST_CODIGOBARRACAIXA (FieldName = 'ST_CODIGOBARRACAIXA', Origin = '"PARMFATUR"."ST_CODIGOBARRACAIXA"') |
source/MFA001/UdmMFA001.dfm | 2836 | ST_CODIGOBARRACAIXA = :ST_CODIGOBARRACAIXA no UPDATE do PARMFATUR |
Tela MEQ015 (Balanço de Estoque)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MEQ015/UMEQ015.pas | 102 | Declaração da flag pública stConsultaEmbalagem: Boolean em TfrmMEQ015 |
source/MEQ015/UMEQ015.pas | 189-200 | No iniciar, executa SELECT P.ST_CODIGOBARRACAIXA, P.ST_CODBARRASEMBALAGEM FROM PARMFATUR P WHERE P.CD_EMPRESA = ...; se ambos forem 'S', seta stConsultaEmbalagem := true |
source/MEQ015/UMEQ015.pas | 835-855 | Quando stConsultaEmbalagem = true e o código lido casa com ITEM.CD_CODBARRAEMB do produto retornado por VALIDA_CODIGOBARRA, multiplica Qtde := Qtde * StrToFloat(ResEmb[1]) (o PS_LIQUIDO da embalagem) |
Procedure SQL
| Arquivo | Linha | Descrição |
|---|---|---|
Scripts/VALIDA_CODIGOBARRA.sql | 31 | Declaração V_ST_CODIGOBARRACAIXA DOM_CHAR1 |
Scripts/VALIDA_CODIGOBARRA.sql | 44-47 | SELECT ... P.ST_CODIGOBARRACAIXA FROM PARMFATUR P WHERE P.CD_EMPRESA = :I_CD_EMPRESA INTO ... :V_ST_CODIGOBARRACAIXA |
Scripts/VALIDA_CODIGOBARRA.sql | 277-307 | Comentário de origem (CHAMADO 99972 - Rogério 17/06/2015) + bloco IF (V_ST_CODIGOBARRACAIXA = 'S') THEN ... SELECT ... FROM ITEM I ... WHERE I.CD_CODBARRAEMB = :I_CD_CODIGOBARRA — executa somente quando O_CD_ITEM ainda é NULL após as demais tentativas |
Scripts/VALIDA_CODIGOBARRA.sql | 302-305 | Saída do fallback: O_VL_TOTAL = O_QT_ITEM * O_VL_UNITARIO; O_CD_CODIGOBARRA = I_CD_CODIGOBARRA; O_TP_CODIGO = 'N' |