الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أريد شرح لهذه الدالة

مغلق
بدأه الباشاقمرالزمان في 3 يوليو 2007 · 6 رد · 4,653 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الإخوة الأفاضل

هذه الدالة كانت في برنامج تحديد سن التقاعد للموظفين من تصميم الأخت /زهرة

فهل أجد من يشرحها لي

لكم خالص الشكر سلفاً

Public Function EndWork(ByVal DateFm As Variant, ByVal DateTo As Variant, DGP As Integer, MGP As Integer, YGP As Integer)
  Dim ddf As Byte, mmf As Byte, yyf As Integer
  Dim ddt As Byte, mmt As Byte, yyt As Integer

  DGP = 0: MGP = 0: YGP = 0

  Select Case VarType(DateFm)
	Case vbDate, vbLong
	  DateFm = DateFm - 1
	  DateFm = Format(DateFm, "dd/mm/yyyy")
	  DateTo = Format(DateTo, "dd/mm/yyyy")
	Case vbString
	  If DateFm Like "##[-/]##[-/]####" Then
		DateFm = Format(Val(Left(DateFm, 2)) - 1, "00") & Mid(DateFm, 3)
	  ElseIf DateFm Like "####[-/]##[-/]##" Then
		DateFm = Format(Val(Right(DateFm, 2)) - 1, "00") & "/" & _
				 Mid(DateFm, 6, 2) & "/" & Left(DateFm, 4)
		DateTo = Right(DateTo, 2) & "/" & Mid(DateTo, 6, 2) & "/" & Left(DateTo, 4)
	  Else
		Exit Function
	  End If
	Case Else
	  Exit Function
  End Select
  '------------------
  ddf = Mid(DateFm, 1, 2)
  mmf = Mid(DateFm, 4, 2)
  yyf = Mid(DateFm, 7, 4)

  ddt = Mid(DateTo, 1, 2)
  mmt = Mid(DateTo, 4, 2)
  yyt = Mid(DateTo, 7, 4)

  If ddt < ddf Then
	ddt = ddt + 30: mmt = mmt - 1
  End If

  If mmt < mmf Then
	mmt = mmt + 12: yyt = yyt - 1
  End If

  DGP = ddt - ddf
  MGP = mmt - mmf
  YGP = yyt - yyf

End Function

تم تعديل هذه المشاركة بواسطة الباشاقمرالزمان في 3 يوليو 2007 في 23:03

الله هو الموفق لسواء السبيل

#2

up

الله هو الموفق لسواء السبيل

#3

اخي الفاضل الباشاقمرالزمان

السلام عليكم ورحمة الله وبركاته

اقتباس
هذه الدالة كانت في برنامج تحديد سن التقاعد للموظفين من تصميم الأخت /زهرة

فهل أجد من يشرحها لي

ما هي المشكلة في الكود ؟ هل هو صعب ؟ او انه غير واضح ؟ او انه يوجد به خطأ ما ؟

ارى ان هذه الدالة هي من ابسط الأكواد ولا يوجد بها اي صعوبه

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

نبدأ مع بداية الكود :

السطر الأول :

Public Function EndWork(ByVal DateFm As Variant, ByVal DateTo As Variant, DGP As Integer, MGP As Integer, YGP As Integer)

اول كلمتين من الكود - Public Function - تعني وظيفه عامة اي يمكن استخدامها في اي مكان سواء النماذج او التقارير او الإستعلامات واسم هذه الوظيفة العامة هو - EndWork - وتعني نهاية العمل وكما تعلم انه لإستخراج الفرق بين تاريخين يجب ان يكون لدينا تاريخ بدايه ورمزنا له ( DateFm ) وهي اختصارا لكلمة Date From - من تاريخ - وجعلناها تساوي Variant اي ممكن تكون هذه القيمة رقميه ونصيه في نفس الوقت وايضا لدينا تاريخ النهاية ورمزنا له ( DateTo ) - الى تاريخ - وايضا يكون قيمه نصية ورقميه ثم قمنا بإضافة اجزاء التاريخ ورمزنا لمجموعة الأيام بالرمز ( DGP ) حيث D تعني Day و GP تعني اختصار لمجموعة GROUP وتكون Integer اي رقمي وهذا منطبق على مجموعة الشهر ( MGP ) حيث M تعني Month وايضا مجموهة السنه ( YGP ) حيث Y تعني Year

السطر الثاني :

Dim ddf As Byte, mmf As Byte, yyf As Integer

هنا قمنا بالتصريح من خلال الأمر Dim بأن ddf مساويه للبايت ولاحظ هنا انها تخص الرمز DateFm في السطر الأول بمعنى انها هذا التصريح يخص - اليوم من تاريخ - ووضعناه بحروف صغيره حتى لا نتلخبط في الكود وينطبق هذا ايضا على mmf - الشهر من تاريخ - واخيرا نهاية الجملة هي yyf - السنة من تاريخ - وجعلناها رقمي Integer

السطر الثالث :

 Dim ddt As Byte, mmt As Byte, yyt As Integer

مشابه تماما للسطر الثاني فيما ذكر اعلاه إلا انه يختلف عنه انه خاص بـ DateTo - الى تاريخ - وهذا واضح من الرموز .

السطر الرابع :

DGP = 0: MGP = 0: YGP = 0

طالما اننا وضعنا هذه الرموز في اول سطر من الكود فلابد ان نعطيها قيمه وهذه القيمه تساوي الصفر حيث انه عندما لا يكون هناك حساب للفرق التواريخ فإن الفروقات تكون دائما صفر .

السطر الخامس :

Select Case VarType(DateFm)

استخدمنا هنا دالة الاختيار Select Case لنوع - من تاريخ - DateFm

السطر السادس :

Case vbDate, vbLong

نبدأ عملية الإختيار للتاريخ وتنسيقه

السطر السابع :

DateFm = DateFm - 1

نجعل DateFm مساوية لـ نفس التاريخ مطروحا منه 1

السطر الثامن :

DateFm = Format(DateFm, "dd/mm/yyyy")

نقوم بتنسيق التاريخ - من تاريخ - بهذا الشكل الأيام ثم الأشهر ثم السنوات dd/mm/yyyy

السطر التاسع :

DateTo = Format(DateTo, "dd/mm/yyyy")

نفس النتسيق السابق للتاريخ ولكنه هنا للتاريخ - الى تاريخ - وبهذا انتهينا من الإختيار الأول

السطر العاشر :

Case vbString

هو الإختيار الثاني وبتنسق مختلف عندما يكون التاريخ في حقل نصي وليس كما التنسيق السابق vbDate تاريخ / وقت

السطر الحادي عشر :

If DateFm Like "##[-/]##[-/]####" Then

هنا استخدمنا الدالة الشرطية اذا كان - من تاريخ - مثل هذا التنيسق "##[-/]##[-/]####" ( دائما علامة الشبكة # تدل على انه تاريخ ) فإن

السطر الثاني عشر :

DateFm = Format(Val(Left(DateFm, 2)) - 1, "00") & Mid(DateFm, 3)

اكمال الجملة الشرطية -اذا .. فإن - من تاريخ - يكون تنسيقها اول خانتين من اليسار تكون "00" ( مع ) نرمز لها بالرمز - & - مع الحرف الثالث الأوسط من تاريخ وهو في السطر الحادي عشر [-/]

السطر الثالث عشر :

ElseIf DateFm Like "####[-/]##[-/]##" Then

ايضا اذا كان التنسيق بهذا الشكل ( لاحظ الفرق بين التنسيقين ) ففي الأول كان اليوم ثم الشهر ثم السنه وهنا في هذا السطر بدأنا بالسنه ثم الشهر ثم اليوم ونفس الدالة الشرطية السابقة سيكون تنسيق - من تاريخ - في السطر الرابع عشر بهذا الشكل :

DateFm = Format(Val(Right(DateFm, 2)) - 1, "00") & "/"  &  Mid(DateFm, 6, 2) & "/" & Left(DateFm, 4)

نبدأ التنسيق هنا اول حرفين لـ ( لتاريخ من) من اليمين ( لاحظ الفرق بين التنسيقات حتىلا تتبخبط عليك الأمور ) ثم نضيف له الشرطة الكائلة لليمين "/" مع اخر اربعة حروف من اليسار

السطر الخامس عشر :

DateTo = Right(DateTo, 2) & "/" & Mid(DateTo, 6, 2) & "/" & Left(DateTo, 4)

هذا السطر خاص بتنسق - الى تاريخ - ولا يوجد فرق بينه وبين الشرح السابق إلا اننا هنا بدأنا من اليمين ثم اضفنا علامة الشرطة المائله "/" ثم من الوسط اخذنا حرفين من الستة حروف ثم من اليسار اخر اربعة حروف .

ونفهم من هذه التنسيقات اننا لو كتبنا التاريخ في حقل نصي بهذا الشكل 22/07/2007 او كتبناها بهذا الشكل 2007/07/22 فإن الدالة سوف تتعرف على هذه التنسيقات وستبدأ بحساب الفرق بين التاريخين .

الأسطر التالية :

Else
		Exit Function
	  End If
	Case Else
	  Exit Function
  End Select

وتعني

عدى ذلك

انهي الدالة

ونهاية الجملة الشرطية

وعدى هذه الإختيارات

انهي الدالة

----------------------

نبدأ الآن بتجزئة الأيام والأشهر والسنوات لـ ( من تاريخ ) بهذه الأسطر

 ddf = Mid(DateFm, 1, 2)
  mmf = Mid(DateFm, 4, 2)
  yyf = Mid(DateFm, 7, 4)

ونفس طريقة التجزئة لـ ( الى تاريخ ) بهذه الأسطر

ddt = Mid(DateTo, 1, 2)
  mmt = Mid(DateTo, 4, 2)
  yyt = Mid(DateTo, 7, 4)

نبدأ الأن بالحسابات على التواريخ

If ddt < ddf Then
	ddt = ddt + 30: mmt = mmt - 1
  End If

اذا كان عدد ايام ( الى تاريخ ) اصغر من عدد ايام ( من تاريخ ) فإن عدد ايام ( الى تاريخ ) يساوي ( الى تاريخ + 30 يوما ) ونأخذ من عدد الأشهر 1 اي نقوم بطرحه من اشهر ( الى تاريخ ) وننهي الجملة الشرطية

If mmt < mmf Then
	mmt = mmt + 12: yyt = yyt - 1
  End If

اذا كان عدد اشهر ( الى تاريخ ) اصغر من عدد اشهر ( من تاريخ ) فإن عدد اشهر ( الى تاريخ ) يساوي ( الى تاريخ + 12 شهر ) حيث نأخذ سنه من وبهذا يكون عددالسنوات مطروحا منه 1 وهي تمثل 12 شهر ثم ننهي الجملة الشرطية .

بعد ان انتهينا من العمليات الحسابية على التواريخ من و الى لم يتبقى لنا معرفة مجوعة الأيام والأشهر والسنوات ةتكون بهذا الشكل

DGP = ddt - ddf
  MGP = mmt - mmf
  YGP = yyt - yyf

DGP مجموعة الأيام تساوي حاصل طرح ايام ( الى تاريخ ) من ايام ( من تاريخ )

MGP مجموعة الأشهر تساوي حاصل طرح اشهر ( الى تاريخ ) من اشهر ( من تاريخ )

YGP مجموعة السنوات تساوي حاصل طرح سنوات ( الى تاريخ ) من سنوات ( من تاريخ )

لو استخدمنا الوظيفه ()EndWork بحيث يكون بداخلها التاريخ بهذا الشكل

EndWork(DateFm,  DateTo , DGP, MGP , YGP)

فسوف تحصل على الفرق بين التاريخين مجزأ الى ايام واشهر وسنوات وسواء كان الحقل هو تاريخ / وقت او حقل نصي تنسيق التاريخ من اليمين او اليسار فلا يوجد فرق فالدالة سوف تقوم بعملها وتظهر النتيجة .

والآن اخي الباشاقمرالزمان هل الشرح واضح ام انني اعيد الشرح مره ثانية .

2
#4

سلام على زهرة المنتدى

شجرة طيبة تؤتي أ ُكلها كل حين ...............

أبو منتظر

#5

أختي الفاضلة / زهرة

بادئ ذي بدء أشكرك الشكر الجزيل لما تفضلتي به من شرح وافٍ وسلس جداً وهذا ما تعودناه من أختنا الفاضلة زهرة العبد الله التي لا تبخل علينا مما أفاض الله به عليها من علم بارك الله فيك وجزاكي عني وعنا جميعاً كل خير

أولاً: الكود ليس به صعوبة أو أنه غير واضح أو به خطأ فلم أبلغ من العلم الحكم عليه وخاصة أنه يعمل بشكل جيد...... ولكن الخطأ في أنا شخصياً ( وأعتقد أن مثلي كثير ) فأنا أنظر إلى الأكواد كأنها ثوابت لا تقبل التغيير وأنها جزء هام يجب حفظه من أجزاء البرمجة وخاصة أنها أنها تحتوي أوامر ورموز وأنظر إلى الرموز وكأنها جزء لا يتجزأ من الأمر ولا أدري هل هي ملحقة به أم نها رموز يضعها كاتب الكود... كما أن الأكواد نفسها لماذا تكتب على هذه الصورة أو تلك الصورة وما الذي تعنيه هذه الصورة أو تأثيرها .

ثانياً: كل ما أعرفه عن الأكواد وما أمتلكه من مكتبات الأكواد المختلفة والتي لا تتعدي أسماء الأوامر وفيما تستخدم فقط وهذا لا يجعل مني أو من أي شخص آخر أن أكون كود وخاصة أن الكثير من التساؤلات تحتاج إلى أكواد ونحصل عليها من المشرفين بشكل أو بآخر أو من خلال البرامج المختلفة والتي حاولت أن أضعها في المكتبات المختلفة لمساعدة الأعضاء في الحصول على مبتغاهم من جهة ومن تقليل العبء عن كاهل المشرفين من جهة أخرى وخاصة أنها أسئلة متكررة.

ثالثاً: هذا الجانب مظلم لدي ولدى الكثير وهذا يفرق كثيراً في مستوى المبرمجين والذي يحتاج إلى شرح وتفسير يجلي هذا الغموض فأقترح أن يكون هناك شرح بين الحين والآخر للأكواد المختلفة وخاصة بين يدي أكثر من كود لحساب الفرق بين تاريخين مثلاً( ولعل ذلك بسبب اهتمامي الغير معرف سبب له للتاريخ والوقت والأرقام) فقد أجد الآن الفرصة بعد هذا الشرح لمعرفة الفرق بينهم وفهم الأوامر المختلفة بأشكالها وصورها المختلفة فقد أكتسب بعد ذلك القدرة على إنشاء كود ما ولكن دون شرحك لهذا الكود كان هذا الجانب سيظل مظلماً ولن تضاء اللمبات في مخي او تعمل الخلايا الرماديا به أبداً

رابعاً: بالطبع لن أفوت هذه الفرصة دون الاستفسار عن بعض الأشياء في هذا الكود والتي قد تبدو ساذجة لكن ما أدراني فأنا لا أعرف معني لها او الغرض منها ( فأرجوا ألا تضحكي منها أو يتملكك النفور من الإجابة عليها)

1- ما معنى -1 في هذا الكود والغرض منه

DateFm = DateFm - 1

2- ماذا تعني الرقمين 6, 2 في هذا الكود

DateFm = Format(Val(Right(DateFm, 2)) - 1, "00") & "/"  &  Mid
(DateFm, 6, 2) & "/" & Left(DateFm, 4)

3- ماذا تعني الأرقام في هذا الكود

ddf = Mid(DateFm, 1, 2)
  mmf = Mid(DateFm, 4, 2)
  yyf = Mid(DateFm, 7, 4)

معلهش تحملي مدرس رياضيات والأرقام بالنسبة لي لابد أن يكون لها معني

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

الله هو الموفق لسواء السبيل

#6

اخي الفاضل الباشا قمر الزمان

السلام عليكم ورحمة الله وبركاته

اقتباس
بالطبع لن أفوت هذه الفرصة دون الاستفسار عن بعض الأشياء في هذا الكود والتي قد تبدو ساذجة لكن ما أدراني فأنا لا أعرف معني لها او الغرض منها ( فأرجوا ألا تضحكي منها أو يتملكك النفور من الإجابة عليها)
لا يوجد لدي مانع في الإجابة عن اي سؤال يتعلق بالبرمجة والأكواد الخاصة بها ولكن المشكلة عندما يتعلق الأمر بالسؤال عن الأمور البدائية في البرمجة والتي من الممكن ان الشخص يتعلمها من اي مكان وذلك بمجرد البحث عن المعلومه فهي متوفره وكما تعلم ان بداية تعلم اي برمجه يجب ان تكون على اقل تقدير بلغة الفيجول بيسك حتى تعرف كل شيء عن الرموز والدوال والوظائف ومتى نستخدم هذا الأمر وما هو البديل المماثل له بمعنى يجب ان تحصل تعليم سواء كان ذاتي او عن طريق الدورات فلا تعتقد ان كل شخص سوف يجيبك عن كل صغيرة وكبيره في الأكواد او البرمجه الا اذا كانت هناك امور لا تستطيع حلها فهنا يمكن الإستعانه بالمبرمجين ولكن المهم من ذلك ان يكون لديك ولو شيء يسير في لغة البرمجة فليس من المعقول ان شخصا يكتب لك بعض الأكواد ولا تعرف اي معنى لها ولكنك تشاهد نتائج هذه الأكواد عند تطبيقها .

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

دعنا نأخذ سؤالك الأول :

اقتباس
ما معنى -1 في هذا الكود والغرض منه

DateFm = DateFm - 1

معنى -1 هو طرح يوم من تاريخ البداية المعطى لأنه لا يوجد شيء اساسا في التواريخ اسمه صفر يوم فلابد ان يكون هناك على اقل تقدير فرق يوم واحد .

سؤالك الثاني

اقتباس
ماذا تعني الرقمين 6, 2 في هذا الكود

DateFm = Format(Val(Right(DateFm, 2)) - 1, "00") & "/" & Mid (DateFm, 6, 2) & "/" & Left(DateFm, 4)

كما تلاحظ ان كل رقم او رقمين الموجودين مع الدوال Right و Left و Mid لها دلالات ومعاني وليست موضوعه بشكل عشوائي .

لهذا دعنا نشرح هذه الدوال الثلاثه مع طرح امثله عليها

اولا : الدالة Right

هذه الدالة تعني البدء من يمين الكلمة وتستخدم مع الحقول المراد استخراج بعض الحروف من الكلمة الموجوده في مربع النص لذا سوف نقوم بالتطبيق على كلمة " ArabTeam" بإعتبار انه لا يوجد هناك فراغ بين الكلمات بل هي كلمة واحده وسنجد ان مجموع هذه الكلمة هو 8 حروف بعكس ان تكون الكلمة بهذا الشكل " Arab Team " فمجموع حروف هذه الكلمة 9 حروف بما فيها الفراغات طبعا نحن لا نهتم بالكلمة ككلمة ولكن عند التطبيق نقوم بإختيار اسم مربع النص وليكن مثلا مربع النص اسمه Text لأنه في التطبيق نستخدم هذه الطريقة

Right(Text, 2)

وهذا يعني اننا نريد اظهار اول حرفين من جهة اليمين من الكلمة الموجوده في مربع النص

بالطبع ستظهر لنا فقط حرفي " am " فقط

حسنا لو غيرنا الرقم 2 الى الرقم 4 فبالطبع سنحصل على الحروف السته من جهة اليمين وهي " Team "

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

 Right ( text, number_of_characters )

ثانيا : الدالة Left

هذه الدالة تعني البدء من يسار الكلمة وتستخدم مع الحقول المراد استخراج بعض الحروف من الكلمة الموجوده في مربع النص لذا سوف نقوم بالتطبيق على كلمة " ArabTeam" بإعتبار انه لا يوجد هناك فراغ بين الكلمات بل هي كلمة واحده وسنجد ان مجموع هذه الكلمة هو 8 حروف بعكس ان تكون الكلمة بهذا الشكل " Arab Team " فمجموع حروف هذه الكلمة 9 حروف بما فيها الفراغات طبعا نحن لا نهتم بالكلمة ككلمة ولكن عند التطبيق نقوم بإختيار اسم مربع النص وليكن مثلا مربع النص اسمه Text لأنه في التطبيق نستخدم هذه الطريقة

Left(Text, 2)

وهذا يعني اننا نريد اظهار اول حرفين من جهة اليسار من الكلمة الموجوده في مربع النص

بالطبع ستظهر لنا فقط حرفي " Ar " فقط

حسنا لو غيرنا الرقم 2 الى الرقم 4 فبالطبع سنحصل على الحروف السته من جهة اليمين وهي " Arab "

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

 Left ( text, number_of_characters )

ثالثا : الدالة Mid

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

Mid ( text, start_position, number_of_characters )

text, start_position هو الموضع الذي سوف نبدأ منه اظهار الحروف المطلوبه

number_of_characters هو عدد الحروف المطلوب اظهارها

طبعا ممكن يكون الموضوع من الحرف 2 او الحرف 3 او الحرف 6 كما تريد بناء على مجموع حروف الكلمة لديك فلدينا في المثال السابق الكلمة ArabTeam" وهي تتكون من 8 حروف لهذا سنطبق عليها الدالة Mid ونستخرج حرفين بداية من الحرف 3 لهذا سنجد ان الحرفين الظاهرين هما "ab" حسب الصيغة التالية

=Mid(Text,3,2)

ولو اردنا استخراج4 حروف بداية من الكلمة 5 فسنكتب هذه الصيغة

=Mid(Text,5,4)

وسيظهر لنا الحروف التالية "Team"

طبعا يمكن الجمع بين هذه الدوال في كود واحد وايضا يمكن استخدمها مع حقول رقميه او حقول نصيه او حقول تاريخ فالنتائج سوف تظهر لك وبناء على هذا الشرح لهذه الدوال عليك التدريب وقراءة هذا الكود اذا كان مربع النص DateFm يحتوي على التاريخ 25/07/2007

DateFm = Format(Val(Right(DateFm, 2)) - 1, "00") & "/"  &  Mid (DateFm, 6, 2) & "/" & Left(DateFm, 4)

وهذا الكود

ddf = Mid(DateFm, 1, 2)
mmf = Mid(DateFm, 4, 2)
yyf = Mid(DateFm, 7, 4)

وزيادة في الإيضاح هذا مثال لكل الدوال المشروحة قم بالتطبيق عليه

RLM.rar

#7

اختي الفاضلة/زهرة

في الحقيقة لا أجد من الكلمات ما يوفِ حقك وتعجز كلمات الشكر كلها عن ذلك ولكني أسأل الله العلي القدير أن يجعل ذلك ميزان حسناتك

الله هو الموفق لسواء السبيل

هذا الموضوع مغلق.

مواضيع مشابهة