ورود

نسخه کامل مشاهده نسخه کامل : یک جدول با اطلاعاتی به شکل زیر چگونه می توان در CrystalReport ساخت؟



M-B-M
20-07-2008, 00:42
سلام
توی کریستال ریپورت چنین گزارشی را چگونه می توان ساخت؟

پسر دختر جمع زن مرد جمع جمع کل
کلاس الف
کلاس ب
کلاس ج


همه اطلاعات در یک جدول به نام Customer قرار دارد
می خواهم در این جدول تعداد پسرهای کلاس الف در مکان مشخص شده، تعداد دخترهای کلاس الف در مکان مشخص شده و جمع این دو در مکان مشخصی شده، تعداد زن های کلاس الف در مکان مشخص شده، تعداد مردهای کلاس الف در مکان مشخص شده و جمع این دو در مکان مشخص شده
و همینطور در کلاسهای بعدی این کار تکرار شود
چگونه می توان چنین گزارشی تهیه نمود؟

M-B-M
21-07-2008, 14:26
لطفا اگر کسی یاد داره کمک کنه!

_H2_
21-07-2008, 23:20
سلام
آیا ساخت یک جدول با فیلدهای مورد نیاز و پر کردنش از داده های موجود این قدر سخت است؟؟؟
یعنی شما نمیتوانید جدول مورد نیاز با نوع فیلدهای مورد نیاز را بسازید؟؟؟

M-B-M
21-07-2008, 23:30
سلام
آیا ساخت یک جدول با فیلدهای مورد نیاز و پر کردنش از داده های موجود این قدر سخت است؟؟؟
یعنی شما نمیتوانید جدول مورد نیاز با نوع فیلدهای مورد نیاز را بسازید؟؟؟

من فکر می کنم که سئوال کمی مشکل باشد که کسی به آن جواب نداده است!
حداقل یک راهنمایی هم نکرده اند که باید برای هر فیلد فرمول نویسی کنم یا با یک ----- کردن ساده می توان چنین جدولی را پر کرد

_H2_
22-07-2008, 00:54
سلام

من فکر می کنم که سئوال کمی مشکل باشد که کسی به آن جواب نداده است!
:31::11:



نام و نوع فیلدهای جدولتان چیست؟

M-B-M
22-07-2008, 01:38
من یک جدول دارم که یک فیلد آن حاوی SelectedIndex یک ComboBox روی فرم است، و فیلد دیگر آن حاوی کد جنسیت است (0 زن 1 مرد). می خواهم در گزارش یک جدول چاپ کنم که سطر های آن حاوی مقادیر همان ComboBox روی فرم باشد (کلاس الف، کلاس ب, کلاس ج) و ستون های آن حاوی جنسیت باشد (زن، مرد، جمع).

در خانه 1.1 تعداد زن های کلاس الف
در خانه 1.2 تعداد مرد های کلاس الف
در خانه 1.3 تعداد مرد ها و زن های کلاس الف

در خانه 2.1 تعداد زن های کلاس ب
در خانه 2.2 تعداد مرد های کلاس ب
در خانه 2.3 تعداد مرد ها و زن های کلاس ب

در خانه 3.1 تعداد زن های کلاس ج
در خانه 3.2 تعداد مرد های کلاس ج
در خانه 3.3 تعداد مرد ها و زن های کلاس ج

نام جدول Customer
نام فیلد حاوی کلاسها Calss از نوع Nvarchar(2)
نام فیلد حاوی جنسیت Gen از نوع Nvarchar(2)

_H2_
23-07-2008, 10:03
سلام
متاسفانه این جواب سوال من نبود، یعنی جدول اصلی شما فقط دو ستون دارد و PrimaryKey هم ندارد؟؟؟؟!!!!!
من فرض میکنم شما حداقل سه جدول دارید
1- جدولی مخصوص کلاسسها با کد کلاس
2- جدولی مخصوص شاگردها با کد دانش آموزی
3- جدولی که مشخص میکند کدام افراد در کدام کلاسها عضو هستند (هر نفری میتواند عضو چند کلاس باشد، هر کلاسی میتواند شامل چند نفر باشد.)

اینطوری هر کلاس و هر نفر فقط یک بار نام نویسی میشود.
(ساختار دیتابیسی زیر کامل نیست و مثلاً شامل تاریخ ها و دوره ها نیست.)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(توجه کنید که طراحی جداول و فیلدهای یک دیتابیس محکم و قوی، خشت اول برنامه نویسی اطلاعات گرا است.)

با این فرض، کد SQL دستور select شما برای استخراج اطلاعات و پر کردن یک DataTable و تحویل دادن به کریستال اینچنین خواهد شد.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور چهار فیلد را باز پس میدهد نام کلاس-تعداد مردان-تعداد زنان-تعداد کل
البته پیشنهاد میکنم برای افزایش کارایی و سرعت، دستور فوق را در یک قالب یک View در SQLServer ذخیره کنید، مثلاً با نام ClassReport یا ClassReportPrint و... سپس در کدهایتان آن View را فراخوانی کنید.

M-B-M
10-10-2008, 11:39
سلام
این جواب شما یعنی من برای هر فیلد باید که باید نمایش داده شود باید این دستورات را بنویسم؟
اگر تعداد این سطر ها و ستون ها به 1000 یا 10000 برسد آنوقت باید چکار کرد؟

ببینید من این جدول را یا ویزارد خود CrystelReport ساخته ام فقط مشکل من این است که کلاسهایی که کسی در آنها ثبت نام نشده اند (مثلا در کلاس الف هیچ دختری ثبت نام نکرده است و همچنین در کلاس ج هیچ پسر و دختری ثبت نام نکرده اند) این دو در گزارش نمی آیند. من می خواهم حتی فیلدهایی که مقدار ندارند در گزارش با مقدار 0 ظاهر شوند.
آیا این ویزارد را می توان طوری تغییر داد که نتیجه مطلوب حاصل شود؟

_H2_
11-10-2008, 00:46
سلام

این جواب شما یعنی من برای هر فیلد باید که باید نمایش داده شود باید این دستورات را بنویسم؟
اگر تعداد این سطر ها و ستون ها به 1000 یا 10000 برسد آنوقت باید چکار کرد؟

میبخشید، باور بفرمائی منظورتان را درک نمیکنم.... !
اگر شما فرضاً ان سه جدول پست 7 را داشته باشیدريال باید به جای یک SELECT * FROM tablename از آن دستور SQL ای نوشته ام برای بازیابی اطلاعات استفاده کنید.


ببینید من این جدول را یا ویزارد خود CrystelReport ساخته ام فقط مشکل من این است که کلاسهایی که کسی در آنها ثبت نام نشده اند (مثلا در کلاس الف هیچ دختری ثبت نام نکرده است و همچنین در کلاس ج هیچ پسر و دختری ثبت نام نکرده اند) این دو در گزارش نمی آیند. من می خواهم حتی فیلدهایی که مقدار ندارند در گزارش با مقدار 0 ظاهر شوند.
آیا این ویزارد را می توان طوری تغییر داد که نتیجه مطلوب حاصل شود؟
به نظر من شما باید دستور SELECT خودتان را فقط عوض کنید و متاسفانه به نظر جوابتان همان پست هفت است!
در مراحل ویزاد هم حتماً در جایی از شما TypedDataSet خواسته میشود؟
باید TypedDataSet با فیلدهای مورد نیاز بسازید و با ان دستور SQL پرش کنید و تحویل کریستال بدهید...

متاسفانه به نظر میرسد حرف همدیگر را متوجه نمیشویم.
اگر میتوانید بخشی از پروزه که فقط شامل دیتابیس و دیتاست و گزارش باشد را آپلود و pm کنید، شاید حرف همدیگر را بهتر بفهمیم !

M-B-M
11-10-2008, 13:47
سلام
اینجا Up کردم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فایل zip حاوی برنامه ؛ دیتابیس ؛ و فایل راهنما

باز هم ممنون

_H2_
14-10-2008, 00:11
سلام
متاسفانه تازه امروز وقت کردم و نگاهی به کدتان انداختم...

این جواب شما یعنی من برای هر فیلد باید که باید نمایش داده شود باید این دستورات را بنویسم؟
اگر تعداد این سطر ها و ستون ها به 1000 یا 10000 برسد آنوقت باید چکار کرد؟

حالا متوجه شدم مشکلتان کجا است.
مشکل شما از آنجا ناشی میشود که چیزی که میخواهید نیاز به یک View دارد که مخالف قوانین نرمال سازی است.

شما ستونهایی دارید که احتمال دارد تعدادشان زیاد شود! درست است؟
این تفکر اشتباه است، تفکر شما باید طوری باشد که همواره تعداد ستون ها را ثابت نگاه دارد...
به فرض با یک دستور ساده SQL توانستید این اطلاعات را استخراج کنید، خوب اگر به قول خودتان این ستون ها تعدادشان به 1000 تا برسد، در چه کاغذی میخواهید آن را چاپ کنید؟؟؟

به سه طرح زیر دقت کنید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

شما الآن مورد اول را انتخاب کرده اید که مشکل دارد ولی به راحتی میتوان مورد دوم و سوم و... را پیاده سازی کرد که هم دستور ثابتی در SQL خواهد داشت و هم مشکل کاغذی با عرض چند متر را حل میکند!

==============

اما در مورد بانکتان:
من اول فیلدهای غیر منطقی nvarchar شما را تبدیل به tinyint کردم و یک سوال:
شما rank را در جدول Customer مشخص کرده اید ولی مشخص نکرده اید حدول Customer با چه فیلیدی به جدول Disorder وصل است و ارتباط دارد؟
بالاخره باید یک فیلدی در Customer مشخص کننده سطر مرجع Disorder باشد؟

این را بگویید من میتوانم نمونه ای از گزارش خودتان (طرح اول تصویر) یا طرح دوم یا ... برایتان بسازم.

M-B-M
16-10-2008, 10:12
سلام
من الان شهرستان هستم و تا جایی که یادم می آید من جدول DoGeneral را در دیتا بیس برای شما ارسال کردم که این جدول حاوی فیلد CuId برای ارتباط با جدول Customer و فیلد DiId برای ارتباط با جدول Disorder است که به ازای هر دانشجو یک DiId ذخیره می شود

در مورد نوع گزارش هم باید بگم که همانطوری که در فایل Doc مشاهده کردید گزارش من هم همانند آن در برگه A4 چاپ می شود و که تمام سطرهای آن در عرض برگه جا می شود و ستونهای آن در چند برگه ادامه می یابد (شکل گزارش دقیقا همانند شکل فایل Doc)

باز هم از اینکه وقت گزاشتید ممنون هستم

_H2_
18-10-2008, 01:49
سلام
من یک نمونه برایتان حاضر کردم ولی متاسفانه جداول و روابط و فیلدهای شما را درست درک نکردم (شرمنده!).
برای همین خودم دو جدول با حداقل فیلدهای مورد نیاز درست کردم و برای گزارش از آنها استفاده کردم.

مشکل کلی دوستان در عدم توانایی طراحی همچین گزارش هایی فرار از SQL و پناه بردن به سمت ابزار گزارش گیری مثل کریستال است.
روش اصولی آن است که شما اول یک دستور SELECT یا یک View بتوانید بسازید که دقیقاً همان سازه اطلاعاتی را که در گزارش نیاز دارید در خروجی نمایش دهد و از ابزاری مثل کریستال فقط در جهت نمایش این خروجی SELECT به صورت شکیل و قابل چاپ استفاده کنید. به اینکه ابزار گزارش را بخواهید جایگزین قدرت پرس و جوی بانک اطلاعاتی کنید.

با توجه به اینکه طبق شکلهایی که در پست قبلیم گذاشتم، شما همچنان بر مدل اول تاکید داشتید، دستورات SQL کمی زیاد شد (چون برای هر بلوک ستون باید تکرار میشد.) در نتیجه در جهت سرعت و وضوح و کاهش کد SQL من یک function با نام ReportByID_Study__ و یک view به نام Report__ درست کردم که خروجی این view دقیقاً همان دیتاهایی است که شما میخواهید نمایش دهید (میتوانید در VS یا یک DataGridView مشاهده کنید) و در اصل کریستال فقط وظیفه این نمایش ساده را بر عهده دارد.

دستورات هر دو function و view را هم میتوانید در فایل sql.txt در کنار دیتابیس پیدا کنید.

1) البته لازم به ذکر است که میشد بدون function هم کار را تمام کرد ولی کدهای SQL داخل view خیلی زیادتر و سردرگم تر میشد.
2) کد SQL هر view را میتوانید یک راست در برنامه وارد کنید تا دیگر نیاز به وجود آن view نباشد ولی وجود view میتواند خوانایی و سرعت را افزایش دهد.

در نهایت هم پیشنهاد میکنم اگر قرار است تعداد ستونهایتان زیاد شود، حتماً به یکی از مدلهای دوم و سوم تصویری پست قبلی ام فکر کنید... !


(
البته وقت زیادی برای قشنگ کردن گزارش کریستال صرف نکرده ام،
یعنی خروجی صحیح است و همان است که خواسته اید ولی به صورت یکم نا مرتب.
این کریستال خیلی نفهمه و اعصاب آدم را خرد خاکشیر میکند تا یک چیز منظم و شکیل درست کند ...
)


rapidshare.com/files/155023585/WindowsFormsApplication_SqlReport.rar
همچنان اگر سوالی بود در حد وقت و سوادم میتوانم کمک کنم.
موفق باشید.

M-B-M
18-10-2008, 15:40
سلام
موقع Attach کردن دیتابیس به Sql این خطا را می دهد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
من از SqlServer2005 استفاده می کنم؛ آیا شما نیز از این ورژن استفاده میکنید یا ورژن 2008؟

_H2_
18-10-2008, 20:51
سلام
این لینک جدید را تست کنید... SQLServer2005+VS2005
rapidshare.com/files/155257282/WindowsFormsApplication_SqlReport.rar

M-B-M
23-02-2009, 13:50
سلام H2 جان
ببخشید که من این تاپیک رو از زیر خاک بیرون کشیدم
من مجدد دیتابیس خودم رو با شکل خروجی گزارش با توضیحات کامل برای شما ارسال می کنم اگر لطف کنید و یک نگاهی به آن بیاندازید و مشکل آن را رفع کنید ممنون می شوم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فایلZip حاوی دیتابیس و فایل Doc شامل توضیحات کامل جدول ها و ارتباط آنها

M-B-M
23-02-2009, 13:51
سلام H2 جان
ببخشید که من این تاپیک رو از زیر خاک بیرون کشیدم
من مجدد دیتابیس خودم رو با شکل خروجی گزارش با توضیحات کامل برای شما ارسال می کنم اگر لطف کنید و یک نگاهی به آن بیاندازید و مشکل آن را رفع کنید ممنون می شوم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فایلZip حاوی دیتابیس و فایل Doc شامل توضیحات کامل جدول ها و ارتباط آنها

_H2_
26-02-2009, 01:41
سلام
- این جدول Period اصلاً برای چه است؟ مبالغ دریافتی؟
- بالاخره این معلولیت هر فرد کجای جدول Customer ذخیره میشود؟
- یعنی معلوبیت فرد در Period ذخیره میشود؟ هر فرد میتواند چندین معلولیت داشته باشد؟ اگر فردی دو معلولیت دارد باید دوبار در آمار معلولیتهای (مرتبط) ذکر شود؟ یعنی در نهایت جمع کل نشان گر تعداد افراد نخواهد بود، بلکه عدد تعداد افراد*معلولیت را نشان میدهد؟

M-B-M
26-02-2009, 14:42
سلام
بله درست متوجه شدید!

توضیحات بیشتر:
هر فرد که در سیستم ثبت نام می شود (فقط یک بار در جدول Customer) می تواند به تعداد n بار مراجعه کند و وقت بگیرد که به ازای هر بار مراجعه یک رکورد در جدول Period به ازای این فرد ایجاد می شود (که اطلاعات این جدول حاوی شماره ایندکس مشتری، شماره معلولیت، مبلغ پرداختی، ... ) که در گزارش باید معلولیتهایی که در دیتابیس وجود دارد دسته بندی شوند (بدون توجه به اینکه این (مثلا 3) معلولیت از آن یک نفر است یا از آن 3 نفر جداگانه)

باز هم ممنون از اینکه وقت گذاشتید

_H2_
03-03-2009, 01:52
سلام
همانطور که قبلاً گفتم، باید اول مشکل را در سطح دستور SELECT در SQL رفع کرد و سپس به سراغ ابزار گزارش گیری رفت.

==============

من در اولین قدم نوع برخی فیلدهای دیتابیس شما را ویرایش کردم، چون متاسفانه از نوع منطقی استفاده نکرده بودید.
الآن در رایانه من...

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
لطفاً در صورت تفاوت، فیلدهای خود را چنین اصلاح کنید، وگرنه ممکن است دستورات بعدی ...


(
فیلدهای شما به نظر بزرگتر از حد لازم می آید...
مثلاً ...
اگر موسسه شما روزی 1000 ثبت نام جدید داشته باشد، میشود ماهی 30000 و سالی 365000 !
که بیشتر از 5883 سال (پنج هزار سال معادل 50 قرن!) طول خواهد کشید تا محدوده int را برای جدول Customer پر کند!!!
پس از نظر منطق و اثبات ریاضی هیچ دلیلی وجود ندارد که CuId از نوع bigint باشد.
ضمن اینکه من بعید میدانم موسسه شما روزی 1000 و ماهی 30000 ثبت نام داشته باشد!

معمولاً خیلی از دوستان int را دست کم میگرند و بدون هیچ پیشبینی منطقی ریاضی از محدوده اعداد مورد نیاز به صرف دم دست بودن int آن را کنار میگذارند!

بهحرحال اینها فقط یک پیشنهاد هستند و صلاح برنامه خود را شما بهتر میدانید.
)
==============

یک تابع با کد زیر ایجاد کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این تابع وظیفه استخراج اطلاعات در یک محدوده Customer.Rank مشخص را دارد.

(
ضمناً نمیدانم برای چه و به چه معنا یکسری از فیلدهای Period.DiId شما NULL هستند؟
فردی بدون بیماری مشخص؟
این میتواند یک وضعیف غیر نرمال در سطح دیتابیس باشد که در صورت بررسی و صحت باید جلوی آن گرفته شود.
ناچاراً دستوری برای نادیده گرفتن این مقادیر اضافه کرده!
)
==============

یک View نهایی با کد زیر ایجاد کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خروجی این View مشابه همان جدولی است که در فایل doc توصیفش کرده بودید.
(نباید ایرادی داشته باشد، من هم چک نکردم، شاید بد نباشد یکبار صحت اعداد و ارقام خروجی را چک کنید.)

==============

حالا خروجی آمده اطلاعات را دارید.
مابقی کار میشود ساخت گزارش (کسل کننده!) مورد نظر از GetStatistic در برنامه گزارش سازتان.

موفق باشید.