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

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

قبليقبلي Go to previous topic
بعديبعدي Go to next topic
آخرين ارسال 23 اسفند 1391 10:52 ق.ظ توسط Etemadi
سوالي درخصوص تابع Trunk سيستم حقوق و دستمزد
�9 پاسخ
مرتب:
شما مجاز به پاسخ به اين پست نمي باشيد.
مولف پيغام ها
sajjadi
کاربر با تجربه
کاربر با تجربه

--
22 اسفند 1391 04:35 ب.ظ

    با سلام و احترام

    سناريوي زير را در نظر بگيريد:
    در مجموعه‌اي، اضافه کار و تاخير بر حسب ساعت و دقيقه در سيستم وارد مي‌شود. درصورتيکه شخصي هم اضافه کار و هم تاخير داشته باشد، ابتدا ساعت و دقيقه تاخير از اضافه کار کسر شده، سپس اگر تاخير بيش از اضافه کار بود، بر اساس فرمولي محاسبه مبلغ تاخير انجام شده، ساعت و دقيقه تاخير نهايي، اطلاع داده مي‌شود و اگر اضافه کار بيشتر بود، مبلغ اضافه کار بر اساس فرمولي محاسبه شده و ساعت و دقيقه اضافه کار نهايي اعلام مي‌گردد. 
    مراحل گفته شده مربوط به ساعت و دقيقه مطابق برنامه زير انجام مي‌گيرد (لازم به ذکر است، فرمولهاي مربوط به محاسبه مبلغ اضافه کار و تاخير در برنامه زير لحاظ نشده است):

    حال اگر اين برنامه را با اعدادي که نوشته شده انجام دهيم حاصل H7 (که در واقع اضافه کار پس از کسر تاخير است و البته به شکل ساعت و دقيقه)، به جاي آنکه 8 شود، 7.60 مي‌شود!
    اکنون اگر همين برنامه را براي 12.30 (D1 اضافه کار) و 8.30 (E1 تاخير) انجام دهيم، H7 (اضافه کار پس از تاخير) عدد 4 خواهد بود. اين سناريو را با چند عدد ديگر نيز انجام دادم و همين تفاوتها را مشاهده نمودم.
    لازم به ذکر است، در خط 202، H4  که همان عدد اختلاف است، درست مي‌باشد ولي پس از عبور از تابع Trunc، مشکل پيدا مي‌کند البته آن هم براي برخي از اعداد!

    لطفا راهنمايي نماييد.

    با تشکر

    momeni
    کاربر ارشد
    کاربر ارشد

    --
    22 اسفند 1391 06:09 ب.ظ
    سلام

    بسیار داستان جالبی است.

    واقعا 7.6 در منطق فعلی به معنی 7 ساعت و 60 دقیقه یا همان 8 ساعت می‌باشد! در کار با ارقام اعشاری گاهی این وضعیت (برای برخی از اعداد) پیش می‌آید. دلیل آن، نحوه نگهداری اعداد اعشاری در سیستم می‌باشد. مثلا یک عدد 8 ممکن است به صورت 7.999999999999999 در سیستم ذخیره شود. اگر این عدد را Trunc نمایید به جای 8، عدد 7 را دریافت می‌کنید و البته بقیه داستان به همان صورتی که فرمودید رخ خواهد داد. برای رفع این مشکل کافی است قبل از Trunc یک عدد بسیار کوچک (که هیچ تغییری در مفهوم داده‌ها ایجاد نکند) را به عددی که Trunc می‌شود اضافه نمایید: مثل H4 = H3 + 0.00000001.

    ارادت
    Etemadi
    کاربر پیشرفته
    کاربر پیشرفته

    --
    22 اسفند 1391 06:10 ب.ظ
    سلام

    فکر می کنم در خطی که H3 محاسبه شده ( قبل از دستور GOTO 202 ) ، باید یک فیلد اطلاعات اصلی ( مثلا MA999 ) تعریف کرده و H3 را درون آن کپی کرده و بعد به خط 202 می رویم و در آنجا بنویسیم H4 = MA999 و بعد ادامه کار ...

    علت اینکه در شرایطی که شما کار را انجام داده اید چرا این مسئله پیش می آید احتمالا به ماهیت متغیرها بر می گردد .

    با تشکر
    Etemadi
    کاربر پیشرفته
    کاربر پیشرفته

    --
    22 اسفند 1391 06:13 ب.ظ
    ببخشید...

    تا بنده پست خود را ارسال کنم جناب آقای مومنی زحمت کشیده و پاسخ داده اند و بنده بعد از ارسال متوجه شدم .

    با تشکر
    sajjadi
    کاربر با تجربه
    کاربر با تجربه

    --
    23 اسفند 1391 08:20 ق.ظ

    با سلام و احترام

    جناب آقاي مومني، ممنونم از توجهتان.
    هنگام تست برنامه، اعداد را قبل و بعد از Trunc مشاهده نمودم، قبل از اين تابع، نمايش عدد درست بود ولي با عبور از خط Trunc، تغييري که گفتيد اتفاق مي‌افتاد. همانطور که گفتم براي چندين گروه پراکنده از عدد، اين عمليات را انجام دادم که براي برخي از آنها در نهايت، نمايش عدد به گونه 60/... بود. لازم به ذکر است، بين اعداد انتخابي رابطه خاصي را مشاهده نکردم.
    جناب آقاي اعتمادي از پاسخ شما هم ممنون، فقط منظورتان از اينکه گفتيد "بستگي به ماهيت متغيرها دارد" را متوجه نشدم. براي اينکه از نحوه عملکرد و تاثير قسمتهاي مختلف مطمئن باشم، در برنامه از اعداد ثابت استفاده نمودم. اگر اين چند خط برنامه را در سيستم وارد نموده و آن را به يک گزارش متصل کنيد مي توانيد نتيجه را بررسي نماييد. در واقع اين متغيرها مستقل از فيلدهاي تعريف شده در جداول مختلف برنامه بوده و کاملا مستقل عمل مي‌کنند.

    با تشکر

    sajjadi
    کاربر با تجربه
    کاربر با تجربه

    --
    23 اسفند 1391 08:25 ق.ظ

    ببخشيد فراموش کردم بپرسم، آيا در تمام قسمتهاي برنامه، قبل از دستور Trunc، مشابه خطي که گفتيد را قرار دهم؟ (در اين نمونه که در دست دارم، علاوه بر اين فرايند، پس از بررسي ساعت و دقيقه اضافه کار با تاخير، اين عمليات مقايسه بايد با تعطيل کاري هم انجام شود. البته در مثالهاي مختلف که انجام دادم، فقط همين قسمت به مشکل برخوردم)

    با تشکر مجدد

    sajjadi
    کاربر با تجربه
    کاربر با تجربه

    --
    23 اسفند 1391 09:48 ق.ظ

    روشي که آقاي اعتمادي گفتند را تست کردم، جواب نداد. ولي روش آقاي مومني، جواب داد.

    ممنون

    Etemadi
    کاربر پیشرفته
    کاربر پیشرفته

    --
    23 اسفند 1391 10:21 ق.ظ
    سلام

    خانم سجادی ممنون از پیگیری و اطلاع رسانی شما و ممنون از جناب آقای مومنی بابت روشی که ارائه دادند .
    مورد جالبی بود .

    با تشکر
    momeni
    کاربر ارشد
    کاربر ارشد

    --
    23 اسفند 1391 10:40 ق.ظ
    سلام

    در مورد کاربرد Trunc در حالت کلی نیازی به این کار نیست. در اینجا با یک تعریف کار بسیار عجیب (از نظر سیستمی) مواجه هستیم. در این کاربرد، تعریف اعشار را تغییر داده‌ایم و معمولا چنین توقع پیچیده‌ای از Trunc در سیستم وجود ندارد. توجه فرمایید که عدد 7.999999999999999999 با هر تعداد رقم اعشار ممکن که بازنمایی شود، همان 8 خواهد بود. این عدد در عملیات عادی سیستم بوجود نمی‌آید. در اینجا 7.60 را داریم که با تعریفی که از اعداد داده‌ایم، واقعا مساوی 8 است (7 ساعت و 60 دقیقه). این وضعیت نشان می‌دهد که اشکال (که البته خیلی مهم نیست و با تمهیدی که گفته شد حل می‌شود) ناشی از تعریف نادرست یک عدد اعشاری است که قسمت صحیح آن در مبنای ده و قسمت اعشاری آن کسری از 60 می‌باشد. برای اینکه مشکل را متوجه شوید، فرض کنید چنین قرارداد می‌کردیم که 7.100 به معنی 8 می‌بود! یعنی نه تنها قسمت اعشار را به اعداد کوچکتر از 100 محدود کرده باشیم، بلکه بین 7.100 و 7.1 هم فرق گذاشته باشیم. واضح است که اداره اعداد با این تعریف کار بسیار دشواری می‌بود - همانطور که اداره اعداد با استاندارد فوق هم کار دشواری است.

    روش صحیح(تر) برای پیاده سازی زمان در سیستم این است که ساعت و دقیقه در دو فیلد مجزا از هم وارد شوند - نه به صورت یک عدد اعشاری با تعریف مبهم. یا اینکه در یک عدد اعشاری که واحد آن معلوم باشد (مثل ساعت) یا یک عدد صحیح با واحد دقیقه... اگر عدد اعشاری با واحد ساعت مورد استفاده قرار گیرد، 12 ساعت و 30 دقیقه باید به صورت 12.5 وارد شود.

    در نسخه XP از نرم‌افزار دستمزد از یک نوع داده به نام "مدت" استفاده خواهیم کرد. ساختار "مدت" شبیه "زمان" است - یعنی ساعت، دقیقه و ثانیه در آن با علامت : از هم جدا می‌شوند. با وجود این نوع داده تصور می‌کنم دیگر نیازی به این محاسبات پیجیده نداشته باشیم.
    Etemadi
    کاربر پیشرفته
    کاربر پیشرفته

    --
    23 اسفند 1391 10:52 ق.ظ
    ممنون از توضیحات شما

    به امید خدا و بعد ، زحمات بسیار زیاد جناب آقای مومنی و پرسنل واحد برنامه نویسی مالی ، خیلی از مسائل که در نسخه تحت داس بود در نسخه ویندوزی حقوق و دستمزد حل خواهد شد .

    با تشکر
    شما مجاز به پاسخ به اين پست نمي باشيد.