Cálculo com Código de barras

Delphi

13/12/2004

A cada dia me aparece uma situação diferente envolvendo código de barras. E, agora me apareceu uma nova e espero encontrar aqui o auxílio de que necessito.

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

Pro-luck

Curtidas 0

Respostas

Pro-luck

Pro-luck

13/12/2004

SOBE


GOSTEI 0
Andremuller

Andremuller

13/12/2004

Tem algumas propriedades que eu não estou utilizando no TProduto mas tu pode precisar. Agora é só alterar a classe de acordo com a tua necessidade.
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
Pro-luck

Pro-luck

13/12/2004

O código que vc me forneceu está dando erro logo na primeira linha.

:::::===> 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
Pro-luck

Pro-luck

13/12/2004

SOBE


GOSTEI 0
Andremuller

Andremuller

13/12/2004

Desculpe a demora para a resposta.

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
Pro-luck

Pro-luck

13/12/2004

SOBE


GOSTEI 0
Michael

Michael

13/12/2004

Olá amigo Pro-luck!

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
Andremuller

Andremuller

13/12/2004

Amigo ó código que eu te passei é puro e simplismete programação orientada a objetos.

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
Andremuller

Andremuller

13/12/2004

Amigo o código que eu te passei é puro e simplismente programação orientada a objetos.

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
Aldus

Aldus

13/12/2004

Bom dia Aloísio, para quebrar a string com o código de barras, siga os seguintes passos, é super simples:

{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
Pro-luck

Pro-luck

13/12/2004

Quero antes de qualquer coisa agradecer pelo tempo que me foi cedido, a fim de resolver o meu problema e, em segundo lugar, acredito que realmente seja simples a resolução do referido problema, mas, como iniciante, existe certos comando presentes no código que me foi fornecido por vc e, que eu ainda não os entendo. Sei que o segredo de tudo é estudar. Mas repito, muito obrigado mesmo e, espero poder contar contigo numa outra situação qualquer. E, no que eu puder ajudar, conte sempre comigo. Tentarei agora entender o seu código para resolver de uma vez por todas o meu pequeno problema.

Cordialmente,


GOSTEI 0
Pro-luck

Pro-luck

13/12/2004

Quero agradecer-lhe pelas dicas SIMPLES que me enviou e ressalvar ainda que elas foram essenciais para que eu resolvesse o meu problema.
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
POSTAR