Yorumları: 1.460
Konuları: 80
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 11.868 Üstad
Beni mahçup ediyorsunuz, basit bir malümat idi sadece. Allah herkesten razı olsun.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
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
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
29-11-2018, Saat: 15:33
(Son Düzenleme: 29-11-2018, Saat: 15:33, Düzenleyen: SimaWB.)
GonderenNo ve PersonelNo. İki ayrı parametreye gerek yok gibi gözüküyor.
There's no place like 127.0.0.1
Yorumları: 230
Konuları: 5
Kayıt Tarihi: 22-10-2018
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.2
- Delphi 10.1
- Delphi 7
- Lazarus / FPC
Rep Puanı: 1.793 Programcı
(29-11-2018, Saat: 13:45)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: 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
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)));
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
29-11-2018, Saat: 19:25
(Son Düzenleme: 29-11-2018, Saat: 19:26, Düzenleyen: TescilsizUzman.)
(29-11-2018, Saat: 15:33)SimaWB Adlı Kullanıcıdan Alıntı: GonderenNo 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?
Yorumları: 231
Konuları: 12
Kayıt Tarihi: 06-07-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.178 Programcı
Belki de ana görev tablosundaki alanları yeniden düzenlemek gerekebilir.
Bazı projelerde aşırı normalizasyon iyi değil.
|