ورود

View Full Version : سوال: گزارش گیری از جدول دیتیل در فست ریپورت



sara.mahdavi
شنبه 15 تیر 1392, 16:38 عصر
سلام:چشمک:
من دو تا جدول دارم که در گزارش گیریم می خوام از جدول دیتیل (متصل به جدول اصلیم) گزارش بگیرم
ولی وقتی به صفحه گزارشگیری فرستاده میشه اولین رکورد جدول رو نشون میده
وقتی هم که توی فست رپورت دیتیل و مستر رو مشخص میکنم
موقع گزارشگیری تمامی اطلاعات رو واسه چاپ میاره ولی من فقط میخوام همونی که انتخاب شده رو نشون بده

دوستان لطفا کمک کنید
ممنون:قلب:

hossein_h62
شنبه 15 تیر 1392, 17:27 عصر
سلام
دقیق متوجه نشدم که از چی میخواین گزارش بگیرید؟ جدول اصلی و جزئیات باهم؟ فقط از Detail ؟؟
ولی خب مسلما وقتی دیتاست متصل به جدول Detail رو به فست ریپورت متصل میکنیم رکوردهای متناظر با رکورد انتخاب شده در جدول Master رو نشون میده، اگر قصد دارید کل رکوردهای جدول Detail رو واکشی و گزارشگیری کنید از یک AdoQuery جداگانه استفاده کنید.

sara.mahdavi
شنبه 15 تیر 1392, 19:18 عصر
ممنون ک جواب دادی
ببین
دو تا جدول دارم : جدول 1 >> مستر | جدول 2 >> دیتیل
من برای اینکه بتونم تمام رکورد های جدول 2 رو ببینم جدول 1 رو بستم
حالا من با استفاده از dbgrid ک به جدول 2 متصل هست یک رکورد رو انتخاب میکنم و بعد بوسیله یک دکمه میخوام از اطلاعات اون رکود گزارش بگیرم اما وقتی ک گزارش باز میشه جدول 1 رو هم باز میکنه و رکورد اول جدول 1 انتخاب میشه و اطلاعات دیتیل رکود اول رو نشون میده
خب امیدوارم منظورم رو رسونده باشم
حالا این روش من درسته؟اگه درسته چطوری مشکلم رو برطرف کنم؟
اگه نیست یک راهکار جدید بهم بگید
با تشکر فراوان از همه دوستان:قلب:

یوسف زالی
شنبه 15 تیر 1392, 20:19 عصر
سلام. در تکمیل صحبت حسین جان؛
برای ارسال گزارش مستر دیتیل بهتره که شما دوتا SP متصل کنید به دو گرید، و در رویداد OnAfterScroll مستر، دیتیل رو رفرش کنید. در این صورت می تونید با ارسال پارامتری معین کنید که تمام ردیف ها رو واکشی کنه یا اینکه ردیفهای متصل به مستر رو.
در ارسال به چاپ هم با استفاده از این روش کمترین کدی نمی نویسید.
اگر روش شما قابل اصلاح نیست بگید از چه اشیایی ملزم به استفاده هستید بشه راهنمایی خوبی کرد.

sara.mahdavi
یک شنبه 16 تیر 1392, 12:54 عصر
برای ارسال گزارش مستر دیتیل بهتره که شما دوتا SP متصل کنید به دو گرید
خیلی ممنون از جوابتون :لبخندساده:
منظورتون رو از SP متوجه نشدم تاحالا باهاش کار نکردم
لطفا میشه یکم دراین مورد بیشتر توضیح بدید
بازم ممنون:چشمک:

یوسف زالی
یک شنبه 16 تیر 1392, 13:03 عصر
منظورم ADOStoredProcedure هست.
دیتابیس شما SQL هست؟
اگر نه، روش جایگزینی بگم.
در مورد دیتابیس کمی توضیح بدید. نسخه دلفی رو هم بگید.

sara.mahdavi
یک شنبه 16 تیر 1392, 14:15 عصر
ن دیتا بیسم access
دلفی xe2 استفاده میکنم

ممنون:لبخندساده:

یوسف زالی
یک شنبه 16 تیر 1392, 14:21 عصر
خب پس اس پی منتفیه.
برای این کار از دو تا ADOQuery استفاده کنید که مستر شما و دیتیل رو بر اساس ردیفی که در مستر هستید تامین می کنه.
مثال زیر رو ببینید:


Master:
select * from TBLMaster

Detail:
select * from TBLDetail where MasterSn = @SN or @SN = 0


کد رفرش شدن (Close and Open) دیتیل رو در رویداد OnAfterScroll شی ADOQuery مستر می گذارید،
پارامتر رو اگر سریال نامبر جدول مستر بدید، می ره و ردیفهای مرتبط به مستر رو براتون میاره، و اگر صفر رد کنید، تمام دیتیل ها رو خواهد آورد.
به این ترتیب هنگام گرفتن چاپ در برنامه نویسی می تونید انتخاب کنید که کدام حالت رو لازم دارید. (می تونه هر دو تا مود رو داشته باشه، مثلا با یک تیک)
امیدوارم منظورم رو رسونده باشم.

sara.mahdavi
یک شنبه 16 تیر 1392, 14:59 عصر
واقعا ازتون ممنونم :خجالت:
ولی...
من اصلا تا حالا با ADOQuery کار نکردم و از دستورات SQL چیز زیادی نمیفهمم
لطفا یا یکم بیشتر توضیح بدید (ابتدایی تر) یا یک مقاله یا آموزشی در این مورد معرفی کنید
باز هم بابت جوابدهی مفید و سریعتون ممنونم:لبخندساده:

یوسف زالی
یک شنبه 16 تیر 1392, 16:00 عصر
خواهش می کنم.
اگر با اشیایی مثل ADOTable کار کرده باشید با این شی هم به راحتی می تونید کار کنید.
در خصوصیت SQL کد خودتون رو می گذارید و مثل جدول Open می کنید. همین!
مثالی براتون می گذارم :

یوسف زالی
یک شنبه 16 تیر 1392, 17:10 عصر
دوستان الان دیدم،
حواسم نبود کانکشن رو هارد کد کردم.
برای استفاده از کد بالا ConnectionString رو روی مسیر فایل اکسسی که توی فولدر هست ست کنید.

sara.mahdavi
یک شنبه 16 تیر 1392, 17:18 عصر
بازم ممنون:لبخندساده:
این مثال خیلی بهم کمک کرد ولی بازم سوال دارم:خجالت:
من دوتا جدول هام رو از طریق DataSource به ADOTable متصل کردم
حالا که باید از ADOQuery استفاده کنم ، باید DataSource رو به ADOQuery وصل کنم یا ADOTable ؟
بعد یک راهنمایی دیگه هم می خواستم
توی فایلی که گذاشتید در ADOQuery تغییراتی داده بودید
مثلا:
Cursor Type = ctStatic
یا در قسمت Parameters
تمام قسمتاش رو تغییر داده بودید
میشه یک توضیحی هم در این مورد بدید؟
با سپاس:لبخندساده:

یوسف زالی
یک شنبه 16 تیر 1392, 17:31 عصر
این قدر ماشاالله تشکر می کنید آدم شرمنده می شه! بدید پروژتون رو بنویسم اصلا :لبخند:
شوخی کردم.
در خصوص سوال اول، وقتی دارید از ADOQuery استفاده می کنید نیازی به ADOTable ندارید. می تونید حذفش کنید و DataSource رو به ADOQuery مقید (Bind) کنید.
در خصوص CursorType داستان خیلی مفصله. در همین سایت هم آقای کشاورز توضیحات خوبی داده.
اون پارامتر ها رو هم من ننوشتم، دلفی با رفرش شدن اضافش می کنه.
کافیه بعد از نوشتن SQL در Query در قسمت خصیصه ها، روی Parameters (دکمه کوچیکه!) یک بار کلیک کنید تا با باز شدن لیست پارامترها، دلفی مجبور به ریلود اونها و اضافه کردنشون تو DFM بشه.
البته همه این کارها رو تو سورس هم می تونید خودتون انجام بدید که من راه تنبلی رو ترجیح دادم!

sara.mahdavi
یک شنبه 16 تیر 1392, 17:56 عصر
وقتی می خوام ADOQuery دومم رو باز کنم این اخطار رو میده
Parameters @ID has no default value
هر کاری کردم درست نشد :ناراحت:
لطفا اینم بگید:لبخندساده:

sara.mahdavi
یک شنبه 16 تیر 1392, 18:03 عصر
آخ ببخشید فهمیدم مشکل کجا بود:اشتباه:
توی قسمت Parametersمقدار value نداشت یعنی پاک شده بود
:خجالت:

sara.mahdavi
یک شنبه 16 تیر 1392, 18:28 عصر
خب این سوال شاید زیاد ربطی به این موضوع نداشته باشه ولی اگه کسی دیگه هم مثل من به این مشکلات خورده باشه این سوال براش پیش میاد
حالا که مجبور شدم ADOTable رو پاک کنم و بجاش ADOQuery بذارم چطوره این دستور رو تغییر بدم؟


image1.Picture.LoadFromFile(dm.ADOTable1Pic.Text)

یعنی چطوری از فیلد های جدولم استفاده کنم؟

یوسف زالی
یک شنبه 16 تیر 1392, 20:12 عصر
دقیقا همون طور که داشتید قبلا استفاده می کردید.
دوبار روی ADOQuery کلیک کنید خودتون متوجه می شید.

sara.mahdavi
یک شنبه 16 تیر 1392, 22:36 عصر
ی مشکل دیگه :افسرده:
وقتی که ADOQuery دیتیلم رو Append میکنم این ارور رو میده

Could not convert variant of type (Null) into type integer
باید چیکار کنم؟:ناراحت:

یوسف زالی
یک شنبه 16 تیر 1392, 23:07 عصر
در کدی که برای رفرش شدن ADOQuery نوشتید و یک پارامتر از نوع عدد می گیره، نمی تونید Null وارد کنید.
راه حل استفاده از یک عدد به جای Null هست.
می تونید مثلا از 1- استفاده کنید:


RefreshDetail( ifthen( VarIsNull(ADO1F1.Value), -1, ADO1F1.AsInteger )

sara.mahdavi
دوشنبه 17 تیر 1392, 13:32 عصر
بازم ممنون:لبخندساده:
ولی من از این کد چیزی نفهمیدم
ifthen واسه چیه؟ باید چیکارش کنم
RefreshDetail من فقط یک عدد میگیره (همونی که خودتون نوشتید)
اگه میشه بگید هر قسمتش واسه چیه
ممنون:قلب:

یوسف زالی
دوشنبه 17 تیر 1392, 13:43 عصر
الان کاملا دیگه بحثمون از تیتر تاپیک منحرف شده!

در خصوص اون خط:


RefreshDetail( ifthen( VarIsNull(ADO1F1.Value), -1, ADO1F1.AsInteger )

SN --> ifthen( VarIsNull(ADO1F1.Value), -1, ADO1F1.AsInteger

ifthen takes a boolean condition, if true returns first item, otherwise returns second item

Boolean Condition --> VarIsNull(ADO1F1.Value)
First Item --> -1
Second Item --> ADO1F1.AsInteger

VarIsNull checks a variant is null or not


یعنی این که چک کن ببین فیلد من الان نال هست یا نه، اگر نال هست 1- بفرست تو refresh و اگر نیست مقدار فیلد رو به صورت عددی بفرست تو refresh
این تابع در یونیت Math موجوده. در یونیت StrUtils هم برای خروجی رشته ای OverLoad شده.
من این خط رو برای اجتناب از زیاد نویسی نوشتم تا هم کنترل شرط و هم مقادیر مشروط و هم فراخوانی تابع همگی در یک دستور خلاصه بشه.

sara.mahdavi
دوشنبه 17 تیر 1392, 18:20 عصر
خب بجای ADO1F1.Value چیرو باید قرار بدم؟

ADO1F1.Value این همون parameters @SN ؟

ببخشید خب :ناراحت:
این مشکلات در ادامه همون سوالم پیش اومد یعنی باید یه تاپیک جدید ایجاد میکردم؟

یوسف زالی
دوشنبه 17 تیر 1392, 18:58 عصر
الان برای پارامتر اون متد چی دارید پاس می دید؟
همون رو بگذارید.
اگر متوجه نشدید کدتون رو بگذارید.

sara.mahdavi
سه شنبه 18 تیر 1392, 05:03 صبح
dm.QAzmudani.Open;
dm.RefreshDetail( ifthen( VarIsNull(dm.QSCL90R.FieldValues['ID']), -1, dm.QSCL90Rid.AsInteger+1 )) ;
dm.QAzmudani.Append;

وقتی append میشه ارور میده
مقدار


dm.QSCL90R.FieldValues['ID']

رو هم Null نشون میده

یوسف زالی
سه شنبه 18 تیر 1392, 09:30 صبح
قرار شد refresh تو afterscroll باشه دیگه. اینجا چه می کنه؟!


dm.RefreshDetail( ifthen( VarIsNull(dm.QSCL90R.FieldValues['ID']), -1, dm.QSCL90R.FieldValues['ID'] )) ;

sara.mahdavi
سه شنبه 18 تیر 1392, 13:47 عصر
بازم همون اخطار رو میده :ناراحت:
من این دستور رو توی رویداد afterscroll جدول مستر گذاشتم ولی وقتی به این دستور میرسه مقدار رو Null میگیره و انگار این دستور کاری انجام نمیده:ناراحت:

اصلا چرا این اخطار رو میده؟ من که دارم جدول مستر رو باز میکنم ولی این فیلد برای جدول دیتیل که ؟

میدونید همه چیزا رو چک کردم خیلی روش کار کردم ولی بازم نمیفهمم مشکل از کجاست (که این بدلیل اینه که هنوز تازه کارم:ناراحت:)

یوسف زالی
سه شنبه 18 تیر 1392, 14:18 عصر
دلیل ارورش اینه که وقتی دارید Append می کنید یک ردیف در مستر ایجاد می شه و روش Scroll اتفاق می افته، برای این ردیف جدید هم هنوز مقداری وجود نداره که باهاش دیتیل رو ست کنه.
نمونه برنامه همراه با Append :افسرده:

sara.mahdavi
سه شنبه 18 تیر 1392, 15:27 عصر
درست شد :تشویق: :لبخند:

مشکل اینجا بود که تابع RefreshDetail در مثال اولی از نوع Integer بود ولی توی مثال دومی که نگاه کردم از نوع Variant بود
و با این کد


QSCL90R.Parameters.ParamByName('@ID').Value := VarToStrDef(ID, '-1');

دیگه نیازی نبود از این کد


dm.RefreshDetail( ifthen( VarIsNull(dm.QSCL90R.FieldValues['ID']), -1, dm.QSCL90R.FieldValues['ID'] )) ;

که زحمت کشیدید نوشتید ، استفاده کنم
بازم ممنون :قلب: