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

استخدام دوال المستخدم داخل DataSet

مغلق
بدأه المزيني في 12 أكتوبر 2006 · 12 رد · 1,747 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أعزائي جميعاً

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

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

أفرض أن لديك قاعدة بيانات MS ACCESS تحوي استعلام وهذا الإستعلام يستخدم دالة مستخدم منشئة باستخدام لغة VBA.

ولنفترض أنك قمت باستدعاء هذا الإستعلام من خلال Microsoft Visual Studio 2005 ستفاجأ بظهور رسالة خطأ ولن يعمل هذا الإستعلام.

فما الحل؟ لايطلع واحد ويقول أستخدم SQL Server لان صاحبنا في هذا المثال ماراح يستخدم غير ACCESS والرجل مرتاح مع الـ ACCESS وأخر حلاوه.

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

#2

واجهتني تلك المشكله ولم اجد رد او حل

#3

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

عموماً لولا رد أخي: KARIMSOFT لظننت أنني أكتب لنفسي في هذا المنتدى

إبراءً للذمة ومن باب الأمانة العلمية إن كان فيما طرحته علماً ينتفع به فقد عدت لأكمل ما بدأت

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

test.rar

تم تعديل هذه المشاركة بواسطة المزيني في 26 أكتوبر 2006 في 02:37

1
#4

أعتقد أن سبب المشكلة هو انك عندما تعمل بالأكسيس فالدوال التي تنشئها بواسطة VBA تعامل كوظائف داخلية ضمن الأكسيس لهذا تتم معاملتها بشكل صحيح ضمن عبارة select

ولكن الدوال التي تنشئها في برنامج vb .net لاتعامل كوظائف داخلية ضمن محرك قواعد البيانات ولهذا لاتستطيع استخدامها ضمن عبارة الـ select

أما عن حل هذه المشكلة بالنسبة للأكسيس فنصف العلم لاأدري

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

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

تم تعديل هذه المشاركة بواسطة samerselo في 26 أكتوبر 2006 في 03:04

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

بعد اليوم لاأحد يقول "لا أدري" فالحل موجود في المرفق أعلاه.

وبالنسبة للمشكلة فهي موجودة في الـ Microsoft Access وأختها المحروسه Microsoft Visual فكلاهما في الهوى سوا ومحدش أحسن من التاني على قولت أخونا المصريين ربنا يخليهم.

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

ملاحظات تحتاج إلى تفسير و حل:

1- لاحظت أن جميع الـViews والـ Stored Procedures تعمل بنجاح عند استدعاءها من VB.NET عدا التي تستدعي دالة معرفة من قبل المستخدم.

للتوضيح:

لو أنك قمت بإنشاء دالة في MS ACCESS باستخدام VBA وقمت باستدعاءها من خلال أحد الاستعلامات فإن هذا الإستعلام سيعمل عند تشغيله من داخل الـMS ACCESS ولن يعمل عند تشغيله من داخل الـVB.NET.

2-لاحظت أن جمل الـSQL عندما تحتوي على أي من الدوال المبنية داخل اللغة كدالة حساب جيب الزاويةSin() مثلاً تعمل بنجاح غير أن نفس الجملة تفشل بمجرد استبدال الدالة بدالة معرفة من قبل المبرمج.

للتوضيح:

لو أنك قمت بإنشاء دالة في الـ VB.NET وحاولت استدعاء هذه الدالة من خلال جملة SQL فإن الجملة لن تنفذ في حين أن ستدعاء دالة من الدوال المبنية داخل اللغة سيجعل جملة SQL تنفذ.

تم تعديل هذه المشاركة بواسطة المزيني في 26 أكتوبر 2006 في 06:21

#6

شكرا علي الرد ولكن ليس هذا الذي توقعته منك

#7

أخي أفصح...

ماالذي لم تتوقعه ومالذي توقعته؟

#8

ان تنادي الاستعلام لا عمل لوب علي الناتج هذا معرف عند الجميع

#9

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

وعموماً قد يوجد أحد الأخوة غير الجميع الذين ذكرتهعم سيستفيد من هذا الحل.

وأخيراً أشكرك على هذا الإفصاح والإبانه.

وللجميع أجمل تحية.

#10

لا تغضب كانت حددت اسم الموضوع ولهاذا توقعنا ان تكون الاجابه علي شضكل ما ولم نتوقع هذا الرد

جزاك الله كل الخير

#11

السلام عليكم

بالنسبة لاستخدا دالة منشئة في ال vba فالله أعلم

ولكن عندي سؤال بالنسبة للمثال الذي ادرجته هل تريد هذه الدالة بالذات ام وضعتها مجرد مثال؟

تستطيع عمل ما تريده بدون عمل دالة في vba

في جملة الSQL تاعتك

SELECT Tb.FullName, Tb.mark1, Tb.mark2, Tb.mark3, tagder(([mark1]+[mark2]+[mark3])/3) AS Expr1 FROM Tb;

غير

tagder(([mark1]+[mark2]+[mark3])/3) AS Expr1

الى

([mark1]+[mark2]+[mark3])/3 AS FinalMark,
 iif(FinalMark<=7,"مقبول",
	iif(FinalMark<=9,"جيد",
		iif(FinalMark<=13,"جيدجيداً",
			iif(FinalMark<=15,"ممتاز")))) AS tagder

اي الجملة ستكون كالاتي

select Tb.FullName, Tb.mark1, Tb.mark2, Tb.mark3,
 ([mark1]+[mark2]+[mark3])/3 AS FinalMark,
 iif(FinalMark<=7,"مقبول",
	iif(FinalMark<=9,"جيد",
		iif(FinalMark<=13,"جيدجيداً",
			iif(FinalMark<=15,"ممتاز")))) AS tagder
from Tb;

وتستطيع حلها بطريقة أخرى ايضا

عمل جدول مكون من العلامة الصغرى والعلامة الكبرى واسم التقدير

لتضح الصورة

create table Tagder (id autoincrement primary key not null,MStart int,MEnd int ,MTagder text(20))
insert into Tagder (mstart,mend,mtagder) values(-1,7,'مقبول')
insert into Tagder (mstart,mend,mtagder) values(7,9,'جيد')
insert into Tagder (mstart,mend,mtagder) values(9,13,'جيدجيداً')
insert into Tagder (mstart,mend,mtagder) values(13,15,'ممتاز')

ثم الاستعلام يكون كالتالي

select Tb.FullName,  Tagder.MTagder
from Tb left join Tagder on
 ((tb.mark1+tb.mark2+tb.mark3)/3>Tagder.MStart 
 and 
 (tb.mark1+tb.mark2+tb.mark3)/3<=Tagder.MEnd)

اما اذا كنت تريد دالة أخرى فممكن لها حل بطريقة أخري

بالنسبة لاستخدام الدالة اذا كان هناك طريقة لذلك فهي ستكون ابطئ من الطريقتين السابقتين

والله أعلم طبعا

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#12

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

أما عن العنوان ودلالته فأعتقد أنه واضح والله أعلم.

أما عن أخي Mo7eb_Alrasool

فأشكره على ما أجاب به.

وأقول له أنني عندما عرضت هذا المثال:

إنما لأقول للأخوة أن هذا هو الحل الذي توصلت إليه كحل لمشكلة استخدام دوال المستخدم المنشئة في VBA أو VB.NET

وقد عرضت الدالة كمثال وإلا فالدوال كثيرة.

أما عن الطرق التي ذكرتها:

فتعتبر حل رغم الملاحظات التالية:

الطريقة الأولى:

ستجعل جملة SQL معقدة شيء ما.

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

لوأضطررت لتعديل هذه الدالة فعليك بالمرور على كل جملة SQL استخدمت فيها هذه الطريقة للتعديل وعندها دور عاد!

أعتقد أن بعض الدوال ستكون معقدة بشكل يجعلك شبه عاجز عن كتابتها داخل جملة SQL.

الطريقة الثانية:

بالإضافة إلى أنها قد لا تتناسب مع جميع الحالات فأنا لا أفضل هذا الحل..

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

أكرر شكري وتقدير لكما خاصة وللجميع عامة.

#13

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

شكر خاص للاخ والحبيب والخليل المزيني علي هذا الكلام الجميل

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

وحتي نجد هذا كيف تشغيل استعلام تحديثي او خذف من الدوت نت وهذا يحل المشكله حل مؤقيت

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…