append

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
barol
Üye
Mesajlar: 49
Kayıt: 05 Oca 2005 04:29
Konum: İzmir

append

Mesaj gönderen barol »

ben anvigator kullanıyorum navigatorın onclikine

if (button=nbinsert) then
begin
table1.append;
abort;
end;
en son satırda insert açılıyor tableın post unu tetikliyor ben işlem yapmadan daha post ediyor nednini anlamadım...
Ölümden öteye köy yok!
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Table Insert edilmiş durumda, önce onu iptal etmen gerekiyor olabilir.
Yanlış hatırlamıyorsam Table1.Cancel; şeklindeydi.
En son ulu coder tarafından 23 Haz 2006 01:31 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Navigator de Insert butonuna basınca Append et demişsin. Insert ile Append zaten aynı şeydir :idea: Table1 dediğin aynı tablo ise kodun bu kısmı mantıksız. Zaten yeni bir kayıt eklemişsin tekrar ekleyince bir öncekini post eder :idea: Mantığı hatalı kurmuşsun sanırım :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Mersian
Üye
Mesajlar: 8
Kayıt: 17 Nis 2006 11:49

Mesaj gönderen Mersian »

Insert ile Append aynı şey değildir.

Insert: Bulunduğun kaydın hemen altına yeni kayıt açar
Append: Dosyanın en sonuna yeni kayıt açar.

Bu fark kimi durumlarda önemli sorunlara yol açabiliyor.


Barol arkadaşım. Table'ın postunu tetikliyor demişsin ama BeforePost mu AfterPost mu belirtmemişsin.

Ayrıca bu işlemi OnClick event'i yerine BeforeAction event'ine yazman daha uygun olur gibime geliyor.
Ufuk TOGAY
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Kod: Tümünü seç

if (button=nbinsert) then 
begin 
table1.append; 
abort; 
end; 

İnsan niye böyle bir kod yazar ki. nbinsert tuşuna basılmış ise Navigator zaten tabloyu "insert" moduna geçirir. "table.append" deyince tablo post edilmeye çalışılır sonrada "append" moduna geçirilir.

BeforePost mu AfterPost mu tetiklenir sorusunun cevabı; er ikiside.


Insert ile Append aynı şey değildir.

Insert: Bulunduğun kaydın hemen altına yeni kayıt açar
Append: Dosyanın en sonuna yeni kayıt açar.
Yani. Yoksa aynı şey için iki farklı metod niye olsun.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

tablonun beforeinsert olayına

Kod: Tümünü seç

begin
   abort;
   table1.append;
end;
yazman işini görecektir. böylelikle navigatör + tuşuna basınca insert çalıştırdığında önce insert işlemi iptal edilecek sonra append olacaktır.. umarım öyle olur :D

saygılar..
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bir kere DBNavigator un OnClikck inde olay/action bitmiştir. Dolaysıyla Abort işlemi çalışmaz :!: BeforeAction da olabilir, fakat Abort tan sonra da Append yapamazsınız :!:
Mersian yazdı:Insert ile Append aynı şey değildir.

Insert: Bulunduğun kaydın hemen altına yeni kayıt açar
Append: Dosyanın en sonuna yeni kayıt açar.

Bu fark kimi durumlarda önemli sorunlara yol açabiliyor.
...
Her iki event ın kodları aşağıdadır. İndeksli bir tabloda araya kayıt girme veya sona kayıt ekleme diye bir şeyden söz edilemez. İndekse göre uygun yere eklenir :idea:

Kod: Tümünü seç

procedure TDataSet.Insert;
var
  Buffer: PChar;
  OldCurrent: TBookmarkStr;
begin
  BeginInsertAppend;
  OldCurrent := Bookmark;
  MoveBuffer(FRecordCount, FActiveRecord);
  Buffer := ActiveBuffer;
  InitRecord(Buffer);
  if FRecordCount = 0 then
    SetBookmarkFlag(Buffer, bfBOF) else
    SetBookmarkData(Buffer, Pointer(OldCurrent));
  if FRecordCount < FBufferCount then Inc(FRecordCount);
  InternalInsert;
  EndInsertAppend;
end;

procedure TDataSet.Append;
var
  Buffer: PChar;
begin
  BeginInsertAppend;
  ClearBuffers;
  Buffer := FBuffers[0];
  InitRecord(Buffer);
  SetBookmarkFlag(Buffer, bfEOF);
  FRecordCount := 1;
  FBOF := False;
  GetPriorRecords;
  InternalInsert;
  End
İlle de Append kodu çalıştırılmak istenirse @muratdicle nin önerisi kullanılabilir. Çünkü Abort özellikle DataSet in BeforeInsert, BeforePost, vs. olaylarının sonlanması için kullanılır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

İndeksli bir tabloda araya kayıt girme veya sona kayıt ekleme diye bir şeyden söz edilemez. İndekse göre uygun yere eklenir
Tablo index li değil ise ne olacak.

Yada tablo index li ama ben TTable ı başka bir secondary index e ayarladıysam sonuç ne olur. Append dersem grid te sona gidilir veri girilir sonra POST olunca aktif olan indexe göre veri kümesi sıralanır. Insert dersem grid te aktif kayıdın bir altına boş satır eklenir veri girilir sonra POST olunca aktif olan indexe göre veri kümesi sıralanır. Sonra ikincil indexi TTable dan kapatırsam veri kümesini bu sefer birincil index e göre görürüm.

Tabi bir Tablo ya verinin insert yapa append ile nasıl ekleneceği ilgili veri tabanının tutumuna (yani tasarımına) bağlı sanırım. Fakat indexler daha çok veri kümesinin sıralanması ve bizim onu nasıl bir sırada göreceğimiz ile ilgili sanırım yoksa recordların veritabanı dosyasına nasıl bir sıra ile yazıldığı ile ilgili değil.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Tablodaki kayıtların ne sırada yazıldığı sizi neden bu kadar ilgilendiriyor pek anlamadım. Sıra önemli ise bir ID alanı ekleyip indekslemek bunca eziyeten daha iyi ve uygundur :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Indexle ne alakası var :?: O sadece kullanıcıya o şekilde view eder.Gerçekte insert ve append farklı işlemlerdir.Mesele bunu kullanıcıya yansıtmamaksa birçok çözüm üretilebilir vs.

Kolay gele.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

bLue aLonE yazdı:Indexle ne alakası var :?: O sadece kullanıcıya o şekilde view eder.Gerçekte insert ve append farklı işlemlerdir.Mesele bunu kullanıcıya yansıtmamaksa birçok çözüm üretilebilir vs.

Kolay gele.
Tamam kardeşim sen istediğin gibi yap :!: Hatta kayıtlar yazdığın sırada mı diye arada bir de yoklama yaparsın, olmadı diski açar büyüteçle bakarsın :?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Mesele kaydın sırası ya da nasıl göründüğü değil :!: Insert ve Append komutlarının aynı olmadığı..Büyüteç fikri de gayet yerinde olmuş, fikrine sağlık :idea:
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

muratdicle yazdı:tablonun beforeinsert olayına

Kod: Tümünü seç

begin
   abort;
   table1.append;
end;
yazman işini görecektir. böylelikle navigatör + tuşuna basınca insert çalıştırdığında önce insert işlemi iptal edilecek sonra append olacaktır.. umarım öyle olur :D

saygılar..
abort sessiz exception atar. Onun için aborttan sonraki kod çalışmaz. (büyük ihtimalle :D)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

undefined yazdı:...
abort sessiz exception atar. Onun için aborttan sonraki kod çalışmaz. (büyük ihtimalle :D)
Sanırım en doğru cevap bu oldu. Çünkü Abort tan sonra işlem iptal edilip mevcut procedure den exit ile çıkılmış gibi bir sonuç oluşuyor. Dolaysıyla sonraki satırlar işletilmiyor.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
barol
Üye
Mesajlar: 49
Kayıt: 05 Oca 2005 04:29
Konum: İzmir

Mesaj gönderen barol »

Arkadaşlar ilginiz için hepinize ayrı ayrı teşekkür etmek istiyorum öncelikle. Daha sonrada neden boyle bir koda ihtiyaç duyduğumu anlatayım.Benim kullandıgım ekranda grid üzerinden veri girişi yapıyorum.ve navigator kullanarak insert,delete,update işlemlerini gercekleştiriyorum.Sorun da burada çıkıyor.Ben navigator dan insert tuşuna bastıgımda o anda grid de ki kaydın bir satır üstüne boşkayıt açıyor ama ben sürekli grid in en altına boş kaydın açılmasını istiyorum.Bunu da append kodu ile yapabileceğimi oğrendim.fakat append kodunu da kullandıgımda da post event ını tetikledigini gordum.Umarım neden boyle bir kod yazdıgımı anlatabilmişimdir.Eğer bu istediğim işlemi başka yöntemle yada kodla nasıl yapılacagını bilen arkadaşlar varsa lütfen yardımcı olsun.Herkese tekrardan sonsuz teşekkürler...
Ölümden öteye köy yok!
Cevapla