Arşiv Anasayfa SQL Server
Sayfalar: 1
Sql Server Veritabanına Tarih Saat Bilgisi Kaydetme Gönderen: dynamo Tarih: 12 November 2007 14:32:05
sql server'de tarih ve saat için iki ayrı veritipi yoktur.smalldatetime ve datetime veritipleri hem tarih hem de saat bilgisini tutar.datetime tipinde tanımlanmış tek bir alanı tarih ve saat olacak şekilde DBGrid'te göstermek için sql sorgusu kullanmak gerekir."Kayit" adlı tabloda datetime tipinde tanımlanmış TarihSaat alanını DBGrid'te Tarih ve Saat olacak şekilde iki ayrı alan oluşturmayı sql kodu ile yapalım:

 
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select Sira,Personel,Arac,TarihSaat as Tarih,TarihSaat as Saat from Kayit');
  ADOQuery1.Open;

Aynı alandan Tarih ve Saat adlı iki alan oluşturduk.Fakat DBGrid'te Tarih alanında sadece tarih,Saat alanında sadece saat bilgisi görünmesi için gridin bağlı olduğu Query'de bu alan formatları belirlenmelidir:

 
  TDateTimeField(ADOQuery1.FieldByName('Tarih')).DisplayFormat:='dd.mm.yyyy';  //sadece tarih bilgisi
  TDateTimeField(ADOQuery1.FieldByName('Saat')).DisplayFormat:='hh:mm:ss';    //sadece saat bilgisi

tarih bilgisi formatını, Windows'un kullandığı tarih ayıracı neyse onu otomatik sistemden alması için aşağıdaki şekilde kullanılabilir:

:
  TDateTimeField(ADOQuery1.FieldByName('Tarih')).DisplayFormat:='dd'+DateSeparator+'mm'+DateSeparator+'yyyy';

sistemin kullandığı tarih ayıracı, Denetim Masası->Bölge ve Dil Seçenenekleri->Özelleştir->tarih kısmında görülebilir.

Örnek Uygulama:



örnek projede hem query hem de table kullanıldı.Tablodaki tek bir datetime alanının tarih ve saat olacak şekilde DGrid'te iki ayrı alan olarak gösterilmesi bir sql sorgusu ile yapılabilir.Table'de bunu yapmak için veritabanında view kullanıldı. ADOTable bu view'e bağlı.view sql kodunu ADOtable'de kullanamak için oluşturulan veritabanı nesnedir.view kodu:

:
select Sira,Personel,Arac,TarihSaat as Tarih,TarihSaat as Saat from Kayit

//sql server Türkçe tarih formatı dmy--->gün.ay.yıl
procedure TForm1.ADOConnection1AfterConnect(Sender: TObject);
begin
  ADOConnection1.Execute('SET DATEFORMAT DMY');
  //ADOConnection1.Execute('SET LANGUAGE Turkish');
end;


procedure TForm1.qry_tbl;
begin
  if RadioButton1.Checked then begin
     DataSource1.DataSet:=ADOTable1;
     ADOTable1.Cancel;
     ADOTable1.TableName:='Kayit_view'; //Kayit tablosu yerine
     ADOTable1.Open;
 
     TDateTimeField(ADOTable1.FieldByName('Tarih')).DisplayFormat:='dd.mm.yyyy';
     TDateTimeField(ADOTable1.FieldByName('Saat')).DisplayFormat:='hh:mm:ss';
  end;
  if RadioButton2.Checked then begin
     DataSource1.DataSet:=ADOQuery1;
     ADOQuery1.Close;
     ADOQuery1.SQL.Clear;
     ADOQuery1.SQL.Add('select Sira,Personel,Arac,TarihSaat as Tarih,TarihSaat as Saat from Kayit order by TarihSaat');
     ADOQuery1.Open;
 
     TDateTimeField(ADOQuery1.FieldByName('Tarih')).DisplayFormat:='dd.mm.yyyy';
     TDateTimeField(ADOQuery1.FieldByName('Saat')).DisplayFormat:='hh:mm:ss';
  end;
 
  DBGrid1.Columns.Clear;
 
  DBGrid1.Columns.Add;
  DBGrid1.Columns[0].FieldName:='Personel';
  DBGrid1.Columns[0].Title.Caption:='Personel';
  DBGrid1.Columns[0].Width:=100;
 
  DBGrid1.Columns.Add;
  DBGrid1.Columns[1].FieldName:='Arac';
  DBGrid1.Columns[1].Title.Caption:='Araç';
  DBGrid1.Columns[1].Width:=100;
 
  DBGrid1.Columns.Add;
  DBGrid1.Columns[2].FieldName:='Tarih';
  DBGrid1.Columns[2].Title.Caption:='Tarih';
  DBGrid1.Columns[2].Width:=80;
 
  DBGrid1.Columns.Add;
  DBGrid1.Columns[3].FieldName:='Saat';
  DBGrid1.Columns[3].Title.Caption:='Saat';
  DBGrid1.Columns[3].Width:=80;
 
end;

filtreleme:

procedure TForm1.filtrele;
var
  y,m,d:Word;
  sa,dk,sn,sl:Word;
begin
  DecodeDate(DateTimePicker3.Date,y,m,d);
  DecodeTime(DateTimePicker4.Time,sa,dk,sn,sl);
  tarih_saat1:=datetimetostr(EncodeDateTime(y,m,d,sa,dk,sn,sl));
 
  DecodeDate(DateTimePicker5.Date,y,m,d);
  DecodeTime(DateTimePicker6.Time,sa,dk,sn,sl);
  tarih_saat2:=datetimetostr(EncodeDateTime(y,m,d,sa,dk,sn,sl));
 
  if RadioButton1.Checked then begin
     ADOTable1.Filtered:=false;
     ADOTable1.Filtered:=true;
  end;
 
  if RadioButton2.Checked then begin
     ADOQuery1.Close;
     ADOQuery1.SQL.Clear;
     ADOQuery1.SQL.Add('select Sira,Personel,Arac,TarihSaat as Tarih,TarihSaat as Saat from Kayit where TarihSaat>='''+tarih_saat1+''' and TarihSaat<='''+tarih_saat2+'''');
     ADOQuery1.Open;
 
     //TDateTimeField(ADOQuery1.FieldByName('Tarih')).DisplayFormat:='dd'+DateSeparator+'mm'+DateSeparator+'yyyy';
     TDateTimeField(ADOQuery1.FieldByName('Tarih')).DisplayFormat:='dd.mm.yyyy';
     TDateTimeField(ADOQuery1.FieldByName('Saat')).DisplayFormat:='hh:mm:ss';
  end;
end;
 
//ADOTable için filter
procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;var Accept: Boolean);
begin
  Accept:=((DataSet['Tarih']>=tarih_saat1) and (DataSet['Tarih']<=tarih_saat2));
end;
 
//sorgula
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
  if BitBtn4.Caption='Sorgula' then begin
     BitBtn4.Caption:='Sorgu İptal';
     filtrele;
  end
  else begin
     BitBtn4.Caption:='Sorgula';
     ADOTable1.Filtered:=false;
     qry_tbl;
  end;
end;
 

dbgridten edit'lere veri atsın

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if RadioButton1.Checked then begin
     Edit1.Text:= ADOTable1.FieldByName('Personel').AsString;
     Edit2.Text:= ADOTable1.FieldByName('Arac').AsString;
     DateTimePicker1.Date:= ADOTable1.FieldByName('Tarih').AsDateTime;
     DateTimePicker2.Time:= ADOTable1.FieldByName('Saat').AsDateTime;
  end;
 
  if RadioButton2.Checked then begin
     Edit1.Text:= ADOQuery1.FieldByName('Personel').AsString;
     Edit2.Text:= ADOQuery1.FieldByName('Arac').AsString;
     DateTimePicker1.Date:= ADOQuery1.FieldByName('Tarih').AsDateTime;
     DateTimePicker2.Time:= ADOQuery1.FieldByName('Saat').AsDateTime;
  end;
 
 
end;
 

örnek uygulama ekte.

Program, Data.ini dosyasından kullanıcı adı ve şifreyi almaktadır.Herhangi bir bilgisayarda yüklü sql server'de sa şifresi ini dosyasına kaydedip programı açınız.

:
procedure TForm1.FormCreate(Sender: TObject);
var
    IniDosya: TIniFile;
    str_dir,str_file_path,str_file,str_data,str_log:string;
    exe_path:string;
begin
   exe_path:= ExtractFilePath(Application.ExeName) ;

   IniDosya := TIniFile.Create(exe_path+'Data.ini');
   try
      user:=IniDosya.ReadString('Options','User','');
      password:=IniDosya.ReadString('Options','Password','');
      server:=IniDosya.ReadString('Options','Server','');
   finally
      IniDosya.Free;
   end;

   //veritabanı eklenmemişse attach et
   ADOConnection1.Connected:=False;
   ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=false;User ID=sa;Initial Catalog=master;Password ='+password+';Data Source=' +server;
   ADOConnection1.Connected:=True;
   if ADOConnection1.Connected then begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('select * from master..sysdatabases WHERE name = ''Data1'' ');
      ADOQuery1.Open;
      if  ADOQuery1.RecordCount = 0 then begin
         str_data:=exe_path+'Data\Data1_data.mdf'  ;
         str_log:=exe_path+'Data\Data1_log.ldf'  ;

         ADOQuery1.Close;
         ADOQuery1.SQL.Clear;
         ADOQuery1.SQL.Text:='EXEC sp_attach_db @dbname = N''Data1'',@filename1 =N'''+str_data+''',@filename2 = N'''+str_log+''' ';
         ADOQuery1.ExecSQL;

         //veritabanına bağlan
         ADOConnection1.Connected :=false;
         ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=Data1;Password ='+password+';Data Source=' +server;
         ADOConnection1.Connected := true;
      end
      else begin
         //veritabanına bağlan
         ADOConnection1.Connected :=false;
         ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=false;User ID='+user+';Initial Catalog=Data1;Password ='+password+';Data Source=' +server;
         ADOConnection1.Connected := true;
      end;
   end;

   qry_tbl;
end;