ورود

View Full Version : انتقال یک فیلد با استفاده از دستورات به ریپورت



rahro
دوشنبه 22 آبان 1385, 09:31 صبح
سلام
میخوام این اختیار رو در اختیار کاربر قرار بدم که هر فیلدی از
برنامه حقوق را که خودش خواست گزارش بگیره . این کار منوط
به اینه که فیلد مورد نظر کاربر به قسمت ریپورت ارسال بشه ولی
نتوانستم با عملگرها"&" فیلد مورد نظر را به ریپورت انتقال بدم آیا
راهی وجود دارد .؟!
متشکرم

mehran_337
دوشنبه 22 آبان 1385, 10:10 صبح
یک راهش اینه که همه فیلد هارو توی ریپورت بزاری بعد در print when اون فیلد مقداری رو ترو یا فالس شرط کنی بعد که کاربر اونو غیر فعال کرد دیگه اون فیلد چاپ نمی شه. البته سرتیتر ها و اون ستون هم باید با همین روش کنترل کنی.
روش کاملتر اما پیچیده تر هم ساخت گزارش ساز برای کاربره اگر واقعا پول خوبی توش هست وقت بزار خودت یک صفحه طراحی گزارش برای کاربر بساز وگرنه ارزش وقت گذاشتن نداره چون کار مشکلیه.
پیشنهاد بعدیم اینه که از امکانات کوایری فرمی که آقای توکل ساخته اند استفاده کنی و هر فیلدی که کار بر بخواد انتخاب می کنه بعد به استفاده از dbf2frx یا کدی مشابه اون می تونی ریپورت داشته باشی

rahro
دوشنبه 22 آبان 1385, 10:49 صبح
سلام
مهران جان 140 تا فیلده نمیشه همه رو گذاشت
و اما مربوطه به محل کار خودمه بحث آبرو در میانه!
واما گزارش ساز چیه تا حالا نشنیدم میشه توضیحی بدی منظورت اینه به صورت تکست در بیاورم و اونو نمایش بدم؟!
یه نگاهی کاملتری به این کد آقای توکل می اندازم ولی فکر کنم ایشان فرم گزارششون ثابت بود و فقط نوع جستجو را در اختیار کاربر قرار داده بود

mehran_337
دوشنبه 22 آبان 1385, 12:38 عصر
واما گزارش ساز چیه تا حالا نشنیدم میشه توضیحی بدی
توی اکثر برنامه های امروزی دست کاربرو توی گزارش گیری باز می زارن . به این سورت که خودشون یک صفحه همانند ریپورت جنراتور می سازند و به کاربر اجازه می دهند که توش گزارش با هر حالت که خودشون دوست دارن بسازند البته همه اش فارسیه . یعنی با یک فرم به شما امکانات ساخت گزارش می دهند.
یا می تونی اون گزارش و طراحی کنی و بصورت external توی برنامه بزاری و مثلا یه دکمه بزاری به اسم "ساخت گزارش" بعد با دستور modi report اون و در اختیار کاربر قرار بدی.البته باید کاربرو با فرم گزارش فاکس آشنا کنی .
بازهم اگه کار راحت تر می خوای همون که گفتم فیلدهای بانک و در اختیار کاربر قرار بده بعد تبدیل کن به گزارش .

javad_hosseiny
دوشنبه 22 آبان 1385, 13:25 عصر
قبلا اینکار رو در دلفی بنده انجام دادم (دست کاربر رو در اجرای انجام گزارشات چاپی باز می گذارد)
ولیکن در محیط ویژوال فاکس یک فرم ساده برای اینکار قرار دادم که فکر کنم در نمونه سورسهایی که قبلا ارائه کرده بودم وجود داشت هرچند مجددا آنرا اینجا آپلود می کنم
در این فرم لیست فیلدهای جدول فعال نمایش داده می شود ( هرچند شما می توانید برای زیبایی کار بعد از بدست آوردن نام جدول متناسبا نام فیلدهای آن را به فارسی در آرایه مربوطه قرار دهید تا لیست فیلدها نمایشی بصورت فارسی باشد) و هر کدام را که انتخاب کرد جزء فیلدهای انتخابی بود و براساس آنها یک گزارش چاپی براساس دستور CREATE REPORT و براساس ارسال نام فیلدهای انتخاب شده بصورت پارامتر به وجود می آورد

rahro
دوشنبه 22 آبان 1385, 13:45 عصر
دوستان از اینکه محبت میکنید و وقت خود را در اختیار حقیر قرار میدهید متشکرم
جناب حسینی کلاس fancytoltip رو فرم شما کم داره باز نمیشه
میشه اصلاح کنینی
منتظرم ومتشکر

kia1349
سه شنبه 23 آبان 1385, 06:40 صبح
اینم کلاسش

rahro
سه شنبه 23 آبان 1385, 07:01 صبح
متشکرم جناب کیا
دوستان فکر کنم بایستی توضیحی کامل ارائه بدهم تا بهتر بتوانم در حل این مشکل از شما یاری بجویم
ببنید ریپورت طراحی من مربوط به احکام پرسنلی ست میدانید که یک قسمت از احکام پرسنلی مربوط
به مشخصات پرسنلی و قسمت دیگر مربوط به آیتمهای حقوقیست در وحله اول روی این نکته توجه
داشته باشید که مختصات تمامی فیلدهای مورد نظر من در ریپورت ثابت است و احتیاجی به تغییر جایگاه فیلدها نیست چون فیلدها حقوقی ست پس تمامی از نوع نامریک و به یک شکل و اندازه هستند فقط و فقط نام این فیلدهاست که من در بانک مربوطه از نام fld1 شروع و به تعداد 140 فیلد که به fld140 ختم شده است حال باتوجه به اینکه تعداد 20 سطر از ریپورت حکم پرسنلی مربوط به فیلدهای حقوقی ست و با در نظر داشتن این موضوع که احکام هر مجموعه زیر نظر موسسه (محل کار حقیر) با هم فرق میکنند (چیزی حدود 10 زیر مجموعه ) من آمده ام مشخصات فیلدهای تمامی مجموعه ها را در یک تیبل ذخیره کرده ام که کاربر با انتخاب زیر مجموعه مورد نظر فیلدها مربوطه باید به ریپورت مورد نظر منتقل و دقیقا همان فیلدها چاپ گردند که خواستم این فیلدها را با عملگر "&" به ریپورت منقل کنم که نشد.
و اما با مطالعه سورس کار آقا رضا تاوک با موضع جالبی برخوردم که برای اولین بار بود میدیدم و آن اینکه ایشان فایل ریپورت مربوطه را با فرمان use reprotname.frx باز نموده بودند و یکسری تغییرات لازم را از این طریق اصلاح کرده بودند !!!!‌
کسی از دوستان اطلاعات خاصی در خصوص فیلدهای ریپورت دارد ؟
آیا بعد از EXE شدن برنامه باز امکان تغییر وجود داره ؟
آیا واقعا این روش استاندارده و باعث خرابی هدر فایل نمیشود؟
رهرو

rezamim
سه شنبه 23 آبان 1385, 07:44 صبح
اولا که فایلهای فاکس مثل FRX ، SCX و . . . همه یکنوع DBF هستند و با دستور USE امکان باز کردن آنها وجود دارد. البته معمولا این کار در مورد فایلهای گزارشات و برای برداشتن درایور چاپگر معرفی شده انجام میشود. امکان انجام تغییر برروی گزارش به این شکل که آنرا باز کرده ، تغییر داده و مجددا ببندید وجود دارد و دقیقا مثل کار بر روی بانکهای اطلاعاتی هیچ خطری ندارد . فقط فایل گزارش شما نباید در فایل EXE باشد. چون در آنصورت امکان تغییر وجود ندارد.

دوم بنظر من بهتر است یک Cursor تعریف کنید و بر اساس انتخاب کاربر آنرا با موارد تعیین شده پر کنید و از آن در تهیه گزارش استفاده کنید. در اینصورت هیچ نیازی هم به تغییر در متن و محتوی گزارش نخواهید داشت.
من منظور شما را اینطور برداشت کردم که مثلا میخواهید در یک سطر بنویسید "بدی آب و هوا " و عدد مربوط به آن در جلوی آن ، در سطر بعد "وام های دریافتی" و عدد مربوطه و...

rahro
سه شنبه 23 آبان 1385, 10:04 صبح
. فقط فایل گزارش شما نباید در فایل EXE باشد. چون در آنصورت امکان تغییر وجود ندارد....
خوب این که حیف شد

.
دوم بنظر من بهتر است یک Cursor تعریف کنید و بر اساس انتخاب کاربر آنرا با موارد تعیین شده پر کنید و از آن در تهیه گزارش استفاده کنید. در اینصورت هیچ نیازی هم به تغییر در متن و محتوی گزارش نخواهید داشت.
من منظور شما را اینطور برداشت کردم که مثلا میخواهید در یک سطر بنویسید "بدی آب و هوا " و عدد مربوط به آن در جلوی آن ، در سطر بعد "وام های دریافتی" و عدد مربوطه و...
دقیقا" همینه که فرمودید البته نمونه همین نوع را هم میخوام در لیست حقوق هم پیاده کنم ولی باید اعتراف کنم که چون تازه یکساله به ویژوال روی آوردم تا کنون هیچ مثالی و توضیحی در مورد Cursor ندیده و نشنیده ام اگر دوستان بتوانند مثالی بزنند و راهنمایی کنن بی نهایت سپاسگذار میشوم

rezamim
سه شنبه 23 آبان 1385, 11:01 صبح
Cursor چیز عجیبی نیست . دقیقا مثل یک DBF هست با این تفاوت که توی حافظه ساخته میشه و با بستن اون از حافظه پاک میشه.
بسته به کاری که میخواهید انجام بدید چندین مدل میشه کرسر ها رو ایجاد کرد. در این مورد شما میتونید یک کرسر بسازید با دستور زیر:


CREATE CURSOR MyCursor (NameFam C(35), Title01 C(40), Value01 N(10,0),;
Title02 C(40), Value02 N(10,0))
بعد موارد انتخاب شده توسط کاربر رو با دستورات متنوع موجود به فیلدها وارد کنید .
بنظر من بهتره با توجه به ثابت بودن تعداد فیلدها در فرم مورد نظر ، تمام فیلدها تنها در یک رکورد ایجاد بشن. اینطوری شما میتونید به ازاء هر فرد یک رکورد با مشخصات مربوط به اون فرد ایجاد کنید و به راحتی گزارش همه نفرات رو تهیه کنید.
در گزارشتون هم تنها اسم فیلدها رو استفاده کنید . منظورم اینه که اسم فیلدتون رو MyCursor.Fld1 نگذارید . همون Fld1 کافیه
قبل از اینکه دستور ایجاد گزارش رو هم بدید یادتون باشه که ناحیه کاری فعال رو کرسر قراربدید
و در آخر هم کرسر رو ببندید


Select MyCursor
Report Form MyReport.frx noconsole preview
use in MyCursor

rahro
سه شنبه 23 آبان 1385, 12:53 عصر
فکر کنم یک چیز رو در نظر نگرفتید , عرض کردم مشخصات پرسنلی به همراه فیلد های حقوقی !
شما در نظر بگیرید بالای فرم مشخصات کامل پرسنل و در گوشه سمت راست نوع قرارداد و شرح حکم و امضای زیرربط و گوشه سمت چپ قیلدهای حقوقی به اضافه جمع کل مربوطه که فیلدهای ثابتی نیستند( درسته تعداد آنها ثابته و نوع همه یکیه ولی نام فیلدها همیشه ثابت نیست ! در یک مجموعه ممکن فیلد 1 تا 10 باشن و در مجموعه 2 فیلد 5 نباشه و فیلد 12 باشه) و... !!
با این روش برنامه بعد از محاسبه احکام جدید دوباره باید چند هزار رکورد را دوباره به کرسر انتقال بده و در آخر گزارش رو آماده کنه که این اتلاف وقته !
اگر بد فهمیدم و یا مورد دیگری هست خواهشا" راهنمایی کنید

rahro
سه شنبه 23 آبان 1385, 12:58 عصر
دوست گرامی توصیه برادرانه من اینه که اگه تمرین کنید همیشه جواب بیشتر سوالاتتونو از help پیدا کنید خیلی راحتت تر جواب می گیرید
مهران جان از توصیه شما متشکرم ولی چه کنم اولا " مطلبی با این موضوع رو نتونستم از توی help در بیاورم دوما" درسته زحمت شما میشه ولی فکر میکنم باید از شما اساتید در جاهایی برای آموزش کمک گرفت مگر نه؟
یادت نره : هر استادی روزی دانش آموز بوده

mehran_337
سه شنبه 23 آبان 1385, 13:39 عصر
نه دوست من منظور من این نبود . اینکه کرسر چیه خودم هم اینجا پرسیدم و یاد گرفتم .
من مخلص همه هم هستم . دلخور نشین
اما اینکه ساختار کرسر چطوریه خب ساختار همه دستورات توی help هست.
منظور من در این حد بود اگر کسی دلخور شد عذرخواهی می کنم

mehran_337
سه شنبه 23 آبان 1385, 15:14 عصر
با این روش برنامه بعد از محاسبه احکام جدید دوباره باید چند هزار رکورد را دوباره به کرسر انتقال بده و در آخر گزارش رو آماده کنه که این اتلاف وقته !

نه نگران این مسئله نباشید با دستور sql کرسر خودتون و ایجاد کنید و ببینید چقدر سریع این کارو می کنه اگر هم با این دستور آشنایی ندارید مثالی می زنم :

SELECT Select_List
FROM Table_List
[WHERE Conditions]
[ORDER BY Column_List]
[نام کرسر INTO cursor]

rezamim
سه شنبه 23 آبان 1385, 19:12 عصر
فکر کنم یک چیز رو در نظر نگرفتید , عرض کردم مشخصات پرسنلی به همراه فیلد های حقوقی !
شما در نظر بگیرید بالای فرم مشخصات کامل پرسنل و در گوشه سمت راست نوع قرارداد و شرح حکم و امضای زیرربط و گوشه سمت چپ قیلدهای حقوقی به اضافه جمع کل مربوطه که فیلدهای ثابتی نیستند( درسته تعداد آنها ثابته و نوع همه یکیه ولی نام فیلدها همیشه ثابت نیست ! در یک مجموعه ممکن فیلد 1 تا 10 باشن و در مجموعه 2 فیلد 5 نباشه و فیلد 12 باشه) و... !!
با این روش برنامه بعد از محاسبه احکام جدید دوباره باید چند هزار رکورد را دوباره به کرسر انتقال بده و در آخر گزارش رو آماده کنه که این اتلاف وقته !
اگر بد فهمیدم و یا مورد دیگری هست خواهشا" راهنمایی کنید

فکر کنم شما هم دقت نفرمودید
1 - در کرسر نمونه ای که من گذاشتم یک فیلد بنام Name گذاشتم که منظورم این بود که شما فیلدهای مربوط به مشخصات عمومی افراد مثل نام و نام خانوادگی ، شماره پرسنلی ، شماره مستخدم ، نام پدر ، شماره شناسنامه ، محل تولد ، مدرک ، رشته تحصیلی ، پست سازمانی ، رسته ، رشته ، طبقه و ... ( آی مردم :کف: ) رو هم در همون رکورد قرار بدهید و منظورم از فیلد های بعدی این بود که مواردی مثل حقوق مبنا ، افزایش سنواتی ، فوق العاده شغل ، فوق العاده سختی کار ، محل خدمت ، جذب و ... رو هم در همون رکورد و شرح حکم هم در همون رکورد. بنابراین به ازاء هر حکم یک رکورد خواهید داشت.
صد البته که محتوی فیلد های شما متغیر خواهد بود . فقط شما به ازاء 20 سطری که دارید ، 40 فیلد ( یکی برای شرح و یکی برای مبلغ ) ایجاد میکنید و آنها را با مقادیر متناسب با هر فرد پر میکنید. بنابراین برای فرد اول مورد نظر شما فیلدهای 1 تا 10 با 1 تا 10 پر میشود و برای فرد دوم شما فیلدهای 1 تا 10 با مقادیر 1و2و3و4و6و7و8و9و10و12 پر میشود.
در آخرهم ما و کرسر و فاکس رو از چند هزار و چند صد هزار رکورد نترسونید که با این چیزها نه میترسیم و نه وقتی تلف میشه:بامزه:

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



Select Persons.* from persons into cursor MyCursor READWRITE

برای اضافه کردن فیلد به کرسر هم از دستور


Alter table MyCursor ADD Column MyField C(10)

استفاده کنید.
خیلی وقته میخوام یه برنامه حقوق و دستمزد بنویسم. امیدوارم بعدا بهم کمک کنید:لبخند:

rahro
چهارشنبه 24 آبان 1385, 07:03 صبح
دوستان سلام
مهران و رضا جان از لطفتون ممنون و متشکرم
بلاخره به یاری خدا توانستم خواستمو شبیه سازی کنم مثال مربوطه را بپیوست آپلود کردم
خاطرتان باشد که درسته این مثال همان فرم ومثال اصلی من نیست ولی دقیقا خواسته ای ست که
دنبالش بودم یعنی مقدار یک فیلد رو در ریپورت آوردن. مطمئنا همه دوستان اهل فنند و با
کوچکترین نگاه به اصل موضوع پی میبرند.
در آخر از تمامی دوستانی که برای رسیدن به این موضوع مرا راهنمایی کردند کمال تشکر
رو دارم
موفق باشید - رهرو

rahro
چهارشنبه 24 آبان 1385, 07:10 صبح
1در آخرهم ما و کرسر و فاکس رو از چند هزار و چند صد هزار رکورد نترسونید که با این چیزها نه میترسیم و نه وقتی تلف میشه:بامزه:
:
من گفتم تازه به دنیای شئ گرا رو آوردم!!

rezamim
چهارشنبه 24 آبان 1385, 07:21 صبح
بنظر من استفاده از Cursor به شکلی که گفتم بهتر از استفاده از آرایه ( به شکلی که شما استفاده کرده اید ) میباشد. هم از نظر کد نویسی و هم از نظر سرعت.
دوست دارم دوستان دیگه هم نظر بدن

rahro
چهارشنبه 24 آبان 1385, 11:02 صبح
بنظر من استفاده از Cursor به شکلی که گفتم بهتر از استفاده از آرایه ( به شکلی که شما استفاده کرده اید ) میباشد. هم از نظر کد نویسی و هم از نظر سرعت.
دوست دارم دوستان دیگه هم نظر بدن
رضا جان مطمئنا باید همینطور باشد چون بهترین استاد تجربه است ولی من به دلایلی این روش رو ترجیح میدهم
اول اینکه من کل اطلاعات کل مجموعه (واحد) انتخابی کاربر را در آرایه ذخیره کرده ام از قبیل متن و فیلد و تنظیم خطوط . همانطور که مستحضرید چون متن هیچگاه تغییر نمیکند پس لزوم ندارد پیوسته صدا زده شود و نام متن را مستقیما به ریپپورت فرستادم و همجنین تنظیم خطوط فی ما بین فیلدهای حقوقی ! ولی گاها" می بایست چند فیلد در یک عدد ضرب و یا با هم جمع شود من این فرمول را هم در آرایه گذاشتم و از این طریق کارم خیلی ساده تر شده !
نمی دانم توانستم توجیح خوبی بکنم یا خیر!؟
بحرحال موارد شما در خصوص Cursor ها واقعا" زیبا و دلپسند بود که من اگاهی نداشتم و اگر این موارد را میدانستم بسیاری از کارهایم تا حالا ساده تر میشد . از شما متشکرم و امیدوارم شما و دیگر دوستان همچنان ما را از علم و تجربه خود بی نصیب نگذارید .
رهرو

kia1349
چهارشنبه 24 آبان 1385, 16:11 عصر
به نظر من هم کرسر بهتره ولی آقای رهرو شما اول مشکلتو حل کن و وقتی کارت تموم شد سر فرصت سعی کن برنامه رو بهینه کنی
اردتمند همه