Delphi Can

Orjinalini görmek için tıklayınız: Firebird Sound_ex Kodu.
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Soundex % lik Benzeşme ile aranan metnin bulunan metne % x miktarda benzemesiyole filtre içine dahil oluyor.
SET TERM ^ ;

CREATE PROCEDURE SP_SOUND_EX (
 ARA VARCHAR(30),
 BUL VARCHAR(30),
 OUT BENZESME_TRK INT,
 OUT BENZESME_ENG INT
)
AS
DECLARE VARIABLE ARA_SOUND VARCHAR(30);
DECLARE VARIABLE BUL_SOUND VARCHAR(30);
DECLARE VARIABLE I INT;
DECLARE VARIABLE HARF VARCHAR(1);
DECLARE VARIABLE COUNT_ARA INT;
DECLARE VARIABLE COUNT_BUL INT;

BEGIN
 ARA_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ARA, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C');
 BUL_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(BUL, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C');

 IF (ARA = BUL) THEN
   BENZESME_TRK = 100;
 ELSE IF (ABS(CHAR_LENGTH(BUL) - CHAR_LENGTH(ARA)) > CHAR_LENGTH(ARA) / 2) THEN
   BENZESME_TRK = 0;
 ELSE
 BEGIN
   I = 1;
   WHILE (I <= CHAR_LENGTH(ARA)) DO
   BEGIN
     HARF = SUBSTRING(ARA FROM I FOR 1);
     INSERT INTO HARFT (STRING, HARF) VALUES (:ARA, :HARF);
     I = I + 1;
   END

   I = 1;
   WHILE (I <= CHAR_LENGTH(BUL)) DO
   BEGIN
     HARF = SUBSTRING(BUL FROM I FOR 1);
     INSERT INTO HARFT (STRING, HARF) VALUES (:BUL, :HARF);
     I = I + 1;
   END

   SELECT
     COALESCE(BUL.ASAY, 0) AS ARASAY,
     COALESCE(STRING.BULSAY, 0) AS BULSAY
   FROM
     (SELECT STRING, HARF, COUNT(*) AS ASAY
      FROM HARFT
      WHERE STRING = :ARA
      GROUP BY STRING, HARF) BUL
   FULL OUTER JOIN
     (SELECT STRING, HARF, COUNT(*) AS BULSAY
      FROM HARFT
      WHERE STRING = :BUL
      GROUP BY STRING, HARF) STRING
   ON STRING.HARF = BUL.HARF
   INTO :COUNT_ARA, :COUNT_BUL;

   BENZESME_TRK = CASE
     WHEN COUNT_ARA = COUNT_BUL THEN 100
     WHEN COUNT_ARA > 0 AND COUNT_BUL > 0 THEN 75
     ELSE 0
   END + IIF(SUBSTRING(ARA FROM 1 FOR 1) = SUBSTRING(BUL FROM 1 FOR 1), 25, 0)
        + IIF(SUBSTRING(ARA FROM CHAR_LENGTH(ARA) FOR 1) = SUBSTRING(BUL FROM CHAR_LENGTH(BUL) FOR 1), 15, 0);

   BENZESME_TRK = BENZESME_TRK / CAST(COUNT(*) AS FLOAT) * 100;
 END

 BENZESME_ENG = BENZESME_TRK; -- Basit bir benzerlik sağlamak için aynı değeri kullanabilirsiniz

 SUSPEND;
END^

SET TERM ; ^

// -------- Kullanımı  Delphi Tarafında -------------

var
  Query: TSQLQuery;
  DataSource: TDataSource;
  DBGrid: TDBGrid;

begin
  Query := TSQLQuery.Create(nil);
  DataSource := TDataSource.Create(nil);
  DBGrid := TDBGrid.Create(nil);

  try
    Query.SQLConnection := // Set your SQL connection here

    Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
    Query.ParamByName('ARA').AsString := 'SADULLAH';
    Query.ParamByName('BUL').AsString := 'ABDULLAH';
    Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
    Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;

    DataSource.DataSet := Query;
    DBGrid.DataSource := DataSource;

    Query.Open;
    try
      while not Query.Eof do
      begin
        // BENZESME_TRK değerini kontrol ederek %70 ve üzeri benzeme oranına sahip kayıtları filtreleyebilirsiniz.
        if Query.FieldByName('BENZESME_TRK').AsInteger >= 70 then  // <---örnek = %70-- Benzeşme Oranı Buradan ayarlanmış.
        begin
          // İstediğiniz işlemleri gerçekleştirin veya sadece DBGrid'e ekleyin
          DBGrid.DataSource.DataSet.Append;
          DBGrid.DataSource.DataSet.FieldByName('ARA').AsString := Query.FieldByName('ARA').AsString;
          DBGrid.DataSource.DataSet.FieldByName('BUL').AsString := Query.FieldByName('BUL').AsString;
          DBGrid.DataSource.DataSet.Post;
        end;

        Query.Next;
      end;
    finally
      Query.Close;
    end;
  finally
    Query.Free;
    DataSource.Free;
    DBGrid.Free;
  end;
end;


//--------------------------------------------------------

[ars=delphi]Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
Query.ParamByName('ARA').AsString := 'SADULLAH';
Query.ParamByName('BUL').AsString := 'ABDULLAH';
Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;
Query.ExecSQL;

ShowMessage('Türkçe Benzerlik: ' + Query.ParamByName('BENZESME_TRK').AsString);
ShowMessage('İngilizce Benzerlik: ' + Query.ParamByName('BENZESME_ENG').AsString);


Zamanım olmadığı için Denemedim.
Interbase de çalıştırdıım.. Hata verdi.....Fİrebird de yazılmış olan bir procedure galiba...