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

اين الخطأ في هذه الدالة

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

الأخوة الكرام

ارفقت ملف قاعدة بيانات

وفيها function

ارجو ان تسمحوا لي ان اشرح ماذا اريد من هذه ال function

في قلعدة البيانات هناك جدولان

t1 وفيه حقل callednum وقصدت به هنا الارقام الهاتفية الدولية ( كتبت ارقام عشوائية )

الجدول الثاني

t2

وفيه حقل code وقصدت به الرمز الدولي او النداء

الان في الوظيفة وضعت احتمال واحد هو ان يكون الرمز code = 3 ( مع العلم وكما تعلمون ان الرموز الدولية قد تصل الى ستة ارقام )

يعني اريد من ال function ان تبحث عن قيمة code في الجدول t2 حيث طولها 3

فاذا وجدتها تقوم بمقارنة مع الحقل callednum في الجدول t1 بحيث تاخذ الاحرف الثلاثة اليسارية من الحقل callednum

فاذا تساوت القيمتان

تصبح قيمة ال function

تساوي الاحرف الثلاثة اليسارية من اقيمة الحقل callednum

واذا لم تتساوى القيمتان

تصبح ال function= null

----

ارجو من حضراتكم ان تصححوا لي اين الخطأ

حيث وضعت هذه ال function في استعلام ليقوم بفرز النداءات من الارقام الدولية حسب الرمز

طبعا وغايتي من ال funtion في المرحلة النهائية انه وبحسب الرمز الدولي يكتب رقما يدل على مجموعة يعني

مثلا اذا كان الرمز 001 فهو في المجموعة 1 ( امريكا وكندا و... الخ )

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

ولكم جزيل الشكر والامتنان في كل الاحوال

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

test.rar

تم تعديل هذه المشاركة بواسطة حسن عبيد في 1 يونيو 2007 في 12:11

#2

أخي أنظر الاستعلام في المثال المرفق أرجو أن يكون هذا ما تريده

test.rar

#3

شكرا جزيلا لك أخي الكريم مصلح - ولكن للاسف ليس هذا هو المطلوب

على كل الاحوال جزاك الله كل خير لاهتمامك وتفاعلك .

#4
مصلح الحريصي كتب:
أخي أنظر الاستعلام في المثال المرفق أرجو أن يكون هذا ما تريده

test.rar

اخي الكريم انظر الملف المرفق test2

انظر في الدالة الموجودة في الاستعلام

عندما وضعت في شرط الدالة ان قيمة code = 001 نلاحظ ان الدالة ارجعت القيمة المطلوبة

ولكن عندما وضعت فس شرط الدالة ان

Len("

")=3

في الدالة ترجع قيمة خالية

وقد قرأت ان دالة

Len

قد لاترجع القيمة المطلوبة

هل برايكم هناك طريقة للحصول على قيمة الدالة

len

في شرط الدالة

lookup

كما ذكرت اعلاه

نحياتي لكم

test2.rar

#5

شكرا جزيلا لمن تفاعل معنا وطبعا كانت الغاية الرئيسية تبادل الافكار لزيادة الخبرة

والحمد لله توصلت الى حل رائع ومذهل بعد الدراسة والتمحيص مع انني كنت ارغب في تبادل الافكار للوصول الى الحل

وشكرا لكم

#6

1- الجدول a وفيه الارقام المطلوب معرفة نداءها الدولي

2- الجدول codetable ويحتوي على الرموز الدولية للارقام الهاتفية الدولية

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

طيب عندما كنت احاول ان اجد طريقة لمعرفة الرمز باستخدام الدالة len او left لمقارنة الارقام او لمعرفة النداء الدولي للرقم احترت على اي اساس الدالة left مثلا ستعرف انه علبها قراءة عدد الاحرف الاولى اليسارية للرقم مثلا 00209874158 والذي هو هنا لرقم في مصر ؟؟؟؟

اذا ما الحل ؟

وما ذنبها الدالة left في الموضوع ؟ اذا قلت لها اقرئي الارقام الثلاثة الاولى او الاربعة او كذا من اليسار فانها تنفذ !

لابد من حل!

ماذا يعني ثلاثة او اربعة او خمس ارقام من اليسار ؟!

ومن اين أبدأ؟

نعود الى الجدول الرموز الدولية وهو codetable وندقق في رموز كل دولة في العالم !

وجدت ان الرموز يمكن تصنيفها الى اربع فئات الفئة الاولى طول الرمز ثلاثة احرف، الفئة الثانية اربعة احرف، الفئة الثالثة خمسة احرف، الفئة الرابعة ستة احرف - يعني اطول رمز دولي طوله ستة أحرف!

اذن منطقيا اصبح الحل متوفر وذلك بانشاء اربعة استعلامات وكل استعلام مهمته حصر الرموز الدولية والتي طولها 3 و 4 و5 و6

فتم انشاء الاستعلام testsql3 لفلترة الرموز الدولية من الجدول codetable والتي طولها ثلاثة احرف

والكود هو :

SELECT code, country, category
FROM codetable WHERE (len(code)=3);

انشاء الاستعلام testsql4 لفلترة الرموز الدولية من الجدول codetable والتي طولها اربعة احرف

والكود هو :

SELECT code, country, category
FROM codetable WHERE (len(code)=4);

انشاء الاستعلام testsql5 لفلترة الرموز الدولية من الجدول codetable والتي طولها خمسة احرف

والكود هو :

SELECT code, country, category
FROM codetable WHERE (len(code)=5);

نشاء الاستعلام testsql6 لفلترة الرموز الدولية من الجدول codetable والتي طولها ستة احرف

والكود هو :

SELECT code, country, category
FROM codetable WHERE (len(code)=6);

طيب وبعدين؟

نقوم بانشاء دالة جديدة ونسميها مثلا funfun

ونعرف لها variable وهو x

طيب ومن اين تجلب الدالة قيمة x

ان قيمة x تجلبها من الحقل المسمى callednum الموجود في الجدول a وهو الرقم المطلوب استنتاج رمزه الدولي!

ثم في داخل الدالة نعرف متغيرات اخرى وهي

a,b,c,d,e,f,g,h,i

كالتالي

حيث الغاية من المتغير i هو الرقمين الاولين من يسار الرقم callednum حتى نعرف اذا كان يساوي صفرين اذا فهو نداء دولي!

اما المتغيرات

e,f,g,h فهي للارقام الثلاثة والاربع والخمس والستة ارقام الاولى من يسار الرقم callednum

والتي سنوظفها لاحقا باستخدام الدالة dlookup اربع مرات تعطي نتيجتها الى المتغيرات a,b,c,d حيث تقوم بالبحث في الاستعلامات المذكورة اعلاه لتقارن قيم الرموز

e,f,g,h بالرمز

 في الاستعلامات السابقة
[code]
Function funfun(x As String)
Dim a, b, c, d, e, f, g, h, i
	i = Left(x, 2)
	e = Left(x, 3)
	f = Left(x, 4)
	g = Left(x, 5)
	h = Left(x, 6)
	a = DLookup("[code]", "testsql3", "[code]='" & e & "'")
	b = DLookup("[code]", "testsql4", "[code]='" & f & "'")
	c = DLookup("[code]", "testsql5", "[code]='" & g & "'")
	d = DLookup("[code]", "testsql6", "[code]='" & h & "'")
'لاحظوا  انه في العبارات الشرطية التالية اخذنا بعين الاعتبار ان
'يبدا باختبار القيمة d  اولا ( وهذا مهم ! لماذا ؟!سانتظر منكم الجواب رغبة مني بالتفاعل مع الموضوع)
If i = "00" Then
	If Not (IsNull(d)) Then
	funfun = d
	ElseIf Not (IsNull(c)) Then
	funfun = c
	ElseIf Not (IsNull(b)) Then
	funfun = b
	ElseIf Not (IsNull(a)) Then
	funfun = a
	Else
	funfun = "??????"
	End If
Else
funfun = "local"
End If

End Function

حسنا بعد ان تنتهي الدالة funfun من عملها مشكورة نجد انها قد اعطتنا الرمز الدولي بدقة لكل رقم callednum موجود في الجدول a

واخيرا

لمعرفة الدولة صاحبة الرمز

نقوم بانشاء دالة جديدة نسميها arabteam

وهي كالتالي

حيث قيمة المتغير a تأتي من من القيمة التي ترجعها الدالة السابقة funfun !

Function arabteam(a As Variant)
Dim b
b = DLookup("[country]", "codetable", "[code]='" & a & "'")
If Not (IsNull(b)) Then
arabteam = b
Else
arabteam = "local"
End If

End Function

اخيرا نقوم بانشاء استعلام نسميه مثلا testingq ياخذ حقله الاول من الجدول a وهو الحقل callednum والحقل الثاني من الدالة funfun

والخقل الثالث من الدالة arabteam

والنتيجة احكموا بانفسكم !

ولكن بقي شيء واحد ( هناك ثغرة صغيرة هل تعرفون اين هي ) وهل هي خطأ برمجي أم ماذا

في الحقيقة هناك احتمال ارجو ان تعرفوه ( ومن خلاله وبمساعدتكم نستطيع حل الثغرة ! )

- مرفق مثال عن قاعدة البيانات

arabteam.rar

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

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