Fórum Cálculo com Código de barras #261821
13/12/2004
0
O que penso em fazer é o seguinte:
Este é o código de barras de um produto diverso qualquer ( 2 550200 00654 1 ).
Ele representa:
2...................................Produto diverso
550200..........................Código do produto
00654 (R$ 6,54).............Valor a pagar.
O preço da mercadoria é R$ 7,00 o Kg.
Quero que ao fornecer esse código para o sistema ele pegue o valor a pagar (00654) divida pelo preço do valor do Kg (R$ 7,00) para então colocar no campo específico que é o Qtde, o valor encontrado 0,934.
E ainda, a virgula deverá estar no lugar correto para que o sistema não interprete o valor a pagar como R$ 654,00.
Sugeriram-me o uso do comando copy para quebrar o Código de barras e então conseguir o que desejo, mas, não estou conseguindo montar a rotina. Já consegui sim, informar através deste código que do 2º ao 7º algarismo, tenho o código do produto e os demais números em nada servem para localizar a mercadoria. Mas faze-lo calcular a quantidade como citei acima, está me dando uma dor de cabeça terrível.
Se alguém puder me ajudar, conte com os mais sinceros agradecimentos.
Quando o código de barras de produtos diversos for digitado ele deverá fazer a seguinte operação:analisará
Pro-luck
Curtir tópico
+ 0Posts
14/12/2004
Pro-luck
Gostei + 0
15/12/2004
Andremuller
Espero ter ajudado.
TProduto = class
private
Qte, ValorPagar: Real;
CodigoProduto: string;
FCodigoBarra: string;
FPreco: Currency;
procedure SetCodigoBarra(const Value: string);
private
property CodigoBarra: string read FCodigoBarra write SetCodigoBarra;
property Preco: Currency read FPreco write FPreco;
constructor Create(APreco: Currency); reintroduce;
public
end;
{ TProduto }
constructor TProduto.Create(APreco: Currency);
begin
inherited Create;
Preco := APreco;
end;
procedure TProduto.SetCodigoBarra(const Value: string);
begin
FCodigoBarra := Value;
CodigoProduto := copy(Value, 3, 6);
ValorPagar := StrToFloat(copy(Value, 10, 3) + ´,´ + copy(Value, 13, 2));
Qte := ValorPagar / Preco;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
oProd: TProduto;
begin
try
oProd := TProduto.Create(7);
oProd.CodigoBarra := edtBarras.Text;
edtQtd.Text := FormatFloat(´0.000´, oProd.Qte);
finally
FreeAndNil(oProd);
end;
end;
Gostei + 0
28/12/2004
Pro-luck
:::::===> TProduto = class
Talvez eu não esteja sabendo utilizá-lo. Reconheço que existem procedimentos dentro deste código que eu não entendi do porque dele estar onde está.
Então, sem querer ser chato e inoportuno, quero pedir-lhe encarecidamente que me forneça as coordenadas de que como utilizar o código que me enviou.
Tentei usar algumas partes do seu código com o que eu já estou utilizando, para mercadorias que possuem códigode barras começados com 789... está dando certo, mas quando passo a utilizar código de barras de produtos diversos, o sistema trava de um jeito que só me resta resetar a máquina.
Se vc achar melhor, eu posso mandar uma cópia do código que estou utilizando, ou até mesmo mandar os arquivos fontes para vc dar uma analisada.
Estou utilizando Delphi 5, Query e Paradox.
E torno a repetir, ficarei eternamente grato se puder me ajudar com este probleminha.
Antecipadamente agradeço.
Gostei + 0
28/12/2004
Pro-luck
Gostei + 0
29/12/2004
Andremuller
Eu criei uma classe no delphi que pode ser declarada logo abaixo da declaração de outra (como TForm por exemplo), caso t colocou em uma unit separada deves inserir ´type´ antes da declaração. Fazemos o seguinte, me envia o código que eu dou uma olhada (muller.a@gmail.com).
Gostei + 0
30/12/2004
Pro-luck
Gostei + 0
31/12/2004
Michael
Vc podia fazer assim: como o valor está no final do código de barras, vc lê da direita para a esquerda. Os dois últimos caracteres seriam a parte decimal do valor, e o restante, a parte inteira. Assim vc não teria o problema de ler 6,54 como 654.
Depois é só buscar na tabela de produtos pelo código do mesmo o valor por kilo e efetuar a divisão.
Qualquer coisa, é só escrever.
Abraços!
Gostei + 0
03/01/2005
Andremuller
O código funciona, não entendo porque ainda persiste a dúvida. Segue abaixo o código de toda a unit comentado
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm) {declaração da classe TForm1}
edtBarras: TEdit; {coloca um um form esses três objetos para testar a classe}
Button1: TButton;
edtQtd: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TProduto = class(TObject) {declaração da classe TProduto herdada de TObject}
private {essa declaração pode ser colocada em uma unit separada}
Qte, ValorPagar: Real;
CodigoProduto: string;
FCodigoBarra: string;
FPreco: Currency;
procedure SetCodigoBarra(const Value: string);
private
property CodigoBarra: string read FCodigoBarra write SetCodigoBarra;
property Preco: Currency read FPreco write FPreco;
constructor Create(APreco: Currency); reintroduce; {construtor da classe}
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TProduto - métodos da classe}
constructor TProduto.Create(APreco: Currency);
begin
inherited Create; {utiliza o create da TObject}
Preco := APreco; {seta a propriedade}
{ps: normalmente envio no constutor as propriedades imprescindíveis para
o funcionamento da classe}
end;
procedure TProduto.SetCodigoBarra(const Value: string);
begin
//insere na propridade CodigoBarra o valor enviado
FCodigoBarra := Value;
//calcula o código do produto
CodigoProduto := copy(Value, 3, 6);
//calcula o valor a pagar
ValorPagar := StrToFloat(copy(Value, 10, 3) + ´,´ + copy(Value, 13, 2));
//calcula a quantidade
Qte := ValorPagar / Preco;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
oProd: TProduto;
begin
try
//cria o objeto dizendo que 7 é o preço dele, conforme declaração do construtor de TProduto
oProd := TProduto.Create(7);
//dispara automaticamente a SetCodigoBarra conforme declaração da propridade
oProd.CodigoBarra := edtBarras.Text ;
//insere em edtQtd (TEdit) a Qte calculada na SetCodigoBarras
edtQtd.Text := FormatFloat(´0.000´, oProd.Qte);
finally
FreeAndNil(oProd);
end;
end;
end.
1) Caso não queiras utilizar esse código sugiro a revisão dos conceitos de orientação a objetos visto ele ser simples, organizado e 100¬ reaproveitável.
2) Caso as dúvidas persistam posso enviar o projeto como exemplo ou supri-las através do fórum.
3) Caso a próxima resposta seja um SOBE, pararei de observar o tópico e boa sorte, lembrando que minha insistência foi apenas para ajudar o colega tendo disponibilizado parte do meu tempo para suprir a sua dúvida.
Gostei + 0
03/01/2005
Andremuller
O código funciona, não entendo porque ainda persiste a dúvida. Segue abaixo o código de toda a unit comentado
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm) {declaração da classe TForm1}
edtBarras: TEdit; {coloca um um form esses três objetos para testar a classe}
Button1: TButton;
edtQtd: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TProduto = class(TObject) {declaração da classe TProduto herdada de TObject}
private {essa declaração pode ser colocada em uma unit separada}
Qte, ValorPagar: Real;
CodigoProduto: string;
FCodigoBarra: string;
FPreco: Currency;
procedure SetCodigoBarra(const Value: string);
private
property CodigoBarra: string read FCodigoBarra write SetCodigoBarra;
property Preco: Currency read FPreco write FPreco;
constructor Create(APreco: Currency); reintroduce; {construtor da classe}
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TProduto - métodos da classe}
constructor TProduto.Create(APreco: Currency);
begin
inherited Create; {utiliza o create da TObject}
Preco := APreco; {seta a propriedade}
{ps: normalmente envio no constutor as propriedades imprescindíveis para
o funcionamento da classe}
end;
procedure TProduto.SetCodigoBarra(const Value: string);
begin
//insere na propridade CodigoBarra o valor enviado
FCodigoBarra := Value;
//calcula o código do produto
CodigoProduto := copy(Value, 3, 6);
//calcula o valor a pagar
ValorPagar := StrToFloat(copy(Value, 10, 3) + ´,´ + copy(Value, 13, 2));
//calcula a quantidade
Qte := ValorPagar / Preco;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
oProd: TProduto;
begin
try
//cria o objeto dizendo que 7 é o preço dele, conforme declaração do construtor de TProduto
oProd := TProduto.Create(7);
//dispara automaticamente a SetCodigoBarra conforme declaração da propridade
oProd.CodigoBarra := edtBarras.Text ;
//insere em edtQtd (TEdit) a Qte calculada na SetCodigoBarras
edtQtd.Text := FormatFloat(´0.000´, oProd.Qte);
finally
FreeAndNil(oProd);
end;
end;
end.
1) Caso não queiras utilizar esse código sugiro a revisão dos conceitos de orientação a objetos visto ele ser simples, organizado e 100¬ reaproveitável.
2) Caso as dúvidas persistam posso enviar o projeto como exemplo ou supri-las através do fórum.
3) Caso a próxima resposta seja um SOBE, pararei de observar o tópico e boa sorte, lembrando que minha insistência foi apenas para ajudar o colega tendo disponibilizado parte do meu tempo para suprir a sua dúvida.
Gostei + 0
03/01/2005
Aldus
{pegar o codigo do produto}
CodigoProduto := Copy(string,2,6);
{Localize o produto com esse código}
{pegar o valor total}
ValorTotal := Copy(string,8,5)
{transforme-o em valor com duas decimais}
ValorComDecimas := StrToInt(ValorTotal)/100
{adquirindo a quantidade}
Quantidade := ValorComDecimais / PrecoUnitariodoProdutonoCadastrodeprodutos
É só isso, é bem simples
Atenciosamente
Mario
Gostei + 0
03/01/2005
Pro-luck
Cordialmente,
Gostei + 0
07/01/2005
Pro-luck
Conte com os meus sinceros agradecimentos e se de alguma forma eu puder te ajudar, tamos aí.
O meu código ficou assim:
procedure TPDV_.CodBarrasExit(Sender: TObject);
Var
ValorPagar, Qtd: Real;
begin
dm_.QryMerc.Close;
dm_.QryMerc.SQL.Clear;
dm_.QryMerc.SQL.Add(´Select * from Mercadorias WHERE CodBarras LIKE :codigo´);
if CodBarras.Text[1]=´2´ then
begin
dm_.QryMerc.ParamByName(´codigo´).AsString:= ´¬´+Copy(CodBarras.Text, 2, 6)+´¬´;
dm_.QryMerc.Open;
ValorPagar := (StrToFloat(Copy(CodBarras.Text, 8, 5)))/100;
Qtd := ValorPagar/dm_.QryMercValor.Value;
dm_.QryVendasPDVDescricao.Text := dm_.QryMercDescricao.Text;
dm_.QryVendasPDVAbreviacao.Text := dm_.QryMercAbreviacao.Text;
dm_.QryVendasPDVValor.Value := ValorPagar;
dm_.QryVendasPDVQtde.Value := Qtd;
dm_.QryVendasPDVTotalDoItem.Value := dm_.QryMercValor.Value*dm_.QryVendasPDVQtde.Value;
Mercadoria.Text := dm_.QryMercDescricao.Text;
dm_.QryVendasPDV.Append;
CodBarras.SetFocus;
end
else
begin
dm_.QryMerc.ParamByName(´codigo´).AsString:= ´¬´+CodBarras.Text+´¬´;
dm_.QryVendasPDVQtde.Value := 1;
dm_.QryMerc.Open;
dm_.QryVendasPDVDescricao.Text := dm_.QryMercDescricao.Text;
dm_.QryVendasPDVValor.Value := dm_.QryMercValor.Value;
dm_.QryVendasPDVAbreviacao.Text := dm_.QryMercAbreviacao.Text;
dm_.QryVendasPDVTotalDoItem.Value := dm_.QryVendasPDVValor.Value*dm_.QryVendasPDVQtde.Value;
Mercadoria.Text := dm_.QryMercDescricao.Text;
dm_.QryVendasPDV.Append;
CodBarras.SetFocus;
end;
end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)