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

ماعمل دالة Filter

مغلق
بدأه ابوحمود في 27 ديسمبر 2001 · 12 رد · 2,096 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما عمل دالة Filter ؟

ارجو الإجابة بالتفصيل .

ولمن يعرف هل هناك دالة تشابهها في الأكسس ؟

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

#2

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

انتظر الجواب قريبا ان شاء اللــــــــــــــــــــــه

.

.

.

.

.

.

اخوك (((((( الدولار ))))))

#3

[shdw]بسم اللـــــــــــ الرحمن الرحيم ـــــــــــــه[/shdw]

[gl]الخاصية Filter[/gl]

تعيد أو تضبط القيمة التي تحدد السجلات الموجودة في الغرض Recordset فتح تسلسليا (خاصة بمجال العمل Microsoft Jet فقط ).

التطبيق على الأغراض :

Dynaset-Type Recordset , Recordset , Snapshot-Type Recordset , Forward-Only-Type Recordset

الوضعيات والقيم العائدة :

ان الوضع أو القيم العائدة هي معطيات نوع String والتي تحتوي على العبارة WHERE من عبارة SQL بدون الكلمة المحجوزة WHERE .

ملاحظــــــــــــات :

استخدم الخاصية Filter لتبيق المرشح على الغرض Recorset من النوع Dynaset أو النوع Snapshot أو Forward-Only-Type Recordset .

تستطيع استخدام الخاصية Filter لتقييد السجلات العائدة من غرض موجود عند فتح غرض Recordset جديد معتمدا على غرض Recordset موجود . في كثير من الحالات , إن اسرع طريقة لفتح غرض Recordset جديد هي بإستخدام عبارة SQL محتوية على الجملة WHERE .

استخدم صيغة التاريخ الأمريكي وهي (شهر - يوم - سنة) عندما تحتوي الحقول المرشحة على التواريخ , وذلك حتى لو تكن مستخدما النسخة الأمريكية من محرك قاعدة معطيات Microsoft Jet (وذلك في الحالة التي يجب فيها أن تجمع أي تواريخ مع سلاسل متسلسلة (متصلة مع بعضها البعض ) , مثلا : (strMonth & "-" & strDay & "-" & strYear ) وإلا , فقد لا ترشح المعطيات كما تتوقع .

إذا ضبطت الخاصية الى سلسلة متواصلة مع قيمة غير صحيحة , وباراميترات النظام تحدد رمز عشري غير أمريكي مثلا كفاصة (مثلا: strFilter = "PRICE > " & LngPrice, & LngPrice = 125.50) سيحدث خطاء ما عندما تحاول فتح Recordset التالي , وهذا يحدث لأنه خلال هذا التسلسل سيحول الرقم الي سلسة بإستخدام الرمز العشري الافتراضي للنظام , لكن Microsoft Jet SQL تقبل فقط الرموز العشرية الأمريكية .

مثال :-

يستخدم هذا المثال الخاصية Filter لإنشاء Recordset موجود معتمدا على شرط (حالة) محدد (محددة) . إن التابع FilterField مطلوب لهذا الاجراء حتى ينفذ

Sub FilterX()
        Dim dbsNorthwind As Database
        Dim rstOrders As Recordset
        Dim intOrders As Integer
        Dim strCountry As String
        Dim rstOrdersCountry As Recordset
        Dim rstMessage As String

        Set dbsNorthwind = OpenDatabase("Northwind.mdb")
        Set rstOrders = dbsNorthwind.OpenRecordset("Orders", _
            dbsOpenSnapshot)
        ' Populate the Recordset
        rstOrders.MoveLast
        intOrders = rstOrders.RecodrCount
        ' Get user input
        strCountry = Trim(InputBox( _
            "Enter a country to filter on:"))
        If strCountry <> "" Then
            'Open a filtered Recordset object.
            Set rstOrdersCountry = _
                FilterField(rstOrders, "ShipCountry", srtCountry)
            With rstOrdersCountry
                ' Check RecordCount before populating Recordser;
                ' otherwise, error may result.
                If RecordCount <> 0 Then .MoveLast
                ' Print number of records for the original
                ' Recordset object and the filtered Recordset
                ' object.

                strMessage = "Orders in original Recordset: " & _
                    vbCr & intOrders & vbCr & _
                    "Orders in filtered Recordset (Country = '" & _
                    strCountry & "'):" & vbCr & .Recordset
                MsgBox strMessage
                .Close
            End With

        End If

        rstOrders.Close
        dbsNorthwind.Close

End Sub


Function FilterField(rstTemp As Recordset, _
        strField As String, strFilter As String) As Recordset

        ' Set a filter on the specified Recordset object and then
        ' Open a new Recordset object .
        rstTemp.Filter = strField & " = '" & strFilter & "'"
        Set FilterField = srtField.OpenRecordset

End Function

تنويه : إذا رغبت في مشاهدة تأثيرات الترشيح rstRecordset يجب أن تضبط الخاصية Filter , وعندئذ افتح غرض Recordset ثانية معتمدا على rstOrders .

تنويه : عندما تعرف المعطيات الي تريد أن تختارها فإنها عادة تكون أكثر كفاءة لإنشاء Recordset بعبارة SQL , يبين هذا المثال كيف تستطيع أن تنشئ Recordset واحد وتحصل على سجلات من بلد مستقل

Sub FilterX2()

        Dim dbsNorthwind As Database
        Dim rstOrders As Recordset
        Set dbsNorthwind = OpenDatabase("Northwind.mdb")
        ' Open a Recordset object that selects recordset form a
        ' table based on the shipping country .
        Set rstOrders = _
            dbsNorthwind.OpenRecordset("SELECT * " & _
            "FROM Orders WHERE ShipCountry = 'KSA'", _
            dbOpenSnapshot)
        rstOrders.Close
        dbsNorthwind.Close

End Sub

:o :o :o

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

هذا كل مالدي حاليا

ارجوا المعذرة ان بدر مني اي تقصير

تقبلوا تحياتي

اخوكم ------------> (((((( الدولار ))))))

#4

الأخ الكريم الدولار

شرح وافي كافي بارك الله فيك وزادك علماً ووفقك لكل خير ولكنه ليس ما اطلب .

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

Public Function NeatSplit(ByVal Expression As String, _
Optional ByVal Delimiter As String = " ", _
Optional ByVal Limit As Long = -1, _
Optional Compare As VbCompareMethod = vbBinaryCompare) _
As Variant

Dim varItems As Variant, i As Long

varItems = Split(Expression, Delimiter, Limit, Compare)

For i = LBound(varItems) To UBound(varItems)

If Len(varItems(i)) = 0 Then varItems(i) = Delimiter

Next i

NeatSplit = Filter(varItems, Delimiter, False)

End Function

مرر لهذه الدالة أي عبارة تحوي عدة كلمات كالتالي :

Dim x As Variant

x = NeatSplit("شكراً لك أخي الدولار")

For i = LBound(x) To UBound(x)
	MsgBox x(i)
Next i

المشكلة في السطر :

NeatSplit = Filter(varItems, Delimiter, False)

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

لذلك طلبت من يوضح عملها لي .

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

ولك تحياتي

#5

العفوا اخي الكريم ابو حمود ما سوينا غير الواجب

اما بالنسبة للكود السابقة فانا كما قمت سابقا بإعلامك بأنني مبتدء جدا جدا جدا بالاكسيس ومعلوماتي به طفيفة جدااااااااااااااااا

فلذلك انا ااسف لعدم مقدرتي للاجابة على سؤالك

اكرر اسفي

تحياتي ------------> (((((( الدولار ))))))

#6

السلام عليكم

الوظيفة Filter كما ترى هي في نفس الوقت:

عنصر للكائن Recordset الذي ينتمي للمكتبة ADODB

و عنصر في الوحدة النمطية Strings للمكتبة VBA الموجودة في فجوال بيسك وأكسس

كما أن هناك وظيفة Filter في المكتبة ACCESS تطبق على النموذج والتقرير لتصفية السجلات وهذه الوظيفة في الأكسس تتعارض مع وظيفة المكتبة VBA (ولهذا فإن الوظيفة تعمل في الفيجوال بيسك حيث لا يحتوي المكتبة ACCESS في مراجعه فيقوم بتنفيذها فورا من المكتبة VBA )

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

فبمثالك بدل السطر الذي ذكرته إلى

NeatSplit = VBA.Strings.Filter(varItems, Delimiter, False)

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

وتحياتي لك (f) (f)

#7

ارغب في مثال لكيفية استخدام الداله Filter مع Date ، حاولت ان انفذ هذا الكود ولم استطع

DEMail.rsCOMrm.Filter = "regmassge.dateofsinding = strMonth &' - '& strDay & ' - ' & strYear"

:( :( :( :( :( :( :(

#8

الأخ عامر جوز

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

حرم الله وجهك عن النار .

لقد تعبت في حل هذه المشكلة ولم استطع .

وقد افدتني هنا فائدتين لكيفية استخدام الدوال عند التعارض والثانية حل المشكلة زادك الله علماً .

ولكن لي رغبة أن تشرح عملها إن تيسر لك ذلك .

وفقك الله كل خير ويسر لك أمرك .

ولك تحياتي

#9

الأخ عامر جوز

آمل الاطلاع على هذا الموضوع والمشاركة إذا كان لديكم حل للمشكلة .

http://www.arabteam2000.com/vb/showthread....p?threadid=7075

ولك تحياتي

#10

ولو أخوي ابو حمود إنت مفضّل علينا وعالمنتدى ومشاركاتي بسيطة وقليلة

الله يحفظك ويخليك ويسلمك

بالنسبة لسؤالك أن اشرح عملها فلم تحدد أي واحدة من الثلاثة تريد وظيفة النصوص أم الأخريتين..:confused:

مع أنني لم أستخدم إلا وظيفة مجموعة السجلات Recordset التي شرحها الأخ الدولار مشكور وأعتقد أن وظيفة المكتبة Access مشابهة لها

#11

قصدت دالة Filter في هذا السطر :

NeatSplit = VBA.Strings.Filter(varItems, Delimiter, False)

ولك تحياتي

#12

تكرم أخوي

[gl]الدالة Filter:[/gl]

تقوم هذه الدالة بالبحث في مصفوفة نصية ذات بعد واحد عن نص معين وتعيد مصفوفة أخرى تحتوي فقط العناصر التي تتضمن (أو لا تتضمن!) النص الذي نبحث عنه. بعبارة أخرى تصفية المصفوفة حسب شرط نحدده..

صيغة الدالة كالتالي

arr() = Filter(Source(), Search, [Include], [CompareMethod])

إذا كانت قيمة الوسيطة Include هي TRUE (وهي الافتراضية) فإن المصفوفة الناتجة تحوي جميع عناصر المصفوفة الأصلية التي تتضمن نص البحث /Search/، وإذا كانت FALSE فإن المصفوفة الناتجة تحوي العناصر التي لا تتضمن نص البحث (كما في مثالك).

أما الوسيطة CompareMethod فتحدد فيما إذا كان البحث حساس لحالة الأحرف vbBinaryCompare أو لا vbTextCompare

مثال:

Dim s(2) As String
s(0) = "First": s(1) = "Second": s(2) = "Third"
Dim res() As String
res = Filter(s, "i", True, vbTextCompare)
' Print the result array  ("First" and "Third").
For i = 0 To UBound(res): Print res( i ): Next

أرجو أن أكون قد وضحت

مع تحياتي (f) (f)

#13

الأخ عامر

مشكور وزادك الله علما علىهذه المعلومات الجديدة .

ولك تحياتي

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

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