Çok kullanıcılı sistemde kayıt problemi

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
ifthen
Üye
Mesajlar: 42
Kayıt: 13 Nis 2006 09:43

Çok kullanıcılı sistemde kayıt problemi

Mesaj gönderen ifthen »

Arkadaşlar yardımlarınız için şimdiden teşekkür ederim.

VT olarak firebird kullanıyorum. 4 bilg. oluşan bir ağ üzerinde çalışacak bir program hazırladım. Kullanıcıların hepsi serverdaki VT ye bağlanıyorlar ve sorgulama yapıyorlar.

Bir SATISTEMP tablom var. Bir de SATIS tablom var. Herbir kullanıcı SATISTEMP dosyasına kendi bilgisayarından kayıt yapabiliyor. Kayıtları SATIS tablosuna aktaran butona ilk tıklayan kullanıcının bilgileri SATIS tablosuna aktarılıyor. Bu arada diğer kullanıcılar aynı butona kendi bilg. tıkladığında programları kilitleniyor.

Server da firebird server, client larda ise firebird client kurulu.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sadece bu bilgiler ile bişeyler demek biraz zor. kayıt işlemlerini yaptığınız kodlarda olursa bişeyler çıkabilir. bu haliyle tahminden öteye bişey gitmez.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
ifthen
Üye
Mesajlar: 42
Kayıt: 13 Nis 2006 09:43

Mesaj gönderen ifthen »

Kod: Tümünü seç

DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('UPDATE SATISTEMP SET SATISTEMP."IslemTuru"='+QuotedStr('Nakit'));
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('INSERT INTO SATISLAR (SATISLAR."UrunNO",SATISLAR."UrunAdi",SATISLAR."Tarih",SATISLAR."Miktar",SATISLAR."Fiyat",SATISLAR."Verilen",');
DM.QAktar.SQL.Add('SATISLAR."Kasiyer",SATISLAR."Barkod",SATISLAR."CinsNO",SATISLAR."UrunCinsi",SATISLAR."KarTutar",SATISLAR."IslemTuru") ');
DM.QAktar.SQL.Add('SELECT SATISTEMP."UrunNO",SATISTEMP."UrunAdi",SATISTEMP."Tarih",SATISTEMP."Miktar",SATISTEMP."Fiyat",SATISTEMP."Verilen",');
DM.QAktar.SQL.Add('SATISTEMP."Kasiyer",SATISTEMP."Barkod",SATISTEMP."CinsNO",SATISTEMP."UrunCinsi",SATISTEMP."KarTutar",SATISTEMP."IslemTuru" FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('DELETE FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.DSSatisTemp.Close;DM.DSSatisTemp.Open;
Butondaki kodlar yukarıdaki gibi.
ifthen
Üye
Mesajlar: 42
Kayıt: 13 Nis 2006 09:43

Mesaj gönderen ifthen »

Arkadaşlar butondaki kodlar yukarıdaki gibi.

Sorgulamada problem yok. Forumda ve internette araştırdım. Ama problemi çözemedim. Bilgisi olanların yardımlarını bekliyorum.
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

niye SATISTEMP ve SATIS gibi iki tablo kullandığını anlamadım..
niye ilk önce kendi bilgisayarlarında kayıt yapıp; sonra SATIS tablosuna kayıt yapıyorlar.

neden böyle bir yapı kullandığını anlayamadım..

bunlar hakkında bilgi verip ne yapmak istediğini ve neden böyle bir yapı kullandığını anlatırsan daha fazla yardımcı olunabilir diye düşünüyorum..
ifthen
Üye
Mesajlar: 42
Kayıt: 13 Nis 2006 09:43

Mesaj gönderen ifthen »

Üzerinde çalıştığım bir market programı.

Her kasiyerin o andaki müşteriye yapmış olduğu satışlar geçici olarak SATISTEMP tablosuna kaydediliyor ve butona tıklandığında SATIS tablosuna aktarılıyor.

Ayrıca SATISTEMP tablosuda serverda. Yani yerel bir tablo değil.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Tavsiyem ve anladığım kadarı ile böyle bir alana ihtiyaç olmayabilir. Çünkü transaction diye bir olay var. Yani kayıt giren kişi sadece işlemi kesinleştirdiği sürece (CommitRetaining) diğerleri o kayıtları görebilir. Sadece bir irsaliye veya fiş bazında olayı düşünüyorsanız da o zaman MemoryTempTable (kbmMemTable, dxMemData vb.) lar kullanabilirsiniz. Sorun tahminin bahsettiğiniz temp tabloyu veri tabanında açmanızdan kaynaklanıyor. Bu arada böyle bir yöntem veri tabanının şişmesine de sebep olacaktır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

sevgili ifthen sanırım şöyle bir mantık hatası yapıyorsun..

1) ana makinede firebird server kurulu;
2) ve senin kullanıcı makinelerindede firebird kurulu;

ve sen ana makinedeki SATIS tablosuna bağlanmak için örnek olarak;
database yolun
192.xx.xx.xx:c:\datalar\data.fdb

ve SATISTEMP tablosuna bağlanmak için database yolun ise
c:\datalar\data.fdb yani ayrı firebird serverlerdeki ayrı databaselerde bulanan ayrı tableler arasında kayıt yapmaya çalışıyorsun..

bu durumda aktarmalarda tabiki sorun çıkıyor.. bencede transaction kullan zaten doğrusuda bu..
ifthen
Üye
Mesajlar: 42
Kayıt: 13 Nis 2006 09:43

Mesaj gönderen ifthen »

selimr,

benim SATISTEMP tablom serverdaki vt da bulunan bir tablo. Yani ben local makinada runtime da hiçbir tablo oluşturmuyorum.

SATISTEMP tablosunu kasiyerler o andaki müşterinin aldığı ürünleri kaydetmek için kullanıyor. Müşteri ödeme yaptıktan sonra da o tablodaki veriler SATIS tablosuna aktarılıyor ve satış işlemi gerçekleşmiş oluyor.

Programda transaction kullanıyorum ve CommitRetaining olarak ayarlı.

Formdaki kodlar aşağıdaki gibi.

Kod: Tümünü seç

procedure TSatis.FormShow(Sender: TObject);
begin
DM.DSSatisTemp.Open;
DM.QGenel.Close;
DM.QGenel.SQL.Clear;
DM.QGenel.SQL.Add('SELECT SUM(SATISTEMP."Verilen") FROM SATISTEMP');
DM.QGenel.Open;
Ed_Tutar.Value:=DM.QGenel.Fields[0].AsFloat;
Verilen.Value:=0;ParaUstu.Value:=0;
Barkod.SetFocus;
end;

procedure TSatis.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DM.DSSatisTemp.Close;DM.QGenel.Close;
DM.QAktar.Close;DM.QDuzenUrun.Close;
action:=cafree;
Satis:=nil;
end;

procedure TSatis.BarkodKeyPress(Sender: TObject; var Key: Char);
var
i:integer;
j:double;
buffer : string;
begin
  if (Barkod.Text<>'') and (Key=#13) then
  begin
  buffer:=Barkod.Text;
  i:=Pos('*',buffer);
  if i<>0 then begin
    j:=StrToFloat(Copy(buffer,1,i-1));
    Delete(buffer,1,i);
    end
  else j:=1;
  DM.QDuzenUrun.Close;
  DM.QDuzenUrun.SQL.Clear;
  DM.QDuzenUrun.SQL.Add('SELECT * FROM URUN');
  DM.QDuzenUrun.SQL.Add('WHERE URUN."Barkod"='+ QuotedStr(buffer));
  DM.QDuzenUrun.SQL.Add(' ORDER BY URUN."UrunNO"');
  DM.QDuzenUrun.Open;
  if DM.QDuzenUrun.RecordCount=0 then
  begin
  buffer:=Barkod.Text;
  Delete(buffer,1,2);
  Delete(buffer,6,6);
  DM.QDuzenUrun.Close;
  DM.QDuzenUrun.SQL.Clear;
  DM.QDuzenUrun.SQL.Add('SELECT * FROM URUN');
  DM.QDuzenUrun.SQL.Add('WHERE URUN."Barkod"='+ QuotedStr(buffer));
  DM.QDuzenUrun.SQL.Add(' ORDER BY URUN."UrunNO"');
  DM.QDuzenUrun.Open;
  if DM.QDuzenUrun.RecordCount=0 then
    begin
    UrunYok.ShowModal;
    DM.QDuzenUrun.Close;
    Barkod.SetFocus;
    Barkod.Text:='';
    exit;
    end
    else begin
    buffer:=Barkod.Text;
    Delete(buffer,1,7);
    buffer:=Copy(buffer,1,5);
    j:=StrToFloat(buffer);
  end;
  end;
  UrunAdi.Caption:=DM.QDuzenUrunUrunAdi.Value;
  DM.DSSatisTemp.Append;
  if Iskonto.Checked=False then begin
    Fiyat.Caption:=FloatToStr(DM.QDuzenUrunSatisFiyati.Value)+ ' TL';
    DM.DSSatisTempFiyat.Value:=DM.QDuzenUrunSatisFiyati.Value;
    DM.DSSatisTempMiktar.Value:=j;
    if DM.QDuzenUrunBirim.Value='Adet' then begin
      Miktar.Caption:=FloatToStr(j);
      Tutar.Caption:=FloatToStr(j*DM.QDuzenUrunSatisFiyati.Value)+ ' TL';
      DM.DSSatisTempVerilen.Value:= DM.DSSatisTempFiyat.Value*DM.DSSatisTempMiktar.Value;
      DM.DSSatisTempKarTutar.Value:=DM.DSSatisTempVerilen.Value-(DM.QDuzenUrunAlisFiyati.Value*DM.DSSatisTempMiktar.Value);
      end
      else begin
      Miktar.Caption:=FloatToStr(j)+ ' Gr';
      Tutar.Caption:=FloatToStr((j/1000)*DM.QDuzenUrunSatisFiyati.Value)+ ' TL';
      DM.DSSatisTempVerilen.Value:= DM.DSSatisTempFiyat.Value*(DM.DSSatisTempMiktar.Value/1000);
      DM.DSSatisTempKarTutar.Value:=DM.DSSatisTempVerilen.Value-(DM.QDuzenUrunAlisFiyati.Value*(DM.DSSatisTempMiktar.Value/1000));
    end;
  end
  else begin
    Fiyat.Caption:=FloatToStr(DM.QDuzenUrunIskonto.Value)+ ' TL';
    DM.DSSatisTempFiyat.Value:=DM.QDuzenUrunIskonto.Value;
    DM.DSSatisTempMiktar.Value:=j;
    if DM.QDuzenUrunBirim.Value='Adet' then begin
      Miktar.Caption:=FloatToStr(j);
      Tutar.Caption:=FloatToStr(j*DM.QDuzenUrunIskonto.Value)+ ' TL';
      DM.DSSatisTempVerilen.Value:= DM.DSSatisTempFiyat.Value*DM.DSSatisTempMiktar.Value;
      DM.DSSatisTempKarTutar.Value:=DM.DSSatisTempVerilen.Value-(DM.QDuzenUrunAlisFiyati.Value*DM.DSSatisTempMiktar.Value);
      end
      else begin
      Miktar.Caption:=FloatToStr(j)+ ' Gr';
      Tutar.Caption:=FloatToStr((j/1000)*DM.QDuzenUrunIskonto.Value)+ ' TL';
      DM.DSSatisTempVerilen.Value:= DM.DSSatisTempFiyat.Value*(DM.DSSatisTempMiktar.Value/1000);
      DM.DSSatisTempKarTutar.Value:=DM.DSSatisTempVerilen.Value-(DM.QDuzenUrunAlisFiyati.Value*(DM.DSSatisTempMiktar.Value/1000));
    end;
  end;
  DM.DSSatisTempUrunNO.Value:=DM.QDuzenUrunUrunNO.Value;
  DM.DSSatisTempUrunAdi.Value:=DM.QDuzenUrunUrunAdi.Value;
  DM.DSSatisTempTarih.Value:=Now;
  DM.DSSatisTempKasiyer.Value:=DM.QKullanici.FieldByName('KullaniciAdi').AsString;
  DM.DSSatisTempBarkod.Value:=DM.QDuzenUrunBarkod.Value;
  DM.DSSatisTempCinsNO.Value:=DM.QDuzenUrunCinsNO.Value;
  DM.DSSatisTempUrunCinsi.Value:=DM.QDuzenUrunUrunCinsi.Value;
  DM.DSSatisTemp.Post;
  DM.QDuzenUrun.Close;
  DM.QGenel.Close;DM.QGenel.Open;
  Ed_Tutar.Value:=DM.QGenel.Fields[0].AsFloat;
  Barkod.SetFocus;
  Barkod.Text:='';
  end;
end;

procedure TSatis.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=vk_F3 then Verilen.SetFocus;
if Key=vk_F1 then Barkod.SetFocus;
if (Key=vk_F2) and (Iskonto.Checked=False) then Iskonto.Checked:=True
else if (Key=vk_F2) and (Iskonto.Checked=True) then Iskonto.Checked:=False;
if Key=vk_F4 then NakitClick(Sender);
if Key=vk_F5 then KrediKartiClick(Sender);
if Key=vk_F6 then VeresiyeClick(Sender);
if Key=vk_F7 then SilClick(Sender);
if Key=vk_F8 then begin
if not Assigned(UrunBul) then UrunBul:= TUrunBul.Create(Application);
xSatis:=Self;
UrunBul.ShowModal;
Barkod.SetFocus;
end;
if Key=vk_F9 then begin
if not Assigned(Doviz) then Doviz:= TDoviz.Create(Application);
xSatis := Self;
Doviz.ShowModal;
end;
end;

procedure TSatis.SilClick(Sender: TObject);
begin
if (DM.DSSatisTemp.RecordCount<>0) and (KayitSil.ShowModal=mrYes) then
  begin
  DM.DSSatisTemp.Delete;
  Barkod.SetFocus;
  Barkod.Text:='';
  DM.QGenel.Close;DM.QGenel.Open;
  Ed_Tutar.Value:=DM.QGenel.Fields[0].AsFloat;
  end;
end;

procedure TSatis.VerilenKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then ParaUstu.Value:=Verilen.Value-Ed_Tutar.Value;
end;

procedure TSatis.NakitClick(Sender: TObject);
begin
if DM.DSSatisTemp.RecordCount=0 then begin
Bilgi.ShowModal;
exit;
end;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('UPDATE SATISTEMP SET SATISTEMP."IslemTuru"='+QuotedStr('Nakit'));
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('INSERT INTO SATISLAR (SATISLAR."UrunNO",SATISLAR."UrunAdi",SATISLAR."Tarih",SATISLAR."Miktar",SATISLAR."Fiyat",SATISLAR."Verilen",');
DM.QAktar.SQL.Add('SATISLAR."Kasiyer",SATISLAR."Barkod",SATISLAR."CinsNO",SATISLAR."UrunCinsi",SATISLAR."KarTutar",SATISLAR."IslemTuru") ');
DM.QAktar.SQL.Add('SELECT SATISTEMP."UrunNO",SATISTEMP."UrunAdi",SATISTEMP."Tarih",SATISTEMP."Miktar",SATISTEMP."Fiyat",SATISTEMP."Verilen",');
DM.QAktar.SQL.Add('SATISTEMP."Kasiyer",SATISTEMP."Barkod",SATISTEMP."CinsNO",SATISTEMP."UrunCinsi",SATISTEMP."KarTutar",SATISTEMP."IslemTuru" FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('DELETE FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.DSSatisTemp.Close;DM.DSSatisTemp.Open;
Ed_Tutar.Value:=0;Verilen.Value:=0;ParaUstu.Value:=0;
UrunAdi.Caption:='';Miktar.Caption:='';
Fiyat.Caption:='';Tutar.Caption:='';
Barkod.SetFocus;
end;

procedure TSatis.KrediKartiClick(Sender: TObject);
begin
if DM.DSSatisTemp.RecordCount=0 then begin
Bilgi.ShowModal;
exit;
end;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('UPDATE SATISTEMP SET SATISTEMP."IslemTuru"='+QuotedStr('Kredi Kartı'));
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('INSERT INTO SATISLAR (SATISLAR."UrunNO",SATISLAR."UrunAdi",SATISLAR."Tarih",SATISLAR."Miktar",SATISLAR."Fiyat",SATISLAR."Verilen",');
DM.QAktar.SQL.Add('SATISLAR."Kasiyer",SATISLAR."Barkod",SATISLAR."CinsNO",SATISLAR."UrunCinsi",SATISLAR."KarTutar",SATISLAR."IslemTuru") ');
DM.QAktar.SQL.Add('SELECT SATISTEMP."UrunNO",SATISTEMP."UrunAdi",SATISTEMP."Tarih",SATISTEMP."Miktar",SATISTEMP."Fiyat",SATISTEMP."Verilen",');
DM.QAktar.SQL.Add('SATISTEMP."Kasiyer",SATISTEMP."Barkod",SATISTEMP."CinsNO",SATISTEMP."UrunCinsi",SATISTEMP."KarTutar",SATISTEMP."IslemTuru" FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.QAktar.SQL.Clear;
DM.QAktar.SQL.Add('DELETE FROM SATISTEMP');
DM.QAktar.ExecSQL;
DM.QAktar.Close;
DM.DSSatisTemp.Close;DM.DSSatisTemp.Open;
Ed_Tutar.Value:=0;Verilen.Value:=0;ParaUstu.Value:=0;
UrunAdi.Caption:='';Miktar.Caption:='';
Fiyat.Caption:='';Tutar.Caption:='';
Barkod.SetFocus;
end;

procedure TSatis.VeresiyeClick(Sender: TObject);
begin
if DM.DSSatisTemp.RecordCount=0 then begin
Bilgi.ShowModal;
exit;
end;
if not Assigned(VeresiyeSatis) then
VeresiyeSatis:= TVeresiyeSatis.Create(Application);
VeresiyeSatis.SatisTutar.Value:=Ed_Tutar.Value;
VeresiyeSatis.VerilenTutar.Value:=0;
VeresiyeSatis.KalanTutar.Value:=Ed_Tutar.Value;
VeresiyeSatis.ShowModal;
DM.DSSatisTemp.Close;DM.DSSatisTemp.Open;
UrunAdi.Caption:='';Miktar.Caption:='';
Fiyat.Caption:='';Tutar.Caption:='';
Ed_Tutar.Value:=0;Verilen.Value:=0;
ParaUstu.Value:=0;Barkod.SetFocus;
end;

Cevapla