MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Mesaj gönderen izmirlikemal » 10 Nis 2018 09:16

Merhaba
Hernekadar konuyu MSSQL Server Forum başlığında paylaşmış olsamda 'naile' nikli arkadaşın uyarısı ile 'PROGRAMLAMA' forum başlığında paylaşmaya karar verdim. Dikkatsizliğim konusunda da tüm arkadaşlarımdan özür dileyerek, sorumu tekrar güncelleme ihtiyacı duydum.

Aşağıdaki kodlardan yararlanarak sorumu sormak istiyorum.
procedure KayitGetir;
Var Query:TAdoQuery;Table_Adi: ?? ;(Burada değişkene tipi ne olacak)
begin
Query := TADOQuery.Create(nil);
Query.Close;
try
Query.Connection:=ADOConnection1;
Query.SQL.Text:='SELECT * FROM MA';
-----
Query.open;
finally
end;
end;
-------------------
Sorunumu sanırım düzgün ve doğru şekilde anlatabilirim düşüncesiyle yukarıda kodlarda bulunan ve altını çizdiğim MSSQL veri tabanındaki "MA" Table adını, örneğin Edit1.text:='MA';
Table_Adi:=Edit1.text; ???? (Böyle değişken olmayacağını biliyorum sadece örneklemek istedim)
bu Edit1.text girdisini Table adı olarak kullanmak istiyorum.
Bunu yapmak istememin sebebi Programı yazarken aynı "alan_adı/alan_adları" verilere ulaşmak için
Veritabanı adını(Table adı) Edit1.text den veya dabgrid denseçerek almak ve programın aynı kodları kullanarak şişmesini önlemek.
Bunu yapmamız mümkün mü? Mümkün ise uzman arkadaşlarımdan yardımcı olmasını ve kısa bir procedure veya Function örneği verebilirler ise memnun olurum. Hayırlı günler dilerim. Teşekkür ederim.

Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 349
Kayıt: 05 Oca 2012 12:55

Re: MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Mesaj gönderen xozcanx » 10 Nis 2018 11:08

Kod: Tümünü seç

Query.SQL.Text:='SELECT * FROM '+EditTabloAdi.Text;
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..

izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Mesaj gönderen izmirlikemal » 10 Nis 2018 04:44

Teşekkürler.

ertank
Üye
Mesajlar: 1202
Kayıt: 11 Eyl 2015 11:45

Re: MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Mesaj gönderen ertank » 10 Nis 2018 06:38

izmirlikemal yazdı:
10 Nis 2018 09:16
Merhaba
Hernekadar konuyu MSSQL Server Forum başlığında paylaşmış olsamda 'naile' nikli arkadaşın uyarısı ile 'PROGRAMLAMA' forum başlığında paylaşmaya karar verdim. Dikkatsizliğim konusunda da tüm arkadaşlarımdan özür dileyerek, sorumu tekrar güncelleme ihtiyacı duydum.

Aşağıdaki kodlardan yararlanarak sorumu sormak istiyorum.
procedure KayitGetir;
Var Query:TAdoQuery;Table_Adi: ?? ;(Burada değişkene tipi ne olacak)
begin
Query := TADOQuery.Create(nil);
Query.Close;
try
Query.Connection:=ADOConnection1;
Query.SQL.Text:='SELECT * FROM MA';
-----
Query.open;
finally
end;
end;
-------------------
Sorunumu sanırım düzgün ve doğru şekilde anlatabilirim düşüncesiyle yukarıda kodlarda bulunan ve altını çizdiğim MSSQL veri tabanındaki "MA" Table adını, örneğin Edit1.text:='MA';
Table_Adi:=Edit1.text; ???? (Böyle değişken olmayacağını biliyorum sadece örneklemek istedim)
bu Edit1.text girdisini Table adı olarak kullanmak istiyorum.
Bunu yapmak istememin sebebi Programı yazarken aynı "alan_adı/alan_adları" verilere ulaşmak için
Veritabanı adını(Table adı) Edit1.text den veya dabgrid denseçerek almak ve programın aynı kodları kullanarak şişmesini önlemek.
Bunu yapmamız mümkün mü? Mümkün ise uzman arkadaşlarımdan yardımcı olmasını ve kısa bir procedure veya Function örneği verebilirler ise memnun olurum. Hayırlı günler dilerim. Teşekkür ederim.
Merhaba,

Sorunuzu cevaplamadan aşağıdaki konulara dikkatinizi çekmek istiyorum.
0- Kullandığınız Delphi sürümünü belirtmemişsiniz. Örnekler Delphi 10.2.3 sürümü ile uyumlu hazırlanmıştır.
1- Her programlama dilinin zorunlu olmayan ama uyulması halinde okunurluğunu arttıran yazım formatı vardır. Pascal dili için bunlardan en başlıcaları;
- Bolk içinde kalan (begin..end, try..finally..end, değişken tanımı için kullanılan var ile begin arası) kodlar blok hizasından en az iki karakter içeriden yazılır.
- Değişken isimleri birden fazla kelimeden oluşuyor ise arasında alt çizgi "_" kullanmadan her kelimenin ilk harfi büyük olacak şekilde yazılır.
2- Mesaj hazırlar iken "Tam Editör & Önİzleme" butonunu kullanarak mesajınızı hazırlayın. Kod örneklerini seçip "</>" butonunu tıklayın. Böylece yazdığınız kod daha kolay okunabilir olacaktır.
3- Query bileşeni Create edildikten hemen sonra kullandığınız Query.Close() ifadesi gereksizdir. Query bileşenine henüz bir TAdoConnection ataması dahi yapılmadığı için zaten kapalı durumdadır.
4- Create ettiğiniz Query bileşenini Free etmediğiniz için örnek kodunuzda hafıza kaçağı oluşacaktır.

Sorunuza gelince;
Aşağıdaki gibi bir fonksiyon kullanabilirsiniz:

Kod: Tümünü seç

function KayitGetir(Connection: TAdoConnection; const TableName, FieldName: string; const Filter: string = ''): string;
var
  Query: TAdoQuery;
begin
  Result := EmptyStr;
  
  Query := TADOQuery.Create(nil);
  try
    Query.Connection:= Connection;
    Query.SQL.Text:='SELECT * FROM ' + AnsiQuotedStr(TableName, '"');
    if Filter <> EmptyStr then
    begin
      Query.SQL.Add(Filter);
    end;

    try
      Query.Open();  // TableName veya Filter değerleri hatalı olabilir. Bu durumda boş değer çeviriyoruz.
    except
      Exit();
    end;
      
    Result := Query.FieldByName(FieldName).AsString;  // Herşey yolunda gider ise istenilen alanın değerini çeviriyoruz.
  finally
    Query.Free();
  end;
end;
Örnek kod bloğunu incelersek;
- Parametre olarak TAdoConnection nesnesini alıyor ki böylece kendi başına (Belirli bir forma bağlı kalmadan herhangi bir ünite içerisinde daha sonra da kullanabileceğiniz bir "utility" fonksiyonu olabilir.
- Tablo adı ve hangi alanın değerini görmek istiyorsanız bu bilgileri belirtiyorsunuz.
- Filter değerine örneğin 'WHERE Kodu = 15' gibi bir değer vererek tek bir kayıt bilgisi elde edebilirsiniz. Bu parametre opsiyoneldir. Fonksiyonu çağırır iken kullanmanız şart değil.

Örnek kullanımı aşağıdaki gibi olacaktır:

Kod: Tümünü seç

  KayitGetir(AdoConnection1, Edit1.Text, 'adi');  // Filtreleme yapılmadan örnek kullanılış
  KayitGetir(AdoConnection1, Edit1.Text, 'adi', 'WHERE kod = 15');  // Filtreleme ile örnek kullanılış
NOT: Tablo içinde "adi" ve "kod" alanlarının olduğu varsayılmıştır.

Eğer kayıtları Form/DataModule üzerindeki bir TAdoQuery üzerinden okumanız gerekiyor ise bu defa aşağıdaki gibi bir fonksiyon kullanabilirsiniz:

Kod: Tümünü seç

function GetFieldValue(Query: TAdoQuery; const FieldName: string; out Value: string): Boolean;
begin
  if not Assigned(Query) then Exit(False);
  try
    Value := Query.FieldByName(FieldName).AsString;
  except
    Exit(False);
  end;
end;
Yukarıdaki fonksiyonu farklı alan tipleri için "overload" kullanarak çoğaltmak mümkün. String ve Integer alanlar için aşağıdaki gibi yazılabilir:

Kod: Tümünü seç

unit DbUtilies;

interface

uses
  System.SysUtils,
  Data.DB,
  Data.Win.ADODB;
  
function GetFieldValue(Query: TAdoQuery; const FieldName: string; out Value: string): Boolean; overload;
function GetFieldValue(Query: TAdoQuery; const FieldName: string; out Value: Integer): Boolean; overload;

implementation

function GetFieldValue(Query: TAdoQuery; const FieldName: string; out Value: string): Boolean;
begin
  if not Assigned(Query) then Exit(False);
  try
    Value := Query.FieldByName(FieldName).AsString;
  except
    Exit(False);
  end;
  Result := True;
end;

function GetFieldValue(Query: TAdoQuery; const FieldName: string; out Value: Integer): Boolean;
begin
  if not Assigned(Query) then Exit(False);
  try
    Value := Query.FieldByName(FieldName).AsInteger;
  except
    Exit(False);
  end;
  Result := True;
end;

end.
Bu şekilde hazırlanmış bir fonksiyon aşağıdaki gibi kullanılabilir:

Kod: Tümünü seç

var
  KarakterDeger: string;
  TamSayiDeger: Integer;
begin
  GetFieldValue(AdoQuery1, 'adi', KarakterDeger);
  GetFieldValue(AdoQuery1, 'sirano', TamSayiDeger);
end;
Okunan değerlerde sorun olup olmadığını anlamak istiyor iseniz bu defa aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

var
  KarakterDeger: string;
  TamSayiDeger: Integer;
begin
  if not GetFieldValue(AdoQuery1, 'adi', KarakterDeger) then
  begin
    ShowMessage('"adi" alanı değeri okunamıyor');
  end;

  if not GetFieldValue(AdoQuery1, 'adi', TamSayiDeger) then
  begin
    ShowMessage('"sirano" alanı değeri okunamıyor');
  end;
end;

izmirlikemal
Üye
Mesajlar: 155
Kayıt: 10 Oca 2014 01:08
Konum: izmir/Buca

Re: MSSQL veritabanında Table_Adı 'nı DBGrid'den Seçerek veya Edit1 hücresine Girerek Atamak

Mesaj gönderen izmirlikemal » 23 Nis 2018 10:24

ertank Arkadaşım Merhaba...
Yazım kuralları ile ilgili verdiğiniz önerileri yazmakda olduğum programda dikkate almaya başlayacağım. teşekkür ederim.
Sorunumu başka bir şekilde çözmüştüm. Başka arkadaşlarımda yararlanabilir düşüncesiyle paylaşıyorum

Kod: Tümünü seç

procedure TForm1.VeriTabaniListesi;
 var
  SL: TStrings;
  index: Integer;
begin
  SL := TStringList.Create;
  try
     ADOConnection1.GetTableNames(SL, False);
    for index := 0 to (SL.Count - 1) do begin
    ComboBox1.Items.Add(SL.Strings[index]);
    end;
  finally
    SL.Free;
  end;
end;
[code]

Cevapla