Barkod verisini tanıma ve işleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Barkod verisini tanıma ve işleme

Mesaj gönderen mpolat »

S.A.
Arkadaşlar şimdi bir el terminali ile sayım yapılcaka işte şu barkodlu üründen şu kadar miktar var diye bir text dosyaya kaydedilecek ve text dosya bir dekstop PC'ye atılacak buraya kadar onların işi :-) Bundan sonrasını benim halletmem gerekiyor
1.) Text dosyadan veri okunacak xxxxxxxx barkodlu üründen xxx adet var gibi şimdi text dosyadan veriyi nasıl okurum? Bu konu daha önce hiç karşıma çıkmadığı için bana şimdi başlı başına bir muamma gibi geliyor sıkıntı basıyor amann :-)
2.) Daha da önemli olan bazı barkodlar sadece ürünü tanıtırken bazıları farklı (Barkod işleriyle daha önce muhatap olmuş arkadaşlar varsa bilirler) bu farklı olanlarda durum şu mesela barkod 2801001001703 olsun burada ilk üç hane olan 280 ürünün terazi ürünü olduğunu sonrasında gelen 1001 ürün kodunu sonrasında gelen 00170 ise kaç gram olduğunu söyler yanlış bilmiyorsam en sondaki 3 de check digit oluyor. Bu kadar açıklamadan sonra ben bu barkod ifadesindeki bloklara ayrı ayrı nasıl ulaşabilirim. Yani program şunu yapsın istiyorum:
1. ilk üç haneyi görüp bu barkodun bir terazi ürününe ait olduğunu anlasın (Örnekte 280)
2.sonraki dört haneyi ürün kodu olartak atasın (Örnekte 1001)
3.Sonraki beş haneyi ürünün miktarı olarak atasın (Örnekte 00170)

Bu konuda yardımcı olabilir misiniz? Ve/veya fikir verebilir misiniz?
Yardım edecek herkese şimdiden çok teşekkürler
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

text dosyayı okuyup işleme ile ilgili aşağıdaki kod işini görür.

Kod: Tümünü seç

var
  Dosya: TextFile;
  DosyaAdi, Satir: string;
begin
  DosyaAdi := 'deneme.txt';
  AssignFile(Dosya, DosyaAdi);
  {$I-}
  Reset(Dosya);
  if IOResult = 0 then // eğer hata yoksa
  while not EOF(Dosya) do // dosya sonuna kadar.
  begin
     ReadLn(Dosya, Satir); // bir satır oku.
     // satırların standart yapıda olduğu düşünülerek,
     // Satir değişkeninde istediğin kısmına copy(Satir, 1, 3) vs. ile ulaşabilirsin.
  end
  else
     ShowMessage('Dosya açma hatası!');

  CloseFile(Dosya);
  {$I+}
end;
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

barkod yapılarını soyle irdeleyebiliriz
magazaici (instore) ean13 barkod yapısı
magaza dısı (manufacture/uretici) ean13 ve ean8
ean13 ve ean8 barkod tipleri 13 ve 8 hane

bunlardan magaza ici kodlar 20-29 arası on ekler alır
bu bir standart
gecerli olan standartda 27 adetli urunler icin 29 agırlıklı urunler icin kullanılır
tabi isteyen istedigini secer bunlardan
ama bilhassa program yazanlar tarafında bu bir karmasaya sebep olmakta

magaza ici urunlerden kasıt magaza icinde (reyon yada depo) paketlenip olusturulan ve musteriye sunulan urun demektir
bu baglamda iceride olusturulan urunler de etiketleyici/terazi gibi barkod basabilen cihazlardan gecer...

senin yapacagın 20-29 arası on eklere gore barkod yapısının bir listesini tutmak
mesela 27 li bir barkod yapısı
27+5 hane PLU no+5 hane adet bilgisi+Cdigit
ve 29 lu barkod yapısı
29+4 hane PLU no+6 hane agırlık bilgisi+Cdigit
yada
29+4 hane PLU no+6 hane fiyat bilgisi+Cdigit
olabilir
bunlar kullanılan sisteme gore belirlenebilir
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

S.A.
Öncelikle sevgili rsimsek ve sevgili gkimirti'ye yardımlarından ve katkılarından dolayı çok teşekkür ederim. sevgili rsimsek gönderdiğiniz kod örneği çok işime yaradı. Bi handikapımdan :) kurtulmama vesile oldunuz. Şimdi herşey iyi güzel çalışıyorda sanırım miktar bilgisini query'ye kaydetme işini çözemedim programa "veri al" komutunu verince kilitlenme oluyor. Kilidi açabilene aşkolsun :) daha iyi fikir edinebilmeniz ve daha iyi yardım edebilmeniz için (tabi bundan yardım etmek zorunda olduğunuz anlamı çıkmaz :D ) kodu yazayım:

Kod: Tümünü seç

procedure TfrmVeriAl.SpeedButton1Click(Sender: TObject);
var
Dosya:Textfile;
DosyaAdi,Satir:String;
miktar:integer;
begin
DosyaAdi:='c:\deneme.txt';
AssignFile(Dosya,DosyaAdi);
{$I-}
Reset(Dosya);
if IOResult=0 then
while not EOF (Dosya) do
begin
ReadLn(Dosya,Satir);//bir satır oku
while not qryDeneme.Eof do
begin
qryDeneme.Edit;
qryDenemeBARKOD.AsString:=Copy(Satir, 1, 13);
miktar:=StrToInt(Copy(Satir, 14, 20));
qryDenemeMIKTARI.AsInteger:=qryDenemeMIKTARI.AsInteger+miktar;
qryDeneme.Post;
//ShowMessage('Dosya Okuma Hatası:'#13'Text dosya geçersiz barkod karakteri içeriyor!...'#13'Lütfen dosyayı kontrol ediniz...');
end;
end;
end;
herkese katkısı için bir daha teşekkür ederken bundan sonra katkıda bulunacak olan arkadaşlara da şimdiden teşekkür ederim.. :)
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

.....
qryDeneme.Post;
qryDeneme.Next; // bu satırı eklememişsin. sürekli aynı kayıt üzerinde takılıp kalıyor.
....[/code]
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

Öncelikle çok teşekkür ederim.
Söylediğinizi yaptım, kısmen işe yaradı ama kodumda bi sorun daha var galiba ve ben bunu çözemedim. :roll: şimdi de VeriAl komutunu verince "Key Violation" hatası alıyorum. Anladığım kadarıyla tablo içinde hareket edemiyor ve ilk kayıtta takılıp kalıyorum. ufff
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

aynı key e sahip kayıtlar yapmaya çalışıyorsun, bence öncelikle tabloyu komple boşalt içindeki kayıtları sil ve öyle atamaya çalış. her hata verdiğinde bu işlemi yeniden yapmalısın. "Key Violation" hatasını almaya devam edersen tanımladığın key yapısını değiştirmelisin.
Kullanıcı avatarı
mehmet_turecan_cakmak
Üye
Mesajlar: 132
Kayıt: 02 Tem 2003 01:08
Konum: Afyon
İletişim:

barkod

Mesaj gönderen mehmet_turecan_cakmak »

selamlar...

bu barkod okuma işine bende baya merak saldım hocam bu barkodu cihazdan okuttuğun zaman editin içerisine yazdığında stoktaki ürün miktarını veriri heralde sql kodlarıyla...

kolay gele...
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

:cry: kafam karıştı şimdi en baştan anlatayım. Text dosyadan veriyi alabiliyoruz buraya kadar tamam.
(deneme adlı bir table var alanları BARKOD,URUN_ADI,MIKTAR)
text dosyadan okunan veriyi table'da var olan veriyle (BARKOD alanına göre) eşleştirip miktarını text dosyada yazan miktar kadar arttıracaz. Bu işlemi yapmak için de (eğer yanlış biliyorsam lütfen düzeltiniz) tabloyu while döngüsüyle taramamız gerekiyor. Ya allak bullak oldu kafam :? Abi cümleten hakkınızı helal edin ya başınızı ağrıtıyorum.
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

kusura bakma olayı tam canlandıramayınca benim de gözümden kaçıyor.

benim de gözümden kaçıyor. qryDeneme nin her seferine başına konumlanmak lazım. istersen proceduru yeniden yazalım;
....

Kod: Tümünü seç

procedure TfrmVeriAl.SpeedButton1Click(Sender: TObject); 
var 
  Dosya:Textfile; 
  DosyaAdi,Satir:String; 
  miktar:integer; 
begin 
  DosyaAdi:='c:\deneme.txt'; 
  AssignFile(Dosya,DosyaAdi); 
  {$I-} 
  Reset(Dosya); 
  if IOResult=0 then 
  while not EOF (Dosya) do 
  begin 
    ReadLn(Dosya,Satir);//bir satır oku 
    [color=blue]qryDeneme.First;[/color]   // her seferine dosyanın başına gel.
    while not qryDeneme.Eof do 
    begin
      if qryDenemeBARKOD.AsString = Copy(Satir, 1, 13) then
      begin  //tabloda aynı kodlu ürünü bul.
         qryDeneme.Edit; 
  //    qryDenemeBARKOD.AsString:=Copy(Satir, 1, 13); 
         miktar:= StrToInt(Copy(Satir, 14, 20));
        qryDenemeMIKTARI.AsInteger:=qryDenemeMIKTARI.AsInteger + miktar; 
         qryDeneme.Post; 
         break;
      end ;
//   else
//       ShowMessage('Dosya Okuma Hatası:'#13'Text dosya geçersiz barkod  karakteri içeriyor!...'#13'Lütfen dosyayı kontrol ediniz...'); 
      qryDeneme.Next; 
    end;
  end;
end; 
....
Aslında yapmak istediklerinle yaptıkların pek fazla uyuşmuyor!
Benim tavsiyem tablonu BARKOD alanına göre index leyip tabloya bağlayıp while ... bloğu yerine aşağıdaki kodu yazman;

Kod: Tümünü seç

  if tblDeneme.FindKey([Copy(Satir, 1, 13)]) then
  begin
    tblDeneme.Edit;
    miktar :=miktar + StrToInt(Copy(Satir, 14, 20));
    tblDenemeMIKTARI.AsInteger:= tblDenemeMIKTARI.AsInteger + miktar; 
    tblDeneme.Post;
  end;
Query için ise;

Kod: Tümünü seç

  if qryDeneme.Locate('BARKOD', [Copy(Satir, 1, 13), []) then
  begin
    qryDeneme.Edit;
    miktar :=StrToInt(Copy(Satir, 14, 20));
    qryDenemeMIKTARI.AsInteger:=qryDenemeMIKTARI.AsInteger + miktar; 
    qryDeneme.Post;
  end;
[/code]
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

Abi Allah aşkına zaten mahcubiyetimin hududu yok bir de kalkıp "kusura bakma olayı tam canlandıramayınca benim de gözümden kaçıyor. " demiyormusun yerin dibine giriyorum. :oops:
Herşey için ne kadar teşekkür etsem azdır. İnşallah Rabbim bir gün bana da benim gibi darda kalmış birine yardım etmeyi nasip eder.
Dua ile...
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

biraz da sorunun net sorulmazı lazım. bazen de cevap yazanın motivasyonu tam olmıyabilir. yani geçiştirme bir cevap olabilir. :wink:

işini gördüyse ne mutlu..
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

:idea: budur abi daha iyi olamazdı çok teşekkürler :D
"İlmin anası sormaktır"
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

:oops: ya çok mahcubum ama kıvrandım kıvrandım bi sonuca ulşamayınca yine sormak zorunda kaldım. Şimdi iki tür barkod verisi var bunlardan biri üretici barkodu ki bu sabit bir yapıya sahiptir ve evrenseldir.Mesela "Ülker AS Kraker 36 Gr" adlı ürünün barkodu dünyanın heryerinde "8690504009504" 'dür. Bunun yanısıra bir de mağaza içi barkod vardır ki bu genellikle açık satılan ve/veya ağırlık bazlı satılan ürünler için geçerlidir.Örneğin barkod 2810001105003 olsun burada 28 bu ürünün bir terazi ürünü olduğunu akabinde gelen 10001 ürünün kodunu bundan sonra gelen 10500 ürünün miktarını -ki genelde gram olarak kullanılır- bu da ürünün ağırlığına göre çıkan terazi etiketindeki barkodun ürünün ağırlığına göre sürekli değiştiğini ifade eder. ve son hane de check digittir.

program birinci bir barkod tipi için çalışıyor. ama ikinci barkod tipi için miktar verisini almıyor.

Kod: Tümünü seç

if qryDeneme.Locate('BARKOD',Copy(Satir, 3, 7),[])then //bu satır sonuç veriyor yani 3-7 arası karakterlere ulaşıp oradan ürün kodu bulunuyor
begin
qryDeneme.Edit;
miktar:=StrToInt(Copy(Satir, 8, 12));//fakat bu satır ve alttaki satır çalışmıyor 8-12 karakterlerine ulaşıp oradan miktar bilgisini alamıyor veya aldığı bilgiyi integer'a çevirmiyor işin kötüsü bir hata mesajı da vermiyor 
qryDenemeMIKTARI.AsInteger:=qryDenemeMIKTARI.AsInteger+miktar;
qryDeneme.Post;
end;
"İlmin anası sormaktır"
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

İkinci barkod yapısında zaten mikktar verisi yok ki
ulker gofretin uzerinde sadece o urun tipine ozgu bir sayı var sizin de dediginiz gibi
yani miktar aslında adetli bir urun olup degeri 1
Cevapla