Kayıtları field gibi gösterme?

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
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Kayıtları field gibi gösterme?

Mesaj gönderen mussimsek »

Merhaba,

Bir rapor yapmam lazım. Burda detay bir tablodaki malzeme bilgilerindeki malzemeleri alanmış gibi göstermem lazım. Bir örnek anlatıyim, malzeme_detay tablom

Malzeme Miktar
CS 100
DS 200
ES 300

gibi. Raporda ben bu malzemeleri kolon gibi göstermeliyim :

Malzeme CS DS ES
miktar 100 200 300

Burda sorun çok malzeme olması ve yapılan üretime göre 2 malzemeden onlarca malzemeye kadar veri olması.

Fikri olan, daha önce uğraşan var mı?
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Ek not, kullandığım araç yüzünden bilgilerin SQL'den bu şekilde gelmesi lazım. Raporlama toolunu değiştiremiyorum :(
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Alan isimlerini bu şekilde alt alta döndürebilirsin.

Kod: Tümünü seç

SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME='TABLO_ADI';
Önemli olan tek satırda döndürmek tabi :roll:

Kaynak: http://www.alberton.info/firebird_sql_meta_info.html

SP içinde bir döngüde toplatılıp sonunda EXECUTE STATEMENT ile view yapılabilir :?:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Mustafa şöyle bir şey olabilir; yazacağın bir SP ile ilk alanı alan_adı olarak bir string değişkende toplayıp EXECUTE STATEMENT str; ile bir tablo oluşturursun. Diğer alanları da aynı şekilde bu tabloya INSERT edebilirsin. Belki view de olabilir :roll:

Kod: Tümünü seç

create procedure New_Procedure
returns (St varchar(255))
as
declare variable alan1 varchar(255);
declare variable alan2 varchar(255);
declare variable xself integer;
declare variable xadi varchar(20);
begin
  alan1 = '';
  alan2 = '';
  for select self, adi from BIRIMLER into :xself, :xadi
  DO begin
    if (alan1 <> '') then alan1 = alan1||', ';
    alan1 = alan1 || cast(xself as varchar(20));
    if (alan2 <> '') then alan2 = alan2||', ';
    alan2 = alan2 || xadi;
  end
--    EXECUTE STATEMENT 'create view deneme3 ('||alan2||') as select '||alan1||' from birimler';
  St = alan2;
  suspend;
  St = alan1;
  suspend;
end
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Benzer bir problemi CREATE VIEW ve DROP VIEW'ları kullanarak, Delphi içinde kod yazarak çözmüştüm.

Rapor almaya başlamadan önce varsa VIEW'ı DROP ediyor, Sonra SELECT DISTINCT ile kaç kolon olacağını belirleyip sonra CREATE VIEW yapıyordum.

Eğer kod yazarak SQL cümlesi elde edecekseniz şuna benzer bir SQL yazarak VIEW'larla uğraşmadan direk çözebilirsiniz. Zaten VIEW için de benzerini yapmanız gerekiyor:

Kod: Tümünü seç

SELECT
  'Miktar' AS Malzeme,
  SUM(CASE WHEN Malzeme = 'CS' THEN Malzeme ELSE 0 END) AS CS,
  SUM(CASE WHEN Malzeme = 'DS' THEN Malzeme ELSE 0 END) AS DS,
  SUM(CASE WHEN Malzeme = 'ES' THEN Malzeme ELSE 0 END) AS ES
FROM malzeme_detay
Sonuçta tek bir satır dönecektir.

Ancak CS, DS, ES vesayreyi SELECT DISTINCT gibi bir şekilde önceden belirlemeniz lazım.

Bunun dışında FireBird'de direk tek bir SQL komutuyla buna benzer dikey bir tabloyu yatay almayı ben de çok aramış fakat bulamamıştım.

Zira SP'ler de sonuçta tablo yapısında statik sonuç döndürüyor.

İyi çalışmalar.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Ek not, kullandığım araç yüzünden bilgilerin SQL'den bu şekilde gelmesi lazım. Raporlama toolunu değiştiremiyorum
bu ifade cok acik olmamis ama raporlama aracini degistirmeden , sql ile kayitlari normal bir sekilde alip bir donguyle bu kayitlari istenilen sekilde bir memory tabloya atip ordanda raporlama aracina gondermekte biz cozum olabilir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Hakan Can yazdı:

Kod: Tümünü seç

SELECT
  'Miktar' AS Malzeme,
  SUM(CASE WHEN Malzeme = 'CS' THEN Malzeme ELSE 0 END) AS CS,
  SUM(CASE WHEN Malzeme = 'DS' THEN Malzeme ELSE 0 END) AS DS,
  SUM(CASE WHEN Malzeme = 'ES' THEN Malzeme ELSE 0 END) AS ES
FROM malzeme_detay
evet bu en mantıklısı, zaten MS Zirve 2007 de ileri SQL başlığı altındaki bir seminerde buna benzer örnekler yaptılar :D
hatta burada cok fazla field (MALZEME) varsa bu kodu string olarak generate edip çalıştırmak daha da mantıklı olabilir.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Biraz daha detay veriyim, daha önce çalışan arkadaş bir raporlama tool'u yapmış. Toolda bir select cümlesi veriyorsunuz ve dönen alanları ayarlayıp, Richedit'te düzgün bir şekilde ekrana basıyor.

Yoksa dediğiniz gibi cxGrid veya Fast Report ile kolay bir şekilde çözülebilirdi. Benim alanlar üzerinde bir takım hesaplamalar ve karşılaştırmalarda yaptığım için sp olarak yaptım. Yani bana mutlaka sp'den dönen sonuçlarda bilgiler bu şekilde olmalı, delphi tarafında takla attıramıyorum.

Sadece bir rapor için raporun formatını da değiştirmek istemiyoruz.

Kolay gelsin.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

İyi günler. O zaman sırf böyle raporları karşılaması açısından programdan geçici tablo doldurup, raporlama aracından bu tabloyu kullanmak uygun olabilir. FB'de yapı nasıl bilmiyorum ama SQLServer'da # karakteri ile başlayan tablolar (memory table) oluşturulunca bunlar sanal olup tıpkı normal tablolar gibi çalışmaktadır. Tabi bağlantı kesildiğinde ise varsa bu tablolar kendiliğinden silinmektedir. Belki FB'de de benzeri bir mantık varsa aynen kullanılabilir yoksa sırf bu iş için normal tablo oluşturup onu kullanmak gerekecektir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba Mustafa Hocam;

Firebirdde değil ama mssql synax şöyle yapılıyor.
PIVOT ve UNPIVOT komutlarıyla PIVOT ile satırları sütün UNPIVOT ile Sütünları satır yapabiliyoruz.

Kod: Tümünü seç

SELECT P .*
FROM Malzeme_Detay
PIVOT
(
Sum ( Miktar )
FOR MalAdi IN( [CS] , [DS] , [ES] )
) AS P

Şeklinde.
Kolay gelsin.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
bir öneride benden.
bir stored procedure oluştur.
output parametresi bir tane string olsun.
out_alan varchar(xxxx)
4 tane değişken tanımla.
declare variable malzeme
declare variable miktar
declare variable out_malzeme
declare variable out_miktar

sonra tablondan miktar ve malzeme alanlarını çek.
bunları out_xxxx lere ekle(string olarak)
ensonada

Kod: Tümünü seç

out_alan=out_malzeme;
suspend;
out_alan=out_miktar;
suspend
diyerek istediğin işlemi yapmış olursun.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

mussimsek yazdı:Biraz daha detay veriyim, daha önce çalışan arkadaş bir raporlama tool'u yapmış. Toolda bir select cümlesi veriyorsunuz ve dönen alanları ayarlayıp, Richedit'te düzgün bir şekilde ekrana basıyor.

Yoksa dediğiniz gibi cxGrid veya Fast Report ile kolay bir şekilde çözülebilirdi. Benim alanlar üzerinde bir takım hesaplamalar ve karşılaştırmalarda yaptığım için sp olarak yaptım. Yani bana mutlaka sp'den dönen sonuçlarda bilgiler bu şekilde olmalı, delphi tarafında takla attıramıyorum.

Sadece bir rapor için raporun formatını da değiştirmek istemiyoruz.

Kolay gelsin.
FireBird 2.0'da DERIVED TABLES diye yeni bir kavram var. Bu kavramı ve CASE WHEN ELSE END ve COALESCE'lerle artık çoğu SP'leri kullanmaya gerek kalmıyor. Birçok kompleks hesaplamaları bunlarla halledebiliyorsunuz. Birçok SELECT cümlesini tek bir SELECT cümlesine çevirebiliyorsunuz.

Eğer SP kullanıyorsanız yine SP'yi tablo gibi verdiğimiz örneklerdeki SELECT cümlelerinde kullanabilirsiniz.

FireBird'de SP içinden dinamik RESULT SET döndürmek bildiğim kadarıyla mümkün değil.

MS-SQL'deki TEMP TABLE olayı (# ve ##) FireBird'de yok.

İyi çalışmalar.
Cevapla