View Full Version : سوال: مجموع یک فیلد در گزارش
alireza323
سه شنبه 29 مرداد 1387, 17:12 عصر
چطور میشه مجموع یه فیلد گزارش رو بدست آورد،من تو گزارشم یه فیلد به اسم "amount " دارم که میخوام مجموع این فیلد رو بدست بیارم و تو گزارشم نشون بدم،چطور میتونم این کارو انجام بدم،لطفا اگه امکان داره کامل توضیح بدین
bsng110
سه شنبه 29 مرداد 1387, 17:36 عصر
هوالحکیم سلام ما هم دقیقاً همین حکایت را داشتیم و الآن به همراه همکارم(که فامیلم هم می شه) به جواب رسیدیم(بعد از یکی دو ساعت) در صورتی که هر چی گشتیم، هیچ کسی جواب این سوال را نداده بود. حالا ما به طور کلی جواب این مسئله را می دهیم که از این به بعد دیگران نیز بتوانند از این روش استفاده کنند. در مورد جمع یک ستون، دو حالت کلی ممکن است به وجود آید. اول نمایش جمع در انتهای ستون است و نهایتاً نمایش جمع صفحه قبل در ابتدای صفحه جاری! بنده توضیحات خود را در Visual Studio 2005 بیان می کنم. در ابتدا حالت اول را توضیح می دهیم. در Filed Explorer بر روی گزینه Running total field کلید کنید و یا از منوی Crystal Report گزینه Insert و سپس Summary را انتخاب کنید. در هر صورت یک پنجره(البته با ظواهر مختلف اما محتوای یکسان) به شما نمایش داده می شود. بنده جهت یکپارچگی توضیحات اولین روش یعنی استفاده از Filed Explorer را توضیح می دهم. در این پنجره، از پنل سمت چپ فیلد مورد نظر خود(در اینجا Amount) را انتخاب کرده و بر روی دکمه < در بالای و وسط پنجره کلید کنید تا این فیلد به سمت راست در خانه Filed to summarize منتقل شود. سپس تابع خود را از جعبه انتخاب شدنی زیر آن انتخاب کنید که شما در اینجا sum را انتخاب می کنید. دقت کنید که فیلد شما باید عددی باشد نه رشته و ... و الا برای انجام چنین کاری باید کدنویسی کنبد. در جعبه اول(Running total name) نیز می توانید نامی برای این فیلد جمع بنویسید مثلاً AmountSum! حالا Ok کنید. در همان قسمت Filed Explorer متغیر شما با همان نام(AmountSum) آمده است. این متغییر را کشیده و در قسمت Report Footer بگذارید. تمام شد. حالا جمع این ستون را برای هر صفحه مشاهده می کنید. برای نمایش جمع صفحه قبل نیز کافیست همین فیلد که در بالا طریقه تولید آن گفته شد را کشیده و این بار در Report Header یا Page Header(بسته به نیاز خود) قرار دهید اما یک مشکل وجود دارد. جمعی که در این حالت مشاهده می کنید، جمع صفحه قبل به اضافه جمع فیلد اولین رکورد صفحه جاری می باشد! برای حل این مشکل بر روی فیلدی که در صفحه قرار داده اید راست کلیلک کرده و Format Object را انتخاب کنید. سپس در زبانه Common ، دکمه روبروی Display String(که در پایین پنجره قرار دارد) را بزنید. حال باید یک خط کد ساده بنویسید. کد شما به صورت زیر است:
CSTR(CurrentFieldValue-{YOUR_FIELD_NAME}) مثلاً من یک فیلد به نام xBedeh از تابع GetRiz داشتم(این تابع یک IDataReader بر می گردوند که چیزی شبیه DataSet است). به همین دلیل نوشتم:
CSTR(CurrentFieldValue-{GetRiz.xBedeh}) همین. تموم شد. امیدوارم که مشکل شما حل شده باشه و در انجام این مراحل به مشکلی بر نخورید. اگه چیز بیشتری یاد گرفتید، حتماً به ما هم بگویید. یا علی خدانگهدارتون
alireza323
چهارشنبه 30 مرداد 1387, 17:27 عصر
آقا ممنون،واقعا راهنمایی خوبی کردی
alireza323
چهارشنبه 30 مرداد 1387, 17:28 عصر
آقا می تونی به یه سوال من که راجب subreport هست،جواب بدی.عنوان سوالمم اینه که چرا subreport من چیزی نشون نمیده،ممنون میشم اگه به اونم یه نگاهی بندازی
bsng110
چهارشنبه 06 شهریور 1387, 21:55 عصر
هوالحکیم
سلام مجدد
گفتم که هنوز با subreport ها کار نکردم و از این بابت شرمنده ام. اما یکی از دوستان پرسیده بودند که چنانچه بخواهیم این فرمول ها برای هر گروه جداگانه حساب شود، چه باید کرد؟ کافیست در هنگام تعریف یک فید مجموعی(Total Field)، در قسمت Reset(سومین قسمت سمت راست) گزینه On Change of Group را زده و نام گروه خود را در مقابل آن انتخاب کنید. مسلم است که بعد از تعریف فیلد نیز با راست کلیک کردن و Edit فیلد می توانید این تغییرات را اعمال کنید. امیدوارم مشکلتان حل شده باشد. البته یک نکته دیگر باقی می ماند و آن در مورد فیلدهای منقول از صفحه قبل می باشد!!! در این موارد باید چه کرد؟ بدیهی است که فیلد منقول از صفحه قبل، مربوط به صفحه اول نباید وجود داشته باشد ولی در صفحات دوم به بعد ممکن است این فیلد نیاز باشد ولی از کجا بفهمیم که نیاز است یا خیر؟ در گزارشات بدون گروه بندی، مطمئن بودیم که در صفحه دوم به بعد به این فیلد نیاز داریم ولی در گزارشات گروه بندی شده، ممکن است گزارش صفحه قبل مربوط به یک گروه دیگر بوده باشد و نیازی به نمایش فیلد منقول از صفحه قبل نباشد و یا بالعکس، گزارش انتهای صفحه قبل، مربوط به گزارش ابتدای صفحه فعلی باشد که در این صورت به فیلد منقول از صفحه قبل نیاز داریم. قبلاً جهت حل این مشکل در گزارشات بدون گروه بندی از pagenumber استفاده کردیم، در اینجا بنده ترفندی را به کار بردم. بررسی کردم، چنانچه گروه قبلی، با گروه جاری برابر بود، پیداست که گزارش انتهای صفحه قبل، ابتدای گزارش جاری بوده است و باید در این گزارش، فیلد منقول از صفحه قبل وجود داشته باشد و چنانچه شماره گروه گزارش انتهای صفحه قبل، با شماره گروه گزارش ابتدای این صفحه یکی نبود، دیگر نیازی به نمایش فیلد منقول از صفحه قبل نمی باشد. این هم فرمول این عمل:
if(PreviousIsNull({YOUR_FIELD_NAME})) Then
true
else if(Previous({YOUR_FIELD_NAME}) <> {YOUR_FIELD_NAME})then
true
else
false
یا علی
حق نگهدارتان
MORTEZA66
پنج شنبه 07 شهریور 1387, 00:05 صبح
سلام به همه دوستان البته راه ساده تر از اين ها هم وجود داره!!! شايد من درست نفهميدم ام مجموع يه فيلد رو خود كريستال هم بدست مياره بدون كد نويسي! تازه به غير از اونم راه ساده تر وجود داره! در صفحه گزارش كليك راست كنيد و Insert-->Summary رو انتخاب كنيد فكركنم كار شما رو راه بندازه
mrs Izadi
یک شنبه 10 شهریور 1387, 11:02 صبح
با سلام
من در گزارشم مجموع مقادیری از یک فیلد که در همین صفحه چاپ میشود را محاسبه میکنم برای محاسبه از این کدها استفاده میکنم
Page by Page totals
Create the following formula, I call it PageTotalReset, and place it in the Page Header section.
Global currencyVar PageTotalValue;
WhilePrintingRecords; PageTotalValue := 0;
Create the following formula, I call it PageTotalAmount, and place it in the Details section.
Global currencyVar PageTotalValue;
WhilePrintingRecords;
PageTotalValue := PageTotalValue + {TableName.FieldName};
Create the following formula, I call it PageTotalDisplay, and place it in the Page Footer section.
Global currencyVar PageTotalValue;
WhilePrintingRecords;
PageTotalValue
حالا مشکلی که وجود داره اینه که در محاسبه مجموع، مقدار آخرین رکورد را حساب نمیکنه و این مقدار با مقادیر صفحه بعد جمع بسته میشه در ضمن این مشکل برای صفحه اول عمومیت نداره یعنی بعضی از مواقع در صفحه اول اتفاق میافته ولی در صفحات بعدی همیشه همینطور است
لطفا مرا در حل مشکلم کمک کنید.
bsng110
یک شنبه 10 شهریور 1387, 12:17 عصر
هوالحکیم
سلام
حق با شماست و از روش بالا نیز می توان استفاده کرد. در مورد خطاهایی که گفتید، دقیقاً نمی دانم مشکل از کجاست و باید یک مرتبه این روش را تست کنم تا ببینم اشکالش از کجاست ولی به شما پیشنهاد می کنم که اصلاً از این روش استفاده نکنید. این روش را برای کارهایی بگذارید که روش اصولی ندارند. فرض کنید به هر وجهی توانستید این فرمولی که نوشتید را کار بیندازید، صرف نظر از پیچیدگی این این و نیاز به کد های زیاد آن در سه Section، به سختی می توان از این روش برای گزارش هایی که گروه بندی شده اند استفاده کرد. انتخاب با شماست ولی پیشنهاد می کنم از این روش استفاده نکنید و از روشی که در بالا توضیح داده شده است، استفاده کنید.
در مورد اون قضیه که در بالا توضیح داده بودم و دوستان دچار سردر گمی شدند نیز باید بگویم که عیب از بنده بود. فکر کردم قبلاً در مورد آن توضیح داده بودم. آقا MORTEZA66 گل، روش شما با روش من یکی است فقط مسیر انجام آنها متفاوت است. بنده قبلاً این روش را در پست اولم توضیح داده بودم. اما قضیه این فرمولی که در پست قبلی گفتم چه بود؟ ببینید معمولاً در صفحه اول گزارش، هیچ کس فیلد منقول از صفحه قبل را نمی گذارد چرا که صفحه قبلی وجود ندارد! بنابراین بهتر از فیلد منقول از صفحه قبل را در یک Section که از نوع Page Header می باشد قرار داد یعنی دو Page Header داشته باشیم و در اولی عناوین بالای صفحه و عناوین جدول را قرار دهیم و در دومی، فیلد منقول از صفحه قبل را و سپس در قسمت Details فیلد های مورد نظر که می خواهیم نمایش داده شوند و در نهایت در پایین صفحه نیز دو عدد Section از نوع Page Footer داشته باشیم. یکی برای فیلد جمع این صفحه یا فیلد منقول به صفحه بعد و دیگری مربوط به پایین صفحه گزارش که در اون می تونید عناوین و لیبل های پایین صفحه را بگذارید مثلاً امضای مسئول ... و ... . دو Section مربوط به فیلدهای جمعی، شاید دارای استثنا باشند. فیلد منقول به صفحه بعد را معمولاً در گزارشات می آوریم و برای صفحه اول و آخر فرقی نمی کند، پس استثنایی ندارد. اما فیلد منقول از صفحه قبل استثنا دارد و نباید در صفحه اول آورده شود. برای حل این مشکل، بر روی section این قسمت راست کلیک کرده و Section Expert را انتخاب می کنیم. در پنجره ظاهر شده، بر روی دکمه فرمول مقابل Suppress (No Drill Down) کلیلک کنید و سپس در آن فرمول زیر را بنویسید:
if pageNumber = 1 then
true
else
false
دقت کنید که چنانچه true برگردانیم، این section نمایش داده نمی شود و چنانچه flase برگردانیم، این section نمایش داده می شود. اما در مورد گروه ها قضیه کمی فرق می کند چرا که گروه ها ممکن است نیمی از یک گروه در این صفحه و نیمی دیگر در صفحه بعد قرار گیرد و یا اینکه تمام گروه در یک صفحه قرار گیرد و برای اینکه تشخیص دهیم، چه موقعی فیلد منقول از صفحه قبل را نمایش دهیم، باید از روش دیگری استفاده کنیم که این روش را در پست قبل توضیح داده ام.
یا علی
حق نگهدارتان
bsng110
پنج شنبه 14 شهریور 1387, 17:31 عصر
با سلام و تشكر فراوان از راهنمايي ارزنده دوستان مخصوصا جناب bsng110.اگه لطف كنيد به سوالهاي ديگه اي كه برام مطرح شده جواب بدين ممنون مي شم.
1- مي خواهم كه "جمع نقل از صفحه قبل" در صفحه اول نشون داده نشه.البته در همون لينكي كه گذاشته بودين نوشته بوديد ولي من متوجه نشدم.
2- كدي كه مي نويسيم كه "جمع نقل از صفحه قبل" را با اولين ركورد صفحه جديد جمع نكند يك مشكل دارد و آن اينكه: اگر يكي از فيلدهاي ركورد جاري خالي باشد(صفر نيست بلكه خاليست) اين كد عمل نمي كند و عدد درست ثبت نمي شود بلكه خالي نشان مي دهد.
3- همچنين قبل از نوشتن كد فوق وقتي روي فيلد مورد نظر كليك راست مي كنيم و format field را انتخاب مي كنيم داراي زبانه number مي باشد كه بعد از نوشتن كد اين زبانه حذف مي شود و نمي توان تنظيماتي از قبيل اينكه كلمه ريال جلوي عدد ثبت شود يا نه را انجام داد.(البته من قبل از نوشتن كد اين تنظيمات را انجام دادم ولي وقتي زبانه number حذف مي شود دوباره كلمه ريال جلوي عدد ثبت مي شود) در اين مورد چه كنم.
4- در صفحه آخر گزارش مي خواهم جمع كل بزنم ولي چون report footer قبل از page footer است بنابراين در صفحه آخر ابتدا "جمع كل" ظاهر مي شود و در پايين آن "جمع منقول به صفحه بعد".در اين مورد چه كنم؟
با تشكر.
هوالحکیم
سلام
در مورد سوال اول شما: ببینید ما یک قسمتی داریم که در آن می خواهیم فیلد "منقول از صفحه قبل" را قرار دهیم. معمولاً در گزارشات ساده مانند جدول فروش یک ماه و یا صورت حساب یک ماه و یا گزارش هایی که ساده و تکی(نه گروه بندی شده) می باشند، برای درج چنین فیلدی، یک section جدید ایجاد می کنیم چرا که کنترل یک section راحت تر از کنترل تک تک کنترل های مربوط به قسمت فیلد منقول از صفحه قبل می باشد(البته چنانچه فیلد زیادی در این زمینه نداردی و الزاماً می خواهید که تک تک فیلد ها را مخفی کنید، نیازی به ساختن section جدا نیست). مثلاً فرض کنید شما می خواهید فیلد منقول از صفحه قبل را در بالای صفحه گزارش خود و بعد از header صفحه(مانند نام موسسه و تاریخ و ...) قرار دهید و بعد از این فیلد، جدول خود را بکشید و در آیتم های این صفحه را قرار دهید، در این صورت الزامی به ساخت یک section جدا نیست به خصوص اگر می خواهید فیلد منقول از صفحه قبل را در جایی از گزارش قرار دهید که در کنار آن، فیلد هایی دیگری نیز وجود دارند که در هر صورت باید نمایش داده شوند. اما اگر می خواهید فیلد منقول از صفحه قبل را در ابتدای جدول خود(به عنوان اولین سطر جدول قرار دهید) و یا اینکه در کنار آن فیلد های دیگری نیز دارید(مانند عکسی، لیبل توضیحی یا ...) و می خواهید همه آنها در صفحه اول نمایش داده نشوند و در صفحه های بعدی بیایند، بهتر است یک section جدا برای این منظور تهیه کنید. خوبی section این است که ما برای صفحه اول section را مخفی می کنیم و بالطبع تمام کنترل های داخل آن نیز مخفی می شوند، ولی چنانچه از section استفاده نمی کردیم، مجبور بودیم تک تک کنترل های مورد نیاز خود را به صورت جداگانه مخفی کنیم که شاید کار اصولی نباشد. همچنین چنانچه فیلد منقول از صفحه قبل شما در سطر اول جدول و زیر header جدول باشد، مجبورید که از section استفاده کنید و الا سطر اول جدول شما یک سطر خالی می ماند چرا که کنترل های آن برای صفحه اول به صورت دستی(نه با section) مخفی شده اند و فقط قسمت سفید پشت آنها نمایش داده می شود که ظاهر خوبی نخواهد داشت. برای ساخت این section هم کافیست بر روی section بالای صفحه(header page) راست کلیک کرده و گزینه insert section below را بزنید. بعد در section جدیدی که تولید شد، فیلد منقول از صفحه قبل را به همراه لیبل و ... مورد نیاز خود قرار دهید. در مورد ساخت این فیلد هم که در پست های قبل توضیح داده ام. حال بر روی header(قسمت خاکستری رنگ) این section جدید راست کلیک کرده و section expert را بزنید و ...(بقیه مراحل را در پست قبل گفته ام). فرمول مربوطه نیز خوانایی خوبی دارد، می گوید اگر صفحه اول است، این section مخفی شود، در غیر اینصورت مخفی نشود(نمایش داده شود).
به عکس ضمیمه شده مراجعه کنید.
http://barnamenevis.org/forum/attachment.php?attachmentid=22803&stc=1&d=1220537120
در مورد سوال دوم، منظورتان از خالی را نمی فهمم. اگر منظورتان این است که پایگاه داده شما null بر می گرداند، در این جور موارد من دیده ام که برنامه با خطا مواجه می شود نه اینکه هیچ چیزی نمایش ندهد. این که می گویید هیچ چیز نمایش نمی دهد، کمی بو دار است(کنایه از مشکوک بودن)؟! در ضمن این کد فقط مربوط به همین فیلد است و به فیلد های دیگر ربطی ندارد که در صورت خالی بودن آنها با مشکل مواجه شود! چنانچه این فیلد نیز صفر باشد، درست عمل می کند ولی در مورد null برای من خطا می دهد. اگه دقیق تر توضیح بدهید، شاید بتوانم کمک کنم.
در مورد سوال سوم حق با شماست. این امر به این دلیل است که شما می گویید قالب نمایش رشته این چیزی باشد که خودتان تعیین کرده اید(همان فرمول)، پس حق دارد که دیگر زبانه مربوط به قالب خروجی را نمایش ندهد. هر قالبی می خواهید، خودتان در همینجا باید درست کنید مثلاً اگر می خواهید ریال پس از آن نمایش داده شود، عبارت < "ریال" + > را به آن اضافه کنید(این که این عبارت باید به سمت راست اضافه شود یا چپ، بستگی به فیلد شما و فرمت آن دارد، یک مرتبه امتحان کنید و خروجی را مشاهده کنید). در مورد سوالتان هم بنده متوجه نشدم که بالاخره چه شد؟ شما فرمول را نوشته اید و کلمه "ریال" باز هم نوشته می شود؟ اگر چنین است، علت را دقیقاً نمی دانم(شاید فیلد شما از نوع currency است) ولی بهتر از قبل از اجرای تابع cstr تابع ToNumber را فراخوانی کنید که خروجی از نوع عددی باشد و در کنار آن علامت به خصوصی(مانند دلار و ریال و ... نیاید) :
Cstr(ToNumber (CurrentFieldValue)-{YOUR_FIELD_NAME}))
در مورد سوال چهارم کمی بیشتر توضیح بدهید. الان فیلد منقول به صفحه بعد شما و فیلد جمع کل گزارش در چه section هایی قرار دارند؟ نکته دیگر اینکه آیا نمی توانید جمع کل را نیز در پایین صفحه قرار دهید و دیگر به report footer مراجعه نکنید؟ اگر چنین است، کافیست در display string مربوط به فیلد منقول به صفحه بعد، کدی مشابه کد section مربوط به فیلد منقول از صفحه قبل بنویسید یعنی بگویید اگر شماره صفحه با شماره صفحه آخر(TotalPageCount) برابر است، به جای عبارت "منقول به صفحه بعد" عبارت "جمع کل" نمایش داده شود.
امیدوارم که توانسته باشم به برخی از مشکلات شما پاسخ داده باشم.
یا علی
حق نگهدارتان
mina200887
چهارشنبه 20 شهریور 1387, 11:18 صبح
هوالحکیم
سلام
در مورد سوال اول شما: ببینید ما یک قسمتی داریم که در آن می خواهیم فیلد "منقول از صفحه قبل" را قرار دهیم. معمولاً در گزارشات ساده مانند جدول فروش یک ماه و یا صورت حساب یک ماه و یا گزارش هایی که ساده و تکی(نه گروه بندی شده) می باشند، برای درج چنین فیلدی، یک section جدید ایجاد می کنیم چرا که کنترل یک section راحت تر از کنترل تک تک کنترل های مربوط به قسمت فیلد منقول از صفحه قبل می باشد(البته چنانچه فیلد زیادی در این زمینه نداردی و الزاماً می خواهید که تک تک فیلد ها را مخفی کنید، نیازی به ساختن section جدا نیست). مثلاً فرض کنید شما می خواهید فیلد منقول از صفحه قبل را در بالای صفحه گزارش خود و بعد از header صفحه(مانند نام موسسه و تاریخ و ...) قرار دهید و بعد از این فیلد، جدول خود را بکشید و در آیتم های این صفحه را قرار دهید، در این صورت الزامی به ساخت یک section جدا نیست به خصوص اگر می خواهید فیلد منقول از صفحه قبل را در جایی از گزارش قرار دهید که در کنار آن، فیلد هایی دیگری نیز وجود دارند که در هر صورت باید نمایش داده شوند. اما اگر می خواهید فیلد منقول از صفحه قبل را در ابتدای جدول خود(به عنوان اولین سطر جدول قرار دهید) و یا اینکه در کنار آن فیلد های دیگری نیز دارید(مانند عکسی، لیبل توضیحی یا ...) و می خواهید همه آنها در صفحه اول نمایش داده نشوند و در صفحه های بعدی بیایند، بهتر است یک section جدا برای این منظور تهیه کنید. خوبی section این است که ما برای صفحه اول section را مخفی می کنیم و بالطبع تمام کنترل های داخل آن نیز مخفی می شوند، ولی چنانچه از section استفاده نمی کردیم، مجبور بودیم تک تک کنترل های مورد نیاز خود را به صورت جداگانه مخفی کنیم که شاید کار اصولی نباشد. همچنین چنانچه فیلد منقول از صفحه قبل شما در سطر اول جدول و زیر header جدول باشد، مجبورید که از section استفاده کنید و الا سطر اول جدول شما یک سطر خالی می ماند چرا که کنترل های آن برای صفحه اول به صورت دستی(نه با section) مخفی شده اند و فقط قسمت سفید پشت آنها نمایش داده می شود که ظاهر خوبی نخواهد داشت. برای ساخت این section هم کافیست بر روی section بالای صفحه(header page) راست کلیک کرده و گزینه insert section below را بزنید. بعد در section جدیدی که تولید شد، فیلد منقول از صفحه قبل را به همراه لیبل و ... مورد نیاز خود قرار دهید. در مورد ساخت این فیلد هم که در پست های قبل توضیح داده ام. حال بر روی header(قسمت خاکستری رنگ) این section جدید راست کلیک کرده و section expert را بزنید و ...(بقیه مراحل را در پست قبل گفته ام). فرمول مربوطه نیز خوانایی خوبی دارد، می گوید اگر صفحه اول است، این section مخفی شود، در غیر اینصورت مخفی نشود(نمایش داده شود).
به عکس ضمیمه شده مراجعه کنید.
http://barnamenevis.org/forum/attachment.php?attachmentid=22803&stc=1&d=1220537120
در مورد سوال دوم، منظورتان از خالی را نمی فهمم. اگر منظورتان این است که پایگاه داده شما null بر می گرداند، در این جور موارد من دیده ام که برنامه با خطا مواجه می شود نه اینکه هیچ چیزی نمایش ندهد. این که می گویید هیچ چیز نمایش نمی دهد، کمی بو دار است(کنایه از مشکوک بودن)؟! در ضمن این کد فقط مربوط به همین فیلد است و به فیلد های دیگر ربطی ندارد که در صورت خالی بودن آنها با مشکل مواجه شود! چنانچه این فیلد نیز صفر باشد، درست عمل می کند ولی در مورد null برای من خطا می دهد. اگه دقیق تر توضیح بدهید، شاید بتوانم کمک کنم.
در مورد سوال سوم حق با شماست. این امر به این دلیل است که شما می گویید قالب نمایش رشته این چیزی باشد که خودتان تعیین کرده اید(همان فرمول)، پس حق دارد که دیگر زبانه مربوط به قالب خروجی را نمایش ندهد. هر قالبی می خواهید، خودتان در همینجا باید درست کنید مثلاً اگر می خواهید ریال پس از آن نمایش داده شود، عبارت < "ریال" + > را به آن اضافه کنید(این که این عبارت باید به سمت راست اضافه شود یا چپ، بستگی به فیلد شما و فرمت آن دارد، یک مرتبه امتحان کنید و خروجی را مشاهده کنید). در مورد سوالتان هم بنده متوجه نشدم که بالاخره چه شد؟ شما فرمول را نوشته اید و کلمه "ریال" باز هم نوشته می شود؟ اگر چنین است، علت را دقیقاً نمی دانم(شاید فیلد شما از نوع currency است) ولی بهتر از قبل از اجرای تابع cstr تابع ToNumber را فراخوانی کنید که خروجی از نوع عددی باشد و در کنار آن علامت به خصوصی(مانند دلار و ریال و ... نیاید) :
Cstr(ToNumber (CurrentFieldValue)-{YOUR_FIELD_NAME}))
در مورد سوال چهارم کمی بیشتر توضیح بدهید. الان فیلد منقول به صفحه بعد شما و فیلد جمع کل گزارش در چه section هایی قرار دارند؟ نکته دیگر اینکه آیا نمی توانید جمع کل را نیز در پایین صفحه قرار دهید و دیگر به report footer مراجعه نکنید؟ اگر چنین است، کافیست در display string مربوط به فیلد منقول به صفحه بعد، کدی مشابه کد section مربوط به فیلد منقول از صفحه قبل بنویسید یعنی بگویید اگر شماره صفحه با شماره صفحه آخر(TotalPageCount) برابر است، به جای عبارت "منقول به صفحه بعد" عبارت "جمع کل" نمایش داده شود.
امیدوارم که توانسته باشم به برخی از مشکلات شما پاسخ داده باشم.
یا علی
حق نگهدارتان
سلام.در مورد سوال دومم :ببينيد توي برنامه وقتي داريم ورود اطلاعات مي كنيم يا بايد فيلد بدهكار پر شود و يا فيلد بستانكار.حال هر كدام از اينها پر شود موقع ذخيره در بانك فيلدي كه عددي ندارد در جدول چيزي ثبت نمي شود (يعني همان مقدار خالي ثبت مي شود) و هيچ error ي هم نمي دهد.(فيلدها از نوع currency ست).براي همين موقع نمايش اطلاعات نيز همان مقدار null نشان داده مي شود و موقع منها كردن(طبق همان كدي كه گفته بوديد) نيز null را نشان مي دهد.در صورتيكه بايد آن عدد را بدون تغيير نشان دهد.
MEHR_2008
چهارشنبه 20 شهریور 1387, 11:52 صبح
سلام دوست عزیز
من با کریستال 10 کار میکنم و میخوام در داخل هر صحفه جمع فیلد های همون صحفه را نشان بده و در پایین صفحه نشون بده.یک فیلد running total field ایجاد کردم و آن را در page footer گذاشتم ولی جمع تا این صفحه را نشان میده و در قسم reset در edit هم نتونستم چیزی پیدا کنم
لطفا راهنمایی کنید ممنون میشم
Alen
پنج شنبه 21 شهریور 1387, 12:32 عصر
سوال اين دوستمون براي منم مطرحه كه وقتي بخوام يه تابع مثل sum روي ركوردهاي موجود در هر صفحه به طور جداگانه اعمال شه چي كار بايد انجام بدم
mrs Izadi
شنبه 23 شهریور 1387, 08:48 صبح
سلام
روشی که من گفته بودم برای بدست اوردن مجموع مقادیر یک فیلد در صفحه جاری است.من یک بار دیگه اون رو تست کردم مشکلی نداره میتوانید از این روش برای بدست آوردن مجموع مورد نظرتان از اون استفاده کنید.
Alen
شنبه 23 شهریور 1387, 12:25 عصر
مرسي از توجهتون ، فقط اگه ميشه يه توضيحي در مورد اون كدها بديد. من اصلا نميدونم اونا رو كجا بايد بنويسم.اگه ميشه يه توضيح كلي راجع بهش بديد . ممنون مي شم اگه كمكم كنيد
MEHR_2008
شنبه 23 شهریور 1387, 14:45 عصر
واقعا ممنون مشکلم حل شد.ولی چطور میتونم به object های درون کریستال ریپورت از طریق vb6 دسترسی داشته باشم.به طور دقیق من یک آرم در گزارشم دارم که میخوام از داخل vb این ole object را تغیر بدم ولی نمیدونم چطوری.به formula field میتونم متصل بشم ولی به عکس نمیتونم .لطفا راهنمایی کنید.
Alen
دوشنبه 25 شهریور 1387, 11:34 صبح
كسي جواب منو نميده ؟
درسته سوالم پيش پا افتادست ولي مهمه برام
اين كدها رو كجا بايد بنويسم؟
تو كريستال يا جاي ديگه
اگه توضيح بديد ممنون ميشم
aminpourazadeh
چهارشنبه 28 مرداد 1388, 14:06 عصر
هوالحکیم
سلام مجدد
گفتم که هنوز با subreport ها کار نکردم و از این بابت شرمنده ام. اما یکی از دوستان پرسیده بودند که چنانچه بخواهیم این فرمول ها برای هر گروه جداگانه حساب شود، چه باید کرد؟ کافیست در هنگام تعریف یک فید مجموعی(Total Field)، در قسمت Reset(سومین قسمت سمت راست) گزینه On Change of Group را زده و نام گروه خود را در مقابل آن انتخاب کنید. مسلم است که بعد از تعریف فیلد نیز با راست کلیک کردن و Edit فیلد می توانید این تغییرات را اعمال کنید. امیدوارم مشکلتان حل شده باشد. البته یک نکته دیگر باقی می ماند و آن در مورد فیلدهای منقول از صفحه قبل می باشد!!! در این موارد باید چه کرد؟ بدیهی است که فیلد منقول از صفحه قبل، مربوط به صفحه اول نباید وجود داشته باشد ولی در صفحات دوم به بعد ممکن است این فیلد نیاز باشد ولی از کجا بفهمیم که نیاز است یا خیر؟ در گزارشات بدون گروه بندی، مطمئن بودیم که در صفحه دوم به بعد به این فیلد نیاز داریم ولی در گزارشات گروه بندی شده، ممکن است گزارش صفحه قبل مربوط به یک گروه دیگر بوده باشد و نیازی به نمایش فیلد منقول از صفحه قبل نباشد و یا بالعکس، گزارش انتهای صفحه قبل، مربوط به گزارش ابتدای صفحه فعلی باشد که در این صورت به فیلد منقول از صفحه قبل نیاز داریم. قبلاً جهت حل این مشکل در گزارشات بدون گروه بندی از pagenumber استفاده کردیم، در اینجا بنده ترفندی را به کار بردم. بررسی کردم، چنانچه گروه قبلی، با گروه جاری برابر بود، پیداست که گزارش انتهای صفحه قبل، ابتدای گزارش جاری بوده است و باید در این گزارش، فیلد منقول از صفحه قبل وجود داشته باشد و چنانچه شماره گروه گزارش انتهای صفحه قبل، با شماره گروه گزارش ابتدای این صفحه یکی نبود، دیگر نیازی به نمایش فیلد منقول از صفحه قبل نمی باشد. این هم فرمول این عمل:
if(PreviousIsNull({YOUR_FIELD_NAME})) Then
true
else if(Previous({YOUR_FIELD_NAME}) <> {YOUR_FIELD_NAME})then
true
else
false
یا علی
حق نگهدارتان
سلام میشه بیستر در مورد جمع منقول از صفحه قبل در گروه ها توضیح بدید؟
shocraneh
شنبه 07 شهریور 1388, 23:40 عصر
وقتی می خام ذخیره کنم خطا می ده در ضمن من vb.net کار می کنم
CSTR(CurrentFieldValue-{id})
در کل تو گزارشگیری زیاد مشکل دارم نمی شه برنامشو بزارین
aminpourazadeh
یک شنبه 08 شهریور 1388, 19:46 عصر
هوالحکیم سلام ما هم دقیقاً همین حکایت را داشتیم و الآن به همراه همکارم(که فامیلم هم می شه) به جواب رسیدیم(بعد از یکی دو ساعت) در صورتی که هر چی گشتیم، هیچ کسی جواب این سوال را نداده بود. حالا ما به طور کلی جواب این مسئله را می دهیم که از این به بعد دیگران نیز بتوانند از این روش استفاده کنند. در مورد جمع یک ستون، دو حالت کلی ممکن است به وجود آید. اول نمایش جمع در انتهای ستون است و نهایتاً نمایش جمع صفحه قبل در ابتدای صفحه جاری! بنده توضیحات خود را در Visual Studio 2005 بیان می کنم. در ابتدا حالت اول را توضیح می دهیم. در Filed Explorer بر روی گزینه Running total field کلید کنید و یا از منوی Crystal Report گزینه Insert و سپس Summary را انتخاب کنید. در هر صورت یک پنجره(البته با ظواهر مختلف اما محتوای یکسان) به شما نمایش داده می شود. بنده جهت یکپارچگی توضیحات اولین روش یعنی استفاده از Filed Explorer را توضیح می دهم. در این پنجره، از پنل سمت چپ فیلد مورد نظر خود(در اینجا Amount) را انتخاب کرده و بر روی دکمه < در بالای و وسط پنجره کلید کنید تا این فیلد به سمت راست در خانه Filed to summarize منتقل شود. سپس تابع خود را از جعبه انتخاب شدنی زیر آن انتخاب کنید که شما در اینجا sum را انتخاب می کنید. دقت کنید که فیلد شما باید عددی باشد نه رشته و ... و الا برای انجام چنین کاری باید کدنویسی کنبد. در جعبه اول(Running total name) نیز می توانید نامی برای این فیلد جمع بنویسید مثلاً AmountSum! حالا Ok کنید. در همان قسمت Filed Explorer متغیر شما با همان نام(AmountSum) آمده است. این متغییر را کشیده و در قسمت Report Footer بگذارید. تمام شد. حالا جمع این ستون را برای هر صفحه مشاهده می کنید. برای نمایش جمع صفحه قبل نیز کافیست همین فیلد که در بالا طریقه تولید آن گفته شد را کشیده و این بار در Report Header یا Page Header(بسته به نیاز خود) قرار دهید اما یک مشکل وجود دارد. جمعی که در این حالت مشاهده می کنید، جمع صفحه قبل به اضافه جمع فیلد اولین رکورد صفحه جاری می باشد! برای حل این مشکل بر روی فیلدی که در صفحه قرار داده اید راست کلیلک کرده و Format Object را انتخاب کنید. سپس در زبانه Common ، دکمه روبروی Display String(که در پایین پنجره قرار دارد) را بزنید. حال باید یک خط کد ساده بنویسید. کد شما به صورت زیر است:
CSTR(CurrentFieldValue-{YOUR_FIELD_NAME}) مثلاً من یک فیلد به نام xBedeh از تابع GetRiz داشتم(این تابع یک IDataReader بر می گردوند که چیزی شبیه DataSet است). به همین دلیل نوشتم:
CSTR(CurrentFieldValue-{GetRiz.xBedeh}) همین. تموم شد. امیدوارم که مشکل شما حل شده باشه و در انجام این مراحل به مشکلی بر نخورید. اگه چیز بیشتری یاد گرفتید، حتماً به ما هم بگویید. یا علی خدانگهدارتون
سلام میشه فورمول جمع منقول از صفحه قبل بنویسید؟
این راه رو امتحان کردم ولی جواب نمیده!
نمی دونم کجای کار رو اشتباه میکنم؟
ممنونم
bsng110
دوشنبه 09 شهریور 1388, 23:33 عصر
هوالحکیم
سلام دوستان
باید ببخشید، من به دلیل مشغله زیاد، فرصت نمی کنم به این سایت سر بزنم. طبق درخواست شما دوستان، فایل های کریستال را براتون می ذارم. امیدوارم به کارتون بیاد.
فکر کنم در فایل
crHesabCard.rpt
بود که از این کارها می کردم.
یا علی
حق نگهدارتون
raha_1362
یک شنبه 18 مهر 1389, 14:25 عصر
سلام دوست من
در مورد اینکه می گید null می فرسته و چیزی بهتون نمایش نمی ده درست گفتید.
شما باید بجای اون کد، کد زیر که تکمیل شده همان کد بالا است را قرار بدید.
stringVar str:="";
if(isnull({YOUR_FIELD_NAME})=true )
then
(
str:=Replace(ToText(CurrentFieldValue,0),".","," );
)
else
str:=Replace(ToText(CurrentFieldValue-{YOUR_FIELD_NAME},0),".","," );
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.