24 Nisan 2010 Cumartesi

Güncellemede KOD 737D hatası

İşletim sisteminizde Sql Express kuruluyken güncelleştirme esnasında 737D hatası ile karşılaşabilirsiniz.

Hatanızın çözümü için kayıt defterinde

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft
SQLServer\MSSQL.1\Setup

yoluna gelerek resume anahtarının değerini 0 (sıfır) yapmak yeterlidir.

15 Nisan 2010 Perşembe

oracle flashback query

son zamanlarda sıkça hata yapmaya başladım.yaşlandım herhalde bu işler için. bi delete veya bi update yapıyorum sonra commit diyorum ardından eyvah diyorum:) sonra da hemen neydi lan bişi vardı tablonun eski tarihli bir görüntüsünü alabiliyorduk diyorum.google a oracel flashback query yazıyorum sonra scn(system change number) li sonuçlar dönüyor falan. ben bilmiyorum scn falan diyorum bana zamanla ilgili bişiler ver bu sefer timestamp çıkıyor karşıma... sonuçta aşağıdaki query i yazabiliyorum.

SELECT *
FROM stn_ihale_yaklasik_maliyet
AS OF SCN TIMESTAMP_TO_SCN(SYSTIMESTAMP - 1/24)

query den de anlaşılacağı üzere arkadaş bize tablonun bir saat önceki veri kümesini veriyor.

burda dikkat edilmesi gereken üç konu var.
1- bu özelliği kullanabilmek için database'de ayarlamak yapmak gerekebilir.(default olarak açıktır karıştırmayın yani:) 10g ile birlikte gelmiştir diye biliyorum)
2- tablo yapısı değişmemiş olmalıdır.yani siz kolon ekler veya çıkarırsanız geçmiş olsun.
3- from yanına sadece tek tablo yazabiliyorsunuz. tavsiyem select in başına
create table tmp as
yazıp sonra gerekli işlemleri yapmanızdır.

birde en fazla bir hafta geriye dönebiliyorsunuz default ayarlarla.

detaylı bilgi için
http://psoug.org/reference/flash_query.html
http://www.oracle-base.com/articles/10g/Flashback10g.php

ihtiyaç hissedilmeyen günler dileyiğle...

12 Nisan 2010 Pazartesi

oracle sql de kayıtları yatay yazdırma (wm_concat)

bizden müşteri ve müşterinin satışları gibi bir bilgiyi tek satırda istediklerinde biz sql harici çözümler bulurduk hep.wm_concat ile artık gerek yok buna.

select m.musteri_no,wm_concat(ms.satis_fiyati)
from musteri m,musteri_satis ms
where m.musteri_no = ms.musteri_no
group by m.musteri_no

daha ayrıntılı bilgi ve farklı func. için
http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php

fmb dosyalarını tekbir forms builder içinde açma

bu konuya takmış nadir insanlardanımdır herhalde:) illa tüm fmb tek bir forms içinde açılsın istiyorum. diğer türlü windows explorer dan çift tıklayınca ayrı bir forms açılıyor tekrar user ve pass giriyorsunuz. bunu engellemek için xp de dosya türlerine girip ayar yapabiliyorduk. fakat windows 7 de öyle bir ayar yapacak yeri bulamadım. ben de eski makinemden ilgili reg kaydını buldum. win7 de de aynen işe yaradı. aşğıdaki kısmı notepad e yapıştırın.uzantısını .reg yapın. çalıştırın.


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\fmb_auto_file]
@=""
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008

[HKEY_CLASSES_ROOT\fmb_auto_file\shell]
@="open"

[HKEY_CLASSES_ROOT\fmb_auto_file\shell\open]

[HKEY_CLASSES_ROOT\fmb_auto_file\shell\open\command]
@="\"C:\\orant\\BIN\\ifbld60.EXE\" \"%1\""

[HKEY_CLASSES_ROOT\fmb_auto_file\shell\open\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\fmb_auto_file\shell\open\ddeexec\Application]
@="ifbld60"

[HKEY_CLASSES_ROOT\fmb_auto_file\shell\open\ddeexec\Topic]
@="System"

4 Nisan 2010 Pazar

Oracle Forms 6i de matrix form yapımı (tefe hesaplama)

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...