hikaye kısaca şudur:
müşterinin daha önceden aldığı fiyatları tefe değerlerine göre güncel fiyat bilgisine çevirmemiz gerekiyordu. müşteri daha önceden bu işi excell ortamında manuel olarak yapıyordu.her ay açıklanan tefe bilgilerini
"yıl-ocak-şubat-mart-nisan-mayıs-haziran-temmuz-ağustos-eylül-ekim-kasım-aralık" formatındaki bir excele giriyorlardı. daha sonra güncellemek istedikleri fiyat bilgisi için ilgili ayla son tefe bilgisini bir formule tabi tutup bir çarpan buluyorlardı. şöyle ki:
tefe_çarpanı=(son_tefe_degeri / ilk_tefe_degeri) * 100 - 100
ardından bu çarpanı kullanarak güncel fiyat bilgisine ikinci bir formülle ulaşıyorlardı.
oda şudur :
guncel_fiyat:= eski_fiyat + (eski_fiyat* tefe_çarpanı)/ 100
bu bilgiler ışığında benim olayı programatize etmem gerekiyordu. formüller v.s. kolay fakat insanları verileri alıştıkları şekilde
"yıl-ocak-şubat-mart-nisan-mayıs-haziran-temmuz-ağustos-eylül-ekim-kasım-aralık"
kolon dizilimiyle görüp değiştirmelerini istiyordum. ve de bunu formsda yapmalıydım:)
biraz araştırma birazda kasma neticesinde bulduğum yol şudur.
--tefe değerlerinin tutulacağı tablo
CREATE TABLE STN_TEFE_DEGERLERI (
YIL NUMBER(4),
AY NUMBER(4),
DEGER NUMBER(22,6)
)
/
--index güzeldir:)
CREATE UNIQUE INDEX STN_TEFE_NDX ON STN_TEFE_DEGERLERI (
YIL ASC,
AY ASC
);
--bu da kullanıcılaın ekranda görecekleri şekilde ayarlanmış view
CREATE OR REPLACE FORCE VIEW satinalma.stn_v_tefe_deger (yil,
ocak,
subat,
mart,
nisan,
mayis,
haziran,
temmuz,
agustos,
eylul,
ekim,
kasim,
aralik
)
AS
SELECT yil, (SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 01) ocak,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 02) subat,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 03) mart,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 04) nisan,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 05) mayis,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 06) haziran,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 07) temmuz,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 08) agustos,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 09) eylul,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 10) ekim,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 11) kasim,
(SELECT deger
FROM stn_tefe_degerleri r
WHERE r.yil = td.yil AND ay = 12) aralik
FROM stn_tefe_degerleri td
GROUP BY yil;
ardından klasik wizardlarla view 'imi forma koydum. kullanıcı istediği şekilde görebiliyordu veriyi. bundan sonraki adımda atraksiyon başlıyor.bu form üzerinde kayıt ekleme,silme ve güncelleme... bunun için de üç ayrı procedure yazdım package ımın içine koydum.şöyleki;
PROCEDURE stn_p_tefe_insert (
p_yil NUMBER,
p_ocak NUMBER,
p_subat NUMBER,
p_mart NUMBER,
p_nisan NUMBER,
p_mayis NUMBER,
p_haziran NUMBER,
p_temmuz NUMBER,
p_agustos NUMBER,
p_eylul NUMBER,
p_ekim NUMBER,
p_kasim NUMBER,
p_aralik NUMBER
)
IS
BEGIN
IF p_ocak IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 01, p_ocak
);
END IF;
IF p_subat IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 02, p_subat
);
END IF;
IF p_mart IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 03, p_mart
);
END IF;
IF p_nisan IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 04, p_nisan
);
END IF;
IF p_mayis IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 05, p_mayis
);
END IF;
IF p_haziran IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 06, p_haziran
);
END IF;
IF p_temmuz IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 07, p_temmuz
);
END IF;
IF p_agustos IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 08, p_agustos
);
END IF;
IF p_eylul IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 09, p_eylul
);
END IF;
IF p_ekim IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 10, p_ekim
);
END IF;
IF p_kasim IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 11, p_kasim
);
END IF;
IF p_aralik IS NOT NULL
THEN
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 12, p_aralik
);
END IF;
END;
PROCEDURE stn_p_tefe_update (
p_yil NUMBER,
p_ocak NUMBER,
p_subat NUMBER,
p_mart NUMBER,
p_nisan NUMBER,
p_mayis NUMBER,
p_haziran NUMBER,
p_temmuz NUMBER,
p_agustos NUMBER,
p_eylul NUMBER,
p_ekim NUMBER,
p_kasim NUMBER,
p_aralik NUMBER
)
IS
BEGIN
IF p_ocak IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 01, p_ocak
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_ocak
WHERE yil = p_yil AND ay = 01;
end;
END IF;
IF p_subat IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 02, p_subat
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_subat
WHERE yil = p_yil AND ay = 02;
end;
END IF;
IF p_mart IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 03, p_mart
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_mart
WHERE yil = p_yil AND ay = 03;
end;
END IF;
IF p_nisan IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 04, p_nisan
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_nisan
WHERE yil = p_yil AND ay = 04;
end;
END IF;
IF p_mayis IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 05, p_mayis
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_mayis
WHERE yil = p_yil AND ay = 05;
end;
END IF;
IF p_haziran IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 06, p_haziran
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_haziran
WHERE yil = p_yil AND ay = 06;
end;
END IF;
IF p_temmuz IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 07, p_temmuz
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_temmuz
WHERE yil = p_yil AND ay = 07;
end;
END IF;
IF p_agustos IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 08, p_agustos
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_agustos
WHERE yil = p_yil AND ay = 08;
end;
END IF;
IF p_eylul IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 09, p_eylul
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_eylul
WHERE yil = p_yil AND ay = 09;
end;
END IF;
IF p_ekim IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 10, p_ekim
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_ekim
WHERE yil = p_yil AND ay = 10;
end;
END IF;
IF p_kasim IS NOT NULL
then
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 11, p_kasim
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_kasim
WHERE yil = p_yil AND ay = 11;
end;
END IF;
IF p_aralik IS NOT NULL
THEN
begin
INSERT INTO stn_tefe_degerleri
(yil, ay, deger
)
VALUES (p_yil, 12, p_aralik
);
exception when dup_val_on_index then
UPDATE stn_tefe_degerleri
SET deger = p_aralik
WHERE yil = p_yil AND ay = 12;
end;
END IF;
END;
PROCEDURE stn_p_tefe_delete (p_yil NUMBER)
IS
BEGIN
DELETE FROM stn_tefe_degerleri
WHERE yil = p_yil;
END;
burası da tamam.şimdi sıra geldi olayın en can alıcı yerine; forms.
forms da ilgili datablock üzerine geldim.özellikler pencerisini açıp DML Data target type kısmını transactianal trigger olarak değiştirdim.
ardından datablock a ON-INSERT,ON-UPDATE,ON-DELETE ve ON-LOCK triggerlarını ekledim.
yazdığım procedureleri ilgili triggerların içine koydum.
ON-INSERT procedure ü:
stn_p_TEFE_insert(:YIL,:OCAK,:SUBAT,:MART,:NISAN,:MAYIS,:HAZIRAN,:TEMMUZ,:AGUSTOS,:EYLUL,:EKIM,:KASIM,:ARALIK);
ON-UPDATE procedure ü:
stn_p_TEFE_update(:YIL,:OCAK,:SUBAT,:MART,:NISAN,:MAYIS,:HAZIRAN,:TEMMUZ,:AGUSTOS,:EYLUL,:EKIM,:KASIM,:ARALIK);
ON-LOCK procedure ü(ON-UPDATE ile aynı):
stn_p_TEFE_update(:YIL,:OCAK,:SUBAT,:MART,:NISAN,:MAYIS,:HAZIRAN,:TEMMUZ,:AGUSTOS,:EYLUL,:EKIM,:KASIM,:ARALIK);
ON-DELETE procedure ü:
stn_p_TEFE_delete(:YIL);
işlem bu kadar. hem düzgün bir tablo yapımız hem de kullanıcı için rahat bir kullanım sağladık. ekran görüntümüz de şu şekilde oldu;
siz daha iyi arayüzler yaparsınız eminim:)
hadi selametle...