Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
birden fazla tabloya kayıt işlemi
#1
merhaba;

fisler, fisharket ve kasahareket adında 3 adet tablom var. bu tablolara kayıt işlemi yaptığım zaman bir hata olduğunda tüm kayıt işlemlerinin geri alınmasını istiyorum. kullanıdığım kod bloğu;
  if not dm.UniConnection1.InTransaction then dm.UniConnection1.StartTransaction;
 TRY

   with Dm.QryDataIslem do
   begin
     Connection := Dm.UniConnection1; Close; SQL.Clear;
     SQL.Add('INSERT INTO TBLFISLER (FISKOD,TARIHSAAT)');
     SQL.Add('VALUES (:FISKOD,:TARIHSAAT) RETURNING ID');
     ParamByName('FISKOD').AsString     :=Trim(txtFisKod.Text);
     ParamByName('TARIHSAAT').AsDateTime:=txtTarihSaat.EditValue;
     ExecSQL;
     EditKayitID.EditValue :=ParamByName('RET_ID').AsInteger;
   end;
   while not vtFisTablo.Eof do
   begin
     with Dm.QryDataIslem do
     begin
       Connection := Dm.UniConnection1; Close; SQL.Clear;
       SQL.Add('INSERT INTO TBLFISHRKT (FISID,ACIKLAMA,MIKTAR,FIYAT,TUTAR)');
       SQL.Add('VALUES (:FISID,:ACIKLAMA,:MIKTAR,:FIYAT,:TUTAR)');
       ParamByName('FISID').AsInteger  :=EditKayitID.EditValue;
       ParamByName('ACIKLAMA').AsString:=vtFisTablo.FieldByName('ACIKLAMA').AsString;
       ParamByName('MIKTAR').AsFloat   :=vtFisTablo.FieldByName('MIKTAR').AsFloat;
       ParamByName('FIYAT').AsFloat    :=vtFisTablo.FieldByName('FIYAT').AsFloat;
       ParamByName('TUTAR').AsFloat    :=vtFisTablo.FieldByName('TUTAR').AsFloat;
       ExecSQL;
     end;
   End;
   with dm.QryDataIslem do
   begin
     Connection := dm.UniConnection1; Close; SQL.Clear;
     SQL.Add('INSERT INTO TBLKASAHRKT (KASAID,TARIHSAAT,ACIKLAMA,TUTAR)');
     SQL.Add('VALUES (:KASAID,:KHRKTKOD,:TARIHSAAT,:ACIKLAMA,TUTAR)');
     ParamByName('KASAID').AsSmallInt    :=NakitKasaID.EditValue;
     ParamByName('TARIHSAAT').AsDateTime :=Now;
     ParamByName('ACIKLAMA').AsString    :=txtAciklama.Text;
     ParamByName('TUTAR').AsFloat        :=txtFisTutari.EditValue;
     ExecSQL;
   end;

   dm.UniConnection1.Commit;
 EXCEPT
   on E : Exception do
   Begin
     dm.UniConnection1.Rollback;
     raise Exception.Create('Hata Mesajı :'+E.Message);
   End;
 END;

üçüncü tabloda parametre hatası yaptırıyorum. fiş ve hareket tablosuna kayıt gerçekleşiyor kasahareket tablosuna kayıt gerçekleşmiyor. herhangi bir hatada bütün işlemler iptal olsun istiyorum. nasıl bir kod bloğu kullanmalıyım.

teşekkür ederim.
Cevapla
#2
Bunun gibi de fakat bazı seyler var burada. Veritabanı oracle mi?

Zaten transaction baslayınca bunun yazman yeterlidir

dm.UniConnection1.StartTransaction;


Bunun first ve next nerede?

   while not vtFisTablo.Eof do
   begin
     with Dm.QryDataIslem do
     begin
       Connection := Dm.UniConnection1; Close; SQL.Clear;
       SQL.Add('INSERT INTO TBLFISHRKT (FISID,ACIKLAMA,MIKTAR,FIYAT,TUTAR)');
       SQL.Add('VALUES (:FISID,:ACIKLAMA,:MIKTAR,:FIYAT,:TUTAR)');
       ParamByName('FISID').AsInteger  :=EditKayitID.EditValue;
       ParamByName('ACIKLAMA').AsString:=vtFisTablo.FieldByName('ACIKLAMA').AsString;
       ParamByName('MIKTAR').AsFloat   :=vtFisTablo.FieldByName('MIKTAR').AsFloat;
       ParamByName('FIYAT').AsFloat    :=vtFisTablo.FieldByName('FIYAT').AsFloat;
       ParamByName('TUTAR').AsFloat    :=vtFisTablo.FieldByName('TUTAR').AsFloat;
       ExecSQL;
     end;
   End;

2. Her birinde buna ne gerek var ?
Connection := dm.UniConnection1;

3. EditKayitID.EditValue :=ParamByName('RET_ID').AsInteger; bunu anlamadım parambynema editvalueye atiyorsunuz???

Biraz düzeltilmesi lazım bu sorgu aslında
Cevapla
#3
(18-05-2021, Saat: 15:14)r3n4m3 Adlı Kullanıcıdan Alıntı: Bunun gibi de fakat bazı seyler var burada. Veritabanı oracle mi?

Zaten transaction baslayınca bunun yazman yeterlidir

dm.UniConnection1.StartTransaction;


Bunun first ve next nerede?

   while not vtFisTablo.Eof do
   begin
     with Dm.QryDataIslem do
     begin
       Connection := Dm.UniConnection1; Close; SQL.Clear;
       SQL.Add('INSERT INTO TBLFISHRKT (FISID,ACIKLAMA,MIKTAR,FIYAT,TUTAR)');
       SQL.Add('VALUES (:FISID,:ACIKLAMA,:MIKTAR,:FIYAT,:TUTAR)');
       ParamByName('FISID').AsInteger  :=EditKayitID.EditValue;
       ParamByName('ACIKLAMA').AsString:=vtFisTablo.FieldByName('ACIKLAMA').AsString;
       ParamByName('MIKTAR').AsFloat   :=vtFisTablo.FieldByName('MIKTAR').AsFloat;
       ParamByName('FIYAT').AsFloat    :=vtFisTablo.FieldByName('FIYAT').AsFloat;
       ParamByName('TUTAR').AsFloat    :=vtFisTablo.FieldByName('TUTAR').AsFloat;
       ExecSQL;
     end;
   End;

2. Her birinde buna ne gerek var ?
Connection := dm.UniConnection1;

3. EditKayitID.EditValue :=ParamByName('RET_ID').AsInteger; bunu anlamadım parambynema editvalueye atiyorsunuz???

Biraz düzeltilmesi lazım bu sorgu aslında

Kusura bakmayın mesajı yazarken unutmuşum.
1. Delphi 10.3.3, Firebird 2.5.9, Devart unidac, first ve next var aslında kod biraz uzun anlaşılır olsun diye kısalttım. first ve next arada kaybolmuş.
2. gerekli değilse kaldırabilirim. yaşadığım bir soruna binaen eklersem düzelir diye eklemiştim kalıp olarak kalmış
3. EditKayitID.EditValue cxCurrency.EditValue dir. integer değişken olarak düşünebilirsiniz. devamındaki kod unidac da eklenen son ID yi okuyor.
Cevapla
#4
(18-05-2021, Saat: 11:23)akuyumcu63 Adlı Kullanıcıdan Alıntı: merhaba;

fisler, fisharket ve kasahareket adında 3 adet tablom var. bu tablolara kayıt işlemi yaptığım zaman bir hata olduğunda tüm kayıt işlemlerinin geri alınmasını istiyorum. kullanıdığım kod bloğu;
  if not dm.UniConnection1.InTransaction then dm.UniConnection1.StartTransaction;
 TRY

   with Dm.QryDataIslem do
   begin
     Connection := Dm.UniConnection1; Close; SQL.Clear;
     SQL.Add('INSERT INTO TBLFISLER (FISKOD,TARIHSAAT)');
     SQL.Add('VALUES (:FISKOD,:TARIHSAAT) RETURNING ID');
     ParamByName('FISKOD').AsString     :=Trim(txtFisKod.Text);
     ParamByName('TARIHSAAT').AsDateTime:=txtTarihSaat.EditValue;
     ExecSQL;
     EditKayitID.EditValue :=ParamByName('RET_ID').AsInteger;
   end;
   while not vtFisTablo.Eof do
   begin
     with Dm.QryDataIslem do
     begin
       Connection := Dm.UniConnection1; Close; SQL.Clear;
       SQL.Add('INSERT INTO TBLFISHRKT (FISID,ACIKLAMA,MIKTAR,FIYAT,TUTAR)');
       SQL.Add('VALUES (:FISID,:ACIKLAMA,:MIKTAR,:FIYAT,:TUTAR)');
       ParamByName('FISID').AsInteger  :=EditKayitID.EditValue;
       ParamByName('ACIKLAMA').AsString:=vtFisTablo.FieldByName('ACIKLAMA').AsString;
       ParamByName('MIKTAR').AsFloat   :=vtFisTablo.FieldByName('MIKTAR').AsFloat;
       ParamByName('FIYAT').AsFloat    :=vtFisTablo.FieldByName('FIYAT').AsFloat;
       ParamByName('TUTAR').AsFloat    :=vtFisTablo.FieldByName('TUTAR').AsFloat;
       ExecSQL;
     end;
   End;
   with dm.QryDataIslem do
   begin
     Connection := dm.UniConnection1; Close; SQL.Clear;
     SQL.Add('INSERT INTO TBLKASAHRKT (KASAID,TARIHSAAT,ACIKLAMA,TUTAR)');
     SQL.Add('VALUES (:KASAID,:KHRKTKOD,:TARIHSAAT,:ACIKLAMA,TUTAR)');
     ParamByName('KASAID').AsSmallInt    :=NakitKasaID.EditValue;
     ParamByName('TARIHSAAT').AsDateTime :=Now;
     ParamByName('ACIKLAMA').AsString    :=txtAciklama.Text;
     ParamByName('TUTAR').AsFloat        :=txtFisTutari.EditValue;
     ExecSQL;
   end;

   dm.UniConnection1.Commit;
 EXCEPT
   on E : Exception do
   Begin
     dm.UniConnection1.Rollback;
     raise Exception.Create('Hata Mesajı :'+E.Message);
   End;
 END;

üçüncü tabloda parametre hatası yaptırıyorum. fiş ve hareket tablosuna kayıt gerçekleşiyor kasahareket tablosuna kayıt gerçekleşmiyor. herhangi bir hatada bütün işlemler iptal olsun istiyorum. nasıl bir kod bloğu kullanmalıyım.

teşekkür ederim.

Merhaba,

UniConnection bileşeninde AutoCommit özelliği açık mı? Default olarak True gelir. Bu yüzden siz Rollback yapsanız bile önceden Commit ettiği için işleminiz geri alınamaz. 
Hata için ise hangi hatayı aldığınızı belirtmeniz gerekir.

İyi çalışmalar.
kisisel_logo_dark.png
WWW
Cevapla
#5
Smile 
teşekkürler kardeşim. şimdi denedim rollback yapıyor. biraz daha denerim bir sorun olursa tekrar dönüş yaparım.
UniConnection False olmalı ve kod ile herhangi bir yer de UniConnection :=True yapılmamış olmalı
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Veri Tabanına Kontrollü Kayıt Yaptırma bünyamin68 15 793 08-03-2024, Saat: 00:06
Son Yorum: TuncayDelphi
Smile TrayIcon ile BringToFront işlemi mcuyan 0 172 30-11-2023, Saat: 21:27
Son Yorum: mcuyan
  Delphi ile Birden Fazla Pdf Dosyasını Birleştirme/Merge Hk. glagher 5 774 08-09-2023, Saat: 10:37
Son Yorum: glagher
  WebBrowser Pdf Kayıt Etme sadoal351 1 576 11-07-2023, Saat: 12:39
Son Yorum: delphiman
  DBGrid de Birden Fazla Kayıt Seçmek. OZCANK 12 3.330 07-07-2023, Saat: 15:31
Son Yorum: emre



Konuyu Okuyanlar: 1 Ziyaretçi