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

الفرز في الاستعلام عن طريق النموذج

بدأه Arwaa في 1 مايو 2008 · 8 رد · 3,820 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تحية مودة للجميع

أرغب في عمل فرز في استعلام عن طريق النموذج

بشرط أن تظهر نتائج الفرز في التقرير حتى أتمكن من طباعة التقرير حسب الفرز الذي نفذته في النموذج

أرجو مساعدتكم المتواضعة يحفظكم الله ويوفقكم لخير مرضاته

المثال مرفق مع التوضيح

Sorting2008.rar

#2

الأخت الفاضلة / Arwaa المحترمة

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

اطلعت على الملف المرفق وقمت بالآتي:-

1- تم عمل مجموعة اختيار اسمه (Opt) تحتوي ع تصاعدي وتنازلي لها قيمة عبارة عن (1-2)

2- تم عمل قائمة منسدلة باسم (schos) تحتوي على حقول الاستعلام عند فتحها (كيف؟!)

توضيح نقطه 2

كيف تم عمل قائمة تعرض الحقول وليس قيم الحقول؟

الجواب: خصائص عنصر التحكم –نوع مصدر الصف – يتم تحديه قائمة الحقول-ومصدر الصف يتم تعيينه الى اسم الاستعلام أو الجدول – فتظهر أسماء الحقول وليس بياناتها .

post-156430-1209740227_thumb.jpg

3- تم إضافة كود لحدث عنصر التحكم (schos) -بعد التحديث- أي بعد اختيار أي حقل حتى يتم الفرز بناء ع القيمة الجديدة المعروضة في القائمة .

4- تم إضافة كود للتقرير عند فتحه يقوم بعرض نفس النتيجة الموجودة على النموذج ( كيف ؟!)

عند فتح التقرير بواسطة الدالة Docmd.openRepor يجب تزويد الدالة باسم التقرير – طريقة العرض-اسم عامل التصفية- شرط .. الخ

DoCmd.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)

ما يهمنا هنا هو عامل التصفية (FilterName) كيف نقوم باستخدامه؟!

قبل كيف نستخدمه لماذا هو مهم في حالتنا هذه ( لأنه يقوم بفتح التقرير استنادا إلى عامل التصفية (SQL)أو- اسم استعلام محفوظ - حيث يتم تحديد اسم الحقل ونوع الفرز تصاعدي أو تنازلي . إن شاء الله يكون واضح!!

طيب نأتي إلى كيف نقوم باستخدامه هناك طريقتين حسب معلوماتي نقوم بالآتي:-

الطريقة 1 وهي استخدام كود (SQL)

مثال 1 موجود في المرفق

نضع اسم وليكن strFilter ونسند له عبارة SQL التي تقوم بالتصفية حسب الطلب كالآتي:-

strFilter = ("SELECT * FROM Schoolers ORDER BY Schoolers.sn ASC;")

هنا الفرز بواسطة حقل sn بطريقة تصاعدية ASC (تصاعدي)

مثال 2

strFilter2 = ("SELECT * FROM Schoolers ORDER BY Schoolers.sn DESC;")

هنا الفرز بواسطة الحقل sn تنازلي (DESC) مع ملاحظة انه قمنا باعطاء اسم مختلف للفلتر strFilter2

بعد ذلك يتم تعويض اسم الفلتر في الدالة DoCmd.OpenReport لتصبح كالآتي:-

DoCmd.OpenReport stDocName, acViewPreview, strFilter

حيث stDocName هو اسم التقرير حسب التعريف المسبق

و strFilter اسم الفلتر الذي سيتم الفرز بناء عليه

الطريقة الثانية باستخدام اسم استعلام محفوظ ونضع اسمه مكان الفلتر

لو فرضنا اننا قمنا بعمل استعلام تحديد وتم فرز البيانات حسب sn تنازلي وحفضناه باسم Qry1

سنقوم بالتعويض بالدالة كالآتي:-

DoCmd.OpenReport stDocName, acViewPreview, Qry1

وسيتم فتح التقرير وسيعطي نفس النتيجة في مثال 1

أرجو ان يكون هذا المطلوب

أخوك مشكاة

Sorting2008_UP.rar

#3

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

ممتاز أخي الكريم مشــكاة . . عمل مبهر

بالفعل هذا هو المطلوب بالضبط .. ولكن ينقصه شيء بسيط فقط

وهو هل يمكننا تحديد أكثر من حقل للفرز في طريقتك هذه ؟

وللمعلومية والأمانة أخي مشكاة فقد تلقيت مساعدة سابقة ولكنني لم أستطع تطبيقها بشكل كامل

وللفائدة للجميع أرجو أن تطلع عليها لمزيد من المعرفة والإبداع المشترك

مرفق مثال الطريقة السابقة

DevelopedsortingTEST3.rar

تم تعديل هذه المشاركة بواسطة Arwaa في 2 مايو 2008 في 22:33

#4

الأخت الفاضلة / Arwaa

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

لقد اطلعت على برنامجك المرفق وهو يستخدم قائمة الاختيار المتعدد لإدخال قائمة القيم المختارة

الى الدالة ويتم الفرز بناء ع ذلك وتظهر النتائج على النموذج فقط

طيب كيف نجعل التقرير يقوم بالاستجابة الى التغيرات التي تحدث على النموذج عندما يتم الفرز باختيار الحقول حسب رغبتك ؟

سنقوم باستخدام نفس الكود الذي يقوم بعمل الفرز ونضيف له لمسه بسيطه ويصبح جاهز للعمل كالآتي:-

1- نقوم بفتح النموذج بوضع التصميم

2- نذهب الى ايقونة التي تفتح التقرير ونختار خصائص -حدث عند النقر

3-نضيف هذا الكود

Dim strFil As String

Dim stDocName As String

strFil = "Select * From QSchoolers ORDER By " & txt & " ;"

stDocName = "FormQSchoolers"

DoCmd.OpenReport stDocName, acPreview, strFil

</FONT>

نلاحظ ان الكود الذي ضفناه هو باللون الأحمر فقط فالسطر الأول قمنا بتعريف strFil كنص

السطر الثاني اسندنا قيمة strFil وهو(الفلتر) الى الكود الأصلي الذي يقوم بعمل الفرز على النموذج

ثم قمنا بإضافته في سطر فتح التقرير كفلتر وبذلك يستجيب التقرير عند فتحه حسب الاختيارات التي اخترناها من النموذج.

أرجو ان يكون ذلك مفيدا لطلبك

أخوك مشكاة

sortingTT3_UP.rar

#5

وعليكم السلام أخي الكريم

أشكرك على هذه المساعدة الكبيرة والعظيمة

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

فلدي مشكلة في المثال منذ فترة ولم أستطع حلها ولا معرفة السبب

عند تطبيقي للمثال لم تعمل معي ازرار تحريك حقول الفرز للأعلى أو الأسفل

وكذلك أزرار اختيار نوع الفرز تصاعدي أم تنازلي

أرجو أن تنظر في المشكلة وترشدني إلى الخطأ والسبب لأتفاداه

مرفق

sortingTT4.rar

تم تعديل هذه المشاركة بواسطة Arwaa في 4 مايو 2008 في 23:41

#6

الأخت الفاضلة / Arwaa

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

أولا : يمكنك السؤال حتى تفهمي الجواب وتستفيدين منه بالتطبيق على أمثله أخرى وهذا من حقك فلا تحتاري

وأسألي حتى لو لم أجب هناك الاعضاء و المشرفين حفظهم الله بإمكانهم الاجابة أيضا.

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

المشاكل المعروضة على النموذج هي

1--زر التبديل للحقول الى الاعلى والاسفل (غير فعال) -عدم تمكين

2-زر Z-A لايعمل ويعطي رسالة خطأ

3-زر الفرز لا يعمل حيث تظهر رسالة عبارة عن لم يتم اختيار أي حقل علىالرغم اننا قمنا باختيار حقل

المهمة هي معرفة الاسباب وراء المشاكل في بند 1 و2 و 3 صح؟

بالنسبة للمشكلة الأولى فهي مرتبطة بالمشكلة الثالثة كيف ؟

حتى يتم تفعيل الزر .. يجب اختيار حقل.. وعند الضغط على الحقل.. هناك اجراء يتم تفعيله اسمه CountSelected

غير موجوده!! بمعنى آخر إن هناك وظيفة تم عملها برمجيا تم تسميتها CountSelected وهي تقوم بوظيفة محددة يتم استدعائها باسمها في اجراء

وهذا هو الكود تبعها أحضرناه من النموذج الأصلي الذي يعمل:

Private Function CountSelected() As Byte

c = 0

For Each VarItm In l.ItemsSelected

c = c + 1

Next VarItm

CountSelected = c

End Function

فهذه الوظيفة تقوم بحصر عدد العناصر في l.ItemsSelected

اسم عنصر القائمة في مثالنا هذا وهو عبارة (l) عن حرف L in small latter

ونلاحظ ان في قائمة (l) في حدث -عند النقر- ان هناك إستدعاء لهذه الدالة CountSelected فإذا تم اختيار اي حقل تقوم الدالة بتفعيل الأزرار لتمكين المستخدم من التبديل بين الحقول واختيار حقل.

إذا قمنا بإضافة هذا الكود بإمكاننا حل المشكلة 1 و3

================

بالنسبة للمشكلة في البند 2 وهي زر Z-A لايعمل ويعطي رسالة خطأ

عند ملاحظة إجراء حدث - عند النقر- نجد هذا الكود

Private Sub ztoa_Click()

For Each VarItm In l.ItemsSelected

theList(VarItm, 1) = "Z to A"

Next VarItm

saveSelected

RefreshTheList

loadSelected

End Sub

الوظائف باللون الأحمر هي نفس فكرة استدعاء وظيفة جاهزة

ونلاحظ ان في النموذج المرفق لك الذي لايعمل تم اغفال ادراج هذه الوظائف .

طيب ما هو عمل هذه الوظائف؟

post-156430-1210011945_thumb.jpg

باختصار شديد تقوم هذه الوظائف بتغيير القيمة في العمود الثاني من القائمة (l) من A-Z الى Z-A

فقط

لماذا هذا التغيير؟

تم وضع شرط وهو هذا الكود

If theList(i, 1) = "Z to A" Then txt = txt + " DESC "

ترجمتها هي اذا كانت القيمة في القائمة للحقل تساوي Z to A اضف الى جملة SQL عبارة DESC وهي عبارة خاصة بالفرز التنازلي

إذا سنقوم بإضافة هذه الوظائف الثلاث للنموذج الذي لايعمل

الوظيفة الأولى

Private Sub saveSelected()

For i = 0 To theFields - 1

If l.Selected(i) Then theList(i, 2) = "selected" Else theList(i, 2) = "notselected"

Next i

End Sub

الوظيفة الثانية

Private Sub RefreshTheList()

For i = 0 To theFields - 1

If l.Selected(i) Then theList(i, 2) = "selected" Else theList(i, 2) = "notselected"

Next i

For i = 0 To theFields - 1

l.RemoveItem (0)

Next i

For i = 0 To theFields - 1

ItemStr = theList(i, 0) & ";" & theList(i, 1)

l.AddItem Item:=ItemStr, Index:=i

Next i

End Sub

الوظيفة الثالثة

Private Sub loadSelected()

For i = 0 To theFields - 1

If theList(i, 2) = "selected" Then l.Selected(i) = True

Next i

End Sub

بعد اضافة هذه الوظائف سيعمل النموذج المعطل مع وجود مشكلة في زر تبديل أولوية القيم في القائمة وهي مشكلة استدعاء وظيفة أيضا غير موجودة وهي swap

post-156430-1210012290_thumb.jpg

سنقوم ايضا باحضارها وهي

Private Sub swap(i, j As Byte)

c1 = theList(j, 0): c2 = theList(j, 1)

theList(j, 0) = theList(i, 0): theList(j, 1) = theList(i, 1)

theList(i, 0) = c1: theList(i, 1) = c2

RefreshTheList

End Sub

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

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

قمنا بعمل زر فتح تقرير للمعاينة بشكل آلي

Dim stDocName As String

stDocName = "FormQSchoolers22"

DoCmd.OpenReport stDocName, acPreview, Me.RecordSource

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

طيب هناك سؤال ؟

ما هو الفرق بين الطريقة أعلاه والطريقة في المشاركة السابقة وهي

Dim strFil As String

strFil = "Select * From QSchoolers ORDER By " & txt & " ;"

stDocName = "FormQSchoolers"

DoCmd.OpenReport stDocName, acPreview, strFil</SPAN></SPAN>

لا حظي الحقول الحمراء لقد قمنا بانشاء اسم لفلتر وهو strFil وقد يكون اي اسم

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

الجواب العنصر المهم هو وجود عنصر تحكم على النموذج باسم txt واسند اليه قيمة RecordSource

باختصار العبارة "& txt &";" ترجمتها هي احضار القيمة الموجودة على النموذج في عنصر التحكم txt وضعها هنا للفرز بناء عليها

===============

ملاحظة: فائدة وأهمية الوظيفة function هي عدم الحاجة الى تكرار كتابة أسطر برمجية في كل مرة لنفس

الوظيفة بالاضافة الى امكانية استدعائها باسمها فقط-أرجو ان تكون واضحة-

===============

أرجو ان يكون الشرح مفيدا لطلبك

أخوك مشكاة

sortingTT4_UP.rar

#7

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

انه من دواعي سروري وشرف لي أن أجد مساعدات قيمة من أمثالك الراقين أخي الكريم مــشكاة

:D

مساعداتك رائعة فهي تركز على التعليم والشرح بالدرجة الأولى فجزاك الله كل خير

والحمد لله والشكر استطعت حل المشكلة وتخطي الصعاب

وسبب حدوث المشكةل عندي سابقاً هي لسببين :

1/ أنني لم أجد هذه الأكواد في الأحداث

2/ أنني لسيت لي معرفة ببناء الأكواد وهو ما أدى لزيادة المشكلة

على كل حال لك أخي الكريم مشكاة ولأخي الكريم (محب العلم ) الذي لا أنسى فضله أيضاً عظيم الشكر والامتنان

واسمح لي بطلب أخير

وهو في زر فتح التقرير ظهرت مشكلة

حيث عند فتح النموذج وقبل إجراء أي فرز عند الضغط على زر فتح التقرير تظهر نافذة خطأ

ولا تظهر عند إجراء الفرز

الشرح بشكل واضح في المرفق

:rolleyes:

sortingTT5.rar

تم تعديل هذه المشاركة بواسطة Arwaa في 6 مايو 2008 في 21:22

#8

الأخت الفاضلة / أروى ..المحترمه،،

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

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

بالنسبة للمشكلة الأخيرة وهي :

===

حيث عند فتح النموذج وقبل إجراء أي فرز عند الضغط على زر فتح التقرير تظهر نافذة خطأ

ولا تظهر عند إجراء الفرز.

=====

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

أولا: سبب المشكلة

ثانيا : حل المشكلة

سنبدأ بشرح أولا:-

سبب المشكلة هي ان الكود الذي يقوم بفتح التقرير قمنا بعمله بشكل آلي وأضفنا له الفلتر فقط ولم نضيف اليه أي شرط للتحقق قبل تنفيذ أمر فتح التقرير لذلك تظهر -نافذة الخطأ- بينما عند اخيارك حقل من القائمة لاتظهر!؟

طيب كيف يظهر الخطأ ولماذا؟

اذا لا حظت اننا قمنا باضافة اسم الفلتر Me.RecordSource وهذا الكود إختصار لعملية تحدث خلف الكواليس وهي تبحث عن الحقول التي سيتم الفرز بناء عليها وعندما لا تجد شيئ -لفرزه- تظهر نافذة الخطأ.

ثانيا :- حل المشكلة

لنحل المشكلة سنقوم باضافة كود شرطي بسيط الى كود فتح التقرير .. ماشي يا أروى !!

ملاحظة: الكود موجود أصلا وسنقوم باستعارته.

الكود :

=====================

If CountSelected > 0 Then

Dim stDocName As String

stDocName = "FormQSchoolers22"

DoCmd.OpenReport stDocName, acPreview, Me.RecordSource

Else

MsgBox "يجب تحديد حقول الفرز أولا", vbOKOnly + vbExclamation + vbMsgBoxRight, "تـنـبـيـه"

End If

==================

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

ترجمة الكود :

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

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

مرفق لك التعديل

مع تمنياتي لك بأن تصبحي مبرمجة كبيرة -أد الدنيا- ونتعلم منك.

أخوك مشكاة

sortingTT5_UP.rar

#9

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

بالفعل أخي الكريم مشــكاة توقعت أن يكون اختباراً لبذل امكانيتي لحل هذه المشكلة

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

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

وأدعو الله أن يحفظك ويحقق طموحاتك وأمنياتك

:rolleyes:

تم تعديل هذه المشاركة بواسطة Arwaa في 7 مايو 2008 في 19:53

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