Zorunlu alan kontrol etmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Zorunlu alan kontrol etmek

Mesaj gönderen mmg »

Merhabalar,

Öncelikle herkese kolay gelsin. Kayıt girişi esnasında form üzerindeki alanların boş geçilip geçilemeyeceğini kontrol etmek istiyorum. Örneğin bir stok kartı tanımlama giriş ekranı olduğunu düşünürsek form üzerinde tanımlı alanlarımız STOK_NO ve STOK_ADI olduğunu düşünelim ve bunlar editbox olsun. Aynı isimler ile bu alanları bir kontrol tablosuna kaydediyorum. Form kaydet butonuna bastığımda kontrol tablosuna bakacak ve tabloya girilmiş olan kayıtların alan isimleriyle form üzerinde eşleşen editbox içeriklerini kontrol edecek.

Kontrol tabloda STOK_ADI var olduğunu düşünelim, kaydet düğmesine bastığımda bu alanın ekrandaki editbox'ı olan STOK_ADI.Text değerine ulaşabilmek istiyorum fakat bunu yüzlerce alan olarak düşünmeliyiz. Bu kontrolü makro kullanarak nasıl yapabileceğim konusunda yardımınızı rica ediyorum.

Yapmak istediğim kısaca şöyle özetleyebilirim. Kullanıcı stok kartı açıyor ise boş geçilemeyecek stok kartı alanlarını bir kontrol tablosuna kaydetmek istiyorum. Yukarıda ki örnekte STOK_ADI olarak bu alanı belirttim. Kaydet düğmesine bastığımda kontrol tablosu açılacak ve tabloda ki alan isimleri ile eşleşen ilgili form üzerindeki nesnelere bakarak kontrol tablosunda tanımlı olan alana bilgi girişi yapılıp yapılmadığını tespit etmek istiyorum. Yardımlarınız için teşekkür ediyorum.

Kod: Tümünü seç

if STOK_NO.TEXT<> '' then
if STOK_ADI.TEXT<> '' then

şeklinde ekrandaki her bir nesneyi ayrı ayrı kontrol etmek istemiyorum. Aşağıda ki gibi bir kod yazarak tabloda tanımlı nesne adlarını tablodan okuyarak bu işlemi otomatik yapmak istiyorum, bunu yapabilir miyim ? Tabi bunu makro kullanarak yapmalıyız diye düşünüyorum fakat kullanmayı bilmiyorum.

KONTROLTABLOSU.OPEN;
while not KONTROLTABLOSU.Eof do
begin 
  IF KONTROLTABLOSUALAN_ADI.VALUE = '' THEN -->BU İFADE BÖYLE YAZILMAYACAK TABİİ Kİ, İHTİYACIM OLAN BURANIN YAZILIMI NASIL OLMALI ?
      SHOWMESSAGE('STOK NO ALANI BOŞ GEÇİLEMEZ.'); 

  (
  KONTROL TABLOSUNDA SONRAKİ KAYDIN STOK ADI OLDUĞUNU DÜŞÜNELİM.

  IF KONTROLTABLOSUALAN_ADI.VALUE = '' THEN
      SHOWMESSAGE('STOK ADI ALANI BOŞ GEÇİLEMEZ.'); 
  )
  
  KONTROLTABLOSU.Next;
end;

Şeklinde bir kullanım yapabilir miyim ? Umarım yapmak istediğimi ifade edebilmişimdir.

Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Zorunlu alan kontrol etmek

Mesaj gönderen mussimsek »

Merhaba,

Kontrolü zorunlu alanların Tag veya Hint değerini doldurup, form üzerindeki tüm nesneleri dolaşıp, Tag değerini kontrol edersiniz. Tag değeri istediğiniz değer ise, boş olup olmadığını kontrol edersiniz. Formda isterse binlerce edit olsun, tek bir döngü ile olur.

Şurada bir örnek var : http://www.delphiturkiye.com/forum/view ... nt#p187993

Kolay gelsin.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Zorunlu alan kontrol etmek

Mesaj gönderen ertank »

Merhaba,

Bakış açınızı değiştirmek adına aşağıdaki şekilde bir yöntem deneyebilirsiniz:

1- Stok kartı tablonuzda boş geçilmeyecek alanları NOT NULL olarak tanımlayın.
2- Veri kayıt etmek/güncellemek için parametre isimlerini alan isimleri ile aynı tanımlayın.
3- Zorunlu alanları otomatik tespit edebilmek için boş kayıt okuma veya tek bir satır kayıt okuyacak, sadece kolon bilgilerini (metadata) elde etmek için bir SQL çalıştırın. Örneğin UniDAC veritabanı bileşenleri kullanıyor iseniz;

Kod: Tümünü seç

var
  qryCheck: TUniQuery;
begin
  qryCheck.ReadOnly := True;
  qryCheck.SQL.Text := 'SELECT TOP 1 * FROM STKKART';
  qryCheck.Open();
end;
Bunlardan sonra Parametre ismini qryCheck ismindeki nesnenin alan isimleri içinde arayıp bulun. Eğer Alanın Required parametresi True ise bu alan boş bırakılamaz demektir. Buna göre parametre değeri ile kontrollerinizi sağlayabilirsiniz.

Bu yöntemin iki avantajı var. Öncelikle kontrol gibi ekstra bir tabloya ihtiyacınız olmuyor. Bu tablodaki mutemel güncelleme hatalarından da kurtulmuş oluyorsunuz. İkincisi ise görsel nesneler ile ilgili kod yazmanıza gerek yok. Mesela bir checkbox için yazacağınız kontrol kodu, combobox için yazacağınız kotrol kodu veya edit alanı için yazacağınız kontrol kodu farklı olabilir.

Aşağıdakine benzer bir kontrol rutininiz olabilir.

Kod: Tümünü seç

function CheckRequiredFieldParameterValues(ParameterSQL: TUniSQL; DataSet: TDataSet; out ProblemFieldName: string; const AllowMissingFields: Boolean = False; const AllowEmptyStrings: Boolean = False): Boolean;
var
  LField: TField;
  I: Integer;
begin
  for I := 0 to ParameterSQL.ParamCount-1 do
  begin
    LField := DataSet.FindField(ParameterSQL.Params[I].Name);
    if LField = nil then
    begin
      if not AllowMissingFields then
        raise Exception.Create('Parametre adı ile eşleşmeyen alan tespit edildi. Parametre adı: ' + ParameterSQL.Params[I].Name);
    end;

    if LField.Required then
    begin
      if VarIsNull(ParameterSQL.Params[I].Value) then
      begin
        ProblemFieldName := LField.FieldName;
        Exit(False);
      end;

      if VarToStr(ParameterSQL.Params[I].Value) = EmptyStr then
      begin
        if LField.DataType in [ftString, ftWideString] then
        begin
          if not AllowEmptyStrings then
          begin
            ProblemFieldName := LField.FieldName;
            Exit(False);
          end;
        end;
      end;
    end;
  end;
  Result := True;
end;
Kullanımı ise aşağıdaki gibi olacaktır

Kod: Tümünü seç

var
  SorunluAlanAdi: string;
begin
  UniSQL1.Params[0].AsString := 'A';
  UniSQL1.Params[1].AsString := '';

  // Tam kayıt öncesinde çalıştırılmalı. Parametre atamaları yapıldıktan sonra
  if not CheckRequiredFieldParameterValues(UniSQL1, UniQuery1, SorunluAlanAdi) then
  begin
    ShowMessage(AnsiQuotedStr(SorunluAlanAdi, '"') + ' boş bırakılamaz!');
    Exit();
  end;

  // Tüm zorunlu alanlarda bilgi var. Kayıt edebiliriz.
  UniSQL1.Execute();
end;
Örnek kod NULL ile EmptyStr değerlerine izin vermiyor. Siz sadece NULL olmasın EmptyStr sorun olmaz diyorsanız AllowEmptyStrings parametresini True olarak gönderebilirsiniz.

Kod örneği farklı veritabanı bileşenleri için uyarlanabilir.
Kod örneği TUniQuery ile kayıt yapılan haller için overloaded olarak kullanılabilir.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: Zorunlu alan kontrol etmek

Mesaj gönderen mmg »

mussimsek yazdı: 07 Eki 2022 08:33 Merhaba,

Kontrolü zorunlu alanların Tag veya Hint değerini doldurup, form üzerindeki tüm nesneleri dolaşıp, Tag değerini kontrol edersiniz. Tag değeri istediğiniz değer ise, boş olup olmadığını kontrol edersiniz. Formda isterse binlerce edit olsun, tek bir döngü ile olur.

Şurada bir örnek var : http://www.delphiturkiye.com/forum/view ... nt#p187993

Kolay gelsin.
Merhaba,

Cevabınız için çok teşekkür ediyorum gerçekten işime yarayacak bilgiler içeriyor fakat benim sanırım bu problemimi tam olarak çözemeyecek gibi duruyor. Şöyle ki, stok kartı girişi ekranında ki zorunlu alanlar sabit değil, kullanıcıya göre değişiyor. Bu nedenle de benim zorunlu alanları bir tabloda kullanıcı bazında tutmam gerekiyor. Zorunlu alan tablosunda da döngüye girmem lazım diye düşünüyorum. Böylece ekrandaki her bir alanı zorunlu mu diye tabloda aramak yerine tabloya kayıtlı zorunlu olan örneğin 2 adet alanı çok hızlı bir şekilde kontrol edebilirim. Tabloya stok kartı girişi ekranındaki nesneleri formdaki isimleri ile kaydettim örneğin formda "STOK_NO" edit alanı aynı isim ile tabloda "ALAN_ADI" alanında kayıtlı. Ben bu alan adında yazılı olan nesnenin dolu mu boş mu olduğunu nasıl kontrol edebilirim ?

ZORUNLU TABLO YAPISI :

Kullanıcı Kodu Form Adı Alan Adı
KULLANICI1 STOK_KARTI STOK_NO
KULLANICI1 STOK_KARTI STOK_ADI
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: Zorunlu alan kontrol etmek

Mesaj gönderen mmg »

ertank yazdı: 07 Eki 2022 11:38 Merhaba,

Bakış açınızı değiştirmek adına aşağıdaki şekilde bir yöntem deneyebilirsiniz:

1- Stok kartı tablonuzda boş geçilmeyecek alanları NOT NULL olarak tanımlayın.
2- Veri kayıt etmek/güncellemek için parametre isimlerini alan isimleri ile aynı tanımlayın.
3- Zorunlu alanları otomatik tespit edebilmek için boş kayıt okuma veya tek bir satır kayıt okuyacak, sadece kolon bilgilerini (metadata) elde etmek için bir SQL çalıştırın. Örneğin UniDAC veritabanı bileşenleri kullanıyor iseniz;

Kod: Tümünü seç

var
  qryCheck: TUniQuery;
begin
  qryCheck.ReadOnly := True;
  qryCheck.SQL.Text := 'SELECT TOP 1 * FROM STKKART';
  qryCheck.Open();
end;
Bunlardan sonra Parametre ismini qryCheck ismindeki nesnenin alan isimleri içinde arayıp bulun. Eğer Alanın Required parametresi True ise bu alan boş bırakılamaz demektir. Buna göre parametre değeri ile kontrollerinizi sağlayabilirsiniz.

Bu yöntemin iki avantajı var. Öncelikle kontrol gibi ekstra bir tabloya ihtiyacınız olmuyor. Bu tablodaki mutemel güncelleme hatalarından da kurtulmuş oluyorsunuz. İkincisi ise görsel nesneler ile ilgili kod yazmanıza gerek yok. Mesela bir checkbox için yazacağınız kontrol kodu, combobox için yazacağınız kotrol kodu veya edit alanı için yazacağınız kontrol kodu farklı olabilir.

Aşağıdakine benzer bir kontrol rutininiz olabilir.

Kod: Tümünü seç

function CheckRequiredFieldParameterValues(ParameterSQL: TUniSQL; DataSet: TDataSet; out ProblemFieldName: string; const AllowMissingFields: Boolean = False; const AllowEmptyStrings: Boolean = False): Boolean;
var
  LField: TField;
  I: Integer;
begin
  for I := 0 to ParameterSQL.ParamCount-1 do
  begin
    LField := DataSet.FindField(ParameterSQL.Params[I].Name);
    if LField = nil then
    begin
      if not AllowMissingFields then
        raise Exception.Create('Parametre adı ile eşleşmeyen alan tespit edildi. Parametre adı: ' + ParameterSQL.Params[I].Name);
    end;

    if LField.Required then
    begin
      if VarIsNull(ParameterSQL.Params[I].Value) then
      begin
        ProblemFieldName := LField.FieldName;
        Exit(False);
      end;

      if VarToStr(ParameterSQL.Params[I].Value) = EmptyStr then
      begin
        if LField.DataType in [ftString, ftWideString] then
        begin
          if not AllowEmptyStrings then
          begin
            ProblemFieldName := LField.FieldName;
            Exit(False);
          end;
        end;
      end;
    end;
  end;
  Result := True;
end;
Kullanımı ise aşağıdaki gibi olacaktır

Kod: Tümünü seç

var
  SorunluAlanAdi: string;
begin
  UniSQL1.Params[0].AsString := 'A';
  UniSQL1.Params[1].AsString := '';

  // Tam kayıt öncesinde çalıştırılmalı. Parametre atamaları yapıldıktan sonra
  if not CheckRequiredFieldParameterValues(UniSQL1, UniQuery1, SorunluAlanAdi) then
  begin
    ShowMessage(AnsiQuotedStr(SorunluAlanAdi, '"') + ' boş bırakılamaz!');
    Exit();
  end;

  // Tüm zorunlu alanlarda bilgi var. Kayıt edebiliriz.
  UniSQL1.Execute();
end;
Örnek kod NULL ile EmptyStr değerlerine izin vermiyor. Siz sadece NULL olmasın EmptyStr sorun olmaz diyorsanız AllowEmptyStrings parametresini True olarak gönderebilirsiniz.

Kod örneği farklı veritabanı bileşenleri için uyarlanabilir.
Kod örneği TUniQuery ile kayıt yapılan haller için overloaded olarak kullanılabilir.
Merhaba,

Cevabınız için çok teşekkür ediyorum, emeğinize sağlık, mükemmel bir bakış açısı fakat benim kullandığım tablo MSSQL ve şu an zorunlu olması istenilen alanlar içinde şu ana kadar boş olanları var. Bu nedenle de stok kartı tablosunda ilgili alanları boş geçilemez olarak işaretleyemiyorum. Anlattığınız yöntemi uygulamak istersem bu beni engellemiş olacak diye düşünüyorum. Detaylı inceleyeceğim, daha önce girilmiş kayıtlarda ki boş bırakılmış alan problemini çözebilirsem bu yöntemi uygulayabilirim diye düşünüyorum.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Zorunlu alan kontrol etmek

Mesaj gönderen ertank »

Boş ancak dolu olması gereken kolon değerlerini bir karakter boşluk olarak güncelleyin. Sonra NOT NULL hale getirin.

Kod: Tümünü seç

update STOK set STKKOD = ' ' where STKKOD IS NULL or STKKOD = '';
alter table STOK alter STKKOD NOT NULL;
Yukarıdakine benzer bir şekilde mevcutta boş olabilen ancak olmaması gerekli kolonları zorunlu dolu olmalı şekline çevirebilirsiniz diye düşünüyorum.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: Zorunlu alan kontrol etmek

Mesaj gönderen mmg »

ertank yazdı: 07 Eki 2022 01:55 Boş ancak dolu olması gereken kolon değerlerini bir karakter boşluk olarak güncelleyin. Sonra NOT NULL hale getirin.

Kod: Tümünü seç

update STOK set STKKOD = ' ' where STKKOD IS NULL or STKKOD = '';
alter table STOK alter STKKOD NOT NULL;
Yukarıdakine benzer bir şekilde mevcutta boş olabilen ancak olmaması gerekli kolonları zorunlu dolu olmalı şekline çevirebilirsiniz diye düşünüyorum.
Merhaba,

Bunu düşünememiştim, dediğiniz gibi null alanları boşluk update ettikten sonra not null'a çevirebildim. Şimdi gönderdiğiniz kodu uygulayabilirim, yardımınız için teşekkür ediyorum.
Cevapla