Çok kullanıcılı sistemde kayıt problemi
Çok kullanıcılı sistemde kayıt problemi
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.
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.
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;
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..
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..
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 

Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
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..
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..
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.
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;