تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الإجازة السنوية
#1
السلام عليكم
ممكن مساعدة بهذا المشروع لحساب الإجازة السنوية ..
طريقة العمل كاتالي :
البرنامج مقسم الى مدخلات ومخرجات
---
1 - يدخل تاريخ الخروج
2- يحدد عدد أيام الإجازة واليكن مثلاً 30
3- إذا كان في شهر الخروج أحد ايام الإجازة السنوية ..
يقوم بتحديدها حتى لا تحسب من ضمن الإجازة واذا كان في يومين من ضمن الإجازة أيضا يحددان حتى لايحسبان
(فمثلاً تم تحديد 30 يوم وصادف ان 26 سبتمبر هي إجازةعيد للدولة لا تحسب او يتم إضافة يوم زيادة بدلا عنها)

4 - سيظهر متى العودة بالتاريخ في المخرجات (وهذا يظهر اوتوماتكلي)
5- زر التنفيذ
============
وشكراً لكم ..

توضيح ..
بالنسبة للجمعة والسبت تحسب من ضمن الإجازة السنوية ..
المهم الأعياد التي تستثنى


الملفات المرفقة
.rar   Mul_2_Date.rar (الحجم : 65.42 ك ب / التحميلات : 27)
الرد }}}}
تم الشكر بواسطة:
#2
أولا : أنت تحتاج الي تحديد العام الحالي الذي ستكون فيه الأجازة
ثانيا : تبني مصفوفة تضع بها جميع تواريخ أجازات الدولة بحيث تكون هذه الايام مرتبطة بالعام الحالي للأجازة
ثالثا : تبني مصفوفة اخري تقرأ منها تاريخ بداية الاجازة الي تاريخ نهاية الاجازة
رابعا : تقارن المصفوفتان فإن كانت المصفوفة التي بها جميع تواريخ الاجازة للشخص تحتوي علي احد تواريخ الاجازات الرسمية للدولة تقوم بإضافة هذا اليوم الي مصفوفة ثالثة اسمها الايام المشتركة
وفي النهاية تجمع عدد الأيام الموجود في مصفوفة الاجازات مع العدد الموجود في مصفوفة الايام المشتركة لتحصل علي عدد أيام الاجازة

الخلاصة انت تختاج الي ثلاثة مصفوفات لتحسب عدد ايام الاجازة
الرد }}}}
تم الشكر بواسطة:
#3
السلام عليكم و رحمة الله اعذرني على التاخير اخي الكريم كنت في سفر



كلام الاخ عمر ممتاز و يعطيك الحل المطلوب اذا كنت تتقن العمل مع المصفوفات
انا بدوري ساستفيد من مكاتب اطار العمل في تطبيق الفكرة
ساكتب لك قطعة من الكود تقوم بحساب نهاية الاجازة لك اعتمادا على عدد الايام المدخلة للاجازة مع استثناء ايام الجمعة و السبت الواردة ضمن فترة الاجازة (كونها عطلة نهاية الاسبوع لدينا) انت اختر ما يناسبك
هذا الكود يقوم باضافة ايام الجمعة و السبت الى ListBox1 كعطل
و يقوم ايضا بتجاوز العطل الوطنية التي تم ملئها في Listbox2 كتواريخ من الشكل (dd/mm/yyyy)
و يقوم ايضا بملئ Listbox3 بايام الاجازة الفعلية التي يجب على الموظف عدم الحضور بها
اخيرا يقوم بحساب نهاية اجازة الموظف بعد ان يتم اضافة كل ايام العطل الى اجازته الفعلية

لتستفيد من الكود ضع على الفورم لديك ListBox2-ListBox3 
وقم باستدعاء الكود في زر حساب

اولا الاجراء المسؤول عن الحساب

PHP كود :
   Sub CalcHolidayes(startDate As DateTimenumDays As Integer)

 
       If numDays 0 Then
            Dim Weekend 
As List(Of String) = New List(Of String)
 
           Dim Allday As List(Of String) = New List(Of String)


 
           Dim DateCalc As Date
            Dim today 
As Date
            today 
startDate

            DateTimePicker2
.Value today.AddDays(numDays 1)
 
           ListBox1.Items.Clear()

 
           '
            For i As Integer = 0 To numDays - 1
                DateCalc = today.AddDays(i)
                If DateCalc.DayOfWeek.ToString = "Friday" Or DateCalc.DayOfWeek.ToString = "Saturday" Then
                    ListBox1.Items.Add(DateCalc.ToShortDateString)
                    '
عطل نهاية الاسبوع
                    Weekend
.Add(DateCalc.ToShortDateString)
 
               Else
                    
'استثاء عطل نهاية الاسبوع من الاضافة الى المصفوفة
                    Allday.Add(DateCalc.ToShortDateString)
                End If

            Next

            Dim op As Integer = 0
            ListBox3.Items.Clear()
            '
ايام الاجازة الفعلية بعد طرحها من عطل الاعياد و عطل نهاية الاسبوع
            If ListBox2
.Items.Count 0 Then

                For Each str 
As String In Allday
                    If Not 
(ListBox2.Items.Contains(str)) Then
                        ListBox3
.Items.Add(str)
 
                   ElseIf ListBox2.Items.Contains(strThen
                        op 
+= 1
                    End 
If
 
               Next

            End 
If

 
           'جمع كل العطل و اظافتها الى تاريخ العودة
            op += ListBox1.Items.Count
            DateTimePicker2.Value = DateTimePicker2.Value.AddDays(op)
        End If
    End Sub 

ثانيا الاستدعاء
PHP كود :
       CalcHolidayes(CDate(DateTimePicker1.Value), Val(TextBox1.Text)) 



بقي عليك ان تضيف العطل الوطنية الخاصة بك الى ListBox2 بالطريقة التي تراها مناسبة و لكن وفق التنسيق "dd/mm/yyyy"
بالتوفيق
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}}
تم الشكر بواسطة:
#4
الأخ عبد الله

اكتب لي قائمة ب أيام الاجازات في الدولة باليوم و الشهر فقط
الرد }}}}
تم الشكر بواسطة:
#5
شكرا أخي Silver
للتجاوب ..
22 مايو
26 سبتمبر
14 أكتوبر
30 نوفمبر

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

شكراَ لك كثيرا أخي وبارك الله فيك

شكراً لك أبوليلى
الرد }}}}
تم الشكر بواسطة:
#6
PHP كود :
Private Function GenerateNationalDateStrings(days As String(), months As String()) As String()
 
       Dim dates As List(Of String) = New List(Of String)()
 
       Dim total As Integer days.Length 1
        For i 
As Integer 0 To total
            Dim d 
As String days(i)
 
           Dim m As String months(i)
 
           Dim y As String DateTime.Now.Year.ToString()
 
           Dim dt As String String.Concat(New String() {d.ToString(Globalization.CultureInfo.CurrentCulture), "/"m.ToString(Globalization.CultureInfo.CurrentCulture), "/"y.ToString(Globalization.CultureInfo.CurrentCulture)})
 
           dates.Add(dt)
 
       Next
        Return dates
.ToArray
    End 
Function

 
   Private Function GenerateNationalDateStrings() As String()
 
       Return GenerateNationalDateStrings({"22""26""14""30"}, {"05""09""10""11"})
 
   End Function

 
   Private Function GenerateAnnualDateStrings(startdate As DateTimeendDate As DateTime) As String()
 
       Dim dates As New List(Of String)()
 
       While startdate <= endDate
            Dim s 
As String CType(Convert.ChangeType(startdate.ToShortDateStringGetType(String)), String)
 
           dates.Add(s)
 
           startdate startdate.AddDays(1)
 
       End While
 
       Return dates.ToArray
    End 
Function

 
   Private Function GetAnnualLevaeDays(annualDates As String(), nationalDates As String()) As Integer
        Return 
(annualDates.Intersect(nationalDates).Count) + (annualDates.Count)
 
   End Function 

في الكود أعلاه :

الدالة الأولي و الثانية الهدف منهم هو حساب مصفوفة الاعياد الوطنية لذلك ستلاحظ انني قمت بتمرير الايام التي كتيتها أنت  الي هذه الدالة

الدالة الثالثة الهدف منها هو حساب مصفوفة تمثل الايام الموجودة بين تاريخ بداية الاجازة و تاريخ نهاية الأجازة

الدالة الاخيرة و هي  GetAnnualLevaeDays هي ما يهمك فعليا لانها التي يتم فيها حساب اجمالي ايام الاجازة وذلك ان كان هناك يوم من الاعياد الوطنية يقع بين تاريخ بداية الاجازة و تاريخ نهاية الاجازة

الكود التالي يوضح كيف تستخدم الكود أعلاه لحساب عدد ايام الاجازة الكلي شاملا الاعياد الوطنية ان وُجدت


PHP كود :
       Dim startDate As DateTime = New DateTime(2016101)
 
       Dim endDate As DateTime = New DateTime(20161031


PHP كود :
Dim i As Integer GetAnnualLevaeDays(GenerateAnnualDateStrings(startDateendDate), GenerateNationalDateStrings()) 

ملحوظة:

جميع الدوال من الممكن كتابتها بطرق  كثيرة .... فهنا في الكود اعلاه كل المصفوفات المستخدمة هي من النوع String لكن من السهل تحويل كل شئ الي مصفوفات من النوع  DateTime لكن هذا لن يؤثر في اي شئ لأن دور المصفوفات هنا يقتصر علي حساب ما هو موجود بالمصفوفات
الرد }}}}
تم الشكر بواسطة:
#7
أخي بارك الله فيك وشكراً لك لتعاون معي ..
لكن أعذرني ..
وضعت الدوال الثلاث في المشروع ولكن لم أفهم كيف أستدعيها ..
وماذا أضع في زر التنفيذ ..
---
لو أوضحت أكثر ..
خلفيتي بسيطه في البرمجة

عفوا رفعت المشروع الفارغ


الملفات المرفقة
.rar   Mul_2_Date.rar (الحجم : 65.42 ك ب / التحميلات : 6)
الرد }}}}
تم الشكر بواسطة:
#8
الأخ عبد الله

مبدئيا انا لاحظت انك تستخدم الفيجوال استوديو 2010 ,  و انا عند نسخة 2015
لذلك ربما الكود في المرفقات لا يفتح عندك لأني قمت بتعديل الكود الأصلي باستخدام نسخة 2015

عموم و كنوع من الحل لك حتي تستطيع كتابة الكود بنسخة 2010

افتح مشروع
اولا : تضيف للفورم الأتي
1- DateTimePicker1 و سيكون الهدف منها تحديد تاريخ بداية الأجازة
2- DateTimePicker2 و سيكون الهدف منها تحديد تاريخ نهاية الأجازة
3- TextBox1 و الهدف منه عرض اجمالي أيام الأجازة
4- ListBox1 لعرض الاجازات الوطنية
5- Button1 سنستخدمه لحساب عدد ايام ايام الأجازة الفعلية و إظهارها في التكست بوكس

و اكتب الكود في الفورم بالشكل التالي


PHP كود :
Public Class Form1
    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        
' أعتقد أنه لا يوجد فائدة لإظهار ايام الاجازات الوطنية لكن هذا للتوضيح فقك في كيفية عرضها داخل الليست بوكس
        For Each s As String In GenerateNationalDateStrings()
            ListBox1.Items.Add(s)
        Next
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim starDate As DateTime = DateTimePicker1.Value
        Dim endDate As DateTime = DateTimePicker2.Value
        Dim annualLeave As Integer = 0
        If endDate > starDate Then
            annualLeave += GetAnnualLevaeDays(starDate, endDate)
            Me.TextBox1.Text = annualLeave
        Else
            MessageBox.Show("تاريخ نهاية الأجازة يجب أن يكون أكبر من تاريخ بداية الأجازة", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.TextBox1.Text = ""
        End If
    End Sub

    Private Function GetAnnualLevaeDays(startdate As DateTime, endDate As DateTime) As Integer
        Return GetAnnualLevaeDays(GenerateAnnualDateStrings(startdate, endDate), GenerateNationalDateStrings())
    End Function
    Private Function GetAnnualLevaeDays(annualDates As String(), nationalDates As String()) As Integer
        Return (annualDates.Intersect(nationalDates).Count) + (annualDates.Count)
    End Function

    Private Function GenerateNationalDateStrings(days As String(), months As String()) As String()
        Dim dates As List(Of String) = New List(Of String)()
        Dim total As Integer = days.Length - 1
        For i As Integer = 0 To total
            Dim d As String = days(i)
            Dim m As String = months(i)
            Dim y As String = DateTime.Now.Year.ToString()
            Dim dt As String = String.Concat(New String() {d.ToString(Globalization.CultureInfo.CurrentCulture), "/", m.ToString(Globalization.CultureInfo.CurrentCulture), "/", y.ToString(Globalization.CultureInfo.CurrentCulture)})
            dates.Add(dt)
        Next
        Return dates.ToArray
    End Function

    Private Function GenerateNationalDateStrings() As String()
        Return GenerateNationalDateStrings({"22", "26", "14", "30"}, {"05", "09", "10", "11"})
    End Function

    Private Function GenerateAnnualDateStrings(startdate As DateTime, endDate As DateTime) As String()
        Dim dates As New List(Of String)()
        While startdate <= endDate
            Dim s As String = CType(Convert.ChangeType(startdate.ToShortDateString, GetType(String)), String)
            dates.Add(s)
            startdate = startdate.AddDays(1)
        End While
        Return dates.ToArray
    End Function

End Class 


الملفات المرفقة
.rar   Mul_2_Date.rar (الحجم : 62.25 ك ب / التحميلات : 17)
الرد }}}}
تم الشكر بواسطة:
#9
أخي silverlight
المشروع يعمل معي جيدا دون مشاكل ..
---
لكن هناك شئ بسيط لم يكن هو المطلوب ..
---
أنا لا أريد أحدد تاريخ الخروج وتاريخ العودة ؟؟
لان هكذا سأحتاج الى حساب الايام والتاريخ وهذا ليس عملي؟
---
كما قلت في سؤالي اريد فقط احدد تاريخ الخروج ..
ومباشرة أحدد في التكستبوكس عدد أيام الخروج واليكن مثلا20 يوم
وأحدد اذا كان هناك يوم وطني
---
وبمجرد الضغظ على الزر التنفيذ يظهر لي تاريخ العودة مضبوط
---
هذا ما اريده اخي بارك الله فيك ..
وشكرالك كثيرا للتعاون .. تحياتي اليك ..
الرد }}}}
تم الشكر بواسطة:
#10
في المرفقات ستجد الملف بعد التعديل
أنا تركت كل شئ كما هو في الفورم الأول و قمت بإضافة فورم اخر لحساب الاجازة كما طلبت


الملفات المرفقة
.rar   Mul_2_Date.rar (الحجم : 70.23 ك ب / التحميلات : 18)
الرد }}}}
تم الشكر بواسطة:


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم