VERI TABANINDA AYRI ID'LERE SAYAC

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

VERI TABANINDA AYRI ID'LERE SAYAC

Mesaj gönderen true_false »

merhabalar sorum şudur
ilgili table alanlarım
TABLE USERS

Kod: Tümünü seç

USER_ID(PK)-USER_NAME-PASSWORD-MOBILE_PHONE-*********(VS)
     1                ALİ                111         05555555         ******
     2                veli                121         05555555         *******
     3                4950              222         00055555         *******
YAPMAK İSTEDİĞİM..
program server üzerinden çalışan çeşitli kullanıcıların girdiği birbirlerine mesaj attığı bir program benim ise yapmak istediğim kullanıcıların birbirlerine gönderdiği mesajların sayısını tutacak. ilk önceleri bunu programdan halletmeye çalıştım ama beni çok oyalacağını düşündüm ve bu işi veri tabanından halletmeye çalışıyordum tıkandım
1.sorum:
bunu yapmak için veri tabanına ayrı bir table açayımmı yoksa bu işlemi TABLE_USERS tablemin içine ilgili bir field(s) açsam olurmu...
2.sorum:(ESAS SORU)
kullanıcıların ayrı ıd leri ve ayrı ayrı gönderdikleri mesajlar var bunları ayrı ayrı tautabilmem için yazacağım triger(s) geb(n)erator(s) olacakmı olacaksa

Kod: Tümünü seç

AS
BEGIN
  IF (NEW.USER_ID IS NULL) THEN //deneme
    NEW.USER_ID = GEN_ID(GEN_SOLARIS_USERS,1);//deneme
  NEW.record_date_time = current_timestamp;//deneme
END

gibimi olacak
son olarak
bu iş böle olmaz sana tavsiyem şudur.... mu diyeceksiniz?
not şimdiden göndermiş olduğunuz güzel cevaplar için 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 »

bence ayri tabloya gerek yok... USERS tablosuna MESAJ_SAYISI diye default 0 olan bir alan ekleyip MESAJ tablosunun insert trigger'inda ilgili kullanıcının MESAJ_SAYISI alanını 1 arttirip, Delete trigger'inda da 1 azaltirsanız ihtiyaç görülür....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

S.A
programın admin paneli olacak oradan yeni kullanıcılar eklenecek yani sonuç olarak fatih diye giren kullanıcı atıığı toplam mesajları görecek mehmet diye giren kullanıcı atıığı toplam mesaj sayısını görecek benim anladığım kadarıyla sizin anlatmak ve bana yardımcı omak istediğiniz konu bütün kullanıcıların attığı toplam mesaj eğer yanlış anladıysam daha açık bi şekilde izah edebilirmisiniz
kolay gelsin ii çalışmalar..
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Hayır bütün kullanıcıların attığı toplam mesajdan bahsetmiyorum... Her kullanıcının attıgı meaj sayısını ayrı ayrı tutabilirsiniz...
Yapmanız gereken USERS tablosuna MESAJ_SAYISI diye default 0 olan bir alan ekleyip MESAJ tablosunun insert trigger'inda da o an mesaj atan kullanıcının numarasını bildiginiz icin o numaraya ait USERS tablosundaki kayıttaki MESAJ_SAYISI alanını arttiracaksiniz....
Genel olarak bu tür amaçlar için trigger kullanım teknikleri konusunda bu makaleden istifade edebilirsiniz...
viewtopic.php?t=644&highlight=
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

hocam tekrar merhabalar (biraz ara verdim kusura bakma)
dediğiniz işlemi yaptım
yalnız ben size şöle anlatayım message tablosuna message_count diye bir alan açtım (integer ) message_count diye bir genarator oluşturdum.
message tablosunun before insert trigrina şu kodu yazdım

Kod: Tümünü seç

AS
BEGIN
  IF (NEW.SMB_ID IS NULL) THEN
    NEW.SMB_ID = GEN_ID  (GEN_SOLARIS_MESSAGE_BOARD,1);
    NEW.record_date_time = current_timestamp;
    NEW.message_count = gen_id (gen_message,1);
end
dediğim gibi toplam mesajları alıyor makalenizi inceledim stok giriş çıkışını bizzat uyguladım fakat bu sorunu çözemedim
type
Tform1 = class(Tform)
Misafir

Mesaj gönderen Misafir »

sayın true_false;
fahrettin yazdı: Yapmanız gereken USERS tablosuna MESAJ_SAYISI diye default 0 olan bir alan ekleyip MESAJ tablosunun insert trigger'inda da o an mesaj atan kullanıcının numarasını bildiginiz icin o numaraya ait USERS tablosundaki kayıttaki MESAJ_SAYISI alanını arttiracaksiniz...
burdan yola çıkarak, user_id nerde?
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

en sonunda netten yaptığım araştırmalarla sql view diye bişiy buldum
bunun sonucunda şu kodu yazarak işim halloldu

Kod: Tümünü seç

ALTER PROCEDURE PROC_MESSAGE_COUNT (
    SENDER_ID INTEGER)
RETURNS (
    COUNT_SENDER INTEGER)
AS
BEGIN
  FOR
    SELECT COUNT( SOLARIS_MESSAGE_BOARD.SMB_ID )
    FROM SOLARIS_MESSAGE_BOARD
    WHERE 
       (
          (SOLARIS_MESSAGE_BOARD.SMB_SENDER_ID =:SENDER_ID)
       )
    INTO :COUNT_SENDER
  DO
  BEGIN
    SUSPEND;
  END
END

bu kodu procedure olarak verdim ama ufak bi sorun delphide bu kodu nasıl çalıştıracağım ii çalışmalar
type
Tform1 = class(Tform)
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

arkadaşlar sorun çok büyük sorumluluk haline geldi verdiğiniz ip uçlarından yolaçıkarak bişeyler yapmaya çalıştım interbasede sql kod yazmak için kolaylık sunan querybuilder'ı keşfettim ve en sonunda işime yarayan bir stored procedure oluşturdum ama bu procedurü delphide uygulayamıyom bana bu konuda yardımcı olursanız sevinirim proceduru yıkarıda yazdım ama bidaha yazayım çalıştırdığım zaman bana istediğim sonucu veriyo hepinize teşekkür ederim. ii çalışmalar.

Kod: Tümünü seç

ALTER PROCEDURE PROC_MESSAGE_COUNT (
    SENDER_ID INTEGER)
RETURNS (
    COUNT_SENDER INTEGER)
AS
BEGIN
  FOR
    SELECT COUNT( SOLARIS_MESSAGE_BOARD.SMB_ID )
    FROM SOLARIS_MESSAGE_BOARD
    WHERE 
       (
          (SOLARIS_MESSAGE_BOARD.SMB_SENDER_ID =:SENDER_ID)
       )
    INTO :COUNT_SENDER
  DO
  BEGIN
    SUSPEND;
  END
END
type
Tform1 = class(Tform)
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

bu soruya cevap gelmedi ama araştırmalar ve karıştırmalar sonucu bana lazım olan kodu öğrendim şimdide sizinle paylaşayım işte kod.

Kod: Tümünü seç

 
              DM.CDS_FOLLUK.Close;
               DM.CDS_FOLLUK.CommandText := 'SELECT COUNT (ss.SMB_ID) AS AHMET FROM SOLARIS_MESSAGE_BOARD SS WHERE SS.SMB_SENDER_ID = '+INTtOSTR(Dm.fSenderId)+'';
               DM.CDS_FOLLUK.Open;
               If DM.CDS_FOLLUK.RecordCount > 0 then
               LBL_TOTAL.Caption := IntTostr(DM.CDS_FOLLUK.FieldByName('AHMET').Value);
ilginize ve alakanıza teşekkür ederim
type
Tform1 = class(Tform)
Cevapla