ورود

View Full Version : چگونگی ایجاد گزارش بصورت شناور



امیر تورانی
چهارشنبه 23 آذر 1384, 10:45 صبح
سلام
چطور میشه گزارشی ایجاد نمود که ستون گزارش ( فیلدها) توسط کاربر انتخاب و از انتخاب کاربر گزارش گرفته شود اگر کسی روش یا نمونه برنامه داره ممنونم که من را راهنمایی کنید

Erfan_eng
سه شنبه 29 آذر 1384, 10:26 صبح
سلام
ما راه حلی که پیدا کردیم این بود : یک جدول که حاوی نام فیلدها هست رو ایجاد کردیم (برنامه ای نوشتیم که با ایجاد این جدول فیلدها در SQL Server ایجاد میشه) برای ایجاد گزارشی بصورت شناور اول این جدول رو Browse کردیم دادیم در اختیار کاربر هر چند تا فیلد دوست داره انتخاب میکنه بعد اون انتخاب شده ها رو توی یک Recordset می ریزیم داخل loop قرار میدیم. مثال:

Do Until rs2PYparameter1.EOF
,SELECT PYsalary1.FinanceYear, PYsalary1.MonthNo, PYsalary1.EmployeeNo
.PYsalary1
(("Trim(rs2PYparameter1.Fields("ParameterLatinName

rs2PYparameter1.MoveNext
If rs2PYparameter1.EOF = False Then
Union
End If
Loop
ولی برنامه هایی هست که Report Designer هستند اگه راه حلی پیدا کردین به ما هم بگین

sh
جمعه 02 دی 1384, 09:42 صبح
اگر از ویرایش Developer کریستال رپورت استفاده کنی میتونی این کار رو به راحتی انجام بدی

gh_fereydonpoor
شنبه 03 دی 1384, 17:31 عصر
سلام به Erfan_eng
می شه خواهش کنم که توضیح بیشتری بدهید که چطوری توی report اون فیلدهارو بصورت خودکار اضافه کردید؟
من هر کاری کردم نتونستم.
مرسی ممنون
یا علی

gavanbakht
دوشنبه 05 دی 1384, 09:15 صبح
SQLReport گزارش ساز بانکهای اطلاعاتی SQLServer -Oracle -Access

http://www.developercenter.ir/Forum/showthread.php?t=164

Erfan_eng
سه شنبه 06 دی 1384, 07:40 صبح
سلام به Erfan_eng
می شه خواهش کنم که توضیح بیشتری بدهید که چطوری توی report اون فیلدهارو بصورت خودکار اضافه کردید؟
من هر کاری کردم نتونستم.
مرسی ممنون
یا علی

همونطوری که قبلا هم گفتم یه Table ایجاد کردیم که حاوی فیلدهاست. از ListView هم استفاده کردیم برای نمایش این Table . یعنی Browse کردیم ریختیم تو listView

Private Function FillSourceListViewParameter() As Boolean
Dim I As Integer
Dim itmFound As ListItem

SourceListViewParameter.ListItems.Clear
FillSourceListViewParameter = True

If rs1PYparameter1.BOF = True And rs1PYparameter1.EOF = True Then
FillSourceListViewParameter = False
"MsgBox "No Parameter
Exit Function
End If

rs1PYparameter1.MoveFirst
I = 1

Do Until rs1PYparameter1.EOF
Set itmFound = TargetListViewParameter. _
FindItem("" & rs1PYparameter1.Fields("ParameterLatinName"), lvwText, , lvwPartial)
If itmFound Is Nothing Then ' If no match, inform user and exit.
Set ListViewItem = SourceListViewParameter.ListItems.Add()
ListViewItem.Text = "" & rs1PYparameter1.Fields("ParameterLatinName")
ListViewItem.ForeColor = vbRed
' SourceListView.ListItems(i).ListSubItems.Add , , "" & rsBKaccount4.Fields("AccountLevel3")
SourceListViewParameter.ListItems(I).ListSubItems. Add , , "" & Trim(rs1PYparameter1.Fields("ParameterFarsiName"))
SourceListViewParameter.ListItems(I).ListSubItems. Add , , "" & rs1PYparameter1.Fields("ParameterType")
SourceListViewParameter.ListItems(I).ListSubItems. Add , , "" & rs1PYparameter1.Fields("ParameterSign")
I = I + 1
End If

rs1PYparameter1.MoveNext

Loop
SourceListViewParameter.Refresh

End Function

محمد رضاپور
سه شنبه 13 دی 1384, 23:46 عصر
با سلام

دوستان اجازه بدید روشی رو که من ازش استفاده کردم و تقریبا 99% از خواسته های من و کارفرمای من رو جواب داده خدمت شما و سایر دوستانی که تمایل به استفاده از این روش دارن رو عرض کنم.
اولا من از VB6 و CR10 Advanced Developer Edition استفاده می کنم و نمی دونم که این قابلیت آیا در dot Net هم هست یا نه؟
درثانی من یه ریپورت جدید طراحی کردم و فقط query خودم رو بهش معرفی کردم و هیچ Object دیگه ای به اون اضافه نکردم. در کدهای فرمی که گزارش رو به کاربر نشون می دم (منظورم همون فرمی هست که ocx کریستال ریپورت توی اون قرار داره) کدهای زیر رو می نویسم:

Dim rsReport As New ADODB.Recordset
Dim Report As New CrystalReport

Private Sub Form_Load()
rsReport.Open "Select * From query"
Report. Database.SetDataSource rsReport
Report. DiscardSavedData

Report.DetailSection1.AddFieldObject [field],[left],[top]

Report.ReadRecords
CRViewer.ReportSource = Report
Screen.MousePointer = vbHourglass
CRViewer.ViewReport
Screen.MousePointer = vbDefault
End Sub

در این حالت شما باید بجای عبارت [field] نام فیلدی رو که کاربر انتخاب کرده رو قید کنید و باید از رسم الخط "{query.fieldname}" استفاده کنید.

نکته دیگه اینه که من یه table تعریف کردم که توی اون در هر رکوردی اسم فیلد query رو نوشتم و یه فیلد هم از نوع Boolean تعریف کردم که وقتی کاربر فیلدی از query رو انتخاب می کنه، من مقدار اون رو True می کنم و در قسمت اضافه کردن Objectها به ریپورتم تمامی فیلدهائی رو که کاربر انتخاب کرده با استفاده از این روش بهش نشون می دم.

شاید یه کم براتون این روش گیج کننده باشه، ولی اگر ساختار طراحی Tableها و queryهای شما منطقی باشن اون وقت متوجه می شید که خیلی راحت با این روش می تونید از گزارش پویا استفاده کنید. این نکته رو هم یادآوری کنم که من حتی سایز کاغذ رو هم متغیر تعریف کردم. یعنی بصورت پیش فرض کاغذ من A4 عمودی هست و با افزایش طول گزارش اون رو بصورت افقی در میارم و اگر باز هم طول گزارش بیشتر شد از کاغذ A3 استفاده می کنم.

در پایان باید اضافه کنم که برای استفاده از این روش می تونید از سمپل خود کریستال ریپورت به آدرس Program Files\Crystal Decision\Crystal Reports 10\Samples\En\Code\RDC\Visual Basic\Pro Athlete Salaries هم استفاده کنید. من بعضی از کارهام رو از اینجا ایده گرفتم.

امیدوارم که این مختصر توضیح جرقه ای برای ذهن دوستان جوان و فعال باشه تا با پشتکار بیشتر (و البته یه کمی هم صبر و حوصله) به آرزوهاشون برسن.

موفق باشید.

ali_kolahdoozan
چهارشنبه 17 اسفند 1384, 06:55 صبح
MEBAKHSHID FARSI NEMENEVISAM . FONTHAM GATI KARDE . YEK SOAL VAGTE AZ KARBAR ESM FIELD HA RO SOAL KARDIM . KHOB SARBARG ONHA RO CHIKAR KOINM ONHAM BAYAD BA ENTEKHAB AVAZ BESHEH