اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الخدمة


إذهب إلى أفضل إجابة Solved by Eng.Qassim,

الردود الموصى بها

السلم عليكم 

ارجو من الاساتذة الكرام مساعدتي 

في الملف المرفق اواجه مشكلة 

عند ماتكون قيمة الحقل (تاريخ اعادة التعيين) = 20 واكثر يعرض الناتج اقل ب 3 في الحقل (الخدمة بعد اعادة التعيين)

الخدمة.accdb

رابط هذا التعليق
شارك

السلام عليكم

اخي @ابراهيم_

لااعلم ماذا تريد بالضبط من ملف الخدمة 

انا اعطيتك ملف جاهز للاحتساب 

اتمنى تشرح لي شو تريد بالضبط وانا حاضر قدر المستطاع

تحياتي

 

  • Like 1
رابط هذا التعليق
شارك

4 ساعات مضت, Ahmed_J said:

السلام عليكم

اخي @ابراهيم_

لااعلم ماذا تريد بالضبط من ملف الخدمة 

انا اعطيتك ملف جاهز للاحتساب 

اتمنى تشرح لي شو تريد بالضبط وانا حاضر قدر المستطاع

تحياتي

 

وعليكم السلام 

شكراً لك اخي لاكن المطلوب هو كما موجود في الملف 

و السؤال هو هناك خطأ في عدد الايام  الحقل (الخدمة بعد اعادة التعيين)

و انا مستخدم نفس الدلة في الحقل (الخدمة قبل اعادة التعيين) و لايوجد بها خطأ

 

رابط هذا التعليق
شارك

35 دقائق مضت, Eng.Qassim said:

وعليكم السلام

سؤالك غير مفهوم..وملفك يعمل بشكل جيد ..حاول ان تغير الفورمات لحقول التاريخ الى Short Date

اعتذر لعدم ايصال الفكرة لكم   و الخلل هو 

في حقل (الخدمة بعد اعادة التعيين) لا يعطي الناتج صحيح

و معادلة الحقل المذكور عند ماتكون قيمة الحقل (تاريخ ترك التعيين) فارغة  هي كالتالي

(الخدمة بعد اعادة التعيين)=(السنة الحالية)-(تاريخ التعيين)

و عندما تكون قيمة الحقل(تاريخ ترك التعيين) ليست فارغة 

(الخدمة بعد اعادة التعيين)=(السنة الحالية)-(تاريخ اعادة التعيين)

رابط هذا التعليق
شارك

16 دقائق مضت, ابراهيم_ said:

و السؤال هو هناك خطأ في عدد الايام

نعم..لاحظت ذلك..الافضل ان تستخدم الدالة التي نشرتها في مشاركتك السابقة

قلت ان هناك فرق بالايام اذا كانت الخدمة طويلة

رابط هذا التعليق
شارك

أخي دع عنك استخدام هذه الحسبات (سنة/شهر/يوم) فلن تجد أي دالة في الدنيا ترضيك وكلامي من خبرة طويلة في هذه الأمور.
استخدم المدد كأرقام عشرية بتقسيم الأيام على 365.25 للمدد القصيرة (حتى أربع سنوات) وتقسيمها على 365.2425 للمدد الطويلة.

تم تعديل بواسطه AbuuAhmed
  • Like 1
  • Thanks 1
رابط هذا التعليق
شارك

5 دقائق مضت, AbuuAhmed said:

خي دع عنك استخدام هذه الحسبات (سنة/شهر/يوم)

خليتني اشك بالدالة التي استخدمها ..استاذ ابو احمد ..

بصراحة كنت استخدم هذه الطريقة بتقسيم الايام على 365.25

 

  • Like 1
رابط هذا التعليق
شارك

هذه دالة تقوم بفرز الأيام البسيطة عن الأيام الكبيسة
من شروطها أن يكون يوم النهاية من ضمن الفترة يعني لحساب إجازة لابد إدخال آخر يوم في الإجازة وليس أول يوم مباشرة بعد الإجازة.
 

Function GetYears(ByVal DateFm As Long, ByVal DateTo As Long) As Double
  Dim Leap004 As Long
  Dim Leap100 As Long
  Dim Leap400 As Long
  Dim LeapYears As Long
  Dim SmblYears As Long
  Dim Leap As Long
  Dim Smbl As Long
  Dim LeapFm As Long
  Dim SmblFm As Long
  Dim inDate As Long
  Dim yy As Integer
  
  'Years between 102 And 9999
  If DateFm < DateSerial(102, 1, 1) Or _
     DateTo < DateSerial(102, 1, 1) Then Exit Function
  
  'Swapping
  If DateFm > DateTo Then
    inDate = DateFm
    DateFm = DateTo
    DateTo = inDate
  End If
  '------------------
  DateFm = DateFm - 1
  '------------------
  inDate = DateFm
  GoSub Calculate
  LeapFm = Leap
  SmblFm = Smbl
  '------------------
  inDate = DateTo
  GoSub Calculate
  Leap = Leap - LeapFm
  Smbl = Smbl - SmblFm
  '------------------
  GetYears = (Leap / 366) + (Smbl / 365)
  Exit Function
  '------------------

Calculate:
  yy = Year(inDate) - 1
  
  Leap004 = Fix(yy / 4)
  Leap100 = Fix(yy / 100)
  Leap400 = Fix(yy / 400)
  LeapYears = Leap004 - Leap100 + Leap400
  SmblYears = yy - LeapYears
  Leap = CLng(LeapYears * 366)
  Smbl = CLng(SmblYears * 365)
  
  '  Day(DateSerial(yy + 1, 3, 0))
  If day(DateSerial(yy + 1, 3, 1) - 1) = 29 Then
    Leap = Leap + (inDate - DateSerial(yy, 12, 31))
  Else
    Smbl = Smbl + (inDate - DateSerial(yy, 12, 31))
  End If
  Return
End Function

 

رابط هذا التعليق
شارك

21 دقائق مضت, Eng.Qassim said:

شوف الفرق بالايام في ملفك..بعد اضافة دالة اخرى

 

الخدمة.rar 31.5 kB · 3 downloads

ممنون منك اخي العزيز تعتك و ياي رحم الله و الديك

22 دقائق مضت, AbuuAhmed said:

أخي دع عنك استخدام هذه الحسبات (سنة/شهر/يوم) فلن تجد أي دالة في الدنيا ترضيك وكلامي من خبرة طويلة في هذه الأمور.
استخدم المدد كأرقام عشرية بتقسيم الأيام على 365.25 للمدد القصيرة (حتى أربع سنوات) وتقسيمها على 365.2425 للمدد الطويلة.

شكرأ لك اخي الكريم على النصيحة موفق ان شاء الله

  • Like 1
رابط هذا التعليق
شارك

41 دقائق مضت, Eng.Qassim said:

خليتني اشك بالدالة التي استخدمها ..استاذ ابو احمد ..

بصراحة كنت استخدم هذه الطريقة بتقسيم الايام على 365.25

فحص لكلامي:
 

Sub TestPeriods()
    Dim DateFm As Date
    Dim DateTo As Date
    
    DateFm = DateSerial(1583, 1, 1)
    DateTo = DateSerial(9999, 12, 31)
    
    Debug.Print GetYears(DateFm, DateTo)
    Debug.Print (DateTo - DateFm + 1) / 365.25
    Debug.Print (DateTo - DateFm + 1) / 365.2425
End Sub

النتائج
 8417 
 8416.82683093771 
 8416.99966460639 

 

  • Like 2
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information