Pular para o conteúdo principal

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_CODIGOBARRACAIXA Valor 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óduloCódigoDescriçãoContexto
Parâmetros FaturamentoMFA001Tela de configuraçãoLê/grava o campo; controla visibilidade de ST_CODBARRASEMBALAGEM (cmbST_CODBARRASEMBALAGEM/lblST_CODBARRASEMBALAGEM)
Balanço de EstoqueMEQ015Conferê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​

ProcedureArquivoDescrição
VALIDA_CODIGOBARRAScripts/VALIDA_CODIGOBARRA.sqlLê 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​

CampoDescrição
PARMFATUR.ST_CODIGOBARRACAIXAHabilita fallback de busca por código de barras de embalagem ('S'/'N')
PARMFATUR.ST_CODBARRASEMBALAGEMParâ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_CODBARRAEMBEAN impresso na caixa master / unidade alternativa do produto
ITEM.CD_CODIGOBARRAEAN da unidade unitária do produto (consultado antes, como via primária)
ITEM.PS_LIQUIDOQuantidade/peso por embalagem — usado pela MEQ015 para multiplicar a quantidade contada quando o código lido é da caixa master
ITEM.SG_UNIDALTSigla da unidade alternativa (embalagem)
I_CD_CODIGOBARRAEntrada da procedure VALIDA_CODIGOBARRA: código lido no leitor
O_CD_ITEM / O_VL_UNITARIO / O_QT_ITEM / O_VL_TOTAL / O_TP_CODIGOSaí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 fazDetalhe
Busca por código de barras da embalagemDesabilitada
VALIDA_CODIGOBARRANã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 MFA001Oculto (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​

  1. Vá em MFA001 → Faturamento → Opção 2 → campo "Código de Barras para Unidade Alternativa (Embalagem)" = "Não"
  2. Salve os parâmetros (F6)
  3. Observe que o campo logo abaixo, "Utiliza Código de Barras Embalagem [MEQ015]" (ST_CODBARRASEMBALAGEM), desaparece da tela
  4. No cadastro de produto (ITEM), suponha que um produto "Refrigerante 2L" tenha:
    • CD_CODIGOBARRA = '7894900010015' (unidade)
    • CD_CODBARRAEMB = '17894900010012' (caixa com 6 unidades)
  5. Abra o PDV (MNF017) ou o balanço de estoque (MEQ015)
  6. Operador passa o leitor no código da caixa fechada 17894900010012
  7. VALIDA_CODIGOBARRA pesquisa o código em:
    • ITEMGRADE.CD_CODIGOBARRA → não encontra
    • ITEM.CD_CODIGOBARRA (via bloco posterior) → não encontra (esse EAN está no CD_CODBARRAEMB)
    • Padrões de balança → não se aplicam
    • ITEM.CD_CODBARRAEMB → bloco não executa (parâmetro desligado)
  8. 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 fazDetalhe
Busca por código de barras da embalagemHabilitada
VALIDA_CODIGOBARRAQuando 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 empresaSe 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árioObtido via RETORNA_PRECOITEM usando PARMFATUR.CD_TABPRECO da empresa
Quantidade (O_QT_ITEM) retornadaVem 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 MFA001Visí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​

  1. Vá em MFA001 → Faturamento → Opção 2 → "Código de Barras para Unidade Alternativa (Embalagem)" = "Sim" → F6
  2. Observe o campo "Utiliza Código de Barras Embalagem [MEQ015]" (ST_CODBARRASEMBALAGEM) aparecer imediatamente logo abaixo (evento cmbST_CODIGOBARRACAIXAChange)
  3. Cadastre (em TPO001/MPD008 ou ITEM) um produto "Refrigerante 2L" com:
    • CD_CODIGOBARRA = '7894900010015'
    • CD_CODBARRAEMB = '17894900010012'
    • PS_LIQUIDO = 6 (6 unidades por caixa)
  4. Abra o PDV (MNF017) ou o MPD002
  5. Operador passa o leitor no código da caixa fechada 17894900010012
  6. 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 fallback
    • SELECT ... FROM ITEM WHERE CD_CODBARRAEMB = '17894900010012' → localiza o produto
  7. 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'
  8. 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'​

  1. Com ST_CODIGOBARRACAIXA = 'S', configure também ST_CODBARRASEMBALAGEM = 'S' na tela MFA001
  2. Abra o MEQ015 — no iniciar o módulo executa:
    // UMEQ015.pas:191-200
    Consulta := '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')) then
    frmMEQ015.stConsultaEmbalagem := true;
  3. Operador informa quantidade Qtde = 10 (pretende contar "10 caixas") e passa o leitor no EAN da embalagem
  4. VALIDA_CODIGOBARRA retorna o produto (via fallback por CD_CODBARRAEMB)
  5. MEQ015 detecta stConsultaEmbalagem = true, consulta ITEM.PS_LIQUIDO da embalagem lida e multiplica:
    // UMEQ015.pas:835-854
    Qtde := (Qtde * StrToFloat(ResEmb[1])) // 10 caixas × 6 un/caixa = 60 un
  6. 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)​

AspectoDetalhe
RelaçãoST_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ênciaPara ST_CODIGOBARRACAIXA ter efeito útil nos módulos de venda/compra, ST_CODIGOBARRA precisa estar ligado no contexto correspondente
IndependênciaOs 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)​

AspectoDetalhe
RelaçãoOs dois campos são lidos no mesmo SELECT de VALIDA_CODIGOBARRA (Scripts/VALIDA_CODIGOBARRA.sql:44)
Ordem de avaliaçãoST_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
ComplementaridadeCobrem 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)​

AspectoDetalhe
DependênciaST_CODBARRASEMBALAGEM só é configurável quando ST_CODIGOBARRACAIXA = 'S' — o evento cmbST_CODIGOBARRACAIXAChange (UMFA001.pas:2552) controla lblST_CODBARRASEMBALAGEM.Visible e cmbST_CODBARRASEMBALAGEM.Visible dinamicamente
EscopoEnquanto 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 MEQ015stConsultaEmbalagem = (ST_CODIGOBARRACAIXA = 'S') AND (ST_CODBARRASEMBALAGEM = 'S') — ambos precisam estar ligados para multiplicar pelo fator da embalagem

Tabela Comparativa Resumida​

OpçãoFallback por CD_CODBARRAEMB em VALIDA_CODIGOBARRACampo ST_CODBARRASEMBALAGEM na MFA001MEQ015 multiplica por PS_LIQUIDOUso típico
N (padrão)Não executaOcultoNuncaEmpresas sem EAN separado para caixa master — operador sempre lê a unidade
SExecuta (última rota)Visível e configurávelSomente 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)​

ArquivoLinhaDescrição
source/MFA001/UMFA001.dfm3809-3810Label "Código de Barras para Unidade Alternativa (Embalagem)" com FocusControl = cmbST_CODIGOBARRACAIXA
source/MFA001/UMFA001.dfm4339-4366Declaraçã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.dfm4076-4090Label oculto lblST_CODBARRASEMBALAGEM ("Utiliza Código de Barras Embalagem [MEQ015]", Visible = False) — tornado visível pelo evento cmbST_CODIGOBARRACAIXAChange
source/MFA001/UMFA001.dfm4879+TwwDBComboBox cmbST_CODBARRASEMBALAGEM (DataField = 'ST_CODBARRASEMBALAGEM')
source/MFA001/UMFA001.pas432Declaração do componente cmbST_CODIGOBARRACAIXA: TwwDBComboBox
source/MFA001/UMFA001.pas565-566Declarações lblST_CODBARRASEMBALAGEM / cmbST_CODBARRASEMBALAGEM
source/MFA001/UMFA001.pas833Assinatura do evento cmbST_CODIGOBARRACAIXAChange(Sender: TObject)
source/MFA001/UMFA001.pas2552-2564Implementação do evento: if (cmbST_CODIGOBARRACAIXA.Value = 'S') then lblST_CODBARRASEMBALAGEM.Visible := True; cmbST_CODBARRASEMBALAGEM.Visible := True; (e inverso quando <> 'S')
source/MFA001/UdmMFA001.pas241Declaração do field tabPARMFATURST_CODIGOBARRACAIXA: TStringField
source/MFA001/UdmMFA001.pas541Valor padrão no AfterInsert: tabPARMFATURST_CODIGOBARRACAIXA.ASString := 'N'
source/MFA001/UdmMFA001.dfm257, 3137SELECT ... PARMFATUR.ST_CODIGOBARRACAIXA ... nas queries de carga e FetchRow
source/MFA001/UdmMFA001.dfm1734-1737Definição do field tabPARMFATURST_CODIGOBARRACAIXA (FieldName = 'ST_CODIGOBARRACAIXA', Origin = '"PARMFATUR"."ST_CODIGOBARRACAIXA"')
source/MFA001/UdmMFA001.dfm2836ST_CODIGOBARRACAIXA = :ST_CODIGOBARRACAIXA no UPDATE do PARMFATUR

Tela MEQ015 (Balanço de Estoque)​

ArquivoLinhaDescrição
source/MEQ015/UMEQ015.pas102Declaração da flag pública stConsultaEmbalagem: Boolean em TfrmMEQ015
source/MEQ015/UMEQ015.pas189-200No 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.pas835-855Quando 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​

ArquivoLinhaDescrição
Scripts/VALIDA_CODIGOBARRA.sql31Declaração V_ST_CODIGOBARRACAIXA DOM_CHAR1
Scripts/VALIDA_CODIGOBARRA.sql44-47SELECT ... P.ST_CODIGOBARRACAIXA FROM PARMFATUR P WHERE P.CD_EMPRESA = :I_CD_EMPRESA INTO ... :V_ST_CODIGOBARRACAIXA
Scripts/VALIDA_CODIGOBARRA.sql277-307Comentá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.sql302-305Saída do fallback: O_VL_TOTAL = O_QT_ITEM * O_VL_UNITARIO; O_CD_CODIGOBARRA = I_CD_CODIGOBARRA; O_TP_CODIGO = 'N'