ADOQuery de update problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

ADOQuery de update problemi

Mesaj gönderen Berdem »

Merhaba Arkadaşlar;
Aşagıdaki kod çalıştığında hata vermiyor.Asıl sıkıntı ADOQuery7 update gerçekleşmiyor.Kod çalışıyor fakat update ettigim table alandaki degeri ne yazıkki göremiyorum.'where SIRANO=:abs'); Sırano autoinc alanı burdamı hatamı yapıyorum diyorum.Yardımlarınızı bekliyorum.

Kod: Tümünü seç

procedure TForm1.Button6Click(Sender: TObject);
var
asd:double;
Begin
ADOConnection1.Connected:=True;
ADODataSet2.Connection:=ADOConnection1;
ADOQuery7.Connection:=ADOConnection1;
ADOQuerygelen.Connection:=ADOConnection1;
try
 ADOConnection1.BeginTrans; //transectionu başlat
    try
     case DataSource2.State of    ////eger datasourc durumu
    dsinsert:                    ///insert pozisyonunda ise
     begin
      if ADODataSet2.FieldByName('GELENNO').IsNull then
         begin
           ADODataSet2.Active;
           ADODataSet2.FieldByName('TARIH').AsDateTime:=Date;      //tarihi bugünün tarihini kullan
           ADODataSet2.Post;
           ADODataSet2.UpdateBatch(arCurrent);
           ADOConnection1.CommitTrans; // transectonu uygula
         end
         else
         begin
           with ADOQuerygelen do
              begin
                Active;
                Close;
                SQL.Clear;
                SQL.Add('SELECT Count(*) FROM giden');
                Open;
                UpdateBatch(arAll);
              end;
                  asd:= ADOQuerygelen.Fields[0].AsFloat+1;
                  ADODataSet2.Active;
                  ADODataSet2.FieldByName('TARIH').AsDateTime:=Date;      //tarihi bugünün tarihini kullan
                  ADODataSet2.Post;
                  ADODataSet2.UpdateBatch(arCurrent);
                  //ShowMessage(floatToStr(asd));
                  with ADOQuery7 do
                        begin
                          Active;
                          SQL.Clear;
                          SQL.Add('Update gelen set GIDENNO=:ab');
                          SQL.Add('where SIRANO=:abs');
                          Parameters.ParamByName('ab').Value:=asd;
                          Parameters.ParamByName('abs').Value:=QuotedStr(DBEdit2.Text);
                          ExecSQL;
                          //UpdateBatch(arAll);
                        end;
              end;
       end;
       dsedit: ///edit pozisyonunda ise
       begin
         ADODataSet2.Active;
         ADODataSet2.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);//tarihi bugünün tarihini kullan
         ADODataSet2.Post;
         ADODataSet2.UpdateBatch(arCurrent);
         ADOConnection1.CommitTrans; // transectonu uygula
       end;
      end;
    except
     on E:Exception do
      begin
       ADOConnection1.RollbackTrans;    //Çakışma varsa tersini uygula
       ShowMessage('Kayıt işleminde bir hata oldu tekrar edin.!');
      end;
     end;
    DateTimePicker1.SetFocus;
    ADODataSet2.Insert;
finally
  ADODataSet2.Connection:=nil;
  ADOQuery7.Connection:=nil;
  ADOQuerygelen.Connection:=nil;
  ADOConnection1.Connected:=False;
end;
end;
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Biraz yardım lütfen. :oops:
Aşağıdaki kod çalışıyor.

Kod: Tümünü seç

with ADOQuery1 do 
begin 
Active; 
SQL.Clear; 
SQL.Add('Update gelen set GIDENNO=:ab'); 
SQL.Add('where SIRANO=:abs'); 
Parameters.ParamByName('ab').Value:=asd; 
Parameters.ParamByName('abs').Value:=Edit1.Text; //....DBEdit1.Text  olunca çalışmıyor.
ExecSQL; 
Fakat farklı table bağlı DBEdit olunca update etmiyor.Burda yapmak istediğim table bağlı DBEdit deki bilgiyi farklı table kullanmak.
Sevgi ve Saygılarımla..
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Yine bir araştırmam oldu başarılı olamadım.Bu sefer degişik bir yolla deneyim dedim.Sql görevini yerine getiriyor insert yapıyor o table üzerinde gösteriyor hatta updatede gösteriyor .Fakat geriya tekrar dönüldüğünde yapılan kayıtları göstermiyor.

Kod: Tümünü seç

case DataSource2.State of    ////eger datasourc durumu
     dsinsert:                    ///insert pozisyonunda ise
     begin
      if ADODataSet2.FieldByName('GELENNO').IsNull then
         begin
           ADODataSet2.Active;
           ADODataSet2.FieldByName('TARIH').AsDateTime:=Date;      //tarihi bugünün tarihini kullan
           ADODataSet2.Post;
           ADODataSet2.UpdateBatch(arCurrent);
           ADOConnection1.CommitTrans; // transectonu uygula
         end
           else
           begin
           with ADOQuerygelen do
              begin
                Active;
                Close;
                SQL.Clear;
                SQL.Add('SELECT Max(SIRANO)as sıra FROM giden');
                Open;// en büyük noumara doğal olarak en son numaradır.
                UpdateBatch(arAll);
              end;
                  asd:= ADOQuerygelen.Fields[0].AsInteger+1;
                    ADODataSet1.Active;
                    ADODataSet1.Close;
                    ADODataSet1.CommandType:=cmdText;
                    ADODataSet1.CommandText :='SELECT * FROM gelen WHERE SIRANO=:Tar';
                    ADODataSet1.Parameters.ParamByName('Tar').Value:=ADODataSet2.FieldByName('GELENNO').AsInteger;
                    ADODataSet1.Prepared;
                    ADODataSet1.Open;
                      ADODataSet1.Active;
                      ADODataSet1.Edit;
                      ADODataSet1.FieldByName('GIDENNO').AsInteger:=asd;
                      ADODataSet1.Post;
                      ADODataSet1.UpdateBatch(arCurrent);
                      //ShowMessage(IntToStr(asd));
                      ADODataSet2.Active;
                      ADODataSet2.FieldByName('TARIH').AsDateTime:=Date;//tarihi bugünün tarihini kullan
                      ADODataSet2.Post;
                      ADODataSet2.UpdateBatch(arCurrent);
         end;
     end;
Sitede doğal olarak :ara yaptım. En yakın Husonet bu problemi yakın geldi.viewtopic.php?t=1342&highlight=sql+add+update Burdaki çözümlerde beni sonuca ulaştıramadı. Gerçektende şu an tıkanmış durumdayım bir çıkış yolum kalmadı.Destek ve önerisi olan arkadaşların yardımlarını bekliyorum.Sevgi ve Saygılarımla...
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Sayın Berdem,
size ufak bir taktik vereyim.... Problemi kodun kendisini vererek degil de cümlelerinizle ifade ederseniz cevap alma şansınız çok artar... Kodu vermeyin demiyorum bu kodu yine verin... Ama problemi cümlelerinizle öyle ifade edin ki okuyan kişi problemin ne oldugunu anlamak için değil sadece acaba problem nereden kaynaklanıyor diye koda baksın...

Eğer dürüs olursak, ben kendi adıma işlerim arasında forumdaki problemleri okurken eger okudugum cümle problemi net olarak ifade etmiyorsa. 3-5 satirdan fazla bir kodu incelemem pek mumkun degil... Zira kod satirlari biraz artti mi o kodun once ne iş yaptığını ya da yapmaya çalıştıgını anlamak için butun dunya ile ilişkimi kesip belki 5-10 dakika kodu satir satir incelemem ve kullanılan değişkenlerden alan isimlerinden meseleyi anlamaya çalışmama gerekiyor... Bu da ha deyince çok kolay yapılabilen bir şey değil....

Bu sebeple meseleyi kodu gormeden de anlayabileceğimiz bir şekilde ifade ederseniz... Belki de birisi diyecek ki neden oyle bir kod yazıyorsun ki soyle soyle yaparsan o iş zaten olur..... vs...

Kolay gelsin.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Merhaba,
Uyarınız için çok teşekkür ederim.Haklısınız bu açıdan hiç düşünmedim. :oops: Bundan sonra daha dikkatli olacam.
Veri tabanı olarak access kullanıyorum veri tabanında iki table var .Giden evrak diye tanımladığım bölümde kayıt yaparken giden evrakta üst evrak numarası olarak gelen evragın protokolü veriliyor.Burda sıkıntı otomatik oluşan giden evrak sıra nosu ise gelen evraga verilecek.Bu nu quary ile denedim.
tablo adı......GELEN...................GİDEN
......................SIRANO...............SIRANO...Burdaki oluşan numara gelen GIDENNO verilecek
......................TARIH..................TARIH
................. ....GIDENNO.............GELENNO

Kod: Tümünü seç

with ADOQuery7 do
begin
  Active;
  SQL.Clear;
  Prepared;
  SQL.Add('Update gelen set GIDENNO=:ab');
  SQL.Add('where SIRANO=:abs');
  Parameters.ParamByName('ab').Value:=asd;
  Parameters.ParamByName('abs').Value:=ADODataSet2.FieldByName('GELENNO').AsInteger;
  ExecSQL;
  UpdateBatch(arAll);
end;
SQL yanıt verdi.Ama kaydı ve update gösterdi fakat geri dönüldüğünde bu kayıtların yapılmadığını gördüm.
Bu sefer başka yollardan çözüm olarak

Kod: Tümünü seç

asd:= ADOQuerygelen.Fields[0].AsInteger+1;
ADODataSet1.Active;
ADODataSet1.Close;
ADODataSet1.CommandType:=cmdText;
ADODataSet1.CommandText :='SELECT * FROM gelen WHERE SIRANO=:Tar';
 ADODataSet1.Parameters.ParamByName('Tar').Value:=ADODataSet2.FieldByName('GELENNO').AsInteger;
ADODataSet1.Prepared;
ADODataSet1.Open;
ADODataSet1.Active;
ADODataSet1.Edit;
ADODataSet1.FieldByName('GIDENNO').AsInteger:=asd;
ADODataSet1.Post;
ADODataSet1.UpdateBatch(arCurrent);
ADODataSet2.Active;
ADODataSet2.FieldByName('TARIH').AsDateTime:=Date;//tarihi bugünün tarihini kullan
ADODataSet2.Post;
ADODataSet2.UpdateBatch(arCurrent);
bunu denedim.Update ve insert ediyor fakat tekrar kayda ve update dönüldüğünde işlemin yapılmadığını görüyorum.Umarım çok sıkmamışımdır.Fahrettin beye uyarısı için tekrar teşekkür ederim.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Kod: Tümünü seç

with ADOQuery7 do 
begin 
  Active; 
  SQL.Clear; 
  Prepared; 
  SQL.Add('Update gelen set GIDENNO=:ab'); 
  SQL.Add('where SIRANO=:abs'); 
  Parameters.ParamByName('ab').Value:=asd; 
  Parameters.ParamByName('abs').Value:=ADODataSet2.FieldByName('GELENNO').AsInteger; 
  ExecSQL; 
  UpdateBatch(arAll); 
end;
Bence daha basit gorunen bu ilk kodun ustunde durmali...
Yani update islemini neden yapmiyor onu yakalamak lazim... Burada mesela ExecSQL; satirindan once ekrana showmessage ile asd ve GELENNO degerlerini gostermelisiniz.... acaba olmasi gereken degerler geliyor mu? Sonra aynı update kodunu bu ekranda gosterdiginiz parametre degerleri ile ayri bir ortamdan bu sql cumlesini calistirip gerekli etkiyi yapıp yapmadigina bakmalısınız...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Merhaba Fahrettin Bey,
Allah sizin gibi balık tutmayı öğretenlerden razı olsun. :alkis: :bravo: :alkis:
Aynen dediğiniz gibi ayrı bir projede esastan başlayarak çalıştıkça diğer kodları ekleyerek yavaş yavaş yaparak hatamı bulmaya çalıştım.Önce quary vazgeçtim.dataset kullanmak daha avantajlı geldi.Sonra hatamın

Kod: Tümünü seç

ADOConnection1.RollbackTrans;
:idea: kaynaklı olduğunu anladım.

Kod: Tümünü seç

 if ADODataSet2.FieldByName('GELENNO').IsNull 
ilk döngüsünde

Kod: Tümünü seç

ADODataSet2.UpdateBatch(arCurrent);
ADOConnection1.CommitTrans; //
Elseden sonraki döngüde

Kod: Tümünü seç

ADOConnection1.CommitTrans; // 
eklemediğim için rollback çalışıyor .Değerli yardımlarınız için tekrar tekrar teşekkür ederim.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

cümlemizden :)
Meseleyi halletmenize sevindim....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla