Senaryoyu oturtamadım..(çözüldü)

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
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Senaryoyu oturtamadım..(çözüldü)

Mesaj gönderen aLonE CoDeR »

Merhaba.
Başlıkta kısaca izah ettiğim gibi üç tablodan SP ile kartezyen sonuç döndürmeye çalışıyorum fakat senaryoda bi eksiklik var sanırım öncelikle sizin fikirlerinizi almak istiyorum.Şöyle ki;

Elimizdeki veriler;

Kod: Tümünü seç

Personel           İşlemTuru      İşlem
---------------------------------------------------
PersonelNo        Depo            İşlemTarihi
PersonelKodu      Büro            İşlemTuru
PersonelAdı                       Personelno

Almak istediğim sonuç (Verilen bir tarih için);

Kod: Tümünü seç

Personel             Depo        Büro     Toplam
---------------------------------------------------
Ahmet                  10         8           18
Mehmet                  6         0            6
Hüseyin                 0         0            0
gibi..

Fikirleriniz için şimdiden teşekkürler..
En son aLonE CoDeR tarafından 11 May 2005 05:35 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

SP'ye gerek kalmadan SQL ile yapılacak bir sorgu değil mi?

İşlem tablosunu seçip diğer tabloları inner join ile ekleyip alt toplam ve genel toplam da aldırabilirsin.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Evet bu konuyu ben de düşündüm ancak özellikle işlemtürü tablosunun verileri sütun halinde olması gerekli..Ve hiç kaydı olmayan personeli null olarak döndürebilmeli...
Fikir için teşekkürler..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bLue aLonE yazdı:Ve hiç kaydı olmayan personeli null olarak döndürebilmeli...
bunu sağlayabilmek için left join veya right join (duruma göre) kullanabilirsiniz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Özdemir
Üye
Mesajlar: 21
Kayıt: 18 Oca 2004 02:57
Konum: istanbul

öncelikle..

Mesaj gönderen Özdemir »

selamlar...
öncelikle tabloları o şekilde tasarlamazdım ben olsam. yani büro mu depo diye bir tablo tutmazdım . o nun yerine hareket tabloma bir alan açardım.bürdanmı depodanmı gibi. bu şekilde çalıştırıcaım sorguyu düşünürdüm. tabi sizin işinize karışmak istemem. olayı tam bilmiyorum..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Hocam yazdığım SP'yi (senaryosu eksik olan kodları) yazayım en iyisi..

Kod: Tümünü seç

CREATE PROCEDURE SP_WSUPP_CHECK (
    IN_TRANSDATE DATE)
RETURNS (
    EMPNO INTEGER,
    EMPCODE VARCHAR(20),
    EMPNAME VARCHAR(50),
    SUPPTYPECOUNT INTEGER)
AS
begin
  for
     select E.EmpNo, E.Code, E.FirstName || E.LastName
      from EMPLOYEE E
      where IsActive='T'
      into :EmpNo, :EmpCode, :EmpName
  do begin
    for
      Select Count(ST.Code)
      from SUPPTYPE ST
      inner join SUPPTRANS STR on (ST.Code=STR.SuppType)
      left outer join EMPLOYEE E on (E.EmpNo=STR.AmonTeamNo)
      where TransDate=:In_TransDate
      into :SUPPTYPECOUNT 
    do
  suspend;
     SuppTypeCount = 0;
 end
end
Burada asıl takıldığım konu; işlem tiplerine göre sonuç döneceği için (bu alanlar kolon halinde görüneceği için) ayrı bir "for select" işlemi uygulamak ya da onun yerine nasıl bir teknik kullanmam gerektiğini kestirememek..
Özdemir yazdı:yani büro mu depo diye bir tablo tutmazdım . o nun yerine hareket tabloma bir alan açardım.bürdanmı depodanmı gibi.
Hocam dikkat ederseniz işlem tablosunda işlem türü var ve zaten FK bağlantı var..

İlginiz için teşekkürler..
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Oracle da DECODE ile , burada ise sanırım CASE ile yapabilirsiniz. Ben decode lu örneği vereyim;

Kod: Tümünü seç

SELECT   empno, code, NAME, SUM (depo) depo, SUM (buro) buro,
         SUM (toplam) toplam
    FROM (SELECT e.empno empno, e.code code,
                 e.firstname || ' ' || e.lastname NAME,
                 DECODE (str.supptype, 'DEPO', 1, 0) depo,
                 DECODE (str.supptype, 'DEPO', 0, 1) buro, 1 toplam
            FROM supptrans str, employee e
           WHERE e.empno = amonteamno)
GROUP BY empno, code, NAME
Eksiklikleri, buro ve depo sabit durumda. Değişken miktarda kolon oluşması durumunda problem olacaktır. Tarih sınırı eklenmemiştir ve tablolar üzerinde çalıştırılmamıştır doğal olarak.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Hocam ilginiz için teşekkür ederim..Benzer bir yapıyla ve iki SP kullanarak çözdüm olayı, birkaç rütuş kaldı.
Kolay gelsin.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

senaryoyu oturtamadım..

Mesaj gönderen aLonE CoDeR »

Kod: Tümünü seç

CREATE PROCEDURE NEW_PROCEDURE (
    IN_TRANSDATE DATE)
RETURNS (
    EMPNO INTEGER,
    CODE VARCHAR(20),
    VCONS INTEGER,
    VTEL INTEGER,
    VWEB INTEGER,
    VCENTER INTEGER,
    ISLEMTURU VARCHAR(10),
    TRANSDATE DATE)
AS
begin
  for
    Select E.EmpNo, Code
    from EMPLOYEE E
    where E.IsActive='T'
    into :EmpNo, :Code
  do
  begin
    for
      select Code
      from SUPPTYPE
      into :IslemTuru
    do
    begin
      TransDate=:IN_TransDate;
      /* karşılaştırmalar..*/
      if (islemturu = 'Depo') then
      begin
        Select *
        from sp_wsupp_count(:EmpNo, :IslemTuru, :in_TransDate)
        where (SuppCount > 0) and not (SuppCount is null)
        into :vCons      end
      if (islemturu = 'Büro') then
      begin
        Select Count(*)
        from sp_wsupp_count(:EmpNo, :IslemTuru, :in_TransDate)
        where (SuppCount > 0) and not (SuppCount is null)
        into :vCenter
      end
     /*karşılaştırma sonu..*/
      if (vCons > 0 or vCenter > 0
       and not (vCons   is null)
       and not (vCenter is null))
      then
      begin
        suspend;
      end
    end/*for select SuppType*/
  suspend;
     vCons =0;
     vTel = 0;
     vWeb = 0;
     vCenter = 0;
  end/*for select employee*/
end
"sp_wsupp_count(:EmpNo, :IslemTuru, :in_TransDate)" bu SP'den doğru sonuç dönmesine rağmen kimi personele fazla kimine eksik atama yapıyor, senaryoda gözümden kaçan bişey var ama hala çözemedim..Suspend'den sonraki sıfırlamalarda bi hata mı var acaba?

İlginiz için teşekkürler..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Değişken tanımlayarak çözdüm olayı, ilgilenen arkadaşlara teşekkürler..
Cevapla