Çarpraz sorgudan bir rapor oluşturdum. Fakat çarpraz sorgunun en kötü tarafı sütun sayısını kontrol edememek tahmininiz. Bunla ilgili olarak nasıl bir çözüm üretilebilir?
Çarpraz Sorgudan Rapor oluşturma
Soru çok güzel. Öncelikle onun için teşekkür ederim
bu konu zaman zaman forumlarda karşıma çıkıyor.
Sütun sayısını sabitlemek için bir ara tablo kullanılabilir. 10-20 tane sütun olsun diye bir sınır koyulabilir.
Ama kesin çözüm isteniyorsa raporun excele dökülmesi her zaman için tercihimdir. Kontrol tamamen sizde olduğu için istenilen formatta kayıtlar gönderilmiş olur. Örneğin ilk 10 sütun üstte ikinci 10 sütun altta olacak şekilde bir format, sütunlar harici ana bilgiler için (adı soyadı gibi) ayrılan alanlar satır sutun birleştirme ile birleştirilir. Tam olarak istenen formata uydurulabilir.
Access raporlarına gömülmektense kodla çözmeyi daha çok seviyorum. Ne yazıkki Access çalışma anında control yaratamadığı için raporlarda bu esnekliği sağlamak zor oluyor...
bu konu zaman zaman forumlarda karşıma çıkıyor.
Sütun sayısını sabitlemek için bir ara tablo kullanılabilir. 10-20 tane sütun olsun diye bir sınır koyulabilir.
Ama kesin çözüm isteniyorsa raporun excele dökülmesi her zaman için tercihimdir. Kontrol tamamen sizde olduğu için istenilen formatta kayıtlar gönderilmiş olur. Örneğin ilk 10 sütun üstte ikinci 10 sütun altta olacak şekilde bir format, sütunlar harici ana bilgiler için (adı soyadı gibi) ayrılan alanlar satır sutun birleştirme ile birleştirilir. Tam olarak istenen formata uydurulabilir.
Access raporlarına gömülmektense kodla çözmeyi daha çok seviyorum. Ne yazıkki Access çalışma anında control yaratamadığı için raporlarda bu esnekliği sağlamak zor oluyor...
Bana işe yarayan bir müdür göster,sana dünyayı yerinden oynatayım.
Descartes
Descartes
Evet güzel ve sık karşılaşılan bir problem.
Bununla ilgili çözümlerden birisi
Sn. Bilgisayarcı'nın anlattığı gibi sorguyu excel'e göndermek.
Benim kullandığım diğer çözümler ise kodlama ile sağlanabiliyor.
Crosstab Query'de kaç tane alan olduğunu ve hangi alan isimlerinin olduğunu Kod yazarak alabiliyorsunuz.
Internet'te yaptığım bir araştırmada,
Bununla ilgili bir çözüm bulmuştum.
Biraz ingilizceniz varsa çözebilirsiniz.
Yapılan şey özetle şu;
Raporda önceden sabit alanlar oluşturup,
kodla çapraz sorgudan alınan değerlere göre sırasıyla atamak.
----------------------
Title: Crosstab Query Report - asked by dhemple on 06/08/2004 12:16PM PDT
http://www.experts-exchange.com/Database...18004.html
I have a report that is populated with a crosstab query. The Column headings will change depending on the criteria selected by the user, but there will always be 5 columns.
Sample1:Product Desc 1Qtr03 2Qtr03 3Qtr03 4Qtr03
Sample2:Product Desc 3Qtr03 4Qtr03 1Qtr04 2Qtr04
------------------------------------------------------------------------------
Quote from Nic’s really old thread:
“When the selected field for the Column value can have different value's, you'll need some code to fill the columns as the value from the fields becomes the NAME of the field for the report.
Checkout this code / comment I created for another Q:
Making the columnheader and detaildata flexible is possible, but needs some Vba code in the OpenReport event.
To start, doing this you need to place the fields "coded" in the report.
The Column headings should be called "lblCol1", "lblCol2", "lblCol3", etc.
The "detail" fields should be called "Col1", "Col2", "Col3", etc.
The report query has two rowheader columns and a Total column, therefor the first field is effectively Column 4 (count starts at 0 so I used intI=3) but this could differ for you.
Make sure that the number of Columns is not bigger as the number placed. The programcode has no protection against that !
The OpenReport code:
---------------------------------------------------------------------------
Private Sub Report_Open(Cancel As Integer)
Dim intI As Integer
Dim intR As Integer
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(Me.RecordSource)
'Place headers
For intI = 3 To rs.Fields.Count - 1
Me("lblCol" & intI - 1).Caption = rs.Fields(intI).Name
Next intI
'Place correct controlsource
For intI = 3 To rs.Fields.Count - 1
Me("Col" & intI - 1).ControlSource = "=SUM([" & rs.Fields(intI).Name & "])"
Next intI
'Place Total field
Me.ColTotal.ControlSource = "=SUM([" & rs.Fields(2).Name & "])"
End Sub
---------------------------------------------------------------------------
The report query has two rowheader columns and a Total column, therefor the first field is effectively Column 4 (count starts at 0 so I used intI=3) but it could differ for you. PRC_Cross Nic;o)”
Bununla ilgili çözümlerden birisi
Sn. Bilgisayarcı'nın anlattığı gibi sorguyu excel'e göndermek.
Benim kullandığım diğer çözümler ise kodlama ile sağlanabiliyor.
Crosstab Query'de kaç tane alan olduğunu ve hangi alan isimlerinin olduğunu Kod yazarak alabiliyorsunuz.
Internet'te yaptığım bir araştırmada,
Bununla ilgili bir çözüm bulmuştum.
Biraz ingilizceniz varsa çözebilirsiniz.
Yapılan şey özetle şu;
Raporda önceden sabit alanlar oluşturup,
kodla çapraz sorgudan alınan değerlere göre sırasıyla atamak.
----------------------
Title: Crosstab Query Report - asked by dhemple on 06/08/2004 12:16PM PDT
http://www.experts-exchange.com/Database...18004.html
I have a report that is populated with a crosstab query. The Column headings will change depending on the criteria selected by the user, but there will always be 5 columns.
Sample1:Product Desc 1Qtr03 2Qtr03 3Qtr03 4Qtr03
Sample2:Product Desc 3Qtr03 4Qtr03 1Qtr04 2Qtr04
------------------------------------------------------------------------------
Quote from Nic’s really old thread:
“When the selected field for the Column value can have different value's, you'll need some code to fill the columns as the value from the fields becomes the NAME of the field for the report.
Checkout this code / comment I created for another Q:
Making the columnheader and detaildata flexible is possible, but needs some Vba code in the OpenReport event.
To start, doing this you need to place the fields "coded" in the report.
The Column headings should be called "lblCol1", "lblCol2", "lblCol3", etc.
The "detail" fields should be called "Col1", "Col2", "Col3", etc.
The report query has two rowheader columns and a Total column, therefor the first field is effectively Column 4 (count starts at 0 so I used intI=3) but this could differ for you.
Make sure that the number of Columns is not bigger as the number placed. The programcode has no protection against that !
The OpenReport code:
---------------------------------------------------------------------------
Private Sub Report_Open(Cancel As Integer)
Dim intI As Integer
Dim intR As Integer
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(Me.RecordSource)
'Place headers
For intI = 3 To rs.Fields.Count - 1
Me("lblCol" & intI - 1).Caption = rs.Fields(intI).Name
Next intI
'Place correct controlsource
For intI = 3 To rs.Fields.Count - 1
Me("Col" & intI - 1).ControlSource = "=SUM([" & rs.Fields(intI).Name & "])"
Next intI
'Place Total field
Me.ColTotal.ControlSource = "=SUM([" & rs.Fields(2).Name & "])"
End Sub
---------------------------------------------------------------------------
The report query has two rowheader columns and a Total column, therefor the first field is effectively Column 4 (count starts at 0 so I used intI=3) but it could differ for you. PRC_Cross Nic;o)”
Bildiğini bilenin arkasından git, bildiğini bilmeyeni uyar, bilmediğini bilene öğret, bilmediğini bilmeyenden kaç.
Konfüçyüs
Konfüçyüs
Sayın Sruz bu yöntem de güzel bir yöntem. Fakat sutun sayısını sabitlemekte hala bir sıkıntı olabilir bu durumda. Örneğin ben Col ve lblCol olarak 20 tane attım. 5 alanlık bir sorgu gönderdim sıkıntı çıkmaz. Mantık olarak 20 taneye kadar sorun çıkmaz. Sorun bunları forma sıkıştırmakta çıkıyor.
Sizin yöntemle tek bir rapor yerine iki tane hazırlamak daha temiz bir yöntem olur. Biri yatay diğeri dikey olacak sekilde.Sayıya göre kendisi yatay ya da dikeyliğe karar versin. Ya da daha temizi içeriklerine göre kendisi karar versin. (2 alanlı bir rapor olabilir ama Fieldlerde 250 karekterlik bilgiler varsa dikey yerine yataya kendisi karar versin gibi..) Bu yöntemle bile sonuç olarak accessin raporlarına kodla müdahale etmek gerekiyor.
Bu kadar kodlamadan sonra excele vermek bence daha güzel. Çünkü excelin esnekliğini de kullanabilir oluyoruz.
Ama sizin yöntem hoş. Yukarıdakileri içeren modifiyeyi de içeren örneği eklemeye çalışayım. Benim istediğim alıntılar yerine her zaman bizden bişilerin olması. Raporda kullanılan lbl mantığının benzerini ben labelleri buton haline getiriken kullanıyorum. Onu biraz değiştirerek rapora da uygularız sanırım...
Sizin yöntemle tek bir rapor yerine iki tane hazırlamak daha temiz bir yöntem olur. Biri yatay diğeri dikey olacak sekilde.Sayıya göre kendisi yatay ya da dikeyliğe karar versin. Ya da daha temizi içeriklerine göre kendisi karar versin. (2 alanlı bir rapor olabilir ama Fieldlerde 250 karekterlik bilgiler varsa dikey yerine yataya kendisi karar versin gibi..) Bu yöntemle bile sonuç olarak accessin raporlarına kodla müdahale etmek gerekiyor.
Bu kadar kodlamadan sonra excele vermek bence daha güzel. Çünkü excelin esnekliğini de kullanabilir oluyoruz.
Ama sizin yöntem hoş. Yukarıdakileri içeren modifiyeyi de içeren örneği eklemeye çalışayım. Benim istediğim alıntılar yerine her zaman bizden bişilerin olması. Raporda kullanılan lbl mantığının benzerini ben labelleri buton haline getiriken kullanıyorum. Onu biraz değiştirerek rapora da uygularız sanırım...
Bana işe yarayan bir müdür göster,sana dünyayı yerinden oynatayım.
Descartes
Descartes
Dim RS As New ADODB.Recordset
Dim I, SutunSayisi As Integer
'---------------------------------------------------------------------------------------------------------
'Query açılıyor
'---------------------------------------------------------------------------------------------------------
RS.open "KK_HATA_RAPORU_GUNLUK_Crosstab", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
'Sütun Sayısı
SutunSayisi = RS.Fields.Count
'Sütun Başlıkları
For I = 1 To SutunSayisi
MsgBox I & ": " & RS.Fields(I - 1).Name
Next I
Dim I, SutunSayisi As Integer
'---------------------------------------------------------------------------------------------------------
'Query açılıyor
'---------------------------------------------------------------------------------------------------------
RS.open "KK_HATA_RAPORU_GUNLUK_Crosstab", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
'Sütun Sayısı
SutunSayisi = RS.Fields.Count
'Sütun Başlıkları
For I = 1 To SutunSayisi
MsgBox I & ": " & RS.Fields(I - 1).Name
Next I
Bildiğini bilenin arkasından git, bildiğini bilmeyeni uyar, bilmediğini bilene öğret, bilmediğini bilmeyenden kaç.
Konfüçyüs
Konfüçyüs
Söylediğiniz gibi mesela raporda 20 sütun varsa
ve çapraz sorguda 20'den fazla sütun varsa,
benim önerebileceğim ve daha önce bir kez kullandığım bir metot var.
20. sütuna "Diğer" gibi bir isim atamak ve 19. sütundan sonraki alanlardaki tüm sütunları kodla toplamak ve bu alana yazdırmak.
Tabii rapora ve önemine göre kullanılabilir bu.
ve çapraz sorguda 20'den fazla sütun varsa,
benim önerebileceğim ve daha önce bir kez kullandığım bir metot var.
20. sütuna "Diğer" gibi bir isim atamak ve 19. sütundan sonraki alanlardaki tüm sütunları kodla toplamak ve bu alana yazdırmak.
Tabii rapora ve önemine göre kullanılabilir bu.
Bildiğini bilenin arkasından git, bildiğini bilmeyeni uyar, bilmediğini bilene öğret, bilmediğini bilmeyenden kaç.
Konfüçyüs
Konfüçyüs
Konuyu Okuyanlar: 2 Ziyaretçi