Pular para o conteúdo principal

Parâmetro de Integração com Balança Eletrônica (Leitura de Peso por Porta Serial/TCP)

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 2 (aba "Parâmetros Comum a Notas Fiscais / Pedido") Tabela: PARMFATUR.ST_UTILIZABALANCA Valor padrão: S (Sim) — DOM_CHAR1 DEFAULT 'S' NOT NULL em docs/schema/tables/PARMFATUR.sql:223

Habilita a leitura automática de peso a partir de uma balança eletrônica conectada (porta serial ou IP, conforme cadastro em BALANCA) ao lançar itens vendidos por peso no PDV (MNF017) ou no pedido de venda (MPD002).

Quando o parâmetro está ativo ('S') e o produto tem ITEM.CD_BALANCA preenchido, o ERP chama a função LeBalanca (em jAutomacao.pas) na hora de informar o item — a balança devolve o peso e o sistema preenche automaticamente a quantidade do item no documento, dispensando digitação manual.

Atenção — parâmetro diferente de ST_CODBARRASBALANCA:

  • ST_UTILIZABALANCA controla comunicação direta com o hardware da balança (leitura de peso em tempo real via jAutomacao.CarregarBalanca). Usa a tabela BALANCA + ITEM.CD_BALANCA.
  • ST_CODBARRASBALANCA controla a interpretação de código de barras EAN-13 pré-impresso pela balança (o código já traz o peso embutido nos dígitos). Usa a procedure VALIDA_CODIGOBARRA + BALANCA.DS_MASCARACODIGO.

Os dois parâmetros não se substituem e podem ser usados de forma combinada ou isolada — veja a seção Interação com ST_CODBARRASBALANCA abaixo.

Telas impactadas​

MóduloCódigoDescriçãoComportamento
PDV / Cupom FiscalMNF017Frente de caixa / cupom fiscalCarrega ST_UTILIZABALANCA para frmMNF017.vST_UTILIZABALANCA. Ao digitar um produto cuja ITEM.CD_BALANCA está preenchida, chama LeBalanca para capturar o peso. Também fornece o botão Balança (btnBalancaClick), que lê o peso da balança padrão dmMNF017.iCD_BALANCA mesmo antes do item ser selecionado (modo 'A' — avulso).
Pedido de VendaMPD002Pedidos de vendaAo inserir um item com ITEM.CD_BALANCA preenchida, consulta ParmFatur.Values['ST_UTILIZABALANCA'] e, se 'S', chama LeBalanca em modo 'P' (peso) para preencher tabITEMPEDIDOQT_PEDIDA ou PS_PEDIDO automaticamente.

Telas/rotinas que NÃO consomem este parâmetro mas chamam LeBalanca​

As rotinas abaixo também conversam com a balança via jAutomacao.LeBalanca, mas não fazem IF ST_UTILIZABALANCA = 'S' — elas dependem apenas de outros critérios (ex.: ST_VALIDAPESO, cadastro de CD_BALANCA no equipamento/movimento ou botão explícito de pesagem):

Conclusão: ST_UTILIZABALANCA é, na prática, um interruptor exclusivo do par MNF017 + MPD002 (isso está inclusive documentado no próprio rótulo da tela, que diz "Utiliza Balança para Produtos [MNF017/MPD002]").

Campos envolvidos​

CampoDescrição
PARMFATUR.ST_UTILIZABALANCAHabilita a leitura automática de peso no par MNF017/MPD002 ('S'/'N')
ITEM.CD_BALANCAVínculo do produto a uma balança cadastrada (FK → BALANCA.CD_BALANCA). Se o item não tiver essa FK preenchida, o ERP não tenta ler a balança mesmo com ST_UTILIZABALANCA = 'S'
BALANCACadastro de balanças disponíveis na empresa (porta serial/IP, modelo, máscara). Consumida por jAutomacao.CarregarBalanca
PARMUSUARIO.CD_BALANCABalança padrão do operador logado (usada pelo botão Balança do MNF017 em modo 'A' — avulso)

Arquitetura: jAutomacao.LeBalanca​

Localização: source/jAutomacao/jAutomacao.pas:14-25

Function LeBalanca(iConexao: TFDCustomConnection; iParametros: TResultado) : TResultado;
begin
Result := CarregarBalanca(iConexao, iParametros);
end;

Assinatura do array iParametros (observada nos callers MNF017/MPD002):

ÍndiceConteúdoExemplo
[0]CD_EMPRESAIntToStr(sessao.empresa.cd_Empresa)
[1]CD_BALANCAResultado[0] retornado de SELECT I.CD_BALANCA FROM ITEM I WHERE I.CD_ITEM = :I
[2]Modo de leitura'P' = peso, 'A' = avulsa (operador aciona explicitamente)
[3]Nº de casas decimais'3' no MPD002/MNF017

Retorno Result[0]:

  • '-1' → erro / sem leitura → o ERP cai no fallback (qtItem := 1 no MPD002).
  • Qualquer outro valor → peso lido, convertido com StrToFloat e atribuído a QT_PEDIDA / PS_PEDIDO / fQtde.

Opções disponíveis​

S - Sim (valor padrão)​

O que fazDetalhe
Leitura automática de peso no MPD002/MNF017Habilitada
Produto com ITEM.CD_BALANCA preenchidoLeBalanca é chamada em modo 'P' (peso) ao inserir o item; o peso retornado vira QT_PEDIDA/PS_PEDIDO automaticamente
Produto sem ITEM.CD_BALANCAA leitura é ignorada — qtItem assume 0 e o ERP coloca qtItem := 1 como fallback (MPD002)
Botão Balança no MNF017Continua funcionando normalmente (ele depende de dmMNF017.iCD_BALANCA em modo 'A', não do flag ST_UTILIZABALANCA)
Erro de comunicação com a balançaRetorno[0] = '-1' → o peso não é preenchido, operador precisa digitar manualmente

Simulação passo a passo​

  1. Cadastre uma balança em BALANCA (porta COM/IP + modelo/protocolo).
  2. No cadastro do produto pesável (ex.: um corte de carne no açougue), preencha ITEM.CD_BALANCA com o código da balança cadastrada.
  3. Vá em MFA001 → aba Ambos → Opção 2 → campo "Utiliza Balança para Produtos [MNF017/MPD002]" = "Sim". Salve (F6).
  4. Abra o pedido de venda MPD002 ou o PDV MNF017.
  5. Pese o corte de carne na balança (ex.: 1,250 kg).
  6. Digite o código do produto no item do pedido.
  7. O ERP roda SELECT I.CD_BALANCA FROM ITEM I WHERE I.CD_ITEM = ..., detecta que o produto tem balança vinculada e chama LeBalanca automaticamente.
  8. A função jAutomacao.CarregarBalanca conversa com o hardware (serial/TCP) e devolve ['1.250'].
  9. tabITEMPEDIDOPS_PEDIDO.AsFloat := 1.250 (MPD002) — a quantidade é preenchida sem o operador digitar.

Resultado esperado: Integração transparente com a balança. Açougues, mercearias e empresas que vendem por peso têm o processo de lançamento automatizado direto do hardware. Este é o valor padrão no banco (DEFAULT 'S'), o que indica que a arquitetura Junsoft assume integração com balança ativa por regra — empresas que não usam balança devem explicitamente trocar para 'N' para evitar delays de timeout de comunicação.


N - Não​

O que fazDetalhe
Leitura automática de peso no MPD002/MNF017Desabilitada
Produto com ITEM.CD_BALANCA preenchidoA FK do produto para a balança é ignorada nesses dois módulos — o ERP pula o bloco if ParmFatur.Values['ST_UTILIZABALANCA'] = 'S' e segue direto para o fallback qtItem := 1
Botão Balança no MNF017Continua funcionando (o botão usa iCD_BALANCA do operador em modo 'A' e não depende desse flag)
Outras telas que usam LeBalancaNão afetadas — MRE005, MNF035, equipamentos MEQ*, ADM015 etc. continuam funcionando normalmente

Simulação passo a passo​

  1. Vá em MFA001 → Opção 2 → "Utiliza Balança para Produtos [MNF017/MPD002]" = "Não". Salve (F6).
  2. Abra o pedido de venda MPD002.
  3. Digite um produto que tenha ITEM.CD_BALANCA preenchido.
  4. O bloco if (ParmFatur.Values['ST_UTILIZABALANCA'] = 'S') (UdmMPD002.pas:2828) retorna False.
  5. LeBalanca não é chamada. qtItem continua em 0, cai no if (qtItem = 0) then qtItem := 1.
  6. O produto é inserido com QT_PEDIDA = 1,000 — o operador precisa digitar a quantidade real manualmente.

Resultado esperado: Empresas que não têm balança conectada (ou cuja rotina de pesagem é feita por outros caminhos — por exemplo via código de barras pré-impresso pela balança → usar ST_CODBARRASBALANCA = 'S') evitam timeouts de comunicação, pop-ups de erro de balança ou delays ao lançar itens no PDV/pedido.


Interação com ST_CODBARRASBALANCA​

Embora os dois nomes pareçam redundantes, eles são caminhos completamente distintos de integração com balança — e são avaliados em pontos diferentes do código:

ParâmetroOnde é consumidoComo a balança participa
ST_UTILIZABALANCAUdmMPD002.pas:2828, UMNF017.pas:1058 e :1885O operador digita o código do produto → o ERP abre a porta serial/TCP da balança vinculada (ITEM.CD_BALANCA) → lê o peso em tempo real → preenche QT_PEDIDA/PS_PEDIDO
ST_CODBARRASBALANCAScripts/VALIDA_CODIGOBARRA.sqlO operador passa o leitor em um EAN-13 pré-impresso pela balança → a procedure decodifica o código usando BALANCA.DS_MASCARACODIGO → extrai produto + peso sem conversar com o hardware

Combinações possíveis​

ST_UTILIZABALANCAST_CODBARRASBALANCACenário típico
SNAçougue/mercearia que conecta a balança diretamente ao PC do PDV/pedido. Operador digita o código do produto e o peso é lido via serial.
NSSupermercado com balanças de autoatendimento na seção de frutas/padaria: a balança imprime a etiqueta EAN-13 e o cliente leva ao caixa. No PDV o operador apenas passa o leitor.
SSAmbos os fluxos coexistem — ex.: estação do PDV tem balança de açougue conectada E aceita etiquetas pré-impressas da seção de padaria.
NNEmpresa que não trabalha com produtos vendidos por peso (maioria das lojas de varejo tradicional).

Ponto de atenção — independência total​

Os dois parâmetros nunca são lidos na mesma query pelo mesmo módulo:

  • ST_UTILIZABALANCA é carregado no SELECT de parâmetros do módulo (MPD002 linha 5751, MNF017 linha 166) e consumido pelo Pascal.
  • ST_CODBARRASBALANCA é carregado dentro da procedure VALIDA_CODIGOBARRA (linha 44-47 de Scripts/VALIDA_CODIGOBARRA.sql) e consumido pelo SQL.

Alterar um não altera o outro. Isso é intencional: a decisão de arquitetura de manter dois parâmetros permite que o mesmo produto aceite os dois modos de pesagem sem acoplamento.


Tabela Comparativa Resumida​

OpçãoMPD002 / MNF017 (leitura serial/TCP)Demais telas que chamam LeBalancaUso típico
S (padrão)Leitura automática de peso ao digitar o produtoSem efeito (essas telas não olham o parâmetro)Açougue, mercearia, padaria — balança conectada diretamente ao PDV/pedido
NLeitura de peso desabilitada — operador digita a quantidadeSem efeito — continuam funcionandoLojas sem balança serial; empresas que usam apenas etiquetas pré-impressas (ST_CODBARRASBALANCA = 'S')

Referências no Código Fonte​

Tela MFA001 (configuração)​

ArquivoLinhaDescrição
source/MFA001/UMFA001.dfm4019-4033TLabel Label99 com Caption = 'Utiliza Balança para Produtos [MNF017/MPD002]' na aba pagFatOp2 (Opção 2)
source/MFA001/UMFA001.dfm4771-4797Declaração do TwwDBComboBox cmbST_UTILIZABALANCA com Items = ('Sim'#9'S', 'Não'#9'N'), DataField = 'ST_UTILIZABALANCA', DataSource = dmMFA001.dsPARMFATUR
source/MFA001/UMFA001.pas550Declaração do componente cmbST_UTILIZABALANCA: TwwDBComboBox
source/MFA001/UdmMFA001.pas280Declaração do field tabPARMFATURST_UTILIZABALANCA: TStringField
source/MFA001/UdmMFA001.dfm1957-1962Definição do field (FieldName = 'ST_UTILIZABALANCA', FixedChar = True, Size = 1)
source/MFA001/UdmMFA001.dfm289, 2443, 2617, 2873, 3169SELECT/INSERT/UPDATE/FetchRow do PARMFATUR incluindo o campo

Nota sobre valor padrão: UdmMFA001.pas não define explicitamente o valor no tabPARMFATURAfterInsert (diferente de outros flags como ST_CODBARRASBALANCA). O padrão 'S' é aplicado pelo próprio banco via DOM_CHAR1 DEFAULT 'S' NOT NULL em PARMFATUR.ST_UTILIZABALANCA — veja docs/schema/tables/PARMFATUR.sql:223.

Tela MPD002 (pedido de venda)​

ArquivoLinhaDescrição
source/MPD002/UdmMPD002.pas2823-2826SELECT I.CD_BALANCA FROM ITEM I WHERE I.CD_ITEM = ... (pega a balança vinculada ao produto)
source/MPD002/UdmMPD002.pas2828if (ParmFatur.Values['ST_UTILIZABALANCA'] = 'S') then — gate do fluxo
source/MPD002/UdmMPD002.pas2832-2844Monta ParamBal com [CD_EMPRESA, CD_BALANCA, 'P', '3'] e chama LeBalanca(fdCon, ParamBal); se Retorno[0] <> '-1', qtItem := StrToFloat(Retorno[0])
source/MPD002/UdmMPD002.pas2846-2847Fallback if (qtItem = 0) then qtItem := 1 — quando a balança não responde ou o parâmetro está em 'N'
source/MPD002/UdmMPD002.pas5751P.ST_UTILIZABALANCA incluído no SELECT de BuscaParametros_MPD002

Tela MNF017 (PDV / cupom fiscal)​

ArquivoLinhaDescrição
source/MNF017/UMNF017.pas90Declaração pública vST_UTILIZABALANCA : String no TfrmMNF017
source/MNF017/UMNF017.pas166P.ST_UTILIZABALANCA incluído no SELECT de carga de parâmetros
source/MNF017/UMNF017.pas208Atribuição frmMNF017.vST_UTILIZABALANCA := Resultado[34]
source/MNF017/UMNF017.pas762-777btnBalancaClick — botão Balança que chama LeBalanca em modo 'A' (avulso) usando dmMNF017.iCD_BALANCA, independente do valor de ST_UTILIZABALANCA
source/MNF017/UMNF017.pas1058if ( Trim(Resultado[12]) <> '' ) and (ParmFatur.Values['ST_UTILIZABALANCA'] = 'S') Then — gate do fluxo de leitura automática ao lançar item (1º ponto)
source/MNF017/UMNF017.pas1061-1070Montagem de ParamBal + LeBalanca; fQtde := StrToFloat(Retorno[0])
source/MNF017/UMNF017.pas1885-1898Segundo ponto de consumo (fluxo alternativo de lançamento) — mesmo padrão

Shared unit​

ArquivoLinhaDescrição
source/jAutomacao/jAutomacao.pas14, 22-25Declaração e implementação de Function LeBalanca(iConexao, iParametros) : TResultado — delega para CarregarBalanca (comunicação com o hardware)

Schema​

ArquivoLinhaDescrição
docs/schema/tables/PARMFATUR.sql223ST_UTILIZABALANCA DOM_CHAR1 DEFAULT 'S' NOT NULL — default do banco é 'S'
docs/schema/tables/ITEM.sql18CD_BALANCA DOM_INTEGER — FK usada pelo fluxo
docs/schema/tables/ITEM.sql140CONSTRAINT RITEM_BALANCA FOREIGN KEY (CD_BALANCA) REFERENCES BALANCA (CD_BALANCA)

Procedure SQL​

Nenhuma procedure em Scripts/ referencia ST_UTILIZABALANCA — o parâmetro é avaliado exclusivamente no código Delphi (ao contrário de ST_CODBARRASBALANCA, que é lido pela procedure VALIDA_CODIGOBARRA).