PDA

View Full Version : بازهم مشاوره و تقاضای راهنمایی



rahro
چهارشنبه 31 مرداد 1386, 12:21 عصر
سلام
دوستان : میدانید در سیستم حقوق ودستمزد هر کدام از آیتمهای غیبت - مرخصی استعلاجی و بدون حقوق در محاسبه حقوق دخیل است . من میخوام برای اینکه کاربر هر ماه قرار نباشد این آیتمها رو بصورت دستی وارد کند در جدولی که قبلا حدود مرخصی در آن به ثبت رسیده آنها رو استخراج کنم و با یک عمل به روز رسانی عملکرد همان ماه روآپدیت کنم .
خوب تا اینجای کار مشکلی نیست مثلا اگر شخصی از تاریخ 01/05/86 تا 15/01/86 بمدت 15 روز مرخصی استعلاجی رفته باشد سیستم حدود ماه رو میسنجه و مدت مرخصی رو در فیلد مربوطه قرار میده ولی مشکل اینجاست که اگر مرخصی استعلاجی شخصی چیزی مثل 01/05/86 تا 15/07/86 به مدت 77 روز بود این رو چه کار کنم زیرا قاعدتا باید 31 روز مربوطه به مرداد 31 روز مربوط به شهریور و 15 روز مربوط به مهر باشد ؟!!!:گیج::افسرده:
مطمئنا باید ساده باشه ولی از بس عجق وجق روش فکر کردم گیج شدم !؟
همکنون منتظر یاری سبزتان هستم :لبخند::لبخند:

سعید حمیدیانفر
چهارشنبه 31 مرداد 1386, 13:03 عصر
سلام
ببین این کارتو راه میندازه ؟


***** test sample
***** false(cFrom,cTo,[isCabise])
?fasele("1386/02/15","1386/03/01")
?fasele("1386/02/15","1386/05/01",.t.)
*
FUNCTION fasele as Integer
LPARAMETERS cDat1,cDat2,lCabise
DO CASE
CASE PCOUNT()<2
RETURN 0
CASE PCOUNT()=2
lCabise=.f.
ENDCASE
iDat1=dat2int(cDat1,lCabise)
iDat2=dat2int(cDat2,lCabise)
iRet=(idat2-idat1)
RETURN iRet
*
FUNCTION dat2int
LPARAMETERS cDat,lCabise
yyyy=INT(VAL(SUBSTR(cDat,1,4)))
mm=INT(VAL(SUBSTR(cDat,6,2)))
dd=INT(VAL(SUBSTR(cDat,9,2)))
DO CASE
CASE mm<=6
iRet=(yyyy*365)+(mm*31)+(dd)
CASE mm>=6 AND mm<12
iRet=(yyyy*365)+(mm*30)+(dd)
CASE mm=12
IF lCabise
iRet=(yyyy*100)+(mm*30)+(dd)
ELSE
iRet=(yyyy*100)+(mm*29)+(dd)
ENDIF
ENDCASE
RETURN iRet

rahro
چهارشنبه 31 مرداد 1386, 13:38 عصر
سلام
فکر میکنم این تابع دو تاریخ متفاوت رو از هم کسر مکینه درسته ؟!!!
ولی دوست عزیز مشکل من این نیست از لطفتون ممنونم .
من باید :
1- تمامی رکوردهای ماه جاری رو که فی مابین تاریخ ابتدا و انتهای ماه مورد نظر میباشد رو استخراج کنم
2- از رکوردهای استخراجی تاریخ هایی رو که به ماه یا ماه های بعد ختم میشود و یا رکوردهایی که به ماه یا ماههای قبل وصل میشه و هنوز تعدادی از روزهای آن باید در ماه جاری محاسبه شود جدا کنم و در فیلد مربوطه ذخیره کنم .
امید است توانسته باشم منظورم رو برسانم

rezamim
چهارشنبه 31 مرداد 1386, 20:32 عصر
من که با توضیحاتت اینجوری شدم :گیج::کف:

rahro
پنج شنبه 01 شهریور 1386, 06:56 صبح
من که با توضیحاتت اینجوری شدم :گیج::کف:
:متعجب:
سلام رضا جان : چه جالب تصور میکردم "اینجوری" مختص منه که باهاش روبه روشدم :قهقهه:
خوب باید باز داستان سرایی کنم .
من در یک جدول (فرضا بنام tbl1) تمامی مرخصی های مربوطه رو ثبت میکنم که شامل مرخصی استحقاقی و ساعتی واستعلاجی و بدون حقوق و...
حال میخوام تعداد ساعتی که یک شخص از مرخصی استعلاجی و استحقاقی و بدون حقوق در ماه مورد درخواست کاربر مثلا تیرماه 86 استفاده کرده رو از توی جدول tbl1 در بیاورم و توی جدول حقوق بریزم مرخصی در جدول tbl1 داری فیلدهای ذیل است
کد پرسنل - نوع مرخصی - تاریخ شروع - تاریخ پایان - مدت - و ....
کد=1 نوع =استعلاجی شروع = 15 / 4 /86 پایان = 25 /4/86 مدت = 10
کد=2 نوع =استعلاجی شروع =15 / 4 / 86 پایان =15/ 6 /86 مدت =32
کد=3 نوع =استعلاجی شروع=15 / 2 / 86 پایان = 15 / 4 /86 مدت=32
ببنید در مورد پرسنل 1 مشکلی وجود نداره چرا که اگر محدوده تیرماه رو در بیاریم تاریخ شروع منهای تاریخ پایان میشود 15 روز و در عملیات تیرماه ثبت میشود ولی در مورد 2 و 3 موارد فرق میکنه دومی درسته 32 روز استفاده کرده ولی 16 روز آن مربوط به تیر ماه و در سومی تنها 15 روز !!!!‌ من در فکر چارتی هستم که بشود این 15 روز و 16 روز از از دومی و سومی جدا کنم و سرعت کارم هم پائین نیاید!!
امیدوارم دیگه اینجوری نشید:قهقهه::قهقهه:

سعید حمیدیانفر
پنج شنبه 01 شهریور 1386, 07:23 صبح
با سلام
ببینید این چطوره ؟


dat1="86/04/15"
dat1="86/06/15"
if substr(dat1,4,2)=substr(dat2,4,2) then && آیا دو تاریخ در یک ماه می باشند
?fasele(dat1,dat2)
else
?fasele(dat1,substr(dat1,1,6)+"30") یا fasele(dat1,substr(dat1,1,6)+"31")
endif

rezaTavak
پنج شنبه 01 شهریور 1386, 09:26 صبح
اگر یادتان باشد یک تابع تاریخ گداشته بودم در آن ماه تاریخ جدا می شود. و عدد ها همه به تاریخ ژولیوسی تبدیل می شود. (خود فاکس دارد فکر کنم sys(3) است.) حالا اگر ماه تاریخ دوم از ماه تاریخ اول بزرگتر بود باید شما بزرگترین روز ماه تاریخ اول را بدست آورید. مثلا در ماههای ۱ تا ۶ که ۳۱ روزه است و ماههای ۷ تا ۱۱ که ۳۰ و ماه ۱۲ که یا کبیسه است و ۳۰ و یا ۲۹ روز. حالا تعداد روز میشود (شروع مرخصیی - کل ماه) در ماه شروع.

در ماه دوم هم اگر تفاوت ماهها بیشتر از ۱ بود و ماه جاری بیشتر از ماه شروع کل روزهای ماه جاری برای ماههای بعد هم بهمین منوال و...

در ماه تاریخ دوم اولین روز ماه منهای تاریخ پایان.


تذکر قبل از محاسبات یک select بگیرید به شرطی که تاریخها در محدوده این ماه باشند. یعنی شروع کوچکتر مساوی ماه جاری و پایان بزرگتر مساوی ماه جاری.

یا


select * from tbl1 where MonthOfDate(cStartOff)<= nThisMonth and MonthOfDate(cEndOff) >= nThisMonth into Array laOffThisMonth

rahro
شنبه 03 شهریور 1386, 11:50 صبح
البته این توضیح در مورد تاریخ شروع مرخصی صدق میکنه ولی در مورد تاریخ پایان نه چرا که مثلا اگر محدوده تاریخ بین 25/12/85 الی 10/01/86 باشه گیر داره علاوه بر این مشکل سالهای کبیسه و خبیسه هم هست .
به هر حال با کمک و راهنمایی شما حل شد ولی فقط یک مورد که آزارم میده اینه که مجبور شدم در فرامین sql از فانکشن استفاده کنم . آخه راه حل دیگری برای بالا بردن سرعت به نظر نرسید.

rezaTavak
یک شنبه 04 شهریور 1386, 19:37 عصر
مهم نیست.

اگر بانک شما کوچک است و تابع شما کم حجم. اما می تونید از برای افزایش سرعت تابع را در C بوسلیه dll تولید کنید که سرعت بالاتری داشته باشید.

rahro
سه شنبه 06 شهریور 1386, 09:40 صبح
سلام
آقا یک مشکل دیگه.
من موقعی که پروژه حقوق و دستمزد رو طراحی میکردم سعی کردم طوری آنرا طراحی کنم که دست کاربر برای تعریف فرمولها و آیتمها در فیلدهای حقوقی باز باشه به نحوی که هر قدر فرمول محاسباتی خواست تعریف کند و تا اینجای کار هم خیلی عالی پیش رفته ولی مشکلی که حال به آن برخوردم گزارشات استخراجی است !! چرا؟! برای اینکه موقعی که فیلدها رو به دست کاربر میدادم باید فکرش رو میکردم که امروز تو حچل نیفتم :ناراحت::گریه: حال متحیرم با این طراحی چارت چگونه گزارشات شامل فیش حقوقی و لیست حقوق وبیمه ومالیات رو استخراج کنم !!!!!!؟ تنها راهی که میتوانم تصور کنم اینهکه یک نمونه طراحی کنم و این اجاره رو به کاربر بدم که بتونه بیس فرم گزارش رو تغییر بده (منظورم همان روشیه که جناب توکل یه وقت توضیح داده بودند یعنی use کردن فرم و دستکاری بیس !!)
نظر دوستان چیه ؟! راه حل بهتری سراغ دارند .:متفکر:
یک نکته که فکر کنم گفتنش بد نباشه عرض کنم که کل فیلدهایی که در اختیار کاربره 140 فیلده که نام آنها از FLD1 تا 140 تعریف شده !!!؟:افسرده:

rezaTavak
سه شنبه 06 شهریور 1386, 20:23 عصر
یک جدول تعریف کنید که فیلدها و نام آنها و عنوان آنها در آن باشد که بدانید چه فیلدی برای چه کاری است.

rahro
جمعه 09 شهریور 1386, 19:44 عصر
یک جدول تعریف کنید که فیلدها و نام آنها و عنوان آنها در آن باشد که بدانید چه فیلدی برای چه کاری است.
سلام
ببخشید جناب توکل :
من یک جدول برای این موضوع دارم که نام فیلدها و عنوان آنها در آن است ولی این خصیصه چطور میتونه راه گشا باشه ؟!
شما مطمئنید منظور من رو متوجه شدید؟

rezaTavak
شنبه 10 شهریور 1386, 11:00 صبح
مطمئن نیستم حدس زدم.
شما باید سپس یک تابع برای تبدیل عنوان به فیلد بنویسید.
در ریپورت هم با quick record بسازید.


یعنی باید همه چیز در اختیار کاربر باشد.

rahro
شنبه 10 شهریور 1386, 15:40 عصر
مطمئن نیستم حدس زدم.
شما باید سپس یک تابع برای تبدیل عنوان به فیلد بنویسید.
در ریپورت هم با quick record بسازید.


یعنی باید همه چیز در اختیار کاربر باشد.
سلام
جناب توکل :
همانطور که عرض کردم کل اطلاعات استخراجی در یک جدول قرار دارد که اسامی فیلدهای آن از fld1 تا fld140 نام گذاری شده است . دقیقا عنوان تک تک این فیلدها در یک جدول دیگه در اختیار کاربره که میتونه به هر یک از این فیلدها عنوانی قرار بده . حال مشخص نیست کاربر مثلا آیتم مزد شغل رو به کدام فیلد اختصاص میده .!!! با این حال چون لیستهای حقوقی و مالیاتی وبیمه یا فیش حقوق دارای یک شمایل خاص میباشند باید طوری برنامه عمل کنه که دقیقا نیاز کاربر رو رفع کنه . و نمیشه در ریپورت جایگاه دقیق فیلد مربوطه رو مشخص کرد!؟
ببینید اگر بازهم موضوع نامفهوم است من قسمتی از پروژه ام آپلود کنم .
در ضمن منظور شما رو از quick record متوجه نشدم لطفا توضیح دهید.

rezaTavak
شنبه 10 شهریور 1386, 16:59 عصر
والا مشکلات اینکه اول برنامه نویسی شده و بعد طراحی. این مشکلات را باید ابتدای طراجی در نظر گرفته باشید.

اشتباه نوشتم منظورم quick report بود.
یک ساخت اتوماتیک report

rahro
یک شنبه 11 شهریور 1386, 06:10 صبح
والا مشکلات اینکه اول برنامه نویسی شده و بعد طراحی. این مشکلات را باید ابتدای طراجی در نظر گرفته باشید.
اشتباه نوشتم منظورم quick report بود.
یک ساخت اتوماتیک report
من ابتدا اعتراف کردم البته نه اینکه طراحی نشده باشه بلکه دید آخر کارم اشتباه بود! ولی در خصوص quick report متاسفانه در محدودیت قرار داریم و نمیتوانیم شایمل اصلی رو طراحی کنیم فکر کنم بهترین کار همون ویرایش ریپورت پیش فرض توسط کاربر باشه همان روشی ابداعی خودتان . زیرا فقط باید نام فیلدها و کپشنها تغییر کنه که همگی در فیلد Expr ریپورته که از نوع مموری هستش من نامی که سیستم بصورت اتوماتیک به تک تک رکوردهای بیس طراحی شده قرار میده رو عوض کردم که هنگامی که خواستم اونها رو در یک فرم در معرض اختیار کاربر قرار بدم براحتی قابل استخراج باشه فقط یک سری مشکلات فعلا با فیلدها ممو دارم چون تا حالا با این فیلدها کار نکردم !!:خجالت: نمیدونم به محضی که میخوام مقدار ممو رو به متغیر از نوع آرایه بدم سیستم میگه این متغیر شناخته شده نیست !؟؟ لذا خواهشا در خصوص درج و اخذ اطلاعات از فیلدهای ممو کمی راهنمائیم کنید . متشکرم

rezaTavak
یک شنبه 11 شهریور 1386, 09:13 صبح
در راهنمای فاکس گفته شده که memo به آرایه نمیرود.

rahro
یک شنبه 11 شهریور 1386, 12:12 عصر
در راهنمای فاکس گفته شده که memo به آرایه نمیرود.
آره دقت نکردم عذر میخوام ولی آیا شما ادامه این راه رو توصیه میکنید ؟ میخوام با اطمینان ادامه دهم آیا آخر کار به نظر شما امید بخشه؟! از دید خودم بله از دید شما چی؟

rahro
چهارشنبه 14 شهریور 1386, 18:26 عصر
در راهنمای فاکس گفته شده که memo به آرایه نمیرود

آره دقت نکردم عذر میخوام ولی آیا شما ادامه این راه رو توصیه میکنید ؟ میخوام با اطمینان ادامه دهم آیا آخر کار به نظر شما امید بخشه؟! از دید خودم بله از دید شما چی؟
سلام
چی شد پس جناب توکل ادامه دهم ؟
در ضمن طی مطالعاتی که داشتم مطلبی خواندم که میتوان با دستور مثلا"

save arrayname memo memoname
محتوی آرایه رو در فیلد ممو ذخیره یا توسط دستور

restory from memoname additive
اطلاعات آرایه رو از فیلد ممو به آرایه بار کرد.:متفکر:
البته هنوز تست نکردم :خجالت:

rezaTavak
پنج شنبه 15 شهریور 1386, 17:39 عصر
سلام

دوست عزیز پست جدید شما را ندیدم. ببخشید.


راستش ببین روی کاغذ درست درمیاد یا نه. اگه شد که ادامه بده اگر نه که روی کاغذ اول طراحی کن.


راستش من خیلی وقته فاکس را کنار گذاشتم . دلیل اولش نداشتن اجرای خوب روی لینوکس و دیگر سیستم عاملهاست. بنابراین نگارش جدیدتر از ۷ را نمیدانم. اما توی نگارش ۷ نیست.


البته اگر هم نشد میشه با دستور scan یک یک فیلدهای ممو را خواند و به یک آرایه ریخت.


گرچه memo یک فیلدی است که بیشتر برای کار پردازشی نیست.



اگر memo را به char تبدیل کنید بهتر است (نگران حجم نباشید ۲۵۴ در اکثر موارد کاراکتر کافیست)

rahro
پنج شنبه 15 شهریور 1386, 21:04 عصر
اگر memo را به char تبدیل کنید بهتر است (نگران حجم نباشید ۲۵۴ در اکثر موارد کاراکتر کافیست)
سلام
عذر میخوام جناب توکل منظورتان رو نفهمیدم منظورتان تغییر ماهیت فیلده !!!! یا چیز دیگه ؟!
:متفکر:

rezaTavak
جمعه 16 شهریور 1386, 19:50 عصر
بله اگر طول کاراکترهایی که ذخیره میشه از ۲۵۴ بیشتر نیست بهتره نوع فیلد کاراکتری باشد.

rahro
شنبه 17 شهریور 1386, 06:23 صبح
بله اگر طول کاراکترهایی که ذخیره میشه از ۲۵۴ بیشتر نیست بهتره نوع فیلد کاراکتری باشد.
ولی این فیلد مربوط به بیس ریپورته که سیستم میسازه !!!!؟

rezaTavak
شنبه 17 شهریور 1386, 07:39 صبح
منظورتون اینکه این یک frx است؟

من فکر کردم فایل خودتان است. باید از scan استفاده کنید.

rahro
چهارشنبه 12 دی 1386, 09:20 صبح
بعد از کلی زحمت و جون کندن بلاخره موفق شدم این گزارش گیری رو تموم کنم ولی با چیزی مواجه شدم که دوباره خاطرات بد داس رو بیادم آورد ! برنامه بدون هیچ خطایی روی پی سی من کار میکنه ولی روی پی سی طرف مقابل خطا میده!:ناراحت: کلی بهش ور رفتم گفتم نشد که نشد!! حتی ویژوال فاکس رو تو کامپیوتر طرف مقابلم نیز نصب کردم ولی همان آش و همان کاسه!
مطمئنم خطا توی این چند سطر آخره هر چند ساده است ولی واقعا گیج گیجم خطاش کجاست . اگر بخوام یک توضیح برای شفاف شدن بهتر موضوع ارائه بدم باید عرض کنم که:
ریپورتها رو به هیچ وجه در پروژه اضافه نکردم و در فرمی که ایجاد کردم به کاربر این امکان رو میده که اگر خواستم ریپورتی جدید برای اون تهیه کنم بعد از ارسال اون رو در فولدر مربوطه کپی و توسط فرم در جدول خاصی به ثبت برسونه و ازش استفاده کنه !
این هم خلاصه این کد آخری:

selectname=ALLTRIM(thisformset.dbfselect) && äÇã ÌÏæá íÔ ÝÑÖ
LOCATE namereport,formoljari,shartter
namereport=ALLTRIM(thisformset.namereport) && äÇã ÑíæÑÊ ÒÇÑÔÇÊ
shartter=''
SELECT &selectname
formoljari=ALLTRIM(this.formode) && ÔÑØ ÇÌÑÇí ÒÇÑÔ
rep_path=SYS(5)+SYS(2003)+'\REP\'+namereport+'.FRX '
shartter=rep_path+' FOR '+formoljari+' preview noconsole'
REPORT FORM &shartter
و این هم خطایی که روی سیستم مقابل دریافت میکنم

command contains unrecognized phrase /keyword. line:49
کلافه شدم دوستان راه کاری در نظر ندارن:عصبانی++:

rahro
چهارشنبه 12 دی 1386, 12:01 عصر
پیداش کردم.!
در سیستم مقابلم فولدری رو که برنامه را در اون نصب کردم بود از نامی شامل دو کلمه که با کلید space از هم جدا شده بود استفاده کرده بودم به عنوان مثال Personel reyhaneh
همین موضوع باعث و ایجاد خطا شده بود .