[çözüldü]veritabanı isimlerini değişken olarak gönderme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

[çözüldü]veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

merhaba
silme, ekleme gibi işlemler için ibdataset kullanıyorum. örneğin her silme işleminde

Kod: Tümünü seç

DataM.TTURDETAY.close;
DataM.TTURDETAY.SelectSQL.Clear;


bu şekilde bir kod yazarak hangi dataset te bu işi yapacağını bildiriyoruz.
yapmak istediğim ise bir procedure oluşturayım buna değişkenler tanımlayıp dışarından hangi datada işlem yapılacaksa
onun ismini vereyim. Böylece aynı kodu tekrar tekrar yazmama gerek kalmaz. Bir kaç deneme yaptım ama başaramadım kod nasıl olmalı.

Kod: Tümünü seç

procedure silme(var dataismi:TIBDataSet);
begin

DataM.dataismi.close;
DataM.dataismi.SelectSQL.Clear;
DataM.dataismi.SelectSQL.Text:='Delete from dataismi where SATISKODU='+QuotedStr(IntToStr(DataM.TTURSATISARTANKOD.AsInteger));
DataM.dataismi.ExecSQL;

end;
En son Lord_Ares tarafından 28 Eyl 2013 05:31 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
softdestek
Üye
Mesajlar: 155
Kayıt: 17 Eyl 2010 03:53

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen softdestek »

dataismi sanırım parametre sen hiç paremetre kullanmayı denedinmi?

'Delete from :pDataismi where SATISKODU=:pSatisKodu'

Query1.Close;
Query1.ParamByName('pDataismi ').AsString:='stoklar';
Query1.ParamByName('pSatisKodu').Asinteger:=52;
Query1.ExecSQL;
Query1.open;
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

sanırım yanlış anlattım, yapmak istediğim şuydu aslında. diyelim ki bir kaç tane ibdatasetimiz var. (satışlardataset,stoklardataset gibi..)
Bu datasetler de sürekli arama, kayıt ekleme gibi işlemler yapıyoruz. ben diyorum ki, arama yapmak istediğimizde arama kodlarımızı hangi datasette arayacaksak ona göre düzenlemek zorunda kalıyoruz.Oysa arama kodlarını bir procedure haline getirip sadece procedure adı şu olan datasette yap bu işi demek istiyorum.

örneğin aşağıdaki gibi bir procedure yapmak istiyorum. Sorun şu ki, dataset_ismi. yaptığımda hata alıyorum. bu tür bir procedure nasıl yaparım.

Kod: Tümünü seç

procedure arama( var dataset_ismi:TIBDataSet; hangi_alanda, aracanak_değer:string );
begin

dataset_ismi.close;
dataset_ismi.SelectSQL.Clear;
dataset_ismi.SelectSQL.Text:='Delete from dataset_ismi where hangi_alanda='+QuotedStr(IntToStr(aranacak_değer.AsInteger));
dataset_ismi.ExecSQL;

end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

Merhaba...

Kendi çözüm arayışınız üzerinden gidersek;

Kod: Tümünü seç

dataset_ismi.SelectSQL.Text:='Delete from dataset_ismi where hangi_alanda='+QuotedStr(IntToStr(aranacak_değer.AsInteger));
demişsin ya, buradan dataset_ismi ifadesini bir değişken olarak değil de statik halde vermişsiniz. Onu da ayırır da STRING olarak verirseniz ihtiyacınızı karşılar kanısındayım. Örneğin

Kod: Tümünü seç

dataset_ismi.SelectSQL.Text:='Delete from ' + strDataset_ismi + ' where ' + strHangi_alanda + '=' + QuotedStr( strAranacak_değer );
gibisinden...
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

mrmarman hocam, kodda şu kısmı bir türlü başaramadım.
dataset_ismi.SelectSQL.Text

yani procedure(var dataismi:string) yaparak kullanmaya kalktığımda dataset_ismi.SelectSQL.Text diyemiyorum hata veriyor.
procedure(var dataismi:TIBDataSet) yaptığımda da hata alıyorum.
ben şu şekil kullanmak istiyorum, diyelim ki satış ve kasa diye iki tane datesetimiz var. Satış datasetinde arama yapacaksam şöyle kullanmak istiyorum

arama(satısdatesinde);

bunu yapamadım
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

DATASET'i dataset_ismi olarak tabloya özel değil de standart bir taneyi (Active := True gibi sürekli açık olmayacak EXECSQL şeklinde işini bitirince kapanacak türden) sadece böyle bir Query tanımlayın. Örneğin adı da GeciciSQLQuery olsun. DELETE INSERT gibi EXECSQL'lik işleri buna yaptırın.

Kod: Tümünü seç

GeciciSQLQuery.SQL.Text :='Delete from ' + strDataset_ismi + ' where ' + strHangi_alanda + '=' + QuotedStr( strAranacak_değer );
Resim
Resim ....Resim
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen unicorn64 »

sorgulama yapılmış, dolu bir datasette belirli kritere göre veri bulmaya mı çalışıyorsunuz?
datasetin locate metoduna bir bakın, şimdi tam kullanımı aklımda değil

Kod: Tümünü seç


procedure(var dataismi:TIBDataSet;alan:string;deger:variant);
begin
  dataismi.locate([alan],[deger],[loCaseInsensitive]);
end;

bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

Cevap gelmedi sanırım hala uğraştırıyor... Bak sana bir örnek hazırladım.


// Aşağıda; form veya datamodule üzerine eklediğin IBDatabase, IBTransaction, IBQuery gibi nesnelerin bir procedure altında tanımını ve IBQuery nesnesini nasıl bağlayacağını örnekleyen bir kod hazırladım.

Kod: Tümünü seç

Var
  strTablo_ismi, strHangi_alanda, strAranacak_deger : String;
begin
  IBDatabase1.DatabaseName := ExtractFilePath(Application.ExeName)+'DATA.fdb';
  With IBDatabase1 do begin
    Params.Add('user_name=SYSDBA');
    Params.Add('password=masterkey');
    Params.Add('lc_ctype=WIN1254');
    LoginPrompt := False;
  end;
  IBQuery1.Transaction := IBTransaction1;
  With IBTransaction1 do begin
    DefaultDatabase := IBDatabase1;
    Params.Add('read_committed');
    Params.Add('rec_version');
    Params.Add('nowait');
  end;
  IBQuery1.Database    := IBDatabase1;
  // Buradan sonra herhangi bir IBDataset olmaksızın
  // SELECT * FROM deyip veya DELETE FROM deyip
  // dilediğin tablodan dilediğin alanı kullanabilirsin...
  IBQuery1.SQL.Text    := 'DELETE FROM ' + strTablo_ismi + ' WHERE ' + strHangi_alanda + '=' + QuotedStr( strAranacak_deger );
  IBQuery1.ExecSQL;
end;
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

mrmarman hocam verdiğiniz harika bir örnek oldu bana, bunu kayıt ekleme ve silme gibi işlemlerde kullandım.
Tek sorun arama işlemlerine kullanamıyor olmam. Sebebi ise arama sonucu dönen değerleri dbgridte gösteremiyor olmam.
Bu yüzden var olan ve bir dbgride bağlanmış olan datasete procedur oluşturmaya çalışıyorum. Bu yüzden şöyle birşey yapmam gerekli.
1) ara diye bir procedure oluşturacağım.
2) procedure hangi datasette bu işi yapcağını değişken olarak vereceğim. ( örneğin satısdatasetimde arama yapcaksam ara(satısdataset) şeklinde )
3) dbgridim satışdatasetine bağlı olduğu için, yapmış olduğum bu aramanın sonuçları dbgridimde gösterilmiş olucak.

unicorn64, arkadaşım kod için teşekkürler. Fakat yapmak istediğim şey ara, sil,kaydet gibi procedurler oluşturup, bu procedurelere hangi datasette bu iş yapacağını dışarıdan değişken ile belirtmek istiyorum.

ilginiz için teşekkürler, hala yapmaya çalışıyorum ama bir türlü beceremedim :))))
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

Merhaba.

Silmek için aşağıdaki şekilde kodladığında DBGrid'de herhangi bir sonuç yansıtmıyoruz.
Sadece işlemin ardından listeleme yaptığın bir DBGrid varsa ona yansıyan TABLOYU yenilemen lazım ki silme sonrası nihai sonuç ekrana yansısın. :idea:

Kod: Tümünü seç

  // -----------------------------------------------------------
  // Silme İşlemi İçin Kullanacağın Satırlar
  // -----------------------------------------------------------
   IBQuery1.SQL.Text    := 'DELETE FROM ' + strTablo_ismi + ' WHERE ' + strHangi_alanda + '=' + QuotedStr( strAranacak_deger );
   IBQuery1.ExecSQL;
Sadece ARAMA sonuçlarını göreceksen bu defa aşağıdaki şekilde kodlayacaksınız.
Buradaki fark ExecSQL yerine Active := True şekliyle sorgu içeriğinin gösterilmek istendiği veya bu içerikten herhangi bir yerde faydalanacağı anlamına geliyor. :idea:

Siz, bir DBGrid'de gösterecekseniz; aşağıdaki şekilde bazı kodlar da ekleyeceksiniz veya form üzerindeki bileşenlerde hazırda bulunduracaksınız. Aşağıdaki şekilde eklenen kod ile sonucun hangi DataSource'a yansıyacağı, bir de hangi DBGrid'in hangi DataSource'a yansıyan veriyi ekranda göstereceği belirtiliyor.
(DataSource adı ile DBGrid adını kodda kendine göre düzenlersin.)

Kod: Tümünü seç

  // -----------------------------------------------------------
  // Arama İşlemi İçin Kullanacağın Satırlar
  // -----------------------------------------------------------
  IBQuery1.Active     := False;
  IBQuery1.SQL.Text   := 'SELECT * FROM ' + strTablo_ismi + ' WHERE ' + strHangi_alanda + '=' + QuotedStr( strAranacak_deger );
  IBQuery1.Active     := True;
  DataSource1.DataSet := IBQuery1;
  DBGrid1.DataSource  := DataSource1;
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

mrmarman hocam, ellerine sağlık.
Burada dikkatimi çeken Query kullanmış olmanız, sanırım aynı şeyler ibdataset ile yapılabilir ama Query kullanmanızın bir nedeni olduğunu düşünüyorum. ibdataseti hazırlarken ( generator oluşturma,dataset editör kısmındaki düzenlemeler vs gibi) duyulan ihtiyaçların, Queryde gerekli olmadığından sanırım.
Sizin programcılık adına bana kattığınız bu değerlerin hakkı ödenmez. Çok teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

Doğru tespit.

- Query ile yaptığımızda tabloların da üzerindeki, ana veritabanı Kataloğuna erişiyorsunuz. SQL sorgusu ile Katalog içinden Tablo veya birden fazla Tabloyu aynı anda harmanlayıp kullanabiliyorsunuz. Uzak bilgisayardan veritabanına erişim söz konusu ise sorguyu yollayıp cevabı kadar veri aldığınızda daha az trafik harcıyorsunuz.

- Diyeceğim odur ki, yönetim statik tek veritabanına bağlı olmaktan çıkıp daha komplike ve belki de akıllı bir hale bürünüyor.

Sonuç için memnun oldum.
Başarılar :bravo:
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

hocam, peki autoincrament gibi alanlar bu kullanım şekli ile sorun çıkarır mı. bu alanlar için datasette generator tanımlayıp post işlemi ile tetikliyoruz, genarate kısmındaki kod işlemi otomatik yapmasını sağlıyorduk. Bu kullanımda bunu kod ilemi yapmalıyız. yoksa bu kullanımda yapılan değişiklikler bağlı olduğumuz tabloda geçicimidir. normalde Query kullanırken updatesql ile kullanıyorduk,böylece yaptığımız değişiklikler kalıcı oluyordu.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen mrmarman »

Merhaba.
- FIREBIRD için sen AUTOINC alan artırımını nasıl tutuyordun bilmiyorum ama generator'u tercih ediyordum. Gerçi uzun zamandır localde MSACCESS, ağ altında SQLServer ve ORACLE kullandığımdan sen diyene kadar generator kavramını unutmuştum bile :lol: Bu saydığım veritabanlarında işlemler otomatik gelişiyor.

- Aslında bir iki test ile durumu çözebilirsin. Tercihini kayıt öncesi bir tabloda tutuğun sayaçtan takviye mi yaparsın yoksa bağımsız bir generator ile mi yaparsın kararını kendin verebilirsin.
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: [çözüldü]veritabanı isimlerini değişken olarak gönderme

Mesaj gönderen Lord_Ares »

Eğer gerekirse, update,insert vs gibi kısımları gerekirse koda ilave ederek gereksinimleri ortadan kaldırmaya çalışacağım.
yardımınız ve paylaşımınız için çok teşekkürler.
Cevapla