Başlangıç ve bitiş saati sorgulatmak

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
tatu
Üye
Mesajlar: 25
Kayıt: 09 Nis 2005 06:13

Başlangıç ve bitiş saati sorgulatmak

Mesaj gönderen tatu »

Arkadaşlar kolay gelsin.

Bir tablom var.

Saat ---- Girdi
12:00 ---- 0
12:10 ---- 0
12:40 ---- 0
13:53 ---- 100
14:11 ---- 0
15:23 ---- 0
16:33 ---- 75


almak istediğim Girdide bulunan değerin yanındaki değeri bitiş saati almak, girdide bulunan değerdeki değerden önceki ilk saat değerini de başlangıç saati yapmak. İstediğim aşşağıdaki şekilde bir sorgu yapmak.

Affınıza sığınarak beceremedim.

Girdi------------Baş Saati---------Bitiş Saati
100-------------12:00-------------13:53
75--------------14:11-------------16:33

Girdi değerleri Sıfır veya rakam olacak. Rakam ise Bitiş Saati Rakamın yanındaki Saat değeri olacak. Başlangıç Saati de Bitiş saatinden önceki ilk Sıfır değerindeki Saat olacak.

Bu şekilde bir sorgu yazmam gerekiyor ve beceremiyorum. Yardımcı olursanız sevinirim.

Kolay gelsin.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Eğer Çok büyük data içermiyor ise bunu Delphi ayağında yapın ve bahsettiğiniz kontrolleri yaparak (döngü ile halledin) eğer data çok fazla diyorsanız (aslında az yada çok benim için farketmez ama) SP yapın.

Bunu bir Query (Sorgu) ile halledeceğim diye boşuna kastırmayın, zira bu tür bir sorguyu yazsanız bile illaki dönen sonuç setinde döngü kurmanız gerekecek.

Bence bir daha düşünün.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
tatu
Üye
Mesajlar: 25
Kayıt: 09 Nis 2005 06:13

Mesaj gönderen tatu »

ilginize çok teşekkür.

ama benim sürekli giriş yapılan bir veritabanım var. Burda Girilen her kayda ait Saati sistem saatinden alyor ve Saat kolonuna işliyor. Ve Girdi kolonuna aralıklı veri girişi oluyor. Yalnız Girdideki veri girişleri de yine Girdiyle bağlantılılı veriler içeriyor. Girdiye giriş yapılınca O anki işlem sonlanıyor.

Benden talep edilen Girdilerle ilgili bir rapor ve bu raporda her girdinin başlangıç ve bitiş saati ve farkı. Daha sonrada Bunların ayrıca Müşteri bzlı ortalmaları talep ediliyor.

Bu nedenle bu tablodan bir şekilde belirttiğim şekilde verileri sorgulatmam lazım ki diğer taleplere cevap verebileyim.

tablo

Müşeteri--Saat ---- Girdi
ahmet----12:00 ---- 0
ahmet----12:10 ---- 0
ahmet----12:40 ---- 0
ahmet----13:53 ---- 100
Ali--------14:11 ---- 0
Ali--------15:23 ---- 0
Ali--------16:33 ---- 75


sorgu

Müşteri--Girdi------------Baş Saati---------Bitiş Saati
ahmet---100-------------12:00-------------13:53
Ali-------75--------------14:11-------------16:33

teşekkürler.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Veri tabanınız nedir? Eğer İVTYS (İlişkisel Veri Tabanı Yönetim Sistemlerinde- RDBMS'lerden) birini kullanıyorsanız SP yapın.

Söylediğiniz tarzda bir sorgu hazırlanır mı bilmiyorum ! Tek bir Sorguda alabilmek imkansız gibi görünüyor (imkansız olmayabilir ama öyle gibi) çünkü aynı tablodan farklı satırları aynı satırmış gibi gösterip bunları eleyerek getireceksiniz. !!!

Bunun yerine tekrar ediyorum siz bu işi bir SP'ye yıkın. Oradan sonuç olarak size Sorgu dönüş seti (Query Result Set) şeklinde bir değer döndürürsünüz ve yapacağınız işlemlerde de bu sonuç setini kullanabilirsiniz. Normal Sorgu'dan farkı olmaz !...

Yahut da SP'de oluşan sonucu bir geçici tabloya (rapor tablosuna) atarsınız, sonra rapor tablosundan işlemlerinize devam edersiniz.

Bilmem açıklayıcı oldu mu?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Kayıt numaralarını düzgün girmek ve hiç atlamamak koşulu ile aşağıdaki sp ile istediğinizi alabilirsiniz. Kayıt nosunu generatordan otomatik oluşturursanız bir sorununuz olmaz.

Ben istediğiniz sonucu almak için aşağıdaki tabloyu oluşturup aşağıdaki verileri girdim.
vt olarak firebird ü kullandım.

Kod: Tümünü seç


CREATE TABLE PERSONEL (
    KNO    INTEGER NOT NULL,
    SAAT   TIME,
    GIRDI  INTEGER
);

Kod: Tümünü seç

INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (1, '12:00:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (2, '12:10:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (3, '12:40:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (4, '13:53:00', 100);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (5, '14:11:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (6, '15:23:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (7, '16:33:00', 75);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (8, '16:40:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (9, '17:05:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (10, '17:20:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (11, '17:35:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (12, '17:45:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (13, '17:30:00', 85);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (14, '17:43:00', 0);
INSERT INTO PERSONEL (KNO, SAAT, GIRDI) VALUES (15, '18:25:00', 93);

COMMIT WORK;

daha sonra aşağıdaki sp yi oluşturdum.

Kod: Tümünü seç

CREATE PROCEDURE SAAT 
RETURNS (
    GIRDI_SONUCU INTEGER,
    BASLAMA_ZAMANI TIME,
    BITIS_ZAMANI TIME)
AS
DECLARE VARIABLE SAYAC INTEGER;
DECLARE VARIABLE SIMDIKI INTEGER;
DECLARE VARIABLE ONCEKI INTEGER;
begin
        sayac=0    ;
  for   select kno,girdi,personel.saat from personel  where girdi<>0 into :simdiki,girdi_sonucu,bitis_zamani  do
  begin

        sayac=sayac+1;

        if (sayac=1) then
               begin

                  for select personel.saat from personel where kno=1 into :baslama_zamani do
                  begin
                  onceki=simdiki;
                   suspend;

                   end
               end 

         if (sayac>1) then
               begin

                  for select personel.saat from personel where kno=:onceki+1 into :baslama_zamani do suspend;
                  onceki=:simdiki;

               end 




  end



end

ibexpert içinden tools/sql editörünü seçip


Kod: Tümünü seç

select * from saat
yazıp çalıştırınca

Kod: Tümünü seç

GIRDI_SONUCU      BASLAMA_ZAMANI      BITIS_ZAMANI
-------------------     ----------------------      ------------------
100                              12:00                         13:53
75                                14:11                         16:33
85                                16:40                         17:30
93                                17:43                         18:25
sonucunu verdi. Bu da sanırım istediğiniz şeydir.

Kolay gelsin.
tatu
Üye
Mesajlar: 25
Kayıt: 09 Nis 2005 06:13

Mesaj gönderen tatu »

selamlar ve şimdiden iyi bayramlar.


Sn. Kuri_YJ Kullandığım VEritabanı sql server 2000. Ama inanın öyle bir kafayı patlattım ki bu konuda artık beynim durdu. SP'de netür bir çözüm üreteceğim hakkında hiçbir fikir üretemez durumdayım.

Sn OfenX tablomda şuan yaklaşık 300.000 kayıt ve 30 Colon var. Dolayısı ile tablomda bir KayıtNo var ama sadece srgulatmak istediğim değil tüm kolonlarla ilişkili. Dolayısı ile Mesela KayıtNo artan sıralamayla ama peşpeşe değil. (1-7-33-57-98 Kayıt numaraları sadece belirtilen kolonlara ait iken ara numaralarda diğer kolonlarla ilgili kayıtlar var.)

saygılar.
Cevapla