اذهب الي المحتوي
أوفيسنا

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

قام بنشر

السلام عليكم

عندى قاعدة بيانات تحتوى على الكثير من الأرقام القومية فى الحقل National_Nr

والمطلوب استخراج تاريخ الميلاد من كل منهم ووضعه فى حقل  Birth

من خلال استعلام تحديث وأن تكون باستخدام الوحدة النمطية بنفس القاعدة CalculateDate

المثال المطلوب التعديل عليه بالمرفقات

شكراً جزيلاً  مقدماً

db1.mdb

قام بنشر
29 دقائق مضت, أحمد العيسى said:

السلام عليكم

 

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

دون الحاجة لإستخدام وحدة نمطية ، كانت لي تجربة سابقة من خلال استعلام تحديث مباشر ، تم تعديله ليتعامل مع مسميات الحقول والجدول لديك ، جربه :-

UPDATE tbl_student1
SET Birth = DateSerial(
    IIf(Left([National_Nr],1)="2",1900,2000) + Val(Mid([National_Nr],2,2)),
    Val(Mid([National_Nr],4,2)),
    Val(Mid([National_Nr],6,2))
)
WHERE Len([National_Nr])=14 AND IsDate(DateSerial(
    IIf(Left([National_Nr],1)="2",1900,2000) + Val(Mid([National_Nr],2,2)),
    Val(Mid([National_Nr],4,2)),
    Val(Mid([National_Nr],6,2))
));

 

  • Like 1
قام بنشر

شكراً أخى Foksh على سرعة الرد

تم المطلوب ،وشكراً لك

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

Date_Sex_Province([National_Nr], 1)

كيف سيكون التصميم ؟

 

  • Thanks 1
  • تمت الإجابة
قام بنشر
10 دقائق مضت, أحمد العيسى said:

Date_Sex_Province([National_Nr], 1)

كيف سيكون التصميم ؟

 

سؤال جميل ..

بعد الإطلاع على الوحدة النمطية ، جرب هذا الاستعلام باستدعاء الدالة :-

UPDATE tbl_student1
SET Birth = Date_Sex_Province([National_Nr], 1)
WHERE Len([National_Nr]) = 14 AND IsDate(Date_Sex_Province([National_Nr], 1));

 

  • Like 1
قام بنشر

ملاحظة بسيطة للأخ @أحمد العيسى 

في طريقة الأخ @Foksh إعتبر أن أي رقم قومي يبدأ بالرقم 2 فسيكون صاحبه من مواليد ماقبل عام 2000 مالم فسيكون من بعد عام 2000 وهذا لم يؤخذ بالإعتبار في الدالة Date_Sex_Province

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

تحياتي

  • Like 1
قام بنشر
49 دقائق مضت, منتصر الانسي said:

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

 

فعلاً ، ملاحظتك صحيحة ومهمة جداً ، وأنت محق في التنبيه عليها .. وعليه فإنه يمكن تعديل الدالة الأصلية لتصبح :-

Function Date_Sex_Province(MyNumber As Variant, MyTest As Byte)
Dim MyProvinces As Variant
Dim r As Integer
Dim yy As String
Dim ty As String * 1
Dim D As String * 2, m As String * 2, y As String * 2 _
, x As String * 2, xx As String * 2
'==============================================
'       يمكنك إضافة المحافظات الاخرى الغير موجودة
'          او تعديل الموجود في حالات الخطأ
MyProvinces = Array("01/القاهرة", "02/الإسكندرية", "03/بورسعيد", "04/السويس", "11/دمياط", "12/الدقهلية", "13/الشرقية" _
, "14/القليوبية", "15/كفر الشيخ", "16/الغربية", "17/المنوفية", "18/البحيرة", "31/البحر الأحمر", "32/الوادى الجديد" _
, "19/الإسماعيلية", "21/الجيزة", "22/بني سويف", "23/الفيوم", "24/المنيا", "25/أسيوط", "34/شمال سيناء", "35/جنوب سيناء" _
, "26/سوهاج", "27/قنا", "28/أسوان", "29/الأقصر", "33/مطروح", "88/خارج مصر")
'==============================================
Date_Sex_Province = ""
On Error GoTo 1
If Len(Trim(MyNumber)) = 0 Then
    GoTo 1
End If

If Not IsNumeric(MyNumber) Or Len(MyNumber) <> 14 Then
    Date_Sex_Province = "Error_MyNumber"
    GoTo 1
End If

If MyTest = 1 Then
    D = Mid(MyNumber, 6, 2)
    m = Mid(MyNumber, 4, 2)
    y = Mid(MyNumber, 2, 2)
    ty = Left(MyNumber, 1)
    
    Select Case ty
        Case "2": yy = "19" & y
        Case "3": yy = "20" & y
        Case Else: yy = ""
    End Select
    If yy <> "" Then Date_Sex_Province = DateSerial(yy, m, D)
    
ElseIf MyTest = 2 Then
    If Left(Right(MyNumber, 2), 1) Mod 2 = 1 Then _
    yy = "ذكر" Else yy = "انثى"
    Date_Sex_Province = yy
    
ElseIf MyTest = 3 Then
    x = Mid(MyNumber, 8, 2)
    For r = LBound(MyProvinces) To UBound(MyProvinces)
        xx = MyProvinces(r)
        If x = xx Then
            Date_Sex_Province = Right(MyProvinces(r), Len(MyProvinces(r)) - 3)
            Exit For
        End If
    Next
End If
1:
End Function

 

أي أن ما تم تعديله هو الجزء :-

Select Case ty
    Case "2": yy = y
    Case "3": yy = "20" & y

ليصبح :-

Select Case ty
    Case "2": yy = "19" & y
    Case "3": yy = "20" & y

 

جزاك الله خيراً أخي @منتصر الانسي :fff: ، عادة لا أقوم بالتعديل على أي جزء لم يتطرق له صاحب الطلب ( معتقداً انه يلبي حاجته دون التوسع في الإحتمالات 😅 )

 

  • Like 1

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

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

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

Important Information