Kayıtları field gibi gösterme?
Kayıtları field gibi gösterme?
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ı?
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ı?
Alan isimlerini bu şekilde alt alta döndürebilirsin.
Önemli olan tek satırda döndürmek tabi 
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
Kod: Tümünü seç
SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME='TABLO_ADI';

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!!
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

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!!
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:
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.
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
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.
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
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.Ek not, kullandığım araç yüzünden bilgilerin SQL'den bu şekilde gelmesi lazım. Raporlama toolunu değiştiremiyorum
evet bu en mantıklısı, zaten MS Zirve 2007 de ileri SQL başlığı altındaki bir seminerde buna benzer örnekler yaptılarHakan 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

hatta burada cok fazla field (MALZEME) varsa bu kodu string olarak generate edip çalıştırmak daha da mantıklı olabilir.
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.
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
İ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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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.
Şeklinde.
Kolay gelsin.
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]
_________________
_________________
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
diyerek istediğin işlemi yapmış olursun.
kolay gelsin.
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
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
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.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.
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.