أحمد العيسى قام بنشر بالامس في 11:53 قام بنشر بالامس في 11:53 السلام عليكم عندى قاعدة بيانات تحتوى على الكثير من الأرقام القومية فى الحقل National_Nr والمطلوب استخراج تاريخ الميلاد من كل منهم ووضعه فى حقل Birth من خلال استعلام تحديث وأن تكون باستخدام الوحدة النمطية بنفس القاعدة CalculateDate المثال المطلوب التعديل عليه بالمرفقات شكراً جزيلاً مقدماً db1.mdb
Foksh قام بنشر بالامس في 12:23 قام بنشر بالامس في 12:23 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)) )); 1
أحمد العيسى قام بنشر بالامس في 12:47 الكاتب قام بنشر بالامس في 12:47 شكراً أخى Foksh على سرعة الرد تم المطلوب ،وشكراً لك لكن للمعرفة فقط ، لو تم استخدام هذه الدالة من الوحدة النمطية المرفقة Date_Sex_Province([National_Nr], 1) كيف سيكون التصميم ؟ 1
تمت الإجابة Foksh قام بنشر بالامس في 12:58 تمت الإجابة قام بنشر بالامس في 12:58 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)); 1
منتصر الانسي قام بنشر بالامس في 15:14 قام بنشر بالامس في 15:14 ملاحظة بسيطة للأخ @أحمد العيسى في طريقة الأخ @Foksh إعتبر أن أي رقم قومي يبدأ بالرقم 2 فسيكون صاحبه من مواليد ماقبل عام 2000 مالم فسيكون من بعد عام 2000 وهذا لم يؤخذ بالإعتبار في الدالة Date_Sex_Province صراحة لا أعلم إذا ما كانت هذه الملاحظة ذات أهمية أم لا ولكن ذكرتها كتنبيه عن الاختلاف بين الحلين فإذا كان الإختلاف مهم فسيكون تأثيره كبير تحياتي 2
Foksh قام بنشر بالامس في 15:37 قام بنشر بالامس في 15:37 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 جزاك الله خيراً أخي @منتصر الانسي ، عادة لا أقوم بالتعديل على أي جزء لم يتطرق له صاحب الطلب ( معتقداً انه يلبي حاجته دون التوسع في الإحتمالات 😅 ) 1
أحمد العيسى قام بنشر منذ 12 ساعات الكاتب قام بنشر منذ 12 ساعات شكراً جزيلاً لهذه الملاحظة القيمة الحقيقة أن الوحدة النمطية قبل التعديل كنت قد أخذتها من هنا _ منتدى أوفيسنا _ واستخدمتها كثيراً فى تطبيقاتى ولم ألاحظ أى خطأ فى استخدامها أنظر الصورتين التاليتين 1
أحمد العيسى قام بنشر منذ 8 ساعات الكاتب قام بنشر منذ 8 ساعات (معدل) السر يكمن فى سطر الكود أدناه شكراً جزيلاً للسادة الزملاء على تلك المناقشة y = Mid(MyNumber, 2, 2) تم تعديل منذ 8 ساعات بواسطه أحمد العيسى
Foksh قام بنشر منذ 8 ساعات قام بنشر منذ 8 ساعات 30 دقائق مضت, أحمد العيسى said: y = Mid(MyNumber, 2, 2) هذا السطر وظيفته فقط هي استخراج آخر رقمين من سنة الميلاد من الرقم القومي ، وبالتالي لن تكون النتيجة مثلا 1985 أو 2010 على سبيل المثال بل ستكون 85 أو 10 ( كما في المثالين ) . ولذا فأن الجزء المصحح أعلاه سابقاً ، وظيفته إعادة دمج رقم القرن مع رقم السنة المستخرج ..
AbuuAhmed قام بنشر منذ 2 ساعات قام بنشر منذ 2 ساعات أول خانة هي رمز القرن ويمكن علاجه بطريقة أفضل حسب وجهة نظري كالتالي: cy = (Left(MyNumber, 1) + 17) * 100 لتصبح النتائج كالتالي: 1700 0 1800 1 1900 2 2000 3 2100 4
الردود الموصى بها
انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد
يجب ان تكون عضوا لدينا لتتمكن من التعليق
انشئ حساب جديد
سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .
سجل حساب جديدتسجيل دخول
هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.
سجل دخولك الان