DBGrid'de ekleme yaparken başka bir table'a da ekleme yapmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

DBGrid'de ekleme yaparken başka bir table'a da ekleme yapmak

Mesaj gönderen PROGRAMADOR »

Merhaba arkadaşlar.

Bir firebird veritabanım var. İçerisinde çeşitli tablolarım var. DBGrid'i autoedit modda açıp verileri grid üzerinden ekleyebiliyorum, düzenleyebiliyorum ve silebiliyorum.

Bir tabloyu DBGrid'e çekip kayıt eklerken ekleme olayı gerçekleştiğinde başka bir tabloya da sql ile nasıl veri ekleyebilirim?
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen Lord_Ares »

Merhaba
1)Veritabanı bileşininde özellekler kısmından append moda girişini yakalayabilir istediğinizi bu kısma yazarak yapabilirsiniz.
2) Diğer basit bir yol ise kayıt ekleme işleminizi bir fonksiyon haline getirin. Çıktısı boolean olsun. Böylece her kayıt eklediğinizde kayıt eklendiyse True eklmendiyse false değeri döndürür. Sizde bu çıkan değere eğer true ise şu veritabanına bunu ekle diyebilirsiniz.
Fikir olarak bir fonksiyon düzenleyip kullanmanız.Çünkü anladığım kadarıyla bir çok tablonuz var oan hangisini çekip veri ekleyeceğiniz konusunda sabitiniz yok. Dolayısı ile kayıt ekleme işlemnizi yapan bir fonksiyon yaparsanız, fonksiyona hangi tabloya, hangi alana gibi bilgileri gönderir kayıt işlemini yaptırırsınız. Size işlem oldu ( true) olmadı (false) şeklinde değer döner sizde buna göre işleminizi yaptırırsınız.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen PROGRAMADOR »

Yapmak istediğim yalnızca grid üzerinde ekleme yapıldığında başka bir tabloya veri ekleyebileyim.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen Lord_Ares »

Gridiniz nereye bağlı >> table , gridinizde herhangi bir değişim olduğunda nereye yansıyor >> Table

Bende diyorum ki Table nızın veya gridinizin özellikler kısmına bakarsanız onchange, onedit,BeforeEdit, Afteredit,afterappend gibi bir çok yönünü göreceksiniz dilerseniz bu kısımları kullanarak veri girişi gerçekleştiği anı yakalar istediğiniz işlemi ( herhangi bir tablo veya tümüne ) yaptırabilirsiniz. Yani table nesnesinin bu özelliğine (örneğin afteredit) yukarıda bahsettiğim gibi fonkisyon ile kayıt ekleme kodunuzu yazarsanız kontrollu bir şekilde dilediğiniz tabloya dilediğiniz şekilde ( sql kodu veya standart kodlama ile ) kayıt ekletebilirsiniz.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen PROGRAMADOR »

grid'in özelliklerinden deneyeceğim. Query'i başka sorgulamalarda da kullanıyorum.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen esistem »

Selam,
Firebird kullanıyorsanız neden bu işi firebird tarafında yapmıyorsunuz? Firebird de tabloların trigger olaylarını kullanın (afterinsert, beforeinsert, afterdelete, beforedelete, afterupdate, beforeupdate)
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen PROGRAMADOR »

Teşekkür ederim yanıt için inceleyeceğim.

Query'nin beforepost eventini aşağıdaki şekilde düzenledim:

Kod: Tümünü seç


procedure TfrmChild.qryBeforePost(DataSet: TDataSet);
var
  tb:TFDTable;
  x:integer;
  Alan:TField;
begin
  x:=1;
  if (tblname='TBKESTIGIMIZFATURALAR') then
      X:=-1//biz fatura kesiyorsak stok azaılıyor
  else if   (tblname='TBBIZEKESILENFATURALAR') then
      x:=1;//bize fatura kesiliyorsa stoğumuz artar

//buraya stok kodlarını ekle
  if (tblname='TBKESTIGIMIZFATURALAR') or
     (tblname='TBBIZEKESILENFATURALAR') then begin

    if DataSet.FieldByName('ID').AsInteger<1 then exit;

    tb:=TFDTable.Create(nil);
    tb.Connection:=uDM.frmDataModule.Conn;
    tb.TableName:='TBSTOK';
    tb.Open;

    if DataSet.State=dsInsert then begin
        tb.Insert;

    end else if DataSet.State=dsEdit then begin
        //tb.Locate('FATURAID',Variant(DataSet.FieldByName('ID').AsInteger),[]);
        tb.First;
        while not tb.eof do begin
            if tb.FieldByName('FATURAID').AsInteger=DataSet.FieldByName('ID').AsInteger then begin
                break;
            end;
            tb.Next;
        end;
        tb.Edit;
    end;

    tb.FieldByName('FATURAID').AsInteger:=DataSet.FieldByName('ID').AsInteger;
    tb.FieldByName('TARIH').AsDateTime:=DataSet.FieldByName('TARIH').AsDateTime;
    tb.FieldByName('MALZEMEADI').AsString:=Dataset.FieldByName('MALZEMEADI').AsString;
    tb.FieldByName('MIKTAR').AsInteger:=(x)*DataSet.FieldByName('MIKTAR').AsInteger;
    tb.FieldByName('TUTAR').AsCurrency:=(-x)*DataSet.FieldByName('TUTAR').AsCurrency;
    tb.FieldByName('FIRMAADI').AsString:=Dataset.FieldByName('FIRMAADI').AsString;
    tb.FieldByName('ACIKLAMA').AsString:=DataSet.FieldByName('ACIKLAMA').AsString;
    tb.Post;
    tb.Close;
    tb.Free;
  end;
end;

Query'den ekleme yapınca table ile önceden kaydettiğim veriyi silip yerine yeni kaydı ekliyor. Sorunun kaynağı neden olabilir?
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen esistem »

Önceki verileri ekledikten sonra commit etmediğiniz için query i close open yaptığınızda boşaltıp yeniden getiriyor olabilir. Ayrıca bu kadar fazla kod yazacağınıza bu işi firebird e devretseniz hiçbir sorun olmadan ve delphi de tek satır kod yazmadan diğer tablolarınızı güncelleyebilirsiniz.
Sorununuzu anladığım kadarı ile aşağıda bir örnek paylaşayım.

Kod: Tümünü seç

UPDATE STOK SET GIREN=GIREN-OLD.giren, CIKAN=CIKAN-OLD.cikan
                WHERE KOD=OLD.stokkodu;

UPDATE STOK SET GIREN=GIREN+NEW.giren, CIKAN=CIKAN+NEW.cikan
                WHERE KOD=NEW.stokkodu;
Yukarıdaki kod STOK_ISLEM tablomun afterupdate trigger'ında yazan kodlardır. update olmadan önceki değerler çıkartılıp, update olduktan sonraki değerler GIREN ve CIKAN alanlarına eklenmektedir.
Not : kodlarınızdan gördüğüm kadarı ile aldığınız ve kestiğiniz faturalar için ayrı ayrı tablo oluşturmuşsunuz, bunun yerine tek bir fatura tablosu oluşturup TURU diye bir alan tanımlayıp, eğer 0 ise alış faturaları eğer 1 ise satış faturalarıdır şeklinde ayarlama yapabilirsiniz.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen PROGRAMADOR »

Dediğiniz gibi tek bir faturalar tablosu yaptım ve trigger oluşturdum.

Kod aşağıda.

Kod: Tümünü seç


procedure CreateTrigger;
begin
  oDBFB.DatabaseQueryExecute(
    'CREATE TRIGGER AUTR FOR TBFATURALAR AFTER UPDATE POSITION 0 AS '+
            'DECLARE VARIABLE X AS INTEGER=1; '+
            'BEGIN '+

                'IF(NEW.TARIH IS NULL)THEN EXIT; '+
                'IF(NEW.ALACAKBORC IS NULL)THEN EXIT; '+
                'IF(NEW.MALZEMEADI IS NULL)THEN EXIT; '+
                'IF(NEW.MIKTAR IS NULL)THEN BEGIN EXIT; '+
                'IF(NEW.TUTAR IS NULL)THEN BEGIN EXIT; '+
                'IF(NEW.FIRMAADI IS NULL)THEN EXIT; '+

                'IF NEW.ALACAKBORC=''A'' THEN X=-1; '+

                'UPDATE TBSTOK SET TARIH =NEW.TARIH, '+
                'MALZEMEADI=NEW.MALZEMEADI, '+
                'MIKTAR=X*NEW.MIKTAR, '+
                'TUTAR=(-X)*NEW.TUTAR '+
                'WHERE FATURAID=NEW.ID'+
                'FIRMAADI=NEW.FIRMAADI, '+
            'END ');

  oDBFB.DatabaseQueryExecute(
    'CREATE TRIGGER AITR FOR TBFATURALAR AFTER INSERT POSITION 0 AS '+
            'DECLARE VARIABLE X AS INTEGER=1; '+
            'BEGIN '+

                'IF(NEW.TARIH IS NULL)THEN EXIT; '+
                'IF(NEW.ALACAKBORC IS NULL)THEN EXIT; '+
                'IF(NEW.MALZEMEADI IS NULL)THEN EXIT; '+
                'IF(NEW.MIKTAR IS NULL)THEN BEGIN EXIT; '+
                'IF(NEW.TUTAR IS NULL)THEN BEGIN EXIT; '+
                'IF(NEW.FIRMAADI IS NULL)THEN EXIT; '+

                'IF NEW.ALACAKBORC=''A'' THEN X=-1; '+

                'INSERT INTO TBSTOK (FATURAID,TARIH,MALZEMEADI,MIKTAR,TUTAR,FIRMAADI) '+
                'VALUES '+
                '(NEW.ID,NEW.TARIH,NEW.MALZEMEADI,NEW.MIKTAR,NEW.TUTAR,NEW.FIRMAADI)'+
            'END ');

end;

Tablolarım şöyle:

Kod: Tümünü seç

//TBSTOK
oDBFB.DatabaseQueryExecute(
      'CREATE TABLE TBSTOK ( '+
      'ID BIGINT NOT NULL PRIMARY KEY'+
      ', FATURAID BIGINT'+
      ', TARIH DATE'+
      ', MALZEMEADI VARCHAR(50)'+
      ', MIKTAR INT'+
      ', TUTAR NUMERIC(18,2)'+
      ', FIRMAADI VARCHAR(50)'+
      ', ACIKLAMA VARCHAR(500) '+
      ');');
SetGenerator('TBSTOK');

//FATURALAR
oDBFB.DatabaseQueryExecute(
      'CREATE TABLE TBFATURALAR ( '+
      'ID BIGINT NOT NULL PRIMARY KEY'+
      ', TARIH DATE'+
      ', ALACAKBORC VARCHAR(1)'+
      ', FIRMAADI VARCHAR(50)'+
      ', MALZEMEADI VARCHAR(50)'+
      ', MIKTAR INT'+
      ', TUTAR NUMERIC(18,2)'+
      ', ACIKLAMA VARCHAR(500) '+
      ');');
SetGenerator('TBFATURALAR');

Bir yanlışlık yoktur umarım.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen esistem »

Selam,
Kodlarına bakınca TBSTOK tablonda ID ve FIRMAADI alanlarını gördüm direk, TBFATURALAR tablonda da FIRMAADI ve MALZEMEADI alanları gözüme çarptı.
Mesela ben senin programında gidip tanımlı bir firmanın adını örneğin "NEJAT" iken onu "NEJAT1" yaparsam büyük ihtimalle TBSTOK tablonda hem "NEJAT" firmasına hemde "NEJAT1" firmasına ait 2 mükerrer kayıt olmayacakmı ? Aynı şekilde MALZEMEADI alanıda böyle bir problemle karşılacaktır.
TBSTOK tablonda gelen fatura id sini FATURAID diye ne güzel oluşturmuşsun, onu referans alarak TBSTOK tablonu istediğin gibi (hiçbir hata olmadan) gelen fatura id si ile ilişkilendirebiliyorken, FIRMAADI ve MALZEMEADI alanların büyük ihtimalle yukarıda bahsettiğim hataya sebep olacaktır (bence). Ayrıca bu tip işlemleri (trigger, stored proc. vs.vs.) sql kodu ile yapmaktansa güzel bir Firebird editoru olan IBEXPERT ile yapsan veritabanına bence daha çok hakim olursun gibime geliyor.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen PROGRAMADOR »

Selam,

Yanıtlarınız için öncelikle teşekkür ederim.

Malzeme ve firma alanlarını listeden seçtiği için kullanıcı o alanlarla ilgili pek sorun çıkmayacaktır.

IBExpert'i hiç kullanmadım ama tavsiyeniz üzerine inceleyeceğim.

Bir de, ben kodu aşağıdaki şekilde düzenledim ama sanırım karşılaştırmada "Ödenmedi" kelimesinde Türkçe karakter olduğu için sorun çıkarıyor. Burada öneriniz nedir?

Kod: Tümünü seç


procedure CreateTrigger;
begin
//INSERT
oDBFB.DatabaseQueryExecute(
  'CREATE TRIGGER AITR FOR TBFATURALAR AFTER INSERT POSITION 0 AS '+
    'DECLARE VARIABLE X_MIKTAR INTEGER; '+
    'BEGIN '+
        'X_MIKTAR = new.MIKTAR; '+

        'IF (lower(NEW.FATURATURU) = ''a'') THEN BEGIN '+ //ALACAK İSE
            'X_MIKTAR = -new.MIKTAR; '+

            'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN '+ //ödenmediyse TBBIZEYAPILACAKODEMELER
                'INSERT INTO TBBIZEYAPILACAKODEMELER (FIRMAADI,TUTAR,ODEMESEBEBI,SEBEPID) '+
                'VALUES '+
                '(NEW.FIRMAADI,NEW.TUTAR,''FATURA'',NEW.ID); '+
            'ELSE '+ //ÖDENDİYSE TBBIZEYAPILANODEMELER
                'INSERT INTO TBBIZEYAPILANODEMELER (TARIH,FIRMAADI,TUTAR,ODEMETURU,ODEMESEBEBI,SEBEPID) '+
                'VALUES '+
                '(CURRENT_DATE,NEW.FIRMAADI,NEW.TUTAR,NEW.ODEMETURU,''FATURA'',NEW.ID); '+

        'END ELSE BEGIN '+   //BORÇ İSE

            'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN '+ //ödenmediyse TBYAPILACAKODEMELER
                'INSERT INTO TBYAPILACAKODEMELER (FIRMAADI,TUTAR,ODEMESEBEBI,SEBEPID) '+
                'VALUES '+
                '(NEW.FIRMAADI,NEW.TUTAR,''FATURA'',NEW.ID); '+
            'ELSE '+ //ÖDENDİYSE /TBFIRMALARAODEMELER
                'INSERT INTO TBFIRMALARAODEMELER (TARIH,FIRMAADI,TUTAR,ODEMETURU,ODEMESEBEBI,SEBEPID) '+
                'VALUES '+
                '(CURRENT_DATE,NEW.FIRMAADI,NEW.TUTAR,NEW.ODEMETURU,''FATURA'',NEW.ID); '+

        'END '+

        //STOĞA İŞLE
        'INSERT INTO TBSTOK (FATURAID,TARIH,MALZEMEADI,MIKTAR,FATURATURU,SEBEPID) '+
        'VALUES '+
        '(NEW.ID,NEW.TARIH,NEW.MALZEMEADI,:X_MIKTAR,NEW.FATURATURU,NEW.ID); '+


    'END; ');

  //UPDATE
  oDBFB.DatabaseQueryExecute(
    'CREATE TRIGGER AUTR FOR TBFATURALAR AFTER UPDATE POSITION 0 AS '+
            'DECLARE VARIABLE X_MIKTAR INTEGER; '+
            'BEGIN '+
                'X_MIKTAR = new.MIKTAR; '+

                 'IF (lower(NEW.FATURATURU) = ''a'') THEN BEGIN '+ //ALACAK İSE
                    'X_MIKTAR = -new.MIKTAR; '+
                     //DAHA ÖNCEDEN ALACAK İSE
                     'IF (lower(OLD.FATURATURU) = ''a'') THEN BEGIN '+
                          'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN '+ //ödenmediyse
                                //BİZE YAPILACAK ÖDEMELERİ GÜNCELLE
                                'UPDATE TBBIZEYAPILACAKODEMELER SET '+
                                'TARIH = CURRENT_DATE, '+
                                'FIRMAADI = new.FIRMAADI, '+
                                'TUTAR = new.TUTAR, '+
                                'ODEMESEBEBI = ''FATURA'' '+
                                'WHERE SEBEPID = new.ID; '+
                          'ELSE '+ //ÖNDEYDİYSE
                                //BİZE YAPILAN ÖDEMELERİ GÜNCELLE
                                'UPDATE TBBIZEYAPILANODEMELER SET '+
                                'TARIH = CURRENT_DATE, '+
                                'FIRMAADI = new.FIRMAADI, '+
                                'TUTAR = new.TUTAR, '+
                                'ODEMETURU = NEW.ODEMETURU, '+
                                'ODEMESEBEBI = ''FATURA'' '+
                                'WHERE SEBEPID = new.ID; '+
                     'END ELSE BEGIN '+   //DAHA ÖNCEDE BORÇ İSE
                          'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN BEGIN '+ //ödenmediyse
                                'INSERT INTO TBBIZEYAPILACAKODEMELER (FIRMAADI,TUTAR,ODEMESEBEBI,SEBEPID) '+
                                'VALUES '+
                                '(NEW.FIRMAADI,NEW.TUTAR,''FATURA'',NEW.ID); '+

                                'DELETE FROM TBYAPILACAKODEMELER '+
                                'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                          'END ELSE BEGIN '+ //ÖNDEYDİYSE
                                'INSERT INTO TBBIZEYAPILANODEMELER (TARIH,FIRMAADI,TUTAR,ODEMETURU,ODEMESEBEBI,SEBEPID) '+
                                'VALUES '+
                                '(CURRENT_DATE,NEW.FIRMAADI,NEW.TUTAR,NEW.ODEMETURU,''FATURA'',NEW.ID); '+

                                'DELETE FROM TBBIZEYAPILANODEMELER '+
                                'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                          'END '+
                     'END '+

                 'END ELSE BEGIN '+   //BORÇ İSE
                     //DAHA ÖNCEDEN ALACAK İSE
                     'IF (lower(OLD.FATURATURU) = ''a'') THEN BEGIN '+
                            'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN BEGIN '+ //ödenmediyse
                                'INSERT INTO TBYAPILACAKODEMELER (FIRMAADI,TUTAR,ODEMESEBEBI,SEBEPID) '+
                                'VALUES '+
                                '(NEW.FIRMAADI,NEW.TUTAR,''FATURA'',NEW.ID); '+

                                'DELETE FROM TBBIZEYAPILACAKODEMELER '+
                                'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                            'END ELSE BEGIN '+  //ÖNDENDİYSE
                                'INSERT INTO TBFIRMALARAODEMELER (TARIH,FIRMAADI,TUTAR,ODEMETURU,ODEMESEBEBI,SEBEPID) '+
                                'VALUES '+
                                '(CURRENT_DATE,NEW.FIRMAADI,NEW.TUTAR,NEW.ODEMETURU,''FATURA'',NEW.ID); '+

                                'DELETE FROM TBBIZEYAPILANODEMELER '+
                                'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                            'END '+
                     'END ELSE BEGIN '+  //DAHA ÖNCEDEN BORÇ İSE
                            'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN '+ //ödenmediyse
                                'UPDATE TBYAPILACAKODEMELER SET '+
                                'TARIH = CURRENT_DATE, '+
                                'FIRMAADI = new.FIRMAADI, '+
                                'TUTAR = new.TUTAR, '+
                                'ODEMESEBEBI = ''FATURA'' '+
                                'WHERE SEBEPID = new.ID; '+
                            'ELSE '+//ÖNDENDİYSE
                                'UPDATE TBFIRMALARAODEMELER SET '+
                                'TARIH = CURRENT_DATE, '+
                                'FIRMAADI = new.FIRMAADI, '+
                                'TUTAR = new.TUTAR, '+
                                'ODEMETURU = NEW.ODEMETURU, '+
                                'ODEMESEBEBI = ''FATURA'' '+
                                'WHERE SEBEPID = new.ID; '+
                     'END '+

                 'END '+

                //ALACAK DA OLSA BORÇ DA OLSA STOĞA İŞLE
                'UPDATE TBSTOK SET '+
                'TARIH = new.TARIH, '+
                'MALZEMEADI = new.MALZEMEADI, '+
                'MIKTAR = :X_MIKTAR, '+
                'FATURATURU = new.FATURATURU '+
                'WHERE FATURAID=new.ID; '+
            'END;');


  oDBFB.DatabaseQueryExecute(
    'CREATE TRIGGER BDELTR FOR TBFATURALAR BEFORE DELETE POSITION 0 AS '+
            'BEGIN '+
                'DELETE FROM TBSTOK WHERE FATURAID = OLD.ID; '+
                'DELETE FROM TBBIZEYAPILANODEMELER '+
                    'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                'DELETE FROM TBBIZEYAPILACAKODEMELER '+
                    'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                'DELETE FROM TBYAPILACAKODEMELER '+
                    'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
                'DELETE FROM TBFIRMALARAODEMELER '+
                    'WHERE SEBEPID = OLD.ID AND ODEMESEBEBI = ''FATURA''; '+
            'END;');
end;
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme ya

Mesaj gönderen esistem »

Merhaba,
IBExpert i şiddetle tavsiye ederim, deneyin mutlaka memnun kalırsınız.
Türkçe karakter olayına gelince,
Kesinlikle firebird veritabanı içersinde stored procedure, trigger, view vs.vs. yazarken türkçe karakter kullanmayın. Büyük sorunlar yaşayabilirsiniz. Versiyon yükseltmede özellikle. Hatta açıklama alanlarında dahi türkçe karakter kullanmayın. Belki konu hakkında uzman üstadlarımız türkçe karakter ile ilgili daha detaylı açıklama yapar fakat ben büyük problem yaşadığım için asla kullanmam.
Birde açıklamaları şu şekilde yaparsanız sorun kalmaz sanırım.

Kod: Tümünü seç

'IF (NEW.ODEMETURU = ''Ödenmedi'') THEN '+ /* ödenmediyse TBBIZEYAPILACAKODEMELER */
çift kesme delphi de açıklama alanı için kullanılır, firebird de /* aciklama */ şeklinde kullanın.
Birde sizin tablo yapınız bana çok garip geliyor. Ben hiçbir zaman string ifadeleri referans almam, herhangi bir tabloda cinsi, turu, odeme durumu vs.vs. gibi alanları daima integer yada small integer olarak kullanırım.
mesela;
FAT_ACIKKAPALI smallint = 0 ise açık, 1 ise kapalı.
FAT_ALISSATIS smallint = 0 ise alış, 1 ise satış.
FAT_TOPPER smallint = 0 ise toptan, 1 ise perakende.
FAT_MALHIZMET smallint = 0 ise mal, 1 ise hizmet, 2 ise taahhüt.
FAT_CARIKODU integer = Cari hesabın ID si (KODU) ile ilişkilendir.
FAT_STOKKODU integer = Stoğun ID si (KODU) ile ilişkilendir.
vs. vs. gibi.
Sorgularda String karakterlerin filtrelenmesi integer yada float alanlara göre çok daha uzun sürer.
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DBGrid'de ekleme yaparken başka bir table'a da ekleme yapmak

Mesaj gönderen PROGRAMADOR »

Merhaba,

Dediğiniz gibi string ile ilişkilendirme yerine, integer kullanmayı seçtim.

Fakat bu sefer de dbgridde stringleri değil id'yi gösteriyor. Query'nin beforpost ve aftergetrecord procedürlerini karıştırdım ama sonuca varamadım.

Tablolar şöyle:

Kod: Tümünü seç

//İŞÇİ MESLEKLERİ
oDBFB.DatabaseQueryExecute(
      'CREATE TABLE '+tbiscimeslekleri+' ( '+
      'ID BIGINT NOT NULL PRIMARY KEY'+
      ', MESLEKADI VARCHAR(100)'+
      ', ACIKLAMA VARCHAR(500) '+
      ');');
 //İŞÇİLER
oDBFB.DatabaseQueryExecute(
      'CREATE TABLE '+tbisciler+' ( '+
      'ID BIGINT NOT NULL PRIMARY KEY'+
      ', ISCIADSOYAD VARCHAR(100)'+
      ', TCNO VARCHAR(11) '+
      ', MESLEKID BIGINT'+
      ', ACIKLAMA VARCHAR(500) '+
      ');');     
Gördüğünüz gibi MESLEKID integer.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Cevapla