PDA

View Full Version : پاسخ به سئوال فورم قدیمی - ردیف در راپوت



منصور بزرگمهر
چهارشنبه 04 تیر 1382, 04:07 صبح
پاسخ به سئوال فورم قدیمی - ردیف در راپوت

در فورم قدیمی دوستی سئوال پرسیده بود، که چگونه می توان در یک راپوت ردیف سطر ایجاد نمود. یکی از دوستان دیگر پاسخ داده بود که می توان با مقید کردن TextBox راپوت به شکا زیر "1=" و تنظیم خاصیت Group فرم و RuningSum شی TextBox می توان این کار را انجام داد، که البته دست نیز می گفته، ولی این حخالت فقط برای راپوتها ممکن می باشد، و برای فرم ممکن نمی باشد، بهمین دلیل باید راه حل دیگری یافت.

البته راه حل ان بسیار ساده می باشد : ابتدا یک متغیر عددی عمومی(در یک ماژول عمومی (یا کلاس) ایجاد سپس در همان ماژول یک تابع بر فرض با نام
Public Function Radif(RowRead AS LONG)as Long
و تنها کاری که این تابع انجام می دهد این است که همان متغیر عمومی را هر بار موقع فراخوانی یکی بعلاوه ان بکند، و سپس برای تابع پاسخ دهد، این گونه حال هر زمان که TextBox ما چه در فرم و چه در راپورت به این تابع مقید شود، فرم یا که سطر به سطر که نمایش می یابد، تابع فوق را فراخوانی می نماید، و تابع نیز با اضافه کردن یک به مقدار قبلی ردیف جدید را باز می گرداند، و بدین ترتیب ردیف ما در فرم یا راپوت درست نمایش می یابد. البته باید گفت که هر بار که فرم باز می شود باید متغیر مربوطه را صفر نمود. آرگومانی نیز که تابع بالا می خواهد این می باشد که یک ستون از ستونهای جدول که شی شما به آن مقید شده است را در آن قرار دهید که در هر سطر که شی شما نمایش می یابد به تابع فوق مراجعه کرده و ردیف را یکی اضافه نماید. در اصل با تابع فوق در هر جا حتی درون کوری ها نیز میتوانی ردیف (یا هر تابع مورد دلخواه خود را) قرار داده و از آن استفاده کنی.
نمونه تابع ردیف ساده را برای شما می نویسم.

در قسمت ابتدای و بالا ماژول عمومی
Dim lngRadif as Long

سپس در بدنه ماژول

Public Function Radif(RowRead AS LONG)as Long
lngRadif=lngRadif+1
Radif=lngRadif
End Function

()Public Sub ResetRadif
lngRadif=0
End Sub


ضمناً من برای ستونهای کلید جدوال خود نیز از این تابع استفاده می کنم، بدینگونه که در ماژول دیگر تابعی برای MAX جداول ایجاد کرده ام، و هر بار که بخواهم در آن جدول کلید جدید بنویسم، تابع MAX فوق را بعنوان آرگومان تابع ردیف فرستاده، (و البته باید تابع ردیف را با اضافه کردن MAX به ردیف اصلاح نمائی)

شکل تابع اینگونه تغییر می کند:
Public Function Radif (lngMaxRow as long,lngRowRead as long)as long

و خط سوم نیز اینگونه
Radif=lngRadif + lngMaxRow

حتی تابع فوق را نیز می توانی در کوریها نیز بکار بری (یا حتی در ADO ) و نتیجه لازم را بگیری.



البته یک راه دیگر نیز وجود دارد که توصیه می شود، هرگز به سراغ انها نروید، و آن استفاده از توابع قلمروی یا با پیشوند D (همانند Dsum یا Dcount و ... )در اصل تابع Dcount می باشد، که همین کار را انجام میدهد ولی به دلیل اینکه برای اجرای هر کدام از این توابع باید یک بار کل جدول مربوطه پرس جو (کوری توسط ADO) در درون این توابع صورت پذیرد، در تعداد سطر بالا بشدت از سرعت جواب این توابع کاسته شده، و بطور کلی مفید بودن انها از دست می رود،

(تذکر اینکه اینجانب در فورم قبلی مشکلی داشتم که جمع تا هر سطر بود، که با تابع Dsum جواب گو بود ولی در جداول بالای صد هزار سطر طوری بد و کند عمل می نمود که من از خیر این موضوع گذشتم و جمع هر سطر را هنگام وارد نمودن کاربر توسط ADO خود محاسبه و در فیلدی ذخیره می کردم) به همین دلیل استفاده از توابع قلمروی را در هیچ زمانی در برنامه خودتان استفاده ننمائید، و برای آن از راه حل های دیگر یا برنامه نویسی دستی استفاده نمائید.
(نمونه تابع استفاده شده در ردیف که معرفی شد، برنامه نویسی کرده، و از شی Scripting.Dictionary استفاده نمائید، تا جمع هر سطر را بدست آورید. حتمآ نتیجه خواهید گرفت.)
متشکرم

ebadian
چهارشنبه 24 اسفند 1384, 22:39 عصر
کافی است عبارت[PRINTCOUNT]=را خصوصیت TEXTBOXوارد نموده و RUNNING SUMرا به OVER GROUP تبدیل نمائیم