17-09-16, 06:01 PM (آخر تعديل لهذه المشاركة : 17-09-16, 06:40 PM {2} بواسطة abdulla2.)
السلام عليكم
ممكن مساعدة بهذا المشروع لحساب الإجازة السنوية ..
طريقة العمل كاتالي :
البرنامج مقسم الى مدخلات ومخرجات
---
1 - يدخل تاريخ الخروج
2- يحدد عدد أيام الإجازة واليكن مثلاً 30
3- إذا كان في شهر الخروج أحد ايام الإجازة السنوية ..
يقوم بتحديدها حتى لا تحسب من ضمن الإجازة واذا كان في يومين من ضمن الإجازة أيضا يحددان حتى لايحسبان
(فمثلاً تم تحديد 30 يوم وصادف ان 26 سبتمبر هي إجازةعيد للدولة لا تحسب او يتم إضافة يوم زيادة بدلا عنها)
4 - سيظهر متى العودة بالتاريخ في المخرجات (وهذا يظهر اوتوماتكلي)
5- زر التنفيذ
============
وشكراً لكم ..
توضيح ..
بالنسبة للجمعة والسبت تحسب من ضمن الإجازة السنوية ..
المهم الأعياد التي تستثنى
أولا : أنت تحتاج الي تحديد العام الحالي الذي ستكون فيه الأجازة
ثانيا : تبني مصفوفة تضع بها جميع تواريخ أجازات الدولة بحيث تكون هذه الايام مرتبطة بالعام الحالي للأجازة
ثالثا : تبني مصفوفة اخري تقرأ منها تاريخ بداية الاجازة الي تاريخ نهاية الاجازة
رابعا : تقارن المصفوفتان فإن كانت المصفوفة التي بها جميع تواريخ الاجازة للشخص تحتوي علي احد تواريخ الاجازات الرسمية للدولة تقوم بإضافة هذا اليوم الي مصفوفة ثالثة اسمها الايام المشتركة
وفي النهاية تجمع عدد الأيام الموجود في مصفوفة الاجازات مع العدد الموجود في مصفوفة الايام المشتركة لتحصل علي عدد أيام الاجازة
الخلاصة انت تختاج الي ثلاثة مصفوفات لتحسب عدد ايام الاجازة
السلام عليكم و رحمة الله اعذرني على التاخير اخي الكريم كنت في سفر
كلام الاخ عمر ممتاز و يعطيك الحل المطلوب اذا كنت تتقن العمل مع المصفوفات انا بدوري ساستفيد من مكاتب اطار العمل في تطبيق الفكرة ساكتب لك قطعة من الكود تقوم بحساب نهاية الاجازة لك اعتمادا على عدد الايام المدخلة للاجازة مع استثناء ايام الجمعة و السبت الواردة ضمن فترة الاجازة (كونها عطلة نهاية الاسبوع لدينا) انت اختر ما يناسبك هذا الكود يقوم باضافة ايام الجمعة و السبت الى ListBox1 كعطل و يقوم ايضا بتجاوز العطل الوطنية التي تم ملئها في Listbox2 كتواريخ من الشكل (dd/mm/yyyy) و يقوم ايضا بملئ Listbox3 بايام الاجازة الفعلية التي يجب على الموظف عدم الحضور بها اخيرا يقوم بحساب نهاية اجازة الموظف بعد ان يتم اضافة كل ايام العطل الى اجازته الفعلية
لتستفيد من الكود ضع على الفورم لديك ListBox2-ListBox3 وقم باستدعاء الكود في زر حساب
اولا الاجراء المسؤول عن الحساب
PHP كود :
Sub CalcHolidayes(startDate As DateTime, numDays 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
' 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(str) Then op += 1 End If Next
End If
'جمع كل العطل و اظافتها الى تاريخ العودة op += ListBox1.Items.Count DateTimePicker2.Value = DateTimePicker2.Value.AddDays(op) End If End Sub
22-09-16, 12:34 AM (آخر تعديل لهذه المشاركة : 22-09-16, 12:40 AM {2} بواسطة silverlight.)
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 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
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(2016, 10, 1) Dim endDate As DateTime = New DateTime(2016, 10, 31)
PHP كود :
Dim i As Integer = GetAnnualLevaeDays(GenerateAnnualDateStrings(startDate, endDate), GenerateNationalDateStrings())
ملحوظة:
جميع الدوال من الممكن كتابتها بطرق كثيرة .... فهنا في الكود اعلاه كل المصفوفات المستخدمة هي من النوع String لكن من السهل تحويل كل شئ الي مصفوفات من النوع DateTime لكن هذا لن يؤثر في اي شئ لأن دور المصفوفات هنا يقتصر علي حساب ما هو موجود بالمصفوفات
24-09-16, 10:22 AM (آخر تعديل لهذه المشاركة : 24-09-16, 10:24 AM {2} بواسطة abdulla2.)
أخي بارك الله فيك وشكراً لك لتعاون معي ..
لكن أعذرني ..
وضعت الدوال الثلاث في المشروع ولكن لم أفهم كيف أستدعيها ..
وماذا أضع في زر التنفيذ ..
---
لو أوضحت أكثر ..
خلفيتي بسيطه في البرمجة
عفوا رفعت المشروع الفارغ
24-09-16, 07:25 PM (آخر تعديل لهذه المشاركة : 24-09-16, 07:26 PM {2} بواسطة silverlight.)
الأخ عبد الله
مبدئيا انا لاحظت انك تستخدم الفيجوال استوديو 2010 , و انا عند نسخة 2015
لذلك ربما الكود في المرفقات لا يفتح عندك لأني قمت بتعديل الكود الأصلي باستخدام نسخة 2015
عموم و كنوع من الحل لك حتي تستطيع كتابة الكود بنسخة 2010
افتح مشروع
اولا : تضيف للفورم الأتي
1- DateTimePicker1 و سيكون الهدف منها تحديد تاريخ بداية الأجازة
2- DateTimePicker2 و سيكون الهدف منها تحديد تاريخ نهاية الأجازة
3- TextBox1 و الهدف منه عرض اجمالي أيام الأجازة
4- ListBox1 لعرض الاجازات الوطنية
5- Button1 سنستخدمه لحساب عدد ايام ايام الأجازة الفعلية و إظهارها في التكست بوكس
و اكتب الكود في الفورم بالشكل التالي
PHP كود :
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles 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
أخي silverlight
المشروع يعمل معي جيدا دون مشاكل ..
---
لكن هناك شئ بسيط لم يكن هو المطلوب ..
---
أنا لا أريد أحدد تاريخ الخروج وتاريخ العودة ؟؟
لان هكذا سأحتاج الى حساب الايام والتاريخ وهذا ليس عملي؟
---
كما قلت في سؤالي اريد فقط احدد تاريخ الخروج ..
ومباشرة أحدد في التكستبوكس عدد أيام الخروج واليكن مثلا20 يوم
وأحدد اذا كان هناك يوم وطني
---
وبمجرد الضغظ على الزر التنفيذ يظهر لي تاريخ العودة مضبوط
---
هذا ما اريده اخي بارك الله فيك ..
وشكرالك كثيرا للتعاون .. تحياتي اليك ..