Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Where Alanını If İçerisinde Kullanmak
#21
Case ile de yapılabiliyormuş. 
Son halini paylaşayım. 
CREATE OR REPLACE FUNCTION "gorev_takip"."sp_gorevlerim2" ( "sorguId" int2, "GonderenNo" int8, "PersonelNo" int8 ) 
	RETURNS TABLE (
		"Gorevid" int8,
		"GorevTuru" VARCHAR,
		"Ack" VARCHAR,
		"Tarih" DATE,
		"Saat" TIME,
		"GonderenId" int8,
		"EkipAd" VARCHAR,
		"gonderen" VARCHAR,
		"Son_Durum" VARCHAR,
		"Orani" int2 
		) AS $BODY$ 
		BEGIN
		
		RETURN query 
		SELECT DISTINCT( gr."ID" ),
	  	gt."AD" AS "GOREV_TURU",
		  gr."ACK",
	  	gr."TARIH",
	  	gr."SAAT",
	  	gr."GONDEREN_ID",
	  	ekp."EKIP_AD",
	  	per."AD_SOYAD" AS "GONDEREN",
	  	gd."AD" AS "SON_DURUM",
	  	gd."ORAN" 
	FROM
		gorev_takip."GOREV" AS gr
		INNER JOIN gorev_takip."GOREV_PERSONEL" AS gper ON gper."GOREV_ID" = gr."ID"
		INNER JOIN gorev_takip."KOD_GOREV_TURU" AS gt ON gr."GOREV_TUR_ID" = gt."ID"
		LEFT JOIN gorev_takip."EKIP" AS ekp ON gr."EKIP_ID" = ekp."ID"
		INNER JOIN gorev_takip."KOD_GOREV_DURUM" AS gd ON gr."SON_DURUM_ID" = gd."ID"
		INNER JOIN gorev_takip."PERSONEL" AS per ON gr."GONDEREN_ID" = per."ID" 
	WHERE
	CASE
			WHEN "sorguId" = 1 THEN ( 1 = 1 ) 
			WHEN "sorguId" = 2 THEN ( gr."GONDEREN_ID" = "GonderenNo" ) 
			WHEN "sorguId" = 3 THEN ( gper."PERSONEL_ID" = "PersonelNo" ) 
		END 
	ORDER BY
			gr."TARIH" DESC,
			gr."SAAT" DESC;
	
	END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#22
GonderenNo ve PersonelNo. İki ayrı parametreye gerek yok gibi gözüküyor.
There's no place like 127.0.0.1
WWW
Cevapla
#23
(29-11-2018, Saat: 13:45)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlCase ile de yapılabiliyormuş. 
Son halini paylaşayım. 
CREATE OR REPLACE FUNCTION "gorev_takip"."sp_gorevlerim2" ( "sorguId" int2, "GonderenNo" int8, "PersonelNo" int8 ) 
 RETURNS TABLE (
 "Gorevid" int8,
 "GorevTuru" VARCHAR,
 "Ack" VARCHAR,
 "Tarih" DATE,
 "Saat" TIME,
 "GonderenId" int8,
 "EkipAd" VARCHAR,
 "gonderen" VARCHAR,
 "Son_Durum" VARCHAR,
 "Orani" int2 
 ) AS $BODY$ 
 BEGIN
 
 RETURN query 
 SELECT DISTINCT( gr."ID" ),
   gt."AD" AS "GOREV_TURU",
  gr."ACK",
   gr."TARIH",
   gr."SAAT",
   gr."GONDEREN_ID",
   ekp."EKIP_AD",
   per."AD_SOYAD" AS "GONDEREN",
   gd."AD" AS "SON_DURUM",
   gd."ORAN" 
 FROM
 gorev_takip."GOREV" AS gr
 INNER JOIN gorev_takip."GOREV_PERSONEL" AS gper ON gper."GOREV_ID" = gr."ID"
 INNER JOIN gorev_takip."KOD_GOREV_TURU" AS gt ON gr."GOREV_TUR_ID" = gt."ID"
 LEFT JOIN gorev_takip."EKIP" AS ekp ON gr."EKIP_ID" = ekp."ID"
 INNER JOIN gorev_takip."KOD_GOREV_DURUM" AS gd ON gr."SON_DURUM_ID" = gd."ID"
 INNER JOIN gorev_takip."PERSONEL" AS per ON gr."GONDEREN_ID" = per."ID" 
 WHERE
 CASE
 WHEN "sorguId" = 1 THEN ( 1 = 1 ) 
 WHEN "sorguId" = 2 THEN ( gr."GONDEREN_ID" = "GonderenNo" ) 
 WHEN "sorguId" = 3 THEN ( gper."PERSONEL_ID" = "PersonelNo" ) 
 END 
 ORDER BY
 gr."TARIH" DESC,
 gr."SAAT" DESC;
 
 END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000

Bence Where kısmı şu şekilde olmalı
WHERE
  (sorguId = 1) or (sorguId = 2 and gr."GONDEREN_ID = "GonderenNo") or (sorguId = 3 and gper."PERSONEL_ID" = "PersonelNo")

Tablolar bende olmadığı için bunu deneyemedim ancak başka bir tablo üzerinde şu şekilde çalışıyor
create Schema fin;
create table fin.Employee(
EmployeeId int4 not null primary key,
FirstName varchar(30),
LastName varchar(30),
Department bigint,
JobId bigint
);

insert into fin.Employee(EmployeeId, FirstName, LastName, Department, JobId) values (1, 'Ahmet', 'Kerim', 1, 1);
insert into fin.Employee(EmployeeId, FirstName, LastName, Department, JobId) values (2, 'Mehmet', 'Hancı', 1, 2);
insert into fin.Employee(EmployeeId, FirstName, LastName, Department, JobId) values (3, 'Kerem', 'Genco', 2, 1);
insert into fin.Employee(EmployeeId, FirstName, LastName, Department, JobId) values (4, 'Kamil', 'Tırpan', 2, 2);

create function fin.SelectEmployee_ByDeptJob2(Parametre integer, ParamValue character(30))
returns Table
( EmployeeId integer,
  FirstName varchar(30),
  LastName varchar(30),
  Department bigint,
  JobId bigint
)
as $$
Begin
  return query 
    select * from Employee as e where (Parametre=0 or Parametre=null) or 
          (Parametre=1 and e.Department=Cast(ParamValue as bigint)) or 
  (Parametre=2 and e.JobId=Cast(ParamValue as bigint)) or
  (Parametre=3 and e.FirstName=Cast(ParamValue as varchar(30))) or
  (Parametre=2 and e.LastName=Cast(ParamValue as varchar(30)));
end
$$ LANGUAGE plpgsql COST 100 VOLATILE ROWS 1000;

select * from fin.SelectEmployee_ByDeptJob2(Cast(3 as integer), Cast('Ahmet' as character(30)));
  
select * from fin.SelectEmployee_ByDeptJob2(Cast(2 as integer), Cast(1 as character(30)));
Cevapla
#24
(29-11-2018, Saat: 15:33)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlGonderenNo ve PersonelNo. İki ayrı parametreye gerek yok gibi gözüküyor.

Mevcut mekanizmada, görev dağılımı yapılıyor. Görev gönderen kişi aynı zamanda görev de alabilir.
Bu sisteme bir personel kendine atanan görevleri görmek isteyebilir veya kendisinin gönderdiği görevleri listelemek isteyebilir. Bu durumda işi tek bir fonksiyon ile hallederim dedim. 
PersonelNo var ise personel Id barındırır. GonderenNo var ise yine bir personel Id barındırır. Farklı bir tabloda görev gönderen kişi Id'sini barındırır.
Bu durumda yalnızca personel tipini içeren sayısal bir değer gönderilirse (GonderenNo ve PersonelNo'nun olmadığı bir yapıda) ve bu -1 ise birinci durumu (Tüm kayıtları listelemek) gerçekleştirebilirim. Gelen değer -1 değilse bir personel olduğunu da var sayarak işlem yapabilirim. Fakat bu bir personel no'su ise iki ve üçüncü koşulumu nasıl ayırt edebilirim. Yani bu id bir görev alan mı yada görev gönderen mi?
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#25
Belki de ana görev tablosundaki alanları yeniden düzenlemek gerekebilir.

Bazı projelerde aşırı normalizasyon iyi değil.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi