Delphi Dünyası Facebook'ta

Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

Gönderen Konu: Firebird iki veri yığınında aynı veya farklı kayıtları bulma  (Okunma sayısı 745 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı AhmetNuri

  • Delphi 1 Level 5
  • *****
  • İleti: 46
  • Rep: +0/-1
Baya zaman önce yazdığım makaleleri buraya da ekliyim dedim umarım faydalı olur.
Merhaba, Geçen seferki trigger örneğinin ardından bu sefer daha ilginç ve daha fazla kişi tarafından ihtiyaç duyulacak bir kod üzerinde duracağım. İster programcı olun ister bilgi işlemci eğer bilişim sekteründe çalışıyorsanız tahminimce mutlaka bir gün bu koda ihtiyacınız olacaktır. Çünkü patronunuz, muhasebeciniz, kaliteciniz, çaycınız bir gün karşınıza çıkıp şu iki excel dosyasında aynı olan kayıtlar ile farklı olan kayıtları birbirinden ayırırmısın gibi bir soru soracaklardır. Bu işleme sap ile samanı ayırma işlemi diyebiliriz. İhtiyaç olduça fazla olduğundan bu tür işler için kullanılacak yöntemde oldukça fazladır. Mesela ben yıllar önce kaptan mağra adamı yöntemi ismini verdiğim iç içe iki tane for dongüsü ve paradox veri tabanı ile bu sorunu çözmüştüm. İşlemin tamamlanması yaklaşık iki gün kadar sürdü. Döngü tamamlandığında sonuçtan çok süreye hayran kalmıştım. Ama neticede tüm kayıtları çok sağlıklı bir şekilde ayırdım. Progamı yazma süresi ise oldukça kısa bir zaman sürmüştü. Aslına bakarsanız Firebird de benim yaptığım for dögüsüne benzer bir şekilde olayı çözüyor. Aradaki hız farkını biraz uğraşsam bende kapatabilirdim fakat bu sefer programı yazmam iki gün çalışma süresi iki dakika sürerdi. Sql veri kümeleri üzerinde işlem yapmak için geliştirilmiş bir sistem olmasından dolayı butür işlemleri en kestirme yoldan yapıp geçer. Uzun lafın kısası amarika yı yeniden keşfetmeye gerek yok. Veri yığınları üzerinde işlem yapılacaksa sql kullanmak en mantıklı çözüm.
Şimdi yapacağımız kod ile ilgili bir sistem analizi yapalım.
İhtiyacımız olan
2 adet tablo
2 adet view
Tabloları veri 1 veri 2 gibi karşılaştırma yapılacak verileri saklamak için kullanacağız.
View ler ise
1. view iki tablo arasındaki aynı kayıtları bulacak
2. view ise ili tablo arasındaki farklı kayıtları bulacak
Not : Çalışmaları Firebird 2.5 doayası olarak yüklüyorum daha düşük sürümlerde ods hatası verir ve çalışmaz

Kod: [Seç]
CREATE VIEW AYNIBUL (
    VWAYNI_MUSTERI)
AS
/*
İki tablodaki AYNI kayırları bulma
Ahmet Nuri DENİZ 01.2011
*/
SELECT
  veri2.veri2_str
FROM
 veri2
 WHERE
 exists (SELECT veri1.veri1_str FROM veri1 WHERE ( UPPER(veri1.veri1_str)  = UPPER(veri2.veri2_str)));


Kod: [Seç]
CREATE VIEW FARKLIBUL (
    VWFARKLI_MUSTERI)
AS
/*
İki tablodaki farklı kayırları bulma
Ahmet Nuri DENİZ 01.2011
*/
SELECT
  veri2.veri2_str
FROM
 veri2
 WHERE
 NOT(exists (SELECT veri1.veri1_str FROM veri1 WHERE ( UPPER(veri1.veri1_str) = UPPER(veri2.veri2_str))))
;
Kod: [Seç]
/* Table: VERI1 */
 
CREATE TABLE VERI1 (
VERI1_OTO INTEGER NOT NULL,
VERI1_STR VARCHAR (254) CHARACTER SET WIN1254 COLLATE PXW_TURK);
 
 
 
/* Primary keys definition */
 
ALTER TABLE VERI1 ADD PRIMARY KEY (VERI1_OTO);
 
 
/* Indices definition */
 
CREATE INDEX IDX_VERI1 ON VERI1 (VERI1_STR);
 
SET TERM ^ ;
 
/* Triggers definition */
 
 
 
/* Trigger: BI_VERI1_VERI1_OTO */
CREATE TRIGGER BI_VERI1_VERI1_OTO FOR VERI1 ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.VERI1_OTO IS NULL) THEN
NEW.VERI1_OTO = GEN_ID(VERI1_VERI1_OTO_GEN, 1);
END
^
 
 
SET TERM ; ^

Kod: [Seç]
/* Table: VERI2 */
 
CREATE TABLE VERI2 (
    VERI2_OTO INTEGER NOT NULL,
    VERI2_STR VARCHAR (254) CHARACTER SET WIN1254 COLLATE PXW_TURK,
    VERI2_STR2 VARCHAR (254) CHARACTER SET WIN1254 COLLATE PXW_TURK);
 
 
 
/* Primary keys definition */
 
ALTER TABLE VERI2 ADD PRIMARY KEY (VERI2_OTO);
 
 
/* Indices definition */
 
CREATE INDEX IDX_VERI2 ON VERI2 (VERI2_STR);
 
SET TERM ^ ;
 
/* Triggers definition */
 
 
 
/* Trigger: BI_VERI2_VERI2_OTO */
CREATE TRIGGER BI_VERI2_VERI2_OTO FOR VERI2 ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.VERI2_OTO IS NULL) THEN
      NEW.VERI2_OTO = GEN_ID(VERI2_VERI2_OTO_GEN, 1);
END
^
 
 
SET TERM ; ^