Tabloda dakika:saniye:salise toplama işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Tabloda dakika:saniye:salise toplama işlemi

Mesaj gönderen sertkayasalih »

Merhaba,

Delphi 6
Veritabanı : EasyTable.

- Projemde kullandığım Veritabanımda Zaman tanımlı string alan var.
Zaman alanına girilen string girdiler hep (dakika:saniye:salise , 00:00:000) biçimindedir ve elle manuel olarak giriliyor.

- Veritabanında 'Zaman' tanımlı alana zaman bilgisini (örnek : 03:45:585) girebiliyorum.
Kayıt sayısı 30 civarında.

- Yapmak istediğim, tabloda Zaman alanının toplamını (dakika:saniye:salise, 00:00:000) cinsinden almak.
Aşağıdaki hazırladığım kod ile yapmaya çalışıyorum ama bir türlü netice alamıyorum.

- Eğer Veritabanında Zaman olarak tanımlı alana, salise 2 haneli (00:00:00) girildiğinde problem çıkmıyor. Son 2 haneyi de salise yerine saniye gibi görüyor :!:

Kod: Tümünü seç

procedure TAnaForm.ToplamZaman;
var
i, y : integer;
TopZaman : TDateTime;
begin
  TopZaman := 0;
  y := BilgiTablo.RecordCount;
  if (BilgiTablo.IsEmpty = false) then
  begin
    BilgiTablo.First;
  for i := 0 to y -1 do
    begin
      TopZaman := TopZaman + StrToTime(BilgiTabloZaman.AsString);
      BilgiTablo.Next;
    end;
  end;
  lbToplamZaman.Caption := TimeToStr(TopZaman);
end;
Yardımcı olan herkese şimdiden teşekkürler :)
En son sertkayasalih tarafından 18 Haz 2004 11:27 tarihinde düzenlendi, toplamda 6 kere düzenlendi.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

hocam bu kod saat alanlarını gayet güzel topluyor.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:Ttime;
begin

a:=strtotime('01:01:01');
b:=strtotime('02:02:02');
c:=a+b;
ShowMessage(timetostr(c)); //03:03:03
end;
sizin kodunuzda ki tdatetime tipi sorun çıkartıyor olabilir.
saygılar...
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Mesaj gönderen DotCom »

@sadettinpolat ; arkadaş o olaydan bahsetmiyor zaten senin topladıgın bigi toplama işlemi yapıyor buda bir problem yok...

@midirjor :

Arkadaşım ; yapmak istediğiniz olayın olmamasının sebebi işletim sisteminden kaynarlanıyor...

az önce iclecedimde bölgesel dil seçeneklerinden de ayarlıyamıyorsunuz. sanırım salise alanını 00:00:00 şeklinde almak zorundasınız...

Kolay Gelsin...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selamlar...

Kod: Tümünü seç

     TopZaman := TopZaman + StrToTime(BilgiTabloZaman.AsString); 
... bu satırda şunu dener misiniz ? Toplanacak zamanın başına 00: daha ekler misiniz... Belki son iki hanenin saniye mi, salise mi olduğuna karar verilemiyordur... (Deneyemedim kusura bakma, çalıştığım yerden mesaj yazıyorum)...

- Ya da sorun çıkmıyor dediğiniz ihtimali değerlendirelim... Son üç haneyi kontol ettirip : ikinokta üstüste işareti varsa noktaüstüste'yi takip eden sütuna INSERT fonksiyonu ile 1 adet 0 ekleyerek çözümünüzü üretebilirsiniz...

- Başarılar...
Resim
Resim ....Resim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Merhaba ben buna benzer bir durumda şöyle yaptım.

Mesela saat1 08:30, saat2=18:30 bu ikisini çıkarmak için şunu yapabilirsin. İki saatide dakikaya çevir. saat1=510 dakika, saat2=1110 dakika, bunları çıkar 1110-510=600 bunuda saate çevir.

Kod: Tümünü seç

600 div 60=10 
 600 mod 60=0

 sonuç=10:00
Bİr fikir verebilir. Kolay Gelsin
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba,
@sadettinpolat,
@m4st3rmus,
@mrmcop,
@bgoktas,

İlginiz için teşekkür ederim :)

- @mrmcop esas sıkıntı, salise 3 haneli olunca başlıyor :!:

Tahminimce Zaman tanımlı Stringi StrToTime fonksiyonu çeviri yaparken hh:mm:ss şeklinde neticeyi yorumladığından 3 haneli salise değerini 2 haneli saniye değeri gibi algılıyor.

StrToTime fonksiyonunu hh:mm:ss:zzz gibi veya mm:ss:zzz yorumlayacak şekilde yeniden düzenlenebilirse sorun çözülür diye düşünüyorum.

- Ancak Delphi'de yeni olduğum için nasıl yapabilirim bilemiyorum :?:

Yardımcı olan herkese şimdiden teşekkürler :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

midijor yazdı: StrToTime fonksiyonunu hh:mm:ss:zzz gibi veya mm:ss:zzz yorumlayacak şekilde yeniden düzenlenebilirse sorun çözülür diye düşünüyorum.

- Ancak Delphi'de yeni olduğum için nasıl yapabilirim bilemiyorum :?:

Yardımcı olan herkese şimdiden teşekkürler :)
Date-Time Format Strings
....
z Displays the millisecond without a leading zero (0-999).
zzz Displays the millisecond with a leading zero (000-999).
...

Kod: Tümünü seç

S := FormatDateTime('"The meeting is on " dddd, mmmm d, yyyy, " at " hh:mm:zzz AM/PM', Now + 0.125); 

The meeting is on Perşembe, Haziran 17, 2004, at 06:48:936 PM
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba sadettinpolat,

Tekrar yanıtınız için teşekkür ederim :)

- Tüm denemelerime rağmen dakika, saniye, salise - 00:00:000 StrToTime dönüşümü ile toplama gerçekleşemiyor :?: StrToTime - saat, dakika, saniye - 00:00:00 dışında salise kabul etmiyor :!:

- Nette google ile aramadığım yer kalmadı sayılır. Saniyeli toplama örneğine hiç rastlamadım. Sonuçta tek seçenek kalıyor galiba :cry: Toplama işlemini dakika, saniye - 00:00 olarak yapacağım :!:

Zaman ayırıp cevap veren tüm arkadaşlarıma tekrar teşekkürler :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

aşağıdaki kod 01.01.252 şeklinde saati stringe çeviriyor ama ne hikmetse StrToTime fonksiyonu için hata verip duruyor.

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
SaatFormati:TFormatSettings;
strSaat:string;
begin
  SaatFormati.TimeSeparator := '.';
  SaatFormati.LongTimeFormat :='nn:ss:zzz';
  strSaat:=TimeToStr(now,SaatFormati);
  ShowMessage(strSaat);
end;

http://www.delphibasics.co.uk/RTL.asp?N ... TimeFormat
bu adreste aşağıdaki kod var lakin bu kodu ben çalıştırmayı başaramadım.

Kod: Tümünü seç

var
  myDate : TDateTime;
  formattedDate : string;

begin
  myDate := StrToTime('15:06:23.456');

  // Display using the default LongTimeFormat
  DateTimeToString(formattedDate, 'tt', myDate);
  ShowMessage('15:06:23.456 using  default = '+formattedDate);

  // Change the display formatting
  LongTimeFormat := 'hh mm ss (zzz)';
  DateTimeToString(formattedDate, 'tt', myDate);
  ShowMessage('15:06:23.456 using override = '+formattedDate);
end;

Kod: Tümünü seç

function StrToTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;
madem hata vercen niye böyle bir fonksiyon var?
ilginç bi durum yani
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba,

- Bu adresi arama yaparken bende görmüştüm. Örneği denedim bende çalıştıramadım.

http://www.delphibasics.co.uk/RTL.asp?Name=StrToTime
adresinde :
The default format in the UK is
hour:minute:second.milli-seconds
dikkatimi çekti :!:

- Bu özellik sadece İngilizce Windows işletim sisteminde mi var :?: acaba...

Ben de anlayamadım :cry:
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Tabloda dakika:saniye:salise toplama işlemi

Mesaj gönderen gkimirti »

midijor yazdı:Merhaba,

- Projemde kullandığım Veritabanımda Zaman tanımlı string alan var.
Zaman alanına girilen string girdiler hep (dakika:saniye:salise , 00:00:000) biçimindedir ve elle manuel olarak giriliyor.
: ye gor stringi parcalayıp,saat,dakikaisaniye ve salise parametrelerini elde edip EncodeTime fonksiyonu ile zaman bilgisini sayısal olarak elde edebilirsin
saonra istedigin sekilde toplama/cıkarma vs. işlemleri yapabilirsin
sonucu yazdıracagın zaman FormatDateTime yada DecodeTime ile saat,dakika,saniye ve salise degerlerini elde edip bunları istedigin sekilde stringe cevirebilirsin
biraz uzun bir yol ama anladıgım kadarıyla baska turlu de olmuyor....
kolay gelsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba gkimirti hocam,

Yanıtınız için teşekkür ederim :)

http://www.delphibasics.co.uk/RTL.asp?Name=StrToTime

- Adresinde StrToTime fonksiyonu hh:mm:ss.zzz (saat:dakika:saniye.salise) cinsinden stringi time'e çevirebildiğini okudum.


Fakat Delphi bileşeni içinde aşağıdaki fonksiyon yapısını bulamadım :!:

Kod: Tümünü seç

function StrToTime ( const Time : string; const FormatSettings : TFormatSettings ) : TDateTime;
Fonksiyon hakkında açıklama ise şöyle:
The StrToTime function attempts to convert a time as a string Date into a TDateTime value.

The time string must adhere to the format of the LongTimeFormat value, and use the TimeSeparator character to separate the hour, minute and second values.

The default format in the UK is
hour:minute:second.milli-seconds, where :

The hour must be 0..23
The minute must be 0..59 (optional)
The second must be 0..59 (optional)
The milli-secs must be 0..999 (optional)

Any errors in the time string will yield EConvertError.

Version 2 of this function is for use within threads. You furnish the FormatSettings record before invoking the call. It takes a local copy of global formatting variables that make the routine thread safe.
Kod örneği aşağıda ki gibi,

Kod: Tümünü seç

// Full Unit code.
// -----------------------------------------------------------
// You must store this code in a unit called Unit1 with a form
// called Form1 that has an OnCreate event called FormCreate.
 
unit Unit1;
 
interface
 
uses
  SysUtils,   // Unit containing the LongTimeFormat command
  DateUtils,
  Forms, Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.dfm} // Include form definitions
 
procedure TForm1.FormCreate(Sender: TObject);
var
  myDate : TDateTime;
  formattedDate : string;

begin
  myDate := StrToTime('15:06:23.456');//***Bu satırda kullanabildiğini gösteriyor! Fakat derleme işleminde burası hata veriyor!

  // Display using the default LongTimeFormat
  DateTimeToString(formattedDate, 'tt', myDate);
  ShowMessage('15:06:23.456 using  default = '+formattedDate);

  // Change the display formatting
  LongTimeFormat := 'hh mm ss (zzz)';
  DateTimeToString(formattedDate, 'tt', myDate);
  ShowMessage('15:06:23.456 using override = '+formattedDate);
end;
 
end. 
- Yukarıdaki gibi derlemeye çalıştığımda 'invalid time value (15:06:23.456 )' hata mesajı veriyor!

Kod: Tümünü seç

function StrToTime ( const Time : string; const FormatSettings : TFormatSettings ) : TDateTime;
- Bu fonksiyonu nasıl düzenleyebiliriz :?:

Yardımcı olan herkese şimdiden teşekkürler :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...
@midijor yazdı:- Projemde kullandığım Veritabanımda Zaman tanımlı string alan var.
@midijor yazdı:- Veritabanında 'Zaman' tanımlı alana zaman bilgisini (örnek : 03:45:585) girebiliyorum.
Kayıt sayısı 30 civarında.
bu ifadeleriniz zaman ismindeki alanın string olarak tanımlı olduğunu bildiriyor...

- Daha önce yazdığım cevapta, '00:' eklemenizi önermiştim... Uygulamamışsınız anlaşılan... :idea:

veritabanınızda bulunan '03:45:585' ifadesini '00:03:45,585' ifadesine dönüştürdüğünüzde işlem hallolmuş olacaktı oysa ki...

- basit bir button koyup sonucu test ediniz... Doğru çalışıp çalışmadığını gördükten sonra uygulamaya geçiniz...

- Size basit bir temrin ...

Kod: Tümünü seç

var
  i, y : integer;
  TopZaman : TDateTime;
begin
  TopZaman := 0;
  y := 10;
  for i := 0 to y -1 do
    begin
      TopZaman := TopZaman + StrToTime('00:00:10,253');
    end;
  Form1.Caption := TimeToStr(TopZaman);
- Yukardaki örnekte string ifadenin nasıl kurgulanacağını görüyorsunuz... Saat:Dakika:Saniye,salise kurgusuna dikkat ediniz...

- Şimdi bu noktada yapacağınız işlem, veritabanındaki ifadenizi yeniden gözden geçirmeniz...
Resim
Resim ....Resim
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba mrmcop hocam,

- Tekrar yanıtınız için teşekkür ederim :?

- Bundan önceki verdiğiniz örneği denedim, string başına + '00:' ilave ettim fakat yine çalışmadı :!:

- En son verdiğiniz örneğinizdeki gibi :

saat:dakika:saniye,salise - 00:00:00,000 şeklindeki kurguyu takip ederek string alanına dakika:saniye,salise - 00:00,000 saniye ile salise arasına virgül koyarak girdim.

Toplama yaparken string alanı başına +'00:' ilave yaptım netice mükemmel :)

Enson hali:

Kod: Tümünü seç


...

BilgiTabloZaman.Value := '03:45,585';  //***dakika:saniye,salise*** 

...

procedure TAnaForm.ToplamZaman; 
var 
i, y : integer; 
TopZaman : TDateTime; 
begin 
  TopZaman := 0; 
  y := BilgiTablo.RecordCount; 
  if (BilgiTablo.IsEmpty = false) then 
  begin 
    BilgiTablo.First; 
  for i := 0 to y -1 do 
    begin 
      TopZaman := TopZaman + StrToTime('00:'+BilgiTabloZaman.AsString); 
      BilgiTablo.Next; 
    end; 
  end; 
  lbToplamZaman.Caption := TimeToStr(TopZaman); 
end; 

- @mrmcop hocam, sizin yardımınızla, zamanı string alanda tanımlarken saniye ile salise arasına virgül (00,000) konulması gerektiğini öğrenmiş olup, sorunum çözülmüş oldu :idea:

- Daha önceki sorunlarımda da ve bunda da çok yardımcı oldunuz :)

- Yardımlarınız için bir kez daha teşekkür ediyor, sizinde işlerinizin kolay geçmesini diliyorum :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Cevapla