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_UTILIZABALANCAValor padrão:S(Sim) —DOM_CHAR1 DEFAULT 'S' NOT NULLemdocs/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_UTILIZABALANCAcontrola comunicação direta com o hardware da balança (leitura de peso em tempo real viajAutomacao.CarregarBalanca). Usa a tabelaBALANCA+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ódulo | Código | Descrição | Comportamento |
|---|---|---|---|
| PDV / Cupom Fiscal | MNF017 | Frente de caixa / cupom fiscal | Carrega 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 Venda | MPD002 | Pedidos de venda | Ao 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):
- MRE005 /
UBalancaRest.pas— pesagem no processo de recapagem. - MRC017, MPD022, MPD039, MPD049 — pesagem sob demanda.
- MNF035
UMNF035Pesagem.pas— pesagem de NF. - MEQ031, MEQ036, MEQ047, MEQ069, MEQ070, MEQ075 — pesagem vinculada a equipamento de recapagem.
- ADM015 — diagnóstico de balança.
jRecapadora/UProdutoRecap.pas— shared unit de produto recap.
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
| Campo | Descrição |
|---|---|
PARMFATUR.ST_UTILIZABALANCA | Habilita a leitura automática de peso no par MNF017/MPD002 ('S'/'N') |
ITEM.CD_BALANCA | Ví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' |
BALANCA | Cadastro de balanças disponíveis na empresa (porta serial/IP, modelo, máscara). Consumida por jAutomacao.CarregarBalanca |
PARMUSUARIO.CD_BALANCA | Balanç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):
| Índice | Conteúdo | Exemplo |
|---|---|---|
[0] | CD_EMPRESA | IntToStr(sessao.empresa.cd_Empresa) |
[1] | CD_BALANCA | Resultado[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 := 1no MPD002).- Qualquer outro valor → peso lido, convertido com
StrToFloate atribuído aQT_PEDIDA/PS_PEDIDO/fQtde.
Opções disponíveis
S - Sim (valor padrão)
| O que faz | Detalhe |
|---|---|
| Leitura automática de peso no MPD002/MNF017 | Habilitada |
Produto com ITEM.CD_BALANCA preenchido | LeBalanca é chamada em modo 'P' (peso) ao inserir o item; o peso retornado vira QT_PEDIDA/PS_PEDIDO automaticamente |
Produto sem ITEM.CD_BALANCA | A leitura é ignorada — qtItem assume 0 e o ERP coloca qtItem := 1 como fallback (MPD002) |
| Botão Balança no MNF017 | Continua funcionando normalmente (ele depende de dmMNF017.iCD_BALANCA em modo 'A', não do flag ST_UTILIZABALANCA) |
| Erro de comunicação com a balança | Retorno[0] = '-1' → o peso não é preenchido, operador precisa digitar manualmente |
Simulação passo a passo
- Cadastre uma balança em
BALANCA(porta COM/IP + modelo/protocolo). - No cadastro do produto pesável (ex.: um corte de carne no açougue), preencha
ITEM.CD_BALANCAcom o código da balança cadastrada. - Vá em MFA001 → aba Ambos → Opção 2 → campo "Utiliza Balança para Produtos [MNF017/MPD002]" = "Sim". Salve (F6).
- Abra o pedido de venda MPD002 ou o PDV MNF017.
- Pese o corte de carne na balança (ex.: 1,250 kg).
- Digite o código do produto no item do pedido.
- O ERP roda
SELECT I.CD_BALANCA FROM ITEM I WHERE I.CD_ITEM = ..., detecta que o produto tem balança vinculada e chamaLeBalancaautomaticamente. - A função
jAutomacao.CarregarBalancaconversa com o hardware (serial/TCP) e devolve['1.250']. 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 faz | Detalhe |
|---|---|
| Leitura automática de peso no MPD002/MNF017 | Desabilitada |
Produto com ITEM.CD_BALANCA preenchido | A 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 MNF017 | Continua funcionando (o botão usa iCD_BALANCA do operador em modo 'A' e não depende desse flag) |
Outras telas que usam LeBalanca | Não afetadas — MRE005, MNF035, equipamentos MEQ*, ADM015 etc. continuam funcionando normalmente |
Simulação passo a passo
- Vá em MFA001 → Opção 2 → "Utiliza Balança para Produtos [MNF017/MPD002]" = "Não". Salve (F6).
- Abra o pedido de venda MPD002.
- Digite um produto que tenha
ITEM.CD_BALANCApreenchido. - O bloco
if (ParmFatur.Values['ST_UTILIZABALANCA'] = 'S')(UdmMPD002.pas:2828) retornaFalse. LeBalancanão é chamada.qtItemcontinua em0, cai noif (qtItem = 0) then qtItem := 1.- 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âmetro | Onde é consumido | Como a balança participa |
|---|---|---|
ST_UTILIZABALANCA | UdmMPD002.pas:2828, UMNF017.pas:1058 e :1885 | O 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_CODBARRASBALANCA | Scripts/VALIDA_CODIGOBARRA.sql | O 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_UTILIZABALANCA | ST_CODBARRASBALANCA | Cenário típico |
|---|---|---|
| S | N | Aç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. |
| N | S | Supermercado 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. |
| S | S | Ambos 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. |
| N | N | Empresa 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 noSELECTde parâmetros do módulo (MPD002 linha 5751, MNF017 linha 166) e consumido pelo Pascal.ST_CODBARRASBALANCAé carregado dentro da procedureVALIDA_CODIGOBARRA(linha 44-47 deScripts/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ção | MPD002 / MNF017 (leitura serial/TCP) | Demais telas que chamam LeBalanca | Uso típico |
|---|---|---|---|
| S (padrão) | Leitura automática de peso ao digitar o produto | Sem efeito (essas telas não olham o parâmetro) | Açougue, mercearia, padaria — balança conectada diretamente ao PDV/pedido |
| N | Leitura de peso desabilitada — operador digita a quantidade | Sem efeito — continuam funcionando | Lojas sem balança serial; empresas que usam apenas etiquetas pré-impressas (ST_CODBARRASBALANCA = 'S') |
Referências no Código Fonte
Tela MFA001 (configuração)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MFA001/UMFA001.dfm | 4019-4033 | TLabel Label99 com Caption = 'Utiliza Balança para Produtos [MNF017/MPD002]' na aba pagFatOp2 (Opção 2) |
source/MFA001/UMFA001.dfm | 4771-4797 | Declaração do TwwDBComboBox cmbST_UTILIZABALANCA com Items = ('Sim'#9'S', 'Não'#9'N'), DataField = 'ST_UTILIZABALANCA', DataSource = dmMFA001.dsPARMFATUR |
source/MFA001/UMFA001.pas | 550 | Declaração do componente cmbST_UTILIZABALANCA: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 280 | Declaração do field tabPARMFATURST_UTILIZABALANCA: TStringField |
source/MFA001/UdmMFA001.dfm | 1957-1962 | Definição do field (FieldName = 'ST_UTILIZABALANCA', FixedChar = True, Size = 1) |
source/MFA001/UdmMFA001.dfm | 289, 2443, 2617, 2873, 3169 | SELECT/INSERT/UPDATE/FetchRow do PARMFATUR incluindo o campo |
Nota sobre valor padrão:
UdmMFA001.pasnão define explicitamente o valor notabPARMFATURAfterInsert(diferente de outros flags comoST_CODBARRASBALANCA). O padrão'S'é aplicado pelo próprio banco viaDOM_CHAR1 DEFAULT 'S' NOT NULLemPARMFATUR.ST_UTILIZABALANCA— vejadocs/schema/tables/PARMFATUR.sql:223.
Tela MPD002 (pedido de venda)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MPD002/UdmMPD002.pas | 2823-2826 | SELECT I.CD_BALANCA FROM ITEM I WHERE I.CD_ITEM = ... (pega a balança vinculada ao produto) |
source/MPD002/UdmMPD002.pas | 2828 | if (ParmFatur.Values['ST_UTILIZABALANCA'] = 'S') then — gate do fluxo |
source/MPD002/UdmMPD002.pas | 2832-2844 | Monta ParamBal com [CD_EMPRESA, CD_BALANCA, 'P', '3'] e chama LeBalanca(fdCon, ParamBal); se Retorno[0] <> '-1', qtItem := StrToFloat(Retorno[0]) |
source/MPD002/UdmMPD002.pas | 2846-2847 | Fallback if (qtItem = 0) then qtItem := 1 — quando a balança não responde ou o parâmetro está em 'N' |
source/MPD002/UdmMPD002.pas | 5751 | P.ST_UTILIZABALANCA incluído no SELECT de BuscaParametros_MPD002 |
Tela MNF017 (PDV / cupom fiscal)
| Arquivo | Linha | Descrição |
|---|---|---|
source/MNF017/UMNF017.pas | 90 | Declaração pública vST_UTILIZABALANCA : String no TfrmMNF017 |
source/MNF017/UMNF017.pas | 166 | P.ST_UTILIZABALANCA incluído no SELECT de carga de parâmetros |
source/MNF017/UMNF017.pas | 208 | Atribuição frmMNF017.vST_UTILIZABALANCA := Resultado[34] |
source/MNF017/UMNF017.pas | 762-777 | btnBalancaClick — botão Balança que chama LeBalanca em modo 'A' (avulso) usando dmMNF017.iCD_BALANCA, independente do valor de ST_UTILIZABALANCA |
source/MNF017/UMNF017.pas | 1058 | if ( 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.pas | 1061-1070 | Montagem de ParamBal + LeBalanca; fQtde := StrToFloat(Retorno[0]) |
source/MNF017/UMNF017.pas | 1885-1898 | Segundo ponto de consumo (fluxo alternativo de lançamento) — mesmo padrão |
Shared unit
| Arquivo | Linha | Descrição |
|---|---|---|
source/jAutomacao/jAutomacao.pas | 14, 22-25 | Declaração e implementação de Function LeBalanca(iConexao, iParametros) : TResultado — delega para CarregarBalanca (comunicação com o hardware) |
Schema
| Arquivo | Linha | Descrição |
|---|---|---|
docs/schema/tables/PARMFATUR.sql | 223 | ST_UTILIZABALANCA DOM_CHAR1 DEFAULT 'S' NOT NULL — default do banco é 'S' |
docs/schema/tables/ITEM.sql | 18 | CD_BALANCA DOM_INTEGER — FK usada pelo fluxo |
docs/schema/tables/ITEM.sql | 140 | CONSTRAINT 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).