View Full Version : آموزش: آموزش گام به گام ساخت گزارش پویا
mehran_337
شنبه 03 بهمن 1388, 16:26 عصر
با سلام خدمت دوستان و اساتید خوبم !
پس از کلی سر و کله زدن موفق شدم آن چیزی که مدتها فکرمو مشغول کرده بود و بسازم و خیلی مشتاق شدم که مراحل کار و در اختیار دوستان قرار دهم.
منظورم از گزارش پویا اینه که وقتی یه جدول داریم و می خواهیم یک گزارش خط کشی شده با نوار های لایت و کمی جنگولک بازی با فیلدهایی که کاربر به دلخواه تیک می زنه بسازیم.
اما از ابتدا 2 نکته بگم
یکی اینکه در این مبحث نیاز به تعامل دوستان دارم و دوم اینکه به دلیل مشغله نمی تونم همه رو یه دفعه ارائه بدم .
پس در هر زمان بخشی از مطلب و باهم بحث می کنیم.
کلیات کار :
به هر روشی که دوست دارید جدول نهایی رو آماده کنید مثلا از تاریخ تا تاریخ ... نام مشتری ... از محدوده فلان تا فلان و ...
در نهایت با کوئری جدول نهایی آماده می شه.
در مرحله بعد یک جدول باید داشته باشیم که نام اصلی فیلدها و یک caption فارسی و طول هر فیلد و نام جدول رو در خودش ذخیره می کنه
مسلما با یه برنامه کوچیک می تونید این کارو انجام بدهید
TBLFIELD.DBF
Field Field Name Type Width Dec Index Collate Nulls Next Step
1 COLNAME Character 15 No
2 COLCAPTION Character 15 No
3 COLWIDTH Numeric 10 3 No
4 OLDWIDTH Numeric 10 3 No
5 NEWWIDTH Numeric 10 3 No
6 NLEFT Numeric 10 3 No
7 LSEL Logical 1 No
8 CTBLNAME Character 30 No
1 No
10 NID Numeric 5 No
mehran_337
یک شنبه 04 بهمن 1388, 11:30 صبح
از قرار معلوم زیاد طرفدار نداشت .
اما خب ترجیح می دم ادامه بدم شاید در اواسط کار برای دوستان جذاب بشه.
تا اینجای کار ما یه گزارش نهایی داریم که اطلاعات همه فیلدهایش در اختیارمان می باشد.
حال باید فیلدها را در اختیار کاربر قرار دهیم تا انتخاب نماید. شما می توانید از هر روشی استفاده کنید از کلاسهای آماده یا listbox و ... استفاده کنید
من از گرید استفاده کردم ارتفاع هدر را 0 قرار دادم و دو ستون یکی checkbox و دیگری textbox به آن اضافه کردم.
توضیح :
یه فرم جدید بسازید و یک گرید بهش اضافه کنید. دو فیلد COLCAPTION و lsel جدول فوق را در اون به نمایش در آورید.
این فرم به کاربر اجازه می دهد تا فیلدهای دلخواهش را برای چاپ انتخاب نماید.
http://afr.ac.ir/soft/reporter/sel.gif
در مرحله بعد باید اندازه فیلدها را جمع بزنیم تا ببینیم از اندازه کاغذ تجاوز می کند یا نه.
اگر جمع اندازه کل فیلدهای انتخاب کوچکتر از سایز کاغذ بود می توانید مقدار باقیمانده را در فیلدها خرد کنیم البته با تناسب .
مثلا طول کاغذ 20 سانتی متره جمع طول فیلدها 14 سانت شد 6 سانت و باید بین فیلدها به نسبت اندازه هر فیلد تقسیم کنیم:
مثال :
طول کاغذ 20 سانت
فیلد 1 : 3 سانت
فیلد 2 : 1 سانت
فیلد 3 : 2 سانت
فیلد 4: 5 سانت
فیلد 5: 3 سانت
-----------------------
جمع : 14 سانت .
مانده 6 سانت
اگر طول هر فیلد را با OldWidth نشان دهیم :
NewWidth = OldWidth + (OldWidth * 6 ) /14
پس طول جدید فیلدها بصورت زیر خواهد شد :
فیلد 1 :
3+( 3*6 ) /14 = 4.28
فیلد 2 :
1+(1*6 ) /14= 1.42
فیلد 3 :
=2.85 2+( 2* 6 ) /14
فیلد 4:
5+( 5*6 ) /14 = 7.14
فیلد 5:
3+( 3*6 ) /14= 4.28
-----------------------
جمع : 19.97سانت تقریبا 20 سانتی متر
پس ما هم اکنون طول تقریبی جدید فیلدها را برای نمایش داریم.
حال اگر جمع کل طول فیلدها بیشتر از اندازه صفحه بود باید چکار کنیم؟
با استفاده از همین فرمول به نسبت طول فیلدهارا کاهش می دهیم.
نکته مهم :
وقتی یک خطی در گزارش به اندازه 1 سانتی متر رسم کنید و آن گزارش را با استفاده از use باز کنید می بینید طول این خط را با عدد 3937 نشان می دهد نمی دانم این عدد چه واحدیست چیست اما احتمال زیاد تعداد نقاطی تشکیل دهنده تصویر هستند.
با این فرض برای تبدیل هر یک سانتی متر از عدد 3937 استفاده می کنیم.
binyaz2003
یک شنبه 04 بهمن 1388, 18:06 عصر
يک سئوال: اين طول هر فيلد رو خودمان بايد در زمان طراحي گزارش دربياريم که هر کدوم مثلا چند سانت ميخوان؟
mehran_337
دوشنبه 05 بهمن 1388, 07:52 صبح
از یادآوری شما ممنونم .
تا این مرحله هنوز هیچ گزارشی طراحی نشده است .فعلا در مرحله محاسبات هستیم .
با توجه به اینکه از فونت tahoma با سایز 10 استفاده کردم مشاهده کردم هر یک کارکتر تقریبا 1166.5 نقطه رو تشکیل می ده این هم مثل همون عدد 3937 بدست آوردم.
طول هر فیلد ( مثلا 15 کارکتر یا 5 رقم) را در عدد فوق ضرب کرده تا اندازه نمایشی طول را در گزارش بدست آوریم
wtol = 1166.5
SCAN
REPLACE oldwidth WITH wtol* colwidth
ENDSCAN
پس تا اینجا ما جدولی داریم که نام و طول فیلدهای مورد نظر کاربر را مشخص کرده.
mehran_337
دوشنبه 05 بهمن 1388, 12:10 عصر
توضیح : همانطوریکه می دانیم هر گزارش هم مانند فرم ها و کوئری و .. مانند table می باشد و با دستور use report.frx قابل باز شدن می باشند.
هر شی هم یک رکورد است مثلا اگر خطی به گزارش اضافه کنیم در جدولش می بینیم رکوردی ایجاد شده و فیلدها همان تنظیمات و خواص هر شی را داراست.
در اینجا به گوشه ای از این خواص آشنا می شویم:
ObjType
این فیلد نشان دهنده نوع یک شی است که می تواند مقادیر عددی مختلفی داشته باشد
مثلا :
مقدار 1 تنظیمات کاغذ و چاپگر و ... .
مقدار 9 اندازه تنظیمات هدر و دیتیل و فوتر
مقدار 5 برچسب
مقدار 6 خط
مقدار 8 تکست باکس
مقدار 18 متغیرهای گزارش
مقدار 25 تنظیمات Dataenvironmen
...
Name
نام متغیر های گزارش
Expr
محتویات . تقریبا شبیه value. اینکه در تکست باکس چه مقادیر و چه متنی نمایش داده شود و ازاین قبیل.
Vpos
فاصله شی از بالای صفحه همانند top
Hpos
فاصله از سمت چپ صفحه همانند left
به بقیه فیلدها فعلا کاری نداریم چون اسمشون مشخصه که چکار می کنند و بعضی ها زیاد کاربردی نیستند تعدادی هم در ادامه کار آشنا خواهیم شد.
مثلا وقتی در init شی Dataenvironment دستوراتی می نویسیم در رکوردی که objtype مقدار 25 دارد می بینیم در فیلد Tag این دستورات ذخیره شده است.
توصیه می شود گزارش خالی را ایجاد کنید و با دستور use بازش کنید و در هر مرحلهخ شی جدیدی اضافه کنید و تغییرات را در ساختار جدول ببینید تا بیشتر با عملکرد آن آشنا شوید.
اینکه برای هر شی کد خاصی (ObjType) قرار دارد خوب است اما مثلا وقتی 5 فیلد بصورت تکست باکس در گزارش وجود دارد از کجا باید فهمید کدام رکورد مربوط به کدام فیلد است تا تغییر دهیم ؟
مقدار Objtype همه تکست باکسها که 8 است پس نیاز به نامگذاری داریم.
من از فیلد comment برای این کار استفاده کردم.
چنانچه روی هر شی در محیط طراحی گزارش دابل کلیک کنید در برگه other روی edit comment کلیک کنید می بینید که می توانید متنی بنویسید که فقط توضیح است و تاثیری در عملیات ندارد
من از این فیلد برای نامگذاری استفاده می کنم این متنی که می نویسید اگر گزارش را use کنید می بینید که در فیلد comment ذخیره شده است
mehran_337
سه شنبه 06 بهمن 1388, 08:39 صبح
حال باید گزارش مورد نظر را بسازیم . روشهای مختلفی برای اینکار وجود دارد .
روشی که من انتخاب کردم این است که ابتدا یک گزارش مثلا با نام ReportBase داشته باشم که تمام اشیا مورد نظر مانند خط افقی ، خط عمودی ، برچسب ، تکست باکس و ... در آن بصورت خام تنظیم شده اند.
کمی به این اشیا خواص آماده می دهیم تا بعدا کمتر نیاز به کدنویسی داشته باشد.
مثلا تکت باکس را راست به چپ کرده و فونت مورد نظر را به آن اعمال می کنیم.
حال اگر در گزارش اصلی این رکورد را کپی کنیم خواص مورد نظر اعمال شده است و نیاز به تنظیم مجدد ندارد.
مجدد متذکر می شوم که این روش کاملا شخصی است و اصراری به استفاده از این روش نیست.مطمنا اساتید بنده در این سایت روشهای دیگری را نیز پیشنهاد خواهند داد.
یک گزارش با نام ReportBase بسازید.
یک خط عمودی به آن اضافه کنید و در comment مقدار Vline را قرار دهید.
از این خط برای خط کشی عمودی بین ستونها استفاده خواهیم کرد
یک خط افقی به آن اضافه کنید و در comment مقدار Hline را قرار دهید.
از این خط برای خط کشی افقی بین رکوردها استفاده خواهیم کرد
یک شی field (یا همون تکست باکس ) اضافه کنید با فونتی ضخیم تر و وسط چین و در comment مقدار HeaderCaption را قرار دهید و Expression آن را مقدار "text" دهید.
از این شی برای نمایش تیتر هر ستون استفاده خواهیم کرد
یک شی field (یا همون تکست باکس ) اضافه کنید با فونتی معمولی (ترجیحا tahoma) و راست چین و در comment مقدار DetailValue را قرار دهید و Expression آن را مقدار "-" دهید.
از این شی برای نمایش محتویات هر ستون یا همون مقادیر اصلی گزارش استفاده خواهیم کرد
البته گزارش پایه من اشیا بیشتری هم داره مثل تاریخ و شماره صفحه و ردیف و غیره که تنظیماتشو آماده می کنم و در یک فرم از کاربر می خوام انتخاب کنه که آیا می خواد تاریخ و شماره صفحه چاپ بشه یا نه .
اگه کاربر خواسته باشه این اشیا و کپی می کنم در گزارش اصلیم یعنی رکوردهاشو کپی می کنم دیگه نیاز به تنظیم خاصی نداره که البته فعلا پایه کار و باهم مرور می کنیم بعدا به این ظرافت کاریها می پردازیم.
mehran_337
سه شنبه 06 بهمن 1388, 10:29 صبح
برای اینکه ساختار گزارش پایه بهم نریزه ابتدا یک جدول با ساختار گزارش می سازیم :
Use reportBase.frx
COPY STRUCTURE TO rptstruct.dbf
اشیا اولیه مانند تنظیمات چاپگر و dataenvironment و خطوط عمودی و افقی را از گزارش پایه به این جدول کپی می کنیم :
APPEND FROM reportBase.frx FOR objtype=1 OR objtype=9 OR objtype=23 OR objtype=25
خب مسلما اگه گزارشتون متغیر هم داشته باشد کد 18 رو هم باید اضافه کنید و عر آنچه که می خواهید. ;-)
اگر یادتون باشه در بالا گفتم تنظیمات کاغذ در رکوردی انجام می شه که objType مقدار 1 را دارد.
پس بهتره در ابتدا ی کار نوع افق یا عمودی بودن کاغذ رو مشخص کنیم . چه بهتر که کاربر خودش انتخاب کنه.
مثلا قبل از گزاش یه فرمی داشته باشه که تعیین کنه می خواد گزارش افق چاپ بشه یا عمودی
IF amoodi = .t. && amodi papaer DEFAULT
REPLACE expr WITH ALLTRIM(expr)+"ORIENTATION=0"+CHR(13)
pwidth = 20
ELSE && ofoghi page
REPLACE expr WITH ALLTRIM(expr)+"ORIENTATION=1"+CHR(13)
pwidth = 29
ENDIF
حالا با استفاده از متغیر pwidth اندازه صفحه رو داریم
binyaz2003
سه شنبه 06 بهمن 1388, 10:34 صبح
خيلي خوب داريد پيش ميريد تبريک ميگم.البته از شخص با تجربه اي با چند صد برنامه بعيد نيست. :تشویق:
اين مقاله رو هم حتما مطالعه کرديد ، براي ساير دوستان قرار ميدم :
http://www.foxite.com/articles/read.aspx?id=74&document=reporting-on-the-fly
mehran_337
سه شنبه 06 بهمن 1388, 10:59 صبح
جناب حسین زاده عزیز
خودتون خوب می دونید که مستمع صاحب سخن را بر سر ذوق آورد از تشویقتون ممنونم فقط امید وارم برای دوستان مفید باشه چون خودمن با این مسئله خیلی درگیر بودم و کدی هم نتونستم مشابه پیدا کنم.
البته لینک شما نکات جالبی داشت که باید بیشتر تحلیلش کنم.
نمونه هایی که دیده بودم یا بصورت create report rpname field ... بود که اصلا مورد قبول من نبود
و مثال دیگه ای دیده بودم که ابتداگزارش کاملی باید ساخته بشه بعد فیلدهایی که می خواهیم مخفی کنیم
چیزی که مد نظرم بود اینه که بتونم خودم کاملا روی گزارش کار کنم.
از دلگرمی شما مجددا ممنونم در ضمن اگر در زمینه لینکی که دادین توضیحاتی دارید فکر کنم به پربار شدن محتویات این تاپیک کمک کنه
mehran_337
یک شنبه 11 بهمن 1388, 10:01 صبح
در این مر حله می خواهیم ارتفاع header – detail , footer را تعیین کنیم.
رکوردهایی که این خصوصیات را در خود نگهداری می کنند objtype=9 AND objcode=1 دارند و قبلا به جدول اضافه شده اند پس با دستور زیر ارتفاع را تعیین می کنیم :
REPLACE height WITH 2*3937 FOR objtype=9 AND objcode=1 && ارتفاع هدر
REPLACE height WITH 1*3937 FOR objtype=9 AND objcode=4 && ارتفاع ديتيل
REPLACE height WITH 2*3937 FOR objtype=9 AND objcode=7 && ارتفاع فوتر
اگر می خواهید کمی کار را دهان پر تر ارائه دهید می توانید توسط textbox تعیین ارتفاع این اشیا را به دست کاربر بسپارید.
حال می خواهیم دو خط افقی در بخش هدر داشته باشیم تا عناوین درون آن قرار گیرد.
http://afr.ac.ir/soft/reporter/pic1.gif
این خطوط در تصویر برای وضوح بیشتر با رنگ قرمز نمایش داده شده است و با نام Hline نامگذاری شده اند.
گفتیم گزارش پایه ای با نام reportBase.frx داریم که اشیا مورد نظر را در آن قرار دادیم و اگر یادتان باشد خط افقی به نام Hline هم به آن اضافه کرده بودیم . هم اکنون همان خط را به گزارش اصلی اضافه می کنیم ( البته 2 بار چون به دو خط نیازمندیم)
APPEND FROM reportBase.frx FOR comment='Hline'
APPEND FROM reportBase.frx FOR comment='Hline'
حال باید این خطوط را به اندازه کل صفحه بکشیم البته بنده برای احتیاط به اندازه 1 سانتی متر از هر دوطرف حاشیه گذاری می کنم یعنی طول کاغذ (pwidth) 2 سانت کمتر
ezaf6 = 1
SCAN FOR comment='Hline'
REPLACE height WITH 104.167 ,hpos WITH 3937 , vpos WITH (( HeaderHeight - ezaf6)*3837)+104.167 ,;
width WITH (pwidth-1)*3937
ezaf6 = 0
ENDSCAN
مقدار 104.167 یعنی ارتفاع این خط صفر است پس خط افقی خواهیم داشت.
HeaderHeight - ezaf6 به این دلیل است که 2 خط به اندازه هستند اما فاصله آنها از بالای صفحه به اندازه 1 سانت فرق می کند .
حالا می خواهیم خطوط عمودی را در هدر اضافه کنیم همان خطوطی که با رنگ سبز نمایش داده شده است و با Vine نام گذاری شده اند.
نکته قابل توجه اینکه ما تعدادی رکورد را از جدول TBLFIELD انتخاب شده داریم (به انتخاب کاربر) که باید نمایش داده شود.
1 - فیلدهایی که باید نمایش داده شوند را شماره گذاری کنید :
SELECT TBLFIELD
varsel =SELECT()
REPLACE nid WITH 0 all
vcnt=1
SCAN FOR lsel
REPLACE nid WITH vcnt
vcnt = vcnt + 1
ENDSCAN
COUNT FOR lsel TO tvis
2 – خطوط عمودی را اضافه می کنیم :
LOCATE FOR comment="Vline"
SCATTER TO tlin
SELECT rptstruct
FOR il = 1 TO tvis+1 && تعداد خطوط باید یکی بیشتر از تعداد فیلدها باشد
APPEND blank
GATHER FROM tlin
REPLACE comment with "Vline" && برای محکم کاری چون بعضا این فیلد کپی نمی شه
ENDFOR
حالا باید مشخصات این خطوط را تنظیم نماییم
vcnt = 1
SELECT rptstruct
SCAN FOR comment="Vline"
SELECT tblfield
LOCATE FOR nid=vcnt
vwidth = newwidth
vcaption = ALLTRIM(colcaption)
vleft = nleft
IF vleft=0 && اولین فیلد از سمت چپ
vleft = pwidth*3937
ENDIF
SELECT rptstruct
REPLACE height WITH 3837 ,hpos WITH vleft , vpos WITH ((HeaderHeight-1)*3937) , width WITH 104.167
vcnt = vcnt + 1
ENDSCAN
فکر نمی کنم کدها نیاز به توضح خاصی داشته باشه ارتفاع خط – فاصله از چپ و فاصله از بالا تنظیم می شود
همین مراحل برای بدست آوردن تنظیمات عنوانین به کار می رود اگر دوستان مطلبی برایشان نامفهوم بود بفرمایید تا توضیح بیشتر داده شود.
ALI RAFFIE
سه شنبه 13 بهمن 1388, 09:30 صبح
ایده خیلی خوبیه
من خیلی وقت پیش یه کم تو این زمینه کار کردم
و به شکل محدود توی یه نرم افزار گذاشتم چون میخواستم فقط ارتفاع ردیف ها ، ارتفاع هدر ، اندازه و نوع فونت و طول ستون رو تغییر بدم. اون قسمت برای چاپ بارکد بود روی لیبل های مختلف .
با زحمت هایی که مهران عزیز کشیده اند اگه دوستان همت کنند حتما یه گزارش ساز خوبی ساخته خواهد شد.
یه ایده که از قدیم تو ذهن منه اینه که برای دیزاین اون از یه دیزاینر مثل اونی که خود فاکس داره استفاده کنیم و بعد به روش مهران جان جنریت کنیم . اونوقت یه سیستم کاملی خواهد شد.
البته فعلا بايد همين روش رو تا آخرش بريم .
آقا مهران واقعا خسته نباشي .:قلب:
mehran_337
سه شنبه 13 بهمن 1388, 10:35 صبح
ممنون از عنایت شما
همه دوست دارن وقتی زحمتی و شروع کردن نتیجه بده . اولش فکر میکردم خیلی پروژه مهمیه چون خودم مدتها درگیرش بودم احساس می کردم بچه ها هم احتیاج داشته باشند اما بعدا که دیدم استقبال ازش کم بود کمی سرد شدم.
دوست داشتم توی این مبحث بچه ها بیشتر شرکت کنند تا نتیجه خوبی بده
پله پله بهتر بود تا نقد بشه بهمین دلیل بین ارسالهام فاصله می انداختم. اما خب جز همین یکی دو نظر ارسال دیگه ای ندیدم
به هر حال منتظر نظر دوستان هستم
یا علی
هادی-محمد
یک شنبه 18 بهمن 1388, 13:07 عصر
محران جان عزیز مثل همیشه نکات آموزشی شما منحصر به فرد ، جالب و مورد نیاز کار بران است من شخصا همیشه منتظر مطرح نمودن نکات آموزشی شما بوده ام و تمامی پاسخهای شما و دیگر اساتید را به سئوالات کاربران را دنبال می کنم . دلسرد نشوید یقیناً هستند دوستانی که از مطالب شما استفاده میکنند همانطور که گفتید اگر طرح باز تر شود مسلماً استقبال نیز بیشتر خواهد شد
mostafa_zamani
سه شنبه 17 فروردین 1389, 10:14 صبح
با اهدا سلام و تشکر
با آرزوی موفقیت در سال نو برای شما
دوست گرامی اگر یک نمونه سورس نیز آپلود نمایید بسیار سپاسگزار خواهیم شد.
ارادتمند زمانی
arashkhaan2002
یک شنبه 22 فروردین 1389, 02:32 صبح
مهران عزیز
من قبلا به صورت آماتور این کارو کردم ولی همیشه تو فکرم این بوده که یک سیستم جامع گزارش ساز باید برای فاکس طراحی کنیم ، البته سیستمهائی در بازار وجود داره که DBF رو هم ساپورت میکنه ولی قیمتش بالاست و البته فارسی هستند.
کاری که من کردم به این شکل بوده که فیلدها و اسامی سر ستون گزارش رو در دستور SQl رو به صورت پارامتری تعریف میکردم و و هر کدوم رو که کاربرتعیین میکرد داخل متغیر میریختم تا جزو کیوری بیاد ،بعدش 2
تا رپورت آماده کرده بودم یکی پورتریت یکی لندسکیپ با عرض ستون های ثابت وفقط تعداد فیلدهای انتخابی رو چک میکردم ببینم به کدوم صفحه رپورت میخوره به پورتریت یا لندسکیپ و به کاربر نتیجه رو نمایش میدادم.
ولی اگر این تحلیل شما از ابتدا نحوه گزارش گیری و سورت و گروه بندی داده ها یعنی کیوری رو هم از اول خودش بسازه و بعد از نمایش گزارش هم به ایجاد نمودار دلخواه برای کاربر بریسه دیگه نورعلی نوره.
با تشکر از زحماتت.
mahsa.n
شنبه 27 شهریور 1389, 10:08 صبح
سلام
من یک برنامه تحتvba دارم و می خوام کاربر بتونه هر وقت خواست از هر فرمی گزارش بگیره
اما نمی خوام توی برنامه برای همه فرم ها گزارش ایجاد کرده باشم. برای این کار من یک جدول و یک کوئری اضافه در برنامه گذاشتم که متناسب با فرمی که کاربر در اون هست با زدن دکمه گزارش گیری ابتدا نام ومشخصات تمام فیلد های مربوط به جدولی که فرم بر پایه اون ایجاد شده داخل این جدول کمکی وارد می شه بعد کوئری کمکی بر مبنا این جدول مقدار می گیره و گزارش بر اساس این کوئری کمکی ایجاد می شه و تمام فیلدههای جدول در گزارش وارد میشه .
فرم های موجود دربرنامه شامل ساب فرم هم هستند که این باعث می شه تعداد فیلدها خیلی زیاد باشه و مشکل من از همین جا شروع می شه .با جابه جا کردن و پخش کردن فیلد ها در قسمت های مختلف گزارش برای فرم های معمولی برنامه درست کار می کنه اما در بعضی از فرم ها یک فیلد چند مقدار داره مثل قیمت پیشنهادی برای یک محصول توسط شرکت های مختلف در اینجا برنامه برای هر کدوم از این مقدار ها یک گزارش ایجاد می کنه یک نفر به من گفت می تونم از grouping
استفاده کنم ولی یا این کار اشتباه بود یا من بلد نیستم . ممنون می شم اگر
راهنماییم کنید
http://www.smokish.com/images/9mxq3axws0ac2dy8jr5a_thumb.jpg (http://www.smokish.com/viewer.php?file=9mxq3axws0ac2dy8jr5a.jpg)
http://www.smokish.com/images/5dfatx47ny6i9e76ayv_thumb.jpg (http://www.smokish.com/viewer.php?file=5dfatx47ny6i9e76ayv.jpg)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.