Data set not in edit or insert mode

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

Data set not in edit or insert mode

Mesaj gönderen Berdem »

Merhaba arkadaşlar,
Problemim edit ve insertti aynı buton üzerinde gerçekleştirmek.Formum girişinde 6 edit ve 2 adet datetimepicker nesnesi var.Asıl problemim
tarih de bir alanı edit yapmak istediğimde ADODataSet1:Data set not in edit or insert mode yanıtını veriyor.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); //kayıt
Begin
ADOConnection1.BeginTrans; //transectionu başlat
if  (ADODataSet1.FieldByName('GELDIGIYER').AsString='') and
(ADODataSet1.FieldByName('VALILIKSAYISI').AsString ='') and
(ADODataSet1.FieldByName('EKI').AsString ='') and
(ADODataSet1.FieldByName('OZU').AsString='') and
(ADODataSet1.FieldByName('SUBESI').AsString='')
then
begin
abort; //boş ise işlemi iptal et
end;
if  (ADODataSet1.FieldByName('GELDIGIYER').AsString<>'') and
(ADODataSet1.FieldByName('VALILIKSAYISI').AsString <>'') and
(ADODataSet1.FieldByName('EKI').AsString<>'') and
(ADODataSet1.FieldByName('OZU').AsString<>'') and
(ADODataSet1.FieldByName('SUBESI').AsString<>'')
then
begin //dolu ise edit ve ya appendyap
 try
  ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);
  ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);
  ADODataSet1.Post;
  ADOConnection1.CommitTrans; // transectonu uygula
  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;
    DateTimePicker3.SetFocus;
  end ;

end;
Hatayı

Kod: Tümünü seç

ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date); 
bölümünde gösteriyor.
Sevgi ve Saygılarımla..
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Kod: Tümünü seç

if not (table1.state in [dsedit, dsinsert]) then
begin
  table1.edit;
  table1alan.value := deger;
  table1.post;
end;
işini görür herhalde..
DeveloperToolKit

..::|YeşilMavi|::..
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

İlginize çok teşekkür ediyorum.Aynen dediginizi uyguladım.Bu sefer hata mesajı almıyorum.Datetimepickerda olan tarihden farklı bir tarih giriyorum butunu clickleyince değiştimiyor :? ve önceki tarihe dönüyor :shock: .Çok teşekkürler..

Kod: Tümünü seç

 if not (ADODataSet1.State in [dsedit,dsinsert]) then
  begin
  ADODataSet1.Edit;
  ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);
  ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);
  ADODataSet1.Post;
  ADOConnection1.CommitTrans; // transectonu uygula
  end;
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Sorunun büyük bölümünü hallettim.Sorun farklı boyuta geldi bu kodları kullanmaya başlıyınca bu sefer gridde hem tarihi hemde saati görüyorum.Buda en çok sorgulamalarda problem yaratıyor.Kısa tarih girilmiş kayıtlarda problem yok saat ve tarih birlikte olanlarda sorgu problemi çıkıyor.Hem accesssden hemde ado fdasdatetime fddate yaptığım halde problem çıkarıyor.

Kod: Tümünü seç

try
case DataSource1.State of    ////eger datasourc durumu
dsinsert:                    ///insert pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=now;      //tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);//mevcut tarihi kullan
ADODataSet1.Post;
ADOConnection1.CommitTrans; // transectonu uygula
end;
dsedit: ///edit pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);//tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date); //mevcut tarihi kullan
ADODataSet1.Post;
ADOConnection1.CommitTrans; // transectonu uygula
end;
end;
Sevgi ve saygılarımla..
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.

Kod: Tümünü seç

begin //dolu ise edit ve ya appendyap
 try
  ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);
  ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);
  ADODataSet1.Post;
  ADOConnection1.CommitTrans; // transectonu uygula
  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;
    DateTimePicker3.SetFocus;
  end ;

end;
kardeş
//dolu ise edit ve ya appendyap
demişsin ama
adodataset.edit
veya
adodataset1.append
dememişsin.
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Merhaba,
dediğinizi yaptım.Bazen iyi baktıgınızı zannedip göremediğiniz o kadar çok şey oluyor ki. :Noops Datetimepicker2 dogru istedigim kısa tarih atıyor fakat datetimepicker1 atmıyor cevap yazdıgım DateOf(now) da saklı imiş..Sanırım sistem tarihi hemde zamanı birlikte atıyor.DateOf tarihde kısaltma yapıyor.Biraz daha dikkatli olmam gerekecek :shock: ...
Dediğinizi yaptım çok teşekkür ederim...

Kod: Tümünü seç

try
case DataSource1.State of    ////eger datasourc durumu
dsinsert:                    ///insert pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=Dateof(now);      //tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);//mevcut tarihi kullan
ADODataSet1.Insert;
ADOConnection1.CommitTrans; // transectonu uygula
end;
dsedit: ///edit pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);//tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date); //mevcut tarihi kullan
ADODataSet1.Edit;
ADOConnection1.CommitTrans; // transectonu uygula
end;
end;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
kardeş benim demek istediğimi sanırım tam anlatamadım.
Sen adodataset1 e nerde edit veya insert diyorsun.
Şuan yazdığın satırlarda

Kod: Tümünü seç

  eğer tablo insert modundaysa
  begin
     değerleri aktar
      insert moduna getir
   end;
   eğer tablo edit modundaysa
       değerleri aktar
        edit moduna getir
    end;
yani tablo edit modunda ise tekrar edit moduna getiriyorsun veya
insert modunda ise tekrar insert moduna getiriyorsun.
Tablonun edit veya insert modunda olduğunu kontrol ettirmeden önce insert yada edit moduna getirmen gerekli değilmi.
Kodların tamamını göremediğim için tam birşey diyemiyorum ama bu kodlarda içime sinmeyen bir durum olduğunu belirtmek istiyorum.
Birde eğer tarih alanınızda saatleri görmek istemiyorsan
now yerine date fonksiyonunu kullanabilrsin. ama dediğin gibi dateof zaten saati sıfırlıyor.
Sanırım biraz karışık oldu ama kusura bakma.
Kolay Gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); //kayıt
Begin
ADOConnection1.BeginTrans; //transectionu başlat
if  (ADODataSet1.FieldByName('GELDIGIYER').AsString='') and
(ADODataSet1.FieldByName('VALILIKSAYISI').AsString ='') and
(ADODataSet1.FieldByName('EKI').AsString ='') and
(ADODataSet1.FieldByName('OZU').AsString='') and
(ADODataSet1.FieldByName('SUBESI').AsString='')
then
begin
abort; //boş ise işlemi iptal et
end;
 try
case DataSource1.State of    ////eger datasourc durumu
dsinsert:                    ///insert pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=Date;      //tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);//mevcut tarihi kullan
ADODataSet1.Insert;
ADOConnection1.CommitTrans; // transectonu uygula
end;
dsedit: ///edit pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);//tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date); //mevcut tarihi kullan
ADODataSet1.Edit;
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;
   ADODataSet1.Insert;
   DateTimePicker3.SetFocus;
end;
Merhaba gerçektende ben bu durumu tam olarak kullanamadım.Belki de bu konuda yeterli bilgi sahibi olmadan böyle bir işe kalkmak insanın kafasını karıştırıyor .İşi tek butona yıkmak istiyorum.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

eğer dataset dsInsert modunda ise mantıklı olan dataseti post yada cancel etmek. aynı şekilde dsEdit modunda ise de dataseti post yada cancel edilebilir.
dsInsert modunda olan bir dataseti tekrar insert lersen, önceki insert modundaki kaydı kaydedip, yeni bir boş kayıt eklemeye çalışır...
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Kayıt düğmesine tıklamadan önce adodataset i insert yada edit moduna getiriyormusun?
Yani sen kaydet düğmesine (button1 e) tıkladığın zaman insertmi yapmak istiyorsun editmi. önce bunu belirtmen lazım.
Peki nerde belirteceğiz ?.
Bilgileri girmeden önce. veya formu show etmeden önce. Formu şhowetmek için hangi dğmeyi kullanıyorsun? (atıyorum) yeni kayıt düğmesini ozaman form.showmodal (yada show) dan önce tablo.insert veya tablo.append komutunu formu göstermek için düzelt düğmesine tıklıyorsan tablo.edit komutunu yazman lazım. Daha sonra kaydet düğmesine bastığın zaman dataset in state ini kontrol edersin. aksi halde state değişkeni dsbrowse döneceğinden insert veya edit işlemi olmayacaktır.
Bir diğer nokta eğer dbedit (veya diğer dbbileşenlerden birini) kullanıyorsanız alanlardan birinde değişiklik yaptığınız zaman tablo otomatik olarak edit moduna (eğer tabloda hiç kayıt yoksa insert moduna) geçer. (db navigator içinde benzer durum söz konusudur.)

Şimdi ilk mesajınızda adodataset i edit veya insert moduna getirmeden datasetin alanlarına değer atamaya çalıştığınız için dataset not in edit or insert mode hatasını alıyordunuz. Dataset in state ini kontrol edererk bu işi kontrol altına aldınız.
Ben tabloyu insert veya edit moduna nerede geçirdiğinizi merak ettiğim için .......
Sizin gönderdiğiniz kodda insert ve edit komutlarının kullanımı gereksiz gibi görünyor. çünkü insert veya edit yaptıktan sonra transaction u bitiriyorsunuz. bu durumda yaptığınız insert ve edit işleminin bi manası kalmıyor. bir önceki mesajda bunu belirtmeye çalışmıştım.

Biraz uzun oldu ama tam olarak anlatmak istediğimi anlatabildimmi bilmiyorum.
eğer anlaşılmayan bir yer varsa yardımcı olmaya çalışırım.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); //kayıt
Begin
ADOConnection1.BeginTrans; //transectionu başlat
if  (ADODataSet1.FieldByName('GELDIGIYER').AsString='') and
(ADODataSet1.FieldByName('VALILIKSAYISI').AsString ='') and
(ADODataSet1.FieldByName('EKI').AsString ='') and
(ADODataSet1.FieldByName('OZU').AsString='') and
(ADODataSet1.FieldByName('SUBESI').AsString='')
then
begin
abort; //boş ise işlemi iptal et
end;
 try
case DataSource1.State of    ////eger datasourc durumu
dsinsert:                    ///insert pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=Date;      //tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date);//mevcut tarihi kullan
ADODataSet1.Post;
ADOConnection1.CommitTrans; // transectonu uygula
end;
dsedit: ///edit pozisyonunda ise
begin
ADODataSet1.FieldByName('TARIH').AsDateTime:=DateOf(DateTimePicker3.Date);//tarihi bugünün tarihini kullan
ADODataSet1.FieldByName('EVRAKTARIHI').AsDateTime:=DateOf(DateTimePicker2.Date); //mevcut tarihi kullan
ADODataSet1.Post;
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;
   ADODataSet1.Insert;
   DateTimePicker3.SetFocus;
end;
Dediginiz gibi yaptım sorun bitmiyor.Formun show insert koydum.Edit pozisyonuna gelince DateTimePicker2 tarihinde değişiklik yapmak istediğimde edit yapmıyor.Diger dbeditlerde yapıyor ama bunda yapmıyor.Tekrar yardımınızı rica ediyorum.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

formun showuna insert yazdıysanız edit yapmaması doğal. formu showettiğiniz satırdan önce koyacaktınız. dediğim gibi eğer yenikayıt düğmesine tıklayıp formu çağırıyorsanız insert
düzelt düğmesine tıklayıp formu açıyorsanız edit yapmalısınız.

birde değer aktarmıyor derken hata falan mı veriyor yoksa o satırları çalışıtırmıyormu?
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Problem yazılan satırlar arttıkca büyüyor.Sanırım olayı daha geniş boyutta düşünmek gerekiyor.Griddeki dataları tıklayınca datetimepickerda göstermek için aşgıdaki kodu kullandım.

Kod: Tümünü seç

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if not AdoDataSet1.FieldByName('TARIH').IsNull
      then
      begin
        DateTimePicker3.Date :=AdoDataSet1.FieldByName('TARIH').AsDateTime ;
      end
      else
      begin
        DateTimePicker3.Date :=now;
      end;
 begin
 if not AdoDataSet1.FieldByName('EVRAKTARIHI').IsNull then
      begin
      DateTimePicker2.Date := AdoDataSet1.FieldByName('EVRAKTARIHI').AsDateTime ;
      end
      else
      begin
        DateTimePicker2.Date :=now;
       end;
 end;
end;
Kardeşim sizin tahmin edebileceginiz gibi DateTimePicker2.Date browse olup olmadığına bakmadan kullandım.İkincisi now bölümünde onları değiştirmek gerekiyormuş.Aşagıdaki gibi düzeltince herşey sayenizde normale döndü.Yazmaya devam edecem bakalım daha ne problemler cıkacak :wink: Destek ve yardımlarınız için çok teşekkür ediyorum.Sevgi ve Saygılarımla ..

Kod: Tümünü seç

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if not AdoDataSet1.FieldByName('TARIH').IsNull
      then
      begin
        DateTimePicker3.Date :=AdoDataSet1.FieldByName('TARIH').AsDateTime ;
      end
      else
      begin
        DateTimePicker3.Date :=date;
      end;
 if AdoDataSet1.State=dsBrowse then
 begin
 if not AdoDataSet1.FieldByName('EVRAKTARIHI').IsNull then
      begin
      DateTimePicker2.Date := AdoDataSet1.FieldByName('EVRAKTARIHI').AsDateTime ;
      end
      else
      begin
        DateTimePicker2.Date :=date;
       end;
 end;
end;

Kod: Tümünü seç

procedure TForm1.DateTimePicker2Change(Sender: TObject);
begin
if ADODataSet1.State=dsBrowse then adodataset1.Edit
end;
Cevapla