Parâmetro de Código de Barras de Balança
Tela de configuração: MFA001 - Parâmetros de Faturamento
Localização: Parâmetros → Ambos → Opção 1
Tabela: PARMFATUR.ST_CODBARRASBALANCA
Valor padrão: N (Não)
Habilita a interpretação de códigos de barras EAN-13 gerados por balança eletrônica (código impresso no ponto de venda após pesagem), em que os próprios dígitos do código carregam o produto e o peso (ou valor total) da mercadoria.
Com o parâmetro ativado ('S'), toda vez que o operador passa o leitor em um código de balança, o ERP reconhece o layout, extrai automaticamente o produto e a quantidade/valor, e lança o item no documento — sem exigir digitação manual do peso.
Telas impactadas
O parâmetro é lido pela procedure VALIDA_CODIGOBARRA, que é chamada por todos os módulos de lançamento de documento que usam leitor de código de barras. As telas abaixo invocam VALIDA_CODIGOBARRA e, portanto, herdam o comportamento de balança automaticamente:
| Módulo | Código | Descrição | Contexto |
|---|
| PDV / Cupom Fiscal | MNF017 | Frente de caixa / cupom fiscal | Leitura direta de código de balança na venda |
| Pedido de Venda | MPD002 | Pedidos de venda | Leitura de código de balança no pedido |
| Pedido de Venda (Outro Tipo) | MPD018 | Orçamento/Pedido alternativo | Leitura de código de balança |
| Pedido Mobile | MPD056 | Pedido via mobile | Leitura de código de balança |
| Pedido (Carregamento) | MPD053 | Orçamento carregamento | Leitura de código de balança |
| Devolução de Pedido | MPD037 | Devolução de pedidos | Leitura de código de balança |
| Orçamento de Compra | MPD092 | Orçamento de compra | Leitura de código de balança |
| Pedido Rápido | MPD091 | Pedido rápido | Leitura de código de balança |
| Pedido | MPD084 | Pedido | Leitura de código de balança |
| Pedido | MPD031 | Pedido | Leitura de código de balança |
| Pedido Simplificado | MPD097 | Pedido simplificado | Leitura de código de balança |
| Pedido Venda Simples | MPD001 | Pedido venda simples | Leitura de código de balança |
| Nota Fiscal Entrada | MNF001 | NF de entrada | Leitura de código de balança |
| Nota Fiscal Saída | MNF002 | Emissão de NF de saída | Leitura de código de balança |
| NF Devolução/Troca | MNF009 | Troca de produtos | Leitura de código de balança |
| NF Recibo | MNF026 | Nota recibo | Leitura de código de balança |
| NF Manifesto | MNF035 | Manifesto/NF | Leitura de código de balança |
| Ordem de Serviço | TOF007 | OS | Leitura de código de balança |
| Balcão / PDV Touch | TPO001 | Balcão PDV touch | Leitura de código de balança |
| Transferência Entrada | MTR004 | Transferência entrada (XML) | Leitura de código de balança |
| Recap Produto | jRecapadora | Produto recap | Leitura de código de balança |
| Recap Movimento | MRE005 | Recap | Leitura de código de balança |
| Recap NF | MRC045 | Recap NF | Leitura de código de balança |
| Equipamento Recap | MEQ002 | Equipamento recap | Leitura de código de balança |
| Equipamento | MEQ008 | Equipamento | Leitura de código de balança |
| Equipamento | MEQ013 | Equipamento | Leitura de código de balança |
| Equipamento | MEQ014 | Equipamento | Leitura de código de balança |
| Equipamento | MEQ015 | Equipamento | Leitura de código de balança |
| Equipamento | MEQ058 | Equipamento | Leitura de código de balança |
| Equipamento | MEQ072 | Equipamento | Leitura de código de balança |
| Config NF | CNF001 | Configuração NF | Leitura de código de balança |
| Config Equipamento | CEQ001 | Configuração Equipamento | Leitura de código de balança |
Nota: A tela MNF017 também carrega explicitamente o valor de ST_CODBARRASBALANCA para uma variável local (iST_CODBARRASBALANCA) no UMNF017.pas:189, mas o consumo real da lógica de balança acontece exclusivamente dentro da procedure VALIDA_CODIGOBARRA.
Telas que apenas replicam o parâmetro entre empresas
| Módulo | Código | Uso |
|---|
| Replicar Parâmetros (RCA006) | RCA006 | INSERT/UPDATE de PARMFATUR de uma empresa para outra (inclui o campo ST_CODBARRASBALANCA) |
| Copiar Parâmetros (CPD009) | CPD009 | INSERT/UPDATE de PARMFATUR na cópia de parâmetros de empresa (inclui o campo) |
Procedures impactadas
| Procedure | Arquivo | Descrição |
|---|
VALIDA_CODIGOBARRA | Scripts/VALIDA_CODIGOBARRA.sql | Lê PARMFATUR.ST_CODBARRASBALANCA e decide se interpreta o código de barras recebido como código de balança (EAN com prefixo '2' de 13 dígitos ou com prefixo '8'/'9' de 14 dígitos) |
Trecho relevante da procedure
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;
IF ( (V_ST_CODIGOBARRABALANCA = 'S')
AND (SUBSTRING(I_CD_CODIGOBARRA FROM 1 FOR 1) = '2')
AND (CHAR_LENGTH(I_CD_CODIGOBARRA) = 13) ) THEN BEGIN
IF ( (V_ST_CODIGOBARRABALANCA = 'S')
AND (SUBSTRING(I_CD_CODIGOBARRA FROM 1 FOR 1) IN ('9','8'))
AND (CHAR_LENGTH(I_CD_CODIGOBARRA) = 14) ) THEN BEGIN
V_CODIGO = TRIM(SUBSTRING(TRIM(I_CD_CODIGOBARRA) FROM 1 FOR 10));
V_PESO = TRIM(SUBSTRING(TRIM(I_CD_CODIGOBARRA) FROM 11 FOR 3) || '.' ||
SUBSTRING(TRIM(I_CD_CODIGOBARRA) FROM 14 FOR 1));
Campos envolvidos
| Campo | Descrição |
|---|
PARMFATUR.ST_CODBARRASBALANCA | Habilita a interpretação de códigos EAN de balança ('S'/'N') |
PARMUSUARIO.CD_BALANCA | Vínculo do operador atual a uma balança (usado dentro de VALIDA_CODIGOBARRA para localizar a máscara correta) |
BALANCA.DS_MASCARACODIGO | Máscara do layout EAN gerado pela balança — define onde estão o código, peso e valor dentro dos 13 dígitos (macros C/P/D/Q/M) |
I_CD_CODIGOBARRA | Código de barras lido pelo leitor (entrada da procedure) |
O_TP_CODIGO | Saída da procedure: 'N' = código normal, 'B' = código de balança |
O_CD_ITEM | Código do produto extraído do código de barras |
O_QT_ITEM | Quantidade (peso) derivada do código |
O_VL_UNITARIO / O_VL_TOTAL | Valor unitário (do produto na tabela de preço) e valor total (calculado a partir do peso/total extraído) |
Opções disponíveis
N - Não (valor padrão)
| O que faz | Detalhe |
|---|
| Interpretação de código de balança | Desabilitada |
Código EAN com prefixo '2' de 13 dígitos | Tratado como código de barras normal — o sistema tenta casar o valor integral em ITEM.CD_CODIGOBARRA ou ITEMCODIGOBARRA; se não encontrar, retorna "produto não localizado" |
Código com prefixo '8'/'9' de 14 dígitos (Joacir Mille Joias) | Tratado como código normal |
Máscara da BALANCA | Não é consultada |
Retorno O_TP_CODIGO | Sempre 'N' (normal) quando o produto é localizado |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Cód. de Barras Balança" = "Não"
- Salve os parâmetros (F6)
- Abra o PDV (MNF017) ou um pedido (MPD002)
- No açougue, o operador pesa uma carne de 1,250 kg a R$ 29,90/kg e a balança imprime o EAN-13
2012345037375 (prefixo '2', código do item "1234", total 037.37, dígito verificador 5)
- O operador passa o leitor no código
- O sistema procura o código integral
2012345037375 em ITEM.CD_CODIGOBARRA e ITEMCODIGOBARRA — como esse EAN é gerado dinamicamente pela balança, nenhum produto é encontrado
- Retorna erro "Produto não localizado"
Resultado esperado: A leitura de código de balança não funciona. O operador precisa digitar manualmente o código do produto e o peso. Este é o valor padrão, adequado para empresas que não usam balança com impressão de etiqueta EAN (a maioria das lojas que não trabalham com produtos vendidos a peso).
Este é o valor padrão ao criar um novo registro no MFA001 (UdmMFA001.pas:472 → 'N').
S - Sim
| O que faz | Detalhe |
|---|
| Interpretação de código de balança | Habilitada |
Código EAN com prefixo '2' de 13 dígitos | Interpretado como código de balança: o sistema lê a máscara BALANCA.DS_MASCARACODIGO vinculada ao operador (via PARMUSUARIO.CD_BALANCA) e decompõe o EAN em código do produto + total/peso |
| Código sem balança cadastrada | Usa layout fixo legado: posições 2–5 são o código do produto, posições 6–12 são o valor total XXXXX.XX |
Código com prefixo '8'/'9' de 14 dígitos | Interpretado como layout alternativo "Joacir Mille Joias": posições 1–10 são o código de barras do produto (casa com ITEM.CD_CODIGOBARRA) e posições 11–14 são o peso XXX.X |
Retorno O_TP_CODIGO | 'B' (balança) quando a interpretação casa com um produto |
| Cálculo automático | VL_TOTAL e QT_ITEM são calculados a partir do peso/total extraído e do preço unitário do produto na tabela de preço |
- Cadastre uma balança em
BALANCA com DS_MASCARACODIGO = 'CCCCCCPPPPPDD' (6 posições de código + 5 inteiros de total + 2 decimais de total)
- Vincule essa balança ao operador em
PARMUSUARIO.CD_BALANCA
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → "Cód. de Barras Balança" = "Sim" → Salve (F6)
- Abra o PDV (MNF017)
- Operador pesa uma carne de 1,250 kg a R$ 29,90/kg na balança
- A balança imprime EAN-13 =
2 001234 03737 5 (prefixo '2' + 001234 código + 03737 = R$ 37,37 + dígito verificador 5)
- Operador passa o leitor no PDV
VALIDA_CODIGOBARRA lê ST_CODBARRASBALANCA = 'S', detecta prefixo '2' e 13 dígitos
- Consulta
BALANCA.DS_MASCARACODIGO do operador logado ('CCCCCCPPPPPDD')
- Extrai:
V_CODIGO = '001234', V_TOTAL = '037.37'
- Busca o produto
CD_ITEM = 1234 e o preço na tabela CD_TABPRECO da PARMFATUR
- Retorna:
O_CD_ITEM = 1234, O_VL_TOTAL = 37,37, O_QT_ITEM = 37,37 / 29,90 = 1,250, O_TP_CODIGO = 'B'
- O item é inserido automaticamente no documento com o peso correto
Resultado esperado: O operador apenas passa o leitor no código impresso pela balança — o produto e a quantidade são lançados automaticamente, sem digitação manual.
Simulação passo a passo — sem balança vinculada ao operador
ST_CODBARRASBALANCA = 'S' mas PARMUSUARIO.CD_BALANCA é NULL para o operador
- Leitor recebe EAN-13 =
2 1234 0373700 5 (prefixo '2', layout legado)
- A procedure cai no fallback legado (
VALIDA_CODIGOBARRA.sql linhas 108-110):
V_CODIGO = SUBSTRING(2..5) = '1234'
V_TOTAL = SUBSTRING(6..10) || '.' || SUBSTRING(11..12) = '03737.00'
- Produto e valor são extraídos e o item é lançado
Resultado esperado: O layout legado é usado, mesmo sem balança cadastrada — mas perde flexibilidade (nenhum peso separado do total).
Simulação passo a passo — Layout "Joacir Mille Joias" (14 dígitos, prefixo '8'/'9')
ST_CODBARRASBALANCA = 'S'
- Cadastre
ITEM.CD_CODIGOBARRA = '8012345670' para um produto de joia vendido por peso
- Balança imprime código de 14 dígitos:
80123456701253 (posições 1-10 = código, posições 11-14 = peso 125.3 gramas)
- Operador passa o leitor
VALIDA_CODIGOBARRA detecta V_ST_CODIGOBARRABALANCA = 'S', prefixo '8' e 14 dígitos
- Extrai:
V_CODIGO = '8012345670', V_PESO = '125.3'
- Busca o produto por
ITEM.CD_CODIGOBARRA = '8012345670'
- Retorna: produto localizado,
O_QT_ITEM = 125,3, O_VL_TOTAL = 125,3 × preço unitário, O_TP_CODIGO = 'B'
Resultado esperado: Usado por joalherias (implementação específica "Joacir Mille Joias" documentada no comentário do código), onde o produto tem código EAN próprio e o peso em gramas é anexado nos últimos 4 dígitos.
ST_CODIGOBARRA (PARMFATUR.ST_CODIGOBARRA)
| Aspecto | Detalhe |
|---|
| Relação | ST_CODBARRASBALANCA só tem efeito útil quando o campo de código de barras está visível na tela — ou seja, quando ST_CODIGOBARRA ativa código de barras para o contexto do documento (Pedido/NF/Ambos) |
| Consequência | Se ST_CODIGOBARRA = 'N' no módulo, o operador não tem campo para passar o leitor → balança nunca é acionada, mesmo com ST_CODBARRASBALANCA = 'S' |
Veja ST_CODIGOBARRA para detalhes.
ST_CODIGOBARRACAIXA (PARMFATUR.ST_CODIGOBARRACAIXA)
| Aspecto | Detalhe |
|---|
| Relação | Lido no mesmo SELECT de VALIDA_CODIGOBARRA (VALIDA_CODIGOBARRA.sql:44) |
| Independente | Afeta código de barras de embalagem (caixa master) e não interfere no layout de balança |
PARMUSUARIO.CD_BALANCA + BALANCA.DS_MASCARACODIGO
| Aspecto | Detalhe |
|---|
| Relação | Quando ST_CODBARRASBALANCA = 'S' e o código é EAN-13 com prefixo '2', a procedure localiza a balança do operador via PARMUSUARIO → BALANCA e usa DS_MASCARACODIGO para decodificar |
| Fallback | Se o operador não tem balança vinculada, um layout fixo é usado (código nas posições 2–5, total XXXXX.XX nas posições 6–12) |
PARAMRECAP.DSMASCARACODIGO (contexto de recapadora)
| Aspecto | Detalhe |
|---|
| Independente | Não depende de ST_CODBARRASBALANCA. É um caminho paralelo dentro da mesma VALIDA_CODIGOBARRA para leitura de banda de pneu (prefixo 'X3'), usado em MRE005 e afins |
Tabela Comparativa Resumida
| Opção | Código EAN-13 com prefixo '2' | Código 14 dígitos '8'/'9' | Uso típico |
|---|
| N (padrão) | Tratado como código normal (casa integral em ITEM.CD_CODIGOBARRA) | Tratado como código normal | Lojas sem balança com impressão EAN |
| S | Interpretado como código de balança → extrai produto + peso/total pela máscara BALANCA.DS_MASCARACODIGO | Interpretado como layout "Joacir Mille Joias" → código nas posições 1-10, peso nas posições 11-14 | Açougues, mercearias com balança, joalherias por peso |
Referências no Código Fonte
Tela MFA001 (configuração)
| Arquivo | Linha | Descrição |
|---|
source/MFA001/UMFA001.dfm | 3069-3095 | Declaração do TwwDBComboBox cmbST_CODBARRASBALANCA com Items = ('Sim'#9'S', 'Não'#9'N'), DataField = 'ST_CODBARRASBALANCA' |
source/MFA001/UMFA001.dfm | 2383-2384 | Label 'Cód. de Barras Balança' com FocusControl = cmbST_CODBARRASBALANCA |
source/MFA001/UMFA001.pas | 237 | Declaração do componente cmbST_CODBARRASBALANCA: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 115 | Declaração do field tabPARMFATURST_CODBARRASBALANCA: TStringField |
source/MFA001/UdmMFA001.pas | 472 | Valor padrão no AfterInsert: tabPARMFATURST_CODBARRASBALANCA.AsString := 'N' |
source/MFA001/UdmMFA001.dfm | 1027-1030 | Definição do field (FieldName = 'ST_CODBARRASBALANCA', Size = 1) |
source/MFA001/UdmMFA001.dfm | 57, 2368, 2520, 2703, 2937 | SELECT/INSERT/UPDATE/FetchRow do PARMFATUR incluindo o campo |
Tela MNF017 (PDV / cupom fiscal)
| Arquivo | Linha | Descrição |
|---|
source/MNF017/UMNF017.pas | 162 | Campo P.ST_CODBARRASBALANCA incluído no SELECT de carga de parâmetros da PARMFATUR |
source/MNF017/UMNF017.pas | 189 | Atribuição dmMNF017.iST_CODBARRASBALANCA := Resultado[15] |
source/MNF017/UdmMNF017.pas | 151 | Field tabCABECALHOST_CODBARRASBALANCA: TStringField |
source/MNF017/UdmMNF017.pas | 281 | Declaração da variável pública iST_CODBARRASBALANCA: string |
source/MNF017/UdmMNF017.dfm | 425-428 | Field ST_CODBARRASBALANCA no dataset de cabeçalho |
Telas de replicação de parâmetros
| Arquivo | Linha | Descrição |
|---|
source/RCA006/UdmRCA006.dfm | 3049, 3115, 3198, 3259 | SELECT/INSERT/UPDATE/FetchRow do PARMFATUR incluindo ST_CODBARRASBALANCA (replicação entre empresas) |
source/CPD009/UdmCPD009.dfm | 300, 366, 449, 510 | SELECT/INSERT/UPDATE/FetchRow do PARMFATUR incluindo ST_CODBARRASBALANCA (cópia de parâmetros) |
Procedure SQL
| Arquivo | Linha | Descrição |
|---|
Scripts/VALIDA_CODIGOBARRA.sql | 21 | Declaração V_ST_CODIGOBARRABALANCA DOM_CHAR1 |
Scripts/VALIDA_CODIGOBARRA.sql | 44-47 | SELECT ST_CODBARRASBALANCA FROM PARMFATUR |
Scripts/VALIDA_CODIGOBARRA.sql | 65 | IF (V_ST_CODIGOBARRABALANCA = 'S') AND (SUBSTRING ... FROM 1 FOR 1) = '2') AND (CHAR_LENGTH = 13) — ativa decodificação EAN-13 com máscara de balança |
Scripts/VALIDA_CODIGOBARRA.sql | 66-106 | Leitura de BALANCA.DS_MASCARACODIGO via PARMUSUARIO.CD_BALANCA + aplicação das macros C/P/D/Q/M |
Scripts/VALIDA_CODIGOBARRA.sql | 108-110 | Fallback sem balança cadastrada: layout fixo CCCC PPPPP DD |
Scripts/VALIDA_CODIGOBARRA.sql | 138 | Retorno O_TP_CODIGO = 'B' quando o código é de balança |
Scripts/VALIDA_CODIGOBARRA.sql | 156-183 | Caminho alternativo: prefixo '8'/'9' de 14 dígitos (layout "Joacir Mille Joias") |
Módulos que consomem VALIDA_CODIGOBARRA (efeito indireto)
Os módulos abaixo chamam VALIDA_CODIGOBARRA em seus fluxos de leitura de código de barras e, portanto, passam a reconhecer códigos de balança automaticamente quando ST_CODBARRASBALANCA = 'S':
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, jRecapadora/UProdutoRecap.pas, Server/JunsoftWebAPI/.../ItemRepository.java.