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

*كود* كود بسيط لحساب العمر من ستة حقول

مغلق
بدأه حارث في 6 سبتمبر 2001 · 25 رد · 6,112 مشاهدة · في قسم الأرشيف و المواضيع المميزه
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

حاولت إنشاء كود لحساب العمر ضمن محاولاتي لتعلم الأكواد، وكانت نتيجة محاولتي هي الملف الموجود في الوصلةالتالية :

http://mypage.ayna.com/harith77/age.zip

في حال لم تتمكن من تحميل الملف افتح الصفحة:

http://mypage.ayna.com/harith77

ثم اختر : age.zip

لكن كما سيتضح لكم فيه إشكالات ، أظن أن سببها كتابتي لكلمة Byte في العبارات نحو Dim days As Byte ، أو سبب آخر .

أرجو من الإخوة الإفادة . ولكم جزيل الشكر .

أخوكم حارث

#2

تم تعديل الملف في نفس اليوم ظهرا ، وذلك بحذف العبارات نحو

Dim days As Byte

وتعديلات أخرى بسيطة .

سؤال : هل لعدم استخدام مثل هذه العبارات تأثير سلبي على الكود .

#3

الأح حارث

آمل إعطائي رأيك في هذا الكود

Dim التاريخ_الحالي As Date

Dim تاريخ_الميلاد As Date

Dim باقي_الأيام As Date

Dim باقي_التاريخ As Date

التاريخ_الحالي = DateSerial(firstyy, firstmm, firstdd)

تاريخ_الميلاد = DateSerial(syy, smm, sdd)

ageyy = (التاريخ_الحالي - تاريخ_الميلاد) 360

باقي_التاريخ = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

If DateDiff("m", تاريخ_الميلاد, باقي_التاريخ) = 12 Then

ageyy = ageyy + 1

agemm = 0

Else

agemm = DateDiff("m", تاريخ_الميلاد, باقي_التاريخ) + 1

End If

باقي_الأيام = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

باقي_الأيام = DateAdd("m", -agemm, باقي_الأيام)

If Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام)) > 29 Then

agemm = agemm + 1

agedd = 0

Else

agedd = Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام))

End If

ولك تحياتي

#4

الأخ أبو حمود :

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

أخوك حارث .

#5

الأخ حارث سلمه الله

السلام عليكم

أشكرك شكراً كثيرا على مابينته ، وهو خطأ لا شك في ذلك وقد وجدت خطأ آخر فيه عند مراجعته لتصحيح الخطأ الذي ذكرته ، وإليك الكود بعد التعديل وانتظر منك تجربته -وكما يقولون انخله نخل -فأنا أول المستفيدين من تنبيهاتك:

Dim التاريخ_الحالي As Date

Dim تاريخ_الميلاد As Date

Dim باقي_الأيام As Date

Dim باقي_التاريخ As Date

التاريخ_الحالي = DateSerial(firstyy, firstmm, firstdd)

تاريخ_الميلاد = DateSerial(syy, smm, sdd)

ageyy = (التاريخ_الحالي - تاريخ_الميلاد) 360

باقي_التاريخ = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

If DateDiff("m", تاريخ_الميلاد, باقي_التاريخ) >= 12 Then

ageyy = ageyy + 1

agemm = 0

Else

agemm = DateDiff("m", تاريخ_الميلاد, باقي_التاريخ)

End If

باقي_الأيام = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

باقي_الأيام = DateAdd("m", -agemm, باقي_الأيام)

If Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام)) > 29 Then

agemm = agemm + 1

agedd = 0

Else

agedd = Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام))

End If

للفائدة ضع في حدث عند التحميل :

firstdd = Day(Date)

firstmm = Month(Date)

firstyy = Year(Date)

ولك تحياتي وشكري

#6

الأخ حارث

وين رحت ؟ هل نفع الكود أم لا ؟

ولك تحياتي

#7

أخوك مشغول شوي هاليومين ، لكن أول ما ألتفت للأكسس أقول لك إن شاء الله ، والله يصبرك علينا

أخوك حارث

#8

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

ولك تحياتي

#9

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

جربت الكود تجريبا سريعا : ووجدت ملاحظات :

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

مثال : تاريخ الميلاد 1/7/1400 التاريخ الحالي 19/6/1422 يعطينا الجواب أحيانا صحيحا وأحيانا 21 سنة و -1 شهر و 18 يوم .

وهذا يؤثر على حساب الأشهر والأعوام بشكل عام.

الثانية : أنه يعطي الأيام بالسالب لكن بدون علامة سالب .

مثال : تاريخ الميلاد 20/6/1400 التاريخ الحالي 19/6/1422 يعطي العمر 22 سنة صفر شهر 1 يوم . والمفروض 19 سنة و11 شهر و 29 يوم . وهذا يؤثر على حساب الأعوام بشكل عام كما يتضح من المثال السابق.

الثالثة : أنه يخطئ في التواريخ القديمة في السنة والشهر . أمثلة :

عند المقارنة بالتاريخ الحالي 19/6/1422 هـ مع 19/6 لعدد من السنوات نجد ما يلي :

السنوات 1359 فما بعدها : يعطي العمر صحيحا : أي الشهر صفر واليوم صفر .

السنوات 1358 - 1291 تعطي خطأ بمعدل سنة ناقصة وشهر زائد .

السنة 1290-1231 فماقبلها تعطي خطأ بمعدل سنتين ناقصتين وشهر زائد .

السنة 1230 وعدد من السنوات قبلها تعطي خطأ بمعدل ثلاث سنوات ناقصة وشهر واحد زائد .

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

ولك جزيل الشكر.

#10

أخي حارث

السلام عليكم

اللي كتبته تجريب سريع أجل شلون البطيء .

لقد جربت ما ذكرته :

أولا : جربت المثال اللي عن السالب فلم يظهر لي سالب بهذا التاريخ أبداً ، فهل أخطأت أنت في التاريخ المكتوب هنا ؟

ثانيا : في الفترة بين :

تاريخ الميلاد 20/6/1400 والتاريخ الحالي 19/6/1422

لايظهر لي أن الفرق بينهما هو 19 سنة و11 شهر و 29 ولو جمعنا 19 سنة مع 1400 لأصبحت 1419 ، و11 شهر و6 شهور تكون سنة وخمسة شهور فنضيف السنة على 1419 فتكون 1420 وخمسة أشهر ، و29 إذا أضيفت على 20 يطلع شهر و19 يوما فيكون التاريخ النهائي 19/6/1420 بينما التاريخ الحالي هو المذكور في الأعلى ، فهل طريقتي في الحساب صحيحة ؟ ارجو كتابة طريقتك في حساب التاريخ .

ثالثا: ماذكرته صحيح وقد عدلت في الكود

Dim التاريخ_الحالي As Date

Dim تاريخ_الميلاد As Date

Dim باقي_الأيام As Date

Dim باقي_التاريخ As Date

التاريخ_الحالي = DateSerial(firstyy, firstmm, firstdd)

تاريخ_الميلاد = DateSerial(syy, smm, sdd)

ageyy = DateDiff("yyyy", تاريخ_الميلاد, التاريخ_الحالي)

باقي_التاريخ = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

If DateDiff("m", تاريخ_الميلاد, باقي_التاريخ) >= 12 Then

ageyy = ageyy + 1

agemm = 0

Else

If DateDiff("m", تاريخ_الميلاد, باقي_التاريخ) < 0 Then

ageyy = ageyy - 1

agemm = Abs(DateDiff("m", تاريخ_الميلاد, باقي_التاريخ))

Else

agemm = DateDiff("m", تاريخ_الميلاد, باقي_التاريخ)

End If

End If

باقي_الأيام = DateAdd("yyyy", -ageyy, التاريخ_الحالي)

باقي_الأيام = DateAdd("m", -agemm, باقي_الأيام)

If Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام)) > 29 Then

agemm = agemm + 1

agedd = 0

Else

agedd = Abs(DateDiff("d", تاريخ_الميلاد, باقي_الأيام))

End If

جربته وخذ راحتك إذا كنت مشغول .

ولك تحياتي

#11

الأخ ابو حمود :

جربته مرة أخرى : والنتيجة كالتالي :

بالنسبة للأعوام القديمة لا مشكلة الآن .

بالنسبة لظهور الأشهر بالسالب لا مشكلة أيضا .

بقيت مشكلة واحدة :

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

مثال ذلك هو نفس ما أوردته سابقا ، لكن مع التصحيح حيث كتبت سابقاسهوا 19 سنة والصحيح 21 سنة .

مثال آخر أوضح : تاريخ الميلاد 29/6/1400 التاريخ الحالي 19/6/1422 ، يعطي العمر 22سنة 0 شهر 9 يوم وكأن قصده 22 سنة 0 شهر -9 يوم ، لأن الصحيح 21 سنة 11 شهر 20 يوم .

أما ظهور الشهر بالسالب في الكود السابق فلا يحصل إلا بعد ما يلي :انقر الزر وأحد الحقول فارغة حينئذ تظهر لك الرسالة error الخ ، انقر end ، اكتب في تاريخ الميلاد 1/7/1415 ، التاريخ الحالي 19/6/1422 انقر الزر ، يظهر لك الشهر سالبا . وتفادي سبب ذلك الذي هو الحقول الفارغة سهل ، لكن لماذا يسبب ذلك ظهور الشهر بالسالب ؟

أخوك : حارث

#12

'دالة بسيطة لحساب الأعمار بصورة تقريبية

'باعتماد جميع الأشهر مدتها 30 يوم

Function Age(df, mf As Byte, yf As Integer, _

dt, mt As Byte, yt As Integer) As String

Dim dd, mm As Byte

Dim yy As Integer

If dt < df Then

dt = dt + 30

mt = mt - 1

End If

If mt < mf Then

mt = mt + 12

yt = yt - 1

End If

dd = dt - df

mm = mt - mf

yy = yt - yf

Age = dd & "," & mm & "," & yy

End Function

#13

الأخ ابوهادي

الأخ ابوحمود

الأخ حارث

القلم عاجز عن ان يفي بحقكم من الشكر والتقدير

ولا اخفي عليكم انني بعض الأوقات (زي الأطرش في الزفة)

ولكن احاول اتعلم منكم ولو شيء بسيط

حقيقة انتم مكسب لهذا المنتدى لما تقمونبه من جهد

ولاانسى الأخ مسافر

دعائي لكم بالتوفيق

#14

الأخوة الأعزاء : أبو حمود - الحارث - أبو هادي

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

أخوكم / أشرف خليل

#15

الأخ أبو هادي :

طبقت طريقتك حسب ما فهمته ، ومع بعض الإضافات البسيطة كان المثال التالي :

أكسس 2000 : http://mypage.ayna.com/harith77/agehdy2000.zip

أكسس 1997 : http://mypage.ayna.com/harith77/agehdy1997.zip

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

http://mypage.ayna.com/harith77

ولك جزيل الشكر

#16

الأخوان ابوهادي سعيد أشرف

أشكركم على مشاركاتكم الطيبه ونفع الله بكم .

الأخ حارث

اريد طريقة الحساب التي تحسب بها حتى اعدل الكود عليها، فالطريقة التي أحسب بها هي ما شرحتها سابقا فهل هي صحيحة ، ثم لا أدري هل لنقص بعض الأشهر -يعني يمكن تكون 29 يوم- تأثير على النتائج .

حاولت البحث في الانترنت عن موقع يحسب العمر للتأكد من النتائج فلم أجد ، هل تعرف موقع أو برنامج ينفع في هذا المجال .

وتحول النتائج إلى السالب فقد تركت حقل الشهر فارغ في التاريخ الحالي فظهرت الرسالة فضغطت Debug ثم كررت العمل وضغطت End وأدخلت رقم ولم يظهر سالب فأعدت العمل على حقل الشهر في تاريخ الميلاد فلم يظهر سالب فأعدته على الأيام في كلا التاريخين فلم يظهر سالب ، وعموما يمكن بكل بساطة التأكد من عدم كون الحقول فارغة في بداية الأجراء .

ولك ولكافة الأخوان المشاركين تحياتي

#17

أخي أبو حمود ، الإخوة جميعا :

طريقة الحساب التي أستعملها هي الطريقة التقليدية :

1- تخصم أيام تاريخ الميلاد من أيام التاريخ الحالي ، فإن كان رقم أيام التاريخ الحالي أصغر تنقص (تستلف) شهر من الأشهر ، وتضيفه على الأيام على أنه 30 يوما .

2- تخصم أشهر تاريخ الميلاد من أشهر التاريخ الحالي (مع مراعاة ما نقص (استلف) من الأِشهر إن حصل شيء من ذلك) ، وإن كانت أشهر التاريخ الحالي أصغر (تستلف) عام من الأعوام ، تضيفه على الأشهر على أنه 12 شهرا .

3- وهكذا مع الأعوام .

الخلاصة كما نطرح عدد من عدد لكن مع مراعاة أن الشهر 30 يوما والسنة 12 شهرا ، وهي طريقة بدائية لكنها جيدة .

أما كون بعض الأشهر 29 يوما فيظهر لي أنه غير مؤثر على هذه الطريقة ، لأننا نحسب العمر بالتاريخ الهجري ، ومن طبيعة الأشهر فيه أن تكون أحيانا ناقصة ، اللهم إلا في حالة واحدة تخطئ فيها هذه الطريقة هي أن يكون الشهر السابق للوقت الحالي ناقصا ، فحينئذ يعطيك خطأ بزيادة يوم واحد في العمر فقط ، مثال ذلك : لو أن مولودا ولد يوم 28/5/1420 ، والتاريخ الحالي 2/7/1422 ، إذا كان شهر 6 من عام 1422 تاما فعمره 2 سنة 1 شهر 4 أيام ، أما إذا كان ناقصا فعمره 2 سنة 1 شهر 3 أيام ، دليل ذلك أنه يوم 28/6/1422 كان عمره 2 سنة 1 شهر 0 يوم ، يوم 29/6 زاد يوم ، يوم 1/7 زاد يومين ، يوم 2/7 زاد 3 أيام ، بينما على هذه الطريقة تعطيك النتيجة على أنه تام دائما، فهنا تخطئ هذه الطريقة ، وفي غير هذه الحالة لا يظهر لي أنها تخطئ ، هذا ما يبدو لي ، وإن كان عند أحد من الإخوة تصحيح فليفدنا ونحن له من الشاكرين .

ملاحظة : تم تصحيح المثال الأخير في نفس الليلة الساعة 9:30

#18

الأخ حارث

بعد التحية :

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

تحياتي

#19

أخواني الأعزاء

بعد التحية

أشكر وأقدر لكل من قام بالشكر والثناء لي ولأخواني المساهمين بهذا المنتدى علما أننا لم نقدم إلا القليل وكثيره واجب علينا تجاه كل المشاركين وبدون استثناء.

وتفضلوا بقبول وافر تحياتي

#20

الأخ حارث

إذا أمكن ولا عليك أمر تضع لنا المثال بعد تعديل أبو هادي لنتمكن من تحميله ولكما الشكر .

ولك تحياتي

#21

بعد التحية للإخوة ، والشكر الجزيل للأخ أبو هادي :

المثال تجدوه على الوصلة التالية :

http://mypage.ayna.com/harith77/Agehdy19.zip

وطريقة التحميل سبق ذكرها مرارا .

#22

ألإخوه ألأفاضل / حارث و أبو حمود و أبو هادي

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

ذادكم ألله علما و نفع يكم .

محمود إبراهيم

#23

ألأخوه ألأفاضل / حرث و أبو هادي و أبو حمود

ألسلام عليكم . قمت بسرعه بتجربه الداله الموجوده في agehdy1997.mdb علي التقويم الميلادي و أعطت نتائج صحيحه رغم بساطة الداله . كنت متوقع تعقيدات الدوال المبنيه مثل :

DateDiff و DateAdd و DateSerial و DatePart و لكن تبين إستخدام متغيرات عدديه بسيطه أعطي بساطه للداله . بارك الله فيمن أنشأها .

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

لكم جميعا أطيب التمنيات بالتوفيق

محمود إبراهيم

#24

الأخوان الأفاضل / من شاركو في هذا الموضوع

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

هل تذكرون هذا الموضوع ؟

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

وعندما حاولت إنزال المثال من الوصلة التالية :

http://mypage.ayna.com/harith77/Agehdy19.zip

ظهرت رسالة بعدم وجود الملف حاليا في الموقع.

أرجو التفضل ممن يوجد لديه المثال المذكور بوضع وصله جديده له لكي يستفاد منه.

والله الموفق.

ibnmusqat.gif
#25

عزيزي ابن مسقط

افتح الصفحة الاخ حارث وفقه الله

ستجد كل الملفات حاول في فترات متفاوته عسى ان تتوفق في تنزيل الملف

بالتوفيق

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

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