اذهب الي المحتوي
أوفيسنا

طلب دالة ذكية للبحث عن رقم معين بعد نص معين


إذهب إلى أفضل إجابة Solved by Ahmos,

الردود الموصى بها

أخي الكريم بارك الله فيك

1- عندي استعداد وربنا يقدرني ويستخدمني

2- لو ممكن توضح التعديلات المطلوبة أكتر مع أمثلة

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

حاول توضيح المطلوب اكثر مع الذكر الحالات والأمثلة وإن شاء الله سنتمكن من الوصول لحل

4- ولقد حاولت في الكود الحالي ان يتعامل مع المتغيرات فيمكنك استدعائه من أي جدول ومع أي عمودين

إذا كان لديك أي استفسار فلا تتردد أخي الكريم

بانتظار توضيحك

بالتوفيق
 

  • Thanks 1
رابط هذا التعليق
شارك

بارك الله فيك أخي الكريم وأحسن إليك

كما أشرت سابقا .. قد أحتاج إلى استخدام هذه الدالة لكتاب معين دون الحاجة للتعديل على جدول (books) أو (BooksList)

في هذه الحالة سأستخلص الكتاب المطلوب من (books) لتعمل الدالة عليه وحده

وستجد في الملف المرفق جدول (books) وفيه كتاب واحد فقط هو "معجم ابن عساكر"

ولن تجد في الجدول اسم الكتاب

لأن اسم الكتاب (الأول والثاني) ستأخذه الدالة من مربع النص في النموذج الذي سيظهر

 image.png.aaa5640d0bdc98c950d48384a014bda1.png

والأمر الأول: (تحديث MNO - بحث في الكل) يعني سيتخدم نفس طريقة البحث التي اعتمدناها بكل خطواتها وملحقاتها، الفرق الوحيد هو حصر البحث في اسم الكتاب الذي سيكتب في مربع النص (Txt1 – Txt2) ولن يأخذه من جدول (books) أو (BooksList)

والأمر الثاني: (تحديث MNO - بعد الرقم مباشرة) نفس السابق من حيث البحث في كتاب واحد فقط، ويختلف في طريقة البحث، فلن يبحث عن رقم الحديث في كل النص، سيبحث عنه بعد اسم الكتاب مباشرة بفاصل (5) حركات مثلا، هي للمسافات والأقواس التي تفصل بين اسم الكتاب والرقم [معجم ابن عساكر (125) ، "سنن النسائي" (301)]

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

وعندها فلا حاجة لقائمة الكتب (BooksList) لمعرفة هل الرقم المطلوب بعد هذا الكتاب أو غيره، ومن الممكن ألا نحتاج لحذف ما قبل اسم الكتاب إذا كانت هناك طريقة لجعل مجال البحث بما بعد اسم الكتاب بحد معين

Smart_Search_One.accdb

تم تعديل بواسطه nssj
رابط هذا التعليق
شارك

لم افهم جزء في الدالة

Public Function ClassifySpeed() As RequestSpeed
    Select Case elapsedTime
        Case Is < 500 ' Less than 500ms
            ClassifySpeed = TooFast
        Case 500 To 1000 ' Between 500ms and 1000ms
            ClassifySpeed = Fast
        Case 1000 To 5000 ' Between 1s and 5s
            ClassifySpeed = Normal
        Case 5000 To 15000 ' Between 5 seconds and 15 seconds
            ClassifySpeed = Slow
        Case Else ' Greater than 15 seconds
            ClassifySpeed = TooSlow
    End Select
End Function
 

من 0 الى 4 

تستعمل لاي قياس ؟!

اظن يوجد استعلامات ناقصة 

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

بعض الاقتراحات ان كانت مناسبة

بدل من استخدام -DOA 

بتعديل وتشطيب ولكن عمل الدوال ممتع 😇

بناء جدول باسماء الكتب باجمالي السجلات 1

وجدول للاحاديث 2

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

A مع +1

=260A4

مع اضافة حقل لكافة الاسماء مثال ابن صياد 😇

وحقل اذا كان للحديث وصف فريد 

للبحث Link 

Nothing = Go 2-Link db كتاب آخر

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

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

تناديها 

db () DOA 

rs

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

ممكن بعض الشرح عن وظيفة الدالة اعلاها

 

شكرا لكم🌹

رابط هذا التعليق
شارك

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

أخي الكريم @nssj
تم بحمد الله العمل علي التعديلات المطلوب الملف بالمرفقات

كما تم التعديل علي بعض الأكواد سأحاول تغطية التعديلات وإن كان هناك أي استفسار أو طلب  أخر فلا تتردد
بانتظار التجربة والإفادة

1- فيما يخص التعديل الأول فما أردته هو ان يتم كل شي فالبحث كما هو ولكن فقط أردت تثبيت اسم الكتاب
وعليه تم التعديل في الكود نفسه ليتضمن هذا الاحتمال دون أن يتأثر القديم
فكانت التعديلات هي إضافة (Optional constName As Boolean = False) حتي يتم التمييز إذا كان اسم الكتاب ثابت ام متغير
وبشكل افتراضي هي False فالاختيار الأساسي هو ان الاسم متغير يعتمد علي خانة اسم الكتاب بالجدول
وهذا ما تم تعديله علي الكود
 

If constName = False Then
	BookName = Nz(Trim(.Fields(bookNameCol)), "")
Else
	BookName = Trim(bookNameCol)
End If

كما يجب التنبيه ان هذا الكود يعتمد بشكل أساسي علي الجدول TAB ومحتوياته بما فيها wipedNass
تم التعديل علي (createBooksCollection) تم إضافة تحقق إذا كان العمود الثاني موجود لإضافة ما فيه
وللعلم فالمطلوب لعمل هذا الكولكشين هو جزء يميز اسم الكتاب مثال 
اذا كان الكتاب الاسم الأول معجم ابن عساكر والثاني ابن عساكر في معجمه 
فيكفي ان يكون الاسم ابن عساكر في البحث او الاستبعاد 
-----------------------------------------------------
فيما يخص الطلب الثاني
فقد تم عمل المطلوب بهذه الطريقة
 

Public Function isBookInText(ByVal fullText As String, _
                                ByVal BookName As String, _
                                Optional ByVal bookNum As String = "") As Boolean
    
    On Error GoTo ErrorHandler
    
    Dim regex           As Object
    Dim matches         As Object
    Dim match           As Object
    Dim pattern         As String
    
    Set regex = CreateObject("VBScript.RegExp")

    If bookNum = "" Then
        pattern = "(?:" & BookName & "\s*-?\s*\(\d+(?:[/\\,\-_]\d+)*\))"
    Else
        pattern = "(?:" & BookName & "\s*-?\s*\(" & bookNum & "\))"
    End If

    With regex
        .Global = False
        .MultiLine = True
        .IgnoreCase = False
        .pattern = pattern
    End With

    Set matches = regex.Execute(fullText)

    If Not matches Is Nothing And matches.count > 0 Then
'        Debug.Print "Book(s) found in text:"
'        For Each match In matches
'            Debug.Print "  - " & match.Value
'        Next
        isBookInText = True
    Else
        isBookInText = False
    End If

CleanAndExit:
    If Not regex Is Nothing Then Set regex = Nothing
    If Not matches Is Nothing Then Set matches = Nothing
    Exit Function

ErrorHandler:
    Debug.Print "Error: " & Err.Description
    isBookInText = False
    Resume CleanAndExit
End Function

فهذه الدالة يمكن استخدامها للبحث عن الكتاب برقم او بدون رقم
وهي تبحث داخل النص وفق هذه الشروط
اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم ( ثم رقم مع فواصل او بدون ثم )
إذا تم تحديد نص للرقم
اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم ( النص المحدد )
هذا السطر من الكود (.Global = False) اذا كنت تريد للبحث ان يتوقف بعد اول نتيجة
تم عمل هذه الدالة لتعود بـ True or False
ولكن يمكن التعديل عليها لتعود بكامل النص مثلاً او تعود بالكتب الموجودة داخل النص التي ينطبق عليها الشروط السابقة
 

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

تم إضافة كود لعمل تحديث للفورم قبل التنفيذ حتي يتأثر بالمتغيرات علي مربع النص

بالتوفيق

Smart_Search_Nssj_V6.zip

  • Like 1
رابط هذا التعليق
شارك

الأستاذة / حنان @hanan_ms

قمت بعمل مديول لحساب الوفق بشكل عام وأضفت له هذه الدالة
Public Function ClassifySpeed() As RequestSpeed
لقياس سرعة استجابة الاتصال بالأنترنت لجلب معلومات علي سبيل المثال
عن طريق oXMLHttp = CreateObject("MSXML2.ServerXMLHTTP")
وبالطبع يمكن التعديل والإضافة علي القيم إذا كان هناك قاعدة لتمييز الوقت المحدد للاستجابة 

 

رابط هذا التعليق
شارك

أحسن الله إليك أخي الكريم

بخصوص التعديل الأول: البحث بنفس الطريقة لكن باعتبار كتاب واحد فقط، فقد تم الأمر بحمد الله

أما التعديل الثاني ، فلفت نظري قولك:

 

3 ساعات مضت, Ahmos said:

اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم ( ثم رقم مع فواصل او بدون ثم )

فقمت بتغير : معجم ابن عساكر (142) إلى: معجم ابن عساكر 142 –

فلم تجده الدالة

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

فالكتب تختلف في طريقة ترقيمها، ففي بعضها:

كتاب ((55)) & كتاب 152 -  & كتاب 152-  & كتاب [47] & كتاب 35، & كتاب  "29"

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

يعني ألا يشترط وجود شيء قبل الرقم

أما نهاية البحث فهي: مسافة أو أي شيء غير الأرقام بما في ذلك: ) ] ، - _

يعني: اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم رقم أو أرقام بدون فواصل

فإذا تم الفصل بمسافة أو أو شيء غير الأرقام ينتهي البحث 

 

ثم ماذا قصدت أخي الكريم بقولك

3 ساعات مضت, Ahmos said:

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

ماذا يعني هذا الخيار وما تأثيره على النتائج ؟

رابط هذا التعليق
شارك

4 ساعات مضت, Ahmos said:

فيكفي ان يكون الاسم ابن عساكر في البحث او الاستبعاد

ليس بالضرورة أخي الكريم 🙂، فقد يجتمع في الحديث الواحد:

ابن عساكر في معجمه & ابن عساكر في تاريخه & ابن عساكر في جزئه

البيهقي في سننه & البيهقي في الشعب & البيهقي في الأربعين

رابط هذا التعليق
شارك

مساكم الله بالخير والنور والسرور
فيما يخص التطبيق
1- يبحث بإسم الكتاب من مربع النص والرقم من الجدول

image.png.3c6f4e29443369773b6cfcf969987d79.png

2 - يبحث بإسم الكتاب فقط بدون الرقم هي فقط  تجربة للأنتقال غلي المرحلة التي تليها فالتفكير
كنت بفكر بصوت عالي 😄 وبعدين فكرت ان احنا ممكن نعمل نمط يتتبع اسماء الاكتب وأرقمها
فممكن مثلاً في الجدول TAB نضيف عمود نستخرج في من النص الكتب الموجودة فيه
بس ده هيحتاج اننا يكون معانا كل اسماء الكتب وكل الطرق اللي ممكن تورد بيها 
*معلومة عند إنشاء دالة تتبع النمط بـ Regex يمكن وضع أكثر من نمط كبدائل ان لم يجد هذا النمط يبحث عن أخر
عموماً ده لو هيساعد معاك ممكن نشتغل عليها بس حاول توفرلي الانماط عشان ابداء اشتغل علي الدالة وأختبرها إن شاء الله
وبعد كدا نشوف هنشغلها ازاي مع أسماء الكتب

صورة من التطبيق الثاني : 😁
image.png.40baa5c38b11c4483c45c13d967111e1.png

5 ساعات مضت, nssj said:

ليس بالضرورة أخي الكريم 🙂، فقد يجتمع في الحديث الواحد:

ابن عساكر في معجمه & ابن عساكر في تاريخه & ابن عساكر في جزئه

البيهقي في سننه & البيهقي في الشعب & البيهقي في الأربعين

شكراً علي التوضيح ده علي الاقل في كولكشين الاستبعاد ممكن بدل ما نكتب 3 بدائل نكتب عساكر او البيهقي
ده لو متاح انا بحاول اوصل الفكرة

بعض الأسئلة
1- هل في قائمة بجميع الكتب وبدائلها 
2- هل يوجد قائمة بأسماء الكتب وأرقامها
3- هل العمود MNOX ده موجود وانت بتحاول تصححه
4- متي سننتقل للبحث بأرقام الصفحات والاحتمالات الاخري ؟

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


علي أي حال كل هذا يمكن تعديله
فقد كنت حريصاً علي أنت تصل الي ما تريده وتطمئن إلي ان والحمد لله الأمر ممكن تحقيقه بفضل الله
اذا كنت بحاجه إلي تعديل أي شئ فلا تتردد

بالتوفيق

  • Thanks 1
رابط هذا التعليق
شارك

منذ ساعه, Ahmos said:

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

(BooksList) فيه أسماء الكتب وبدائلها وأرقامها التي هي مجال البحث

أما قائمة بأسماء كل الكتب التي ترد في (TAB) فلا يوجد، ومن الصعب حصرها، وبعضها يذكر مختصرا مثل: طب، هق، ك، كر، طس، شعب .. ، وهذه الأحرف تتكرر كثيرا في النص، مما يجعل البحث عنها وتمييزها صعب جدا

منذ ساعه, Ahmos said:

هل العمود MNOX ده موجود وانت بتحاول تصححه

غير موجود ، أضفته مؤقتا لإجراء التجارب، وأنا أحدثه يدويا .. لذلك فإن إعداد ملف للتجارب يأخذ وقتا

 

منذ ساعه, Ahmos said:

متي سننتقل للبحث بأرقام الصفحات والاحتمالات الاخري ؟

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

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

7 ساعات مضت, nssj said:

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

فالكتب تختلف في طريقة ترقيمها، ففي بعضها

وهذا التعديل بوضع حد ينتهي عنده البحث وينتقل للتالي قد يساعد في موضوع الصفحات

رابط هذا التعليق
شارك

أخي الكريم تفضل هذا النمط إن شاء الله يتضمن الاحتمالات الممكنة
 

pattern = "(?:" & bookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & bookNum & "[\s*|'\)\]\ -}""]*)"

يتم استبداله هنا 
image.png.99550d14a8b4ec64f979afe5ca9cdb65.png

بانتظار تجربتك للعديد من الاحتمالات

وإذا قمت بتنشيط هذا الجزء من نفس الكود

image.png.826238e64161462857f57326e0b138d1.png
فيمكنك اختبار الدالة هكذا وستطبع النتيجة
 

Sub testIsBookExist()
    Dim inputText       As String
    Dim bookName        As String
    Dim bookNum         As String
    
    bookName = "المطالب"
    bookNum = "3298"
    inputText = DLookup("[NASS]", "TAB", "[MNO]=33976")
    
    inputText = Replace(inputText, "(", "|(")
    inputText = Replace(inputText, ")", "  )''")
    If isBookInText(inputText, bookName, bookNum) Then
        Debug.Print "YES"
    Else
        Debug.Print "NO"
    End If
End Sub

أرجو من الله التوفيق والسداد

 

  • Thanks 1
رابط هذا التعليق
شارك

جزاك الله خيرا أخي الكريم وأحسن إليك

تم الأمر بحمد الله .. وبهذا نكون قد أنهينا ما يتعلق بالبحث عن الكتب بأرقام الأحاديث، والحمد لله أولا وآخر

والآن جاء دور البحث عن الكتب بأرقام الصفحات أو الجزء والصفحة

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

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

الاختلاف سيكون بأن البحث القديم كان بالاعتماد على رقم (B_HNO)

أما الآن فسيكون بالاعتماد على عمودي: (Part) و (Page) أو أحدهما

 وهنا تكمن أول إشكالية .. فقبل إعداد ملف التجربة أردت أن آخذ رأيك في هذه القضية:

الكتب التي تخرج بالاعتماد على الصفحات نوعان:

1 - الأول وهو الأكثر يذكر الجزء والصفحة بفاصل / بمسافة أو بدون مسافة [ (1/ 25)، ( 3 /7 ) ، 5/ 99 ، 6 /59]

2 - الثاني يذكر الصفحة فقط بعد حرف  بمسافة أو بدون مثل: [ (ص 25)، (ص66) ( ص  126)  ]

هذا كله في جدول (TAB)

أما في جدول (BOOKS) فإن عمود (Part) لا يكون فارغا، وحتى في هذه الكتب التي لا يذكر فيها رقم الجزء ويستعاض عنه بـ (ص ) فرقم الجزء فيها (1)

يعني لا يوجد ما يميزها

وأعتقد أنه لا بد من تمييز مثل هذه الكتب عند البحث، لأن الدالة عندما تريد أن تبحث عن مثل هذه الكتب فهي لن تبحث عن رقم الصفحة يعد [ 1/  ]  بل بعد 

وأنا أستطيع تمييز مثل هذه الكتب، إما بأن أغير رقم الجزء فيها مؤقتا إلى (0)، أو بإضافة حقل خاص بصيغة (نعم أو لا) لتمييزها، بحيث أن الدالة إذا وجدت رقم (0) في عمود الجزء، أو علامة (نعم) في الحقل الخاص فستبحث عن بدل البحث عن رقم الجزء

فما هو الأنسب .. تغيير رقم الجزء إلى (0) أو تمييز هذه الكتب بعلامة في حقل خاص ؟

بانتظار رأيك لأعد الملف مع باقي التفاصيل

رابط هذا التعليق
شارك

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

 

اللهم لك الحمد كله، ولك الشكر كله، ولك الملك كله، وبيدك الخير كله، وإليك يرجع الأمر كله؛ علانيته وسره أوله وأخره، ظاهره وباطنه...لك الحمد يا مالك الملك في الأولى والآخرة، حمداً دائمًا طيبًا نقيًا مباركًا فيه؛ يملأ السماوات والأرض وما بينهما، كما ينبغي لجلال وجهك وعظيم سلطانك
 

بسم الله ولا حول ولا قوة إلا بالله وعلي الله توكلنا وهو نعم المولى ونعم النصير
 

كما فهمت انك ستقوم بالتمييز يدوياً 
ماذا لو كمنا بإعداد عمو في جدول TAB  مثل wipedNass 
نقوم في باستبدال ص إذا جاءت منفردة او بعد (  مثلاً بـ 1/
وبهذه الطريقة نكون قد وحدنا النص

كما يمكنك إعداد بعض النصوص كعينة للتجربة وإرسالها مع الإشارة الي مواضع البحث او النتائج المتوقعة
حتي تتضح الفكرة أكثر عن التحديات والاحتمالات

لدي فكرة وأحتاج إلي مساعدتك
بجانب ما نقوم به اريد ان نستفيد من هذه البيانات كان نبدء في كل عملية بحث بتكوين قائمة بالكتب
مثلاً الأن وجدنا تتطابق لإستخراج الـ MNO 
ماذا لو جمعنا القيم البحثية وهي اسم الكتاب والرقم 
وفي خطوة لاحقه سنجد ان قاعدة البيانات تحتوي علي MNO واسم كتاب ورقمه
فنقوم بعمل دليل ان هذا الرقم يحتوي علي هذه الكتب

 

طبعاً انا بفكر معاك بصوت عالي
انا مش عارف انت شغال علي ايه بالظبط لكن عايز تفكر ازاي تقدر تستفيد من البيانات اللي بتوصلها بحيث متعرفش ان ممكن تحتاجها ازاي
بما انك ماشي فالداتا بتحللها وتظبطها
 

يعني قصدي ان لو في حاجه نقدر نعملها واحنا ماشين ومش هتعطلنا ممكن نعملها 

  • Thanks 1
رابط هذا التعليق
شارك

5 ساعات مضت, Ahmos said:

ماذا لو كمنا بإعداد عمو في جدول TAB  مثل wipedNass 
نقوم في باستبدال ص إذا جاءت منفردة او بعد (  مثلاً بـ 1/

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

حتى لا يتم استبدال أمثال:

(صلى الله عليه وسلم)

(صليت خلف ..

(صحيح ..

مع احتمال وجود مسافة بين القوس وص (  ص

وأنا من باب الاحتياط، ففي الملف المرفق كتابان (أمالي الشجري) (الأربعين للبكري)

ميزت بعلامة في حقل (sad) لأنه بطريقة (ص )

 والآن أذكر بعض التفاصيل التي لم أذكرها في المشاركة السابقة

 البحث في كتب الصفحات (1/ 187) (2 / 66) 3 / 44  (ص 94) سيكون بنفس الطريقة المعتمدة السابقة، من حيث اختيار اسم الكتاب من نموذج فإن لم يكن فمن عمود الكتب .. لا تعديل في هذا الأمر

الاختلاف سيكون بأن البحث القديم كان بالاعتماد على رقم (B_HNO)

أما الآن فسيكون بالاعتماد على عمودي: (part) و (Page)

 وبما أننا سنعتمد نفس إجراءات البحث السابقة فلن تواجهنا مشكلة البحث عن الرقم كاملا، ومشكلة وجود الرقم قبل اسم الكتاب أو بعده ولكن لكتاب آخر

لكن توجد إشكاليات خاصة بهذه الطريقة:

 ** الإشكالية الأولى: وهي في هذه الأمثلة في (TAB): أمالي الشجري (2/ 132-133) ، الأربعين للبكري (ص 38-39)

 image.png.4665097621da00ca21476c376466ebf5.png

وهما في جدول (BOOKS)

 image.png.ad667a348147906d73ac881a2b90e04c.png

 

لا مشكلة عندما تحد الدالة عن صفحة (132) أو صفحة (38) لأن الدالة ستجدهما أولا، ثم إذا تابعت البحث فستجد أيضا صفحة (133) وصفحة (39) ولهما رقم (MNO) مختلف

والأمر هنا هين، لأن الدالة ستضع الرقم الذي تجده أولا في (MNO)، وهو المطلوب

* المشكلة الأكبر عندما تبحث الدالة عن الحديث التالي: الشجري 1 / 133، البكري (ص 39)

 image.png.6055aba9e001b99f202f70803a30b5d2.png

فعندما تبحث الدالة عن (الأربعين للبكري) صفحة (39) في (Tab)، قد تجد أولا الحديث الذي فيه:

الأربعين للبكري (ص 38-39) وهي ليس المطلوب

وإذا تابعت البحث ستجد المطلوب: الأربعين للبكري (ص 39)

ولكل منها رقم (MNO) مختلف

وكذلك الحال في أمالي الشجري جزء (2) صفحة (133)

قد تجد أولا النتيجة غير المطلوبة: أمالي الشجري (2/ 132-133)

وإذا تابعت البحث ستجد النتيجة الصحيحة: أمالي الشجري (2/ 133)

وفي الحالتين ستضع الدالة في (MNO) الرقم الأول الذي وجدته، وليس هو الرقم المطلوب

 فهل سنبحث عن طريقة لحذف مثل هذه الأرقام كما فعلنا في مثل [مصنفات ابن البختري 147 - (55)] أم يمكن تجاوز الأمر بطريقة أخرى، أم لا بد من وجود هذا الخلل والتعامل معه لكونه قليل الحدوث

 

 ثم هل ستعمل الدالة في مثل: أمالي الشجري (1/ 16، 2/ 46)

 image.png.ac28be95cc08665eae75515b47ef2819.png

 

** الإشكالية الثانية: وجود أكثر من حديث في الصفحة الواحد، ولكل حديث رقم (MNO)

image.png.8411a69a4625238cedf427ac17f073d3.pngimage.png.8411a69a4625238cedf427ac17f073d3.png

فهذه الأحاديث الأربعة ستبحث عنها الدالة بصيغة: أمالي الشجري (1/ 60) وستجدها في أربعة مواضع من (TAB) لكل موضع رقم (MNO)

 image.png.b5dd1492842f2420e5ebf1ebdadf02eb.png

وبما أن الدالة تحتفظ بجميع النتائج وتضعها في حقل (allFoundMNO) فلا بأس بذلك، لكن إن أمكن أن توضع هذه النتائج في حقول منفصلة معدة لذلك مسبقا فهو أفضل، سواء بنفس الكود أو بكود منفصل

وأهمية ذلك عندي، أني سأستخدم نموذجا يعرض الحديث من (TAB) بمجرد النقر المزدوج على الرقم، وبذلك سأستعرض هذه الأحاديث بسرعة وعندما أجد المطلوب أعتمد رقمه

وقد أضفت ستة أعمدة لهذا الغرض في (BOOKS) لاستيعاب سبعة أرقام مع الحقل الرئيسي (MNO)

image.png.9f50bd32d071358b11682eb875f3e8b9.png

لأني أستبعد أن توجد في مجموعة الكتب صفحة يوجد بها أكثر من سبعة الأحاديث في صفحة واحدة

 

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

 

بالنسبة لاقتراحك أخي الكريم

5 ساعات مضت, Ahmos said:

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

فلم أفهم بالضبظ ما تعني أخي الكريم

وأنا أسمع كثيرا عن موضوع تحليل البيانات

وإذا كان بإمكاني القيام بشيء لتسهيل عملي والحصول على أفضل النتائج فأنا حريص على ذلك

وأنا تحولت لأكسس لهذا الغرض، فكل الملفات التي عندي كانت ملفات (وورد)

وأنا الآن أعمل في بيئة أكسس لأستفيد من مزاياه

إجمالا أخي الكريم .. دالة البحث الذكية التي طلبتها هنا هي على أهميتها بالنسبة لي وكونها ستوفر لي وقتا كبيرا .. فاستخدامي لها سيكون محدودا بكتب معينة، هي الكتب التي كانت موجودة لدي في ملفات (وورد) وأريد أن أربطها بقاعدة البيانات عبر (MNO)

أما الآن وبعد أن أصبحت أستخدم أكسس وليس (وورد) فكل الكتب والأحاديث الجديدة التي أتعامل معها أدرجها فورا بجدول (TAB) مع رقم (MNO)

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

Smart_Search_Pages.accdb

رابط هذا التعليق
شارك

2 ساعات مضت, Ahmos said:

اي اننا لن نواجه نتائج في مواضع متأخرة صحيح

للأسف أخي الكريم .. سنواجه هذا الأمر .. وقد يكون في الملف المرفق مثال لهذا .. وأنا الآن خارج البيت .. باختصار: كل ما واجهناه في الأرقام سنواجهه هنا وزيادة 😂

رابط هذا التعليق
شارك

سؤال لو سمحت
دلوقتي احنا عندنا 3 أرقام
- رقم الجزء مثال 1 وفي حال كانت ص يتم استبدالها بـ 1
- رقم الصفحة وهو يأتي بنبسة 100% بعد رقم الجزء / 
  وقدياتي حديث في صفحتي فالصفجة الاولي تاتي أولاً ومن ثم الثانية بهذه الكيفية 132-133
رقم الحديث وهو الموجود في العمود B_Hno
وفق ما فهمت فقد ياتي اسم الحديث بعده اما
- رقمه
- او الجزء والصفحة - الصفحة
- او الصفحة ويرمز لها بـ ص وقد لا يرمز لها

هل من الممكن ان تجتمع الاحتمالات الثلاثة ؟

اما أفكر فيه حالياً هو ان نستهدف عن القص أبعد رقم قد يرد
وليكون الرقم المستهدف هو رقم الصفحة
والحمد لله قد افضنا الي دالة القص خاصية تسمح لنا بزيادة الجزء المقتطع من النص
فمثلاً لو كان النص يتمن كتاب (232) - (1 / 132-133) فإذا تم قص النص برقم الصفحة 132 سنفقد باقي الحديث
ولكن يمكن ان نخبر الدالة ان تزيد بعد الرقم وليكن 8 خانات أخري حتي نضمن الجزء المتبقي للبحث يتضمن كافة المعلومات التي قد نحتاج اليها
ومن ثم تقوم بعمل دالة تقوم بعمل إستبدال لـ ص او او ( ص  بـ 1 /
وتستبدل أيضاً و( او و (   باسم الحديث (
 
النتيجة اننا لدينا نص الان تم معالجته ولم يعد هناك أرقام تاتي في مواضع متأخرة 
ومن ثم يمكن تطبيق نمط لنفحص تطابق النتيجة من عدمها

في انتظار مراجعتك وتعليق ودعواتك 
بالتوفيق

  • Thanks 1
رابط هذا التعليق
شارك

3 ساعات مضت, Ahmos said:

او الصفحة ويرمز لها بـ ص وقد لا يرمز لها

الصفحة بدون الجزء لا بد أن يرمز لها بحرف ص وقبله قوس بمسافة أو بدون 55) ( ص 55 )، أما حرف ص بدون قوس فغير وارد

3 ساعات مضت, Ahmos said:

هل من الممكن ان تجتمع الاحتمالات الثلاثة ؟

لا يمكن، إما رقم الحديث ، أو الجزء والصفحة ، أو الصفحة فقط

3 ساعات مضت, Ahmos said:

ومن ثم تقوم بعمل دالة تقوم بعمل إستبدال لـ ص او او ( ص  بـ 1 /
وتستبدل أيضاً و( او و (   باسم الحديث (

 لا مشكلة في استبدال (ص & ( ص بـ 1/  في كل الملف بشرط أن يأتي بعدها بمسافة أو بدون مسافة رقم

وإذا كنت تريد أن تجعل الاستبدال إذا جاءت (ص & ( ص بعد اسم الكتاب مباشرة فعندها لا يلزم أن تشترط أن يكون بعدها رقم

لكن قد يأتي في النص: الأربعين للبكري (ص 55) حدثنا .. .. .. ..، و(ص 102)

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

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

3 ساعات مضت, Ahmos said:

وتستبدل أيضاً و( او و (   باسم الحديث (

لا أرى حاجة لهذا الاستبدال، لأن المثال الذي ذكرته

3 ساعات مضت, Ahmos said:

كتاب (232) - (1 / 132-133)

غير وارد أن يرد في النص

 

وكما أنت تفكر بصوت عالي فأنا سأفكر بصوت عالي وكأني أتعامل مع ملفات الوورد:

مشكلتنا في مثل (1/ 132-133) (ص 33-34) هل يمكن أن نستخلص بعد اسم الكتاب (10) حركات مثلا، ثم نذهب إلى أول (-) ثم أستبدلها برمز غير موجود في الملف، مثلا //، ثم أتأكد من عدم وجود مسافة بعد هذا الرمز الجديد باستبدال (// ) بـ (//) في كل الملف، ثم أعود للدالة في أكسس لتحذف كل ما بعد (//) إلى أول مسافة

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

خطوات مملة 🙄 .. ولكن هكذا كنت أعمل في وورد 😅 

إجمالا .. إذا كان هذا الأمر شديد التعقيد فلا بأس بمعالجته يدويا

وبالتوفيق أخي الكريم

رابط هذا التعليق
شارك

إن شاء الله الأمر ميسر
وسيفتح الله لنا

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

5 ساعات مضت, nssj said:

مشكلتنا في مثل (1/ 132-133) (ص 33-34)

فكيف يحدث هذا و 132 و133 ارقام صفحات و 33 و 34 أيضاً

سؤال رقم الصفة الموجود بالملف هو دائماً الرقم الأول صح ؟
مثل 132  و  33
آلية البحث التي أفكر بها بعد اسم الكتاب مسافات او لا ( او لا مسافات او لا ثم رقم الجزء ثم مسافات او لا ثم فاصل / 
سؤال هل يتغير الفاصل او هو دائمة /
ثم مسافات او لا ثم رقم الصفحة
فاذا كان رقم الصفحة الذي سنبحث عنها هو دائماً الرقم الأول بعد الجزء والفاصل وسوف نعتمد هذه الطريقة إن شاء الله
ولذلك اريد استبدال و( باسم الكتاب حتي نستطيع إتباع نمط محدد

رابط هذا التعليق
شارك

10 دقائق مضت, Ahmos said:

فكيف يحدث هذا و 132 و133 ارقام صفحات و 33 و 34 أيضاً

أخي الكريم .. هذا يستخدم أحيانا في الأحاديث الطويلة التي تأخذ أكثر من صفحة، (1/ 132-133) تعني أن الحديث بدأ من صفحة 1/ 132، وانتهى في 1/ 133

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

أما الفاصلة (،) فتعني غالبا موضع آخر، يعني: 1/ 12، 178  تعني أن الحديث في موضعين: الأول 1/ 12، والثاني 1/ 178

14 دقائق مضت, Ahmos said:

سؤال هل يتغير الفاصل او هو دائمة /

نعم أخي الكريم الفاصل هو دائما (/) بمسافة أو بدون .. لا فاصل بين الجزء والصفحة سواه

رابط هذا التعليق
شارك

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

أخي الكريم فضلاً قم بتجربة الملف المرفق 
لدي بعض الأسئلة
1- فيما يخص الـ allFoundMNO فقد لا يتم تسجيلهم جميعاً وذلك لسبب
    
image.png.dbafe158084322754b3954f6af56d736.png
كما في هذه الصورة ستجد ان نتائج البحث 5 ولكن الأرقام التي تم تسجيلها تختلف 
وذلك لان في هذا الجزء من الكود إذا وجد نتيجة مطابقة يتوقف عن البحث

image.png.63622bf7e9ffce2d022a95b49714595f.png

وإذا اردنا ان لا يتوقف حتي نسجل كل النتائج علينا ان نأخذ في الاعتبار
- الوقت
- هل نريد ان يتم تسجيل اول نتيجة مطابقة او أخر نتيجة في foundMNO وهو يحمل القيمة التي سيتم وضعها في MNO

2- عند المراجعة وجدت هذه الحالة وأردت السؤال عنها

image.png.4a8044414c1705743883ef2e03fa3e19.png

الأمر هنا ان اسم الكتاب مختلف فاذا كان الاسم الذي تم استخدامه في اول بحث هو الأربعين للبكري فستظهر النتيجة الاولي فقط
أقصد انه لن يتم رصد بدائل
كما ان آلية البحث تعتمد أن الخلية في العمود MNO تكون فارغه فاذا كان هناك نتيجة مسجلة فلن تبحث باسم الكتاب الموجود في BookName2


1- في انتظار مراجعتك وملاحظاتك وكيف تريد ان يتم تعديل آلية البحث حتي توفر لك أفضل نتيجة ممكنة
2- هل تملك الصفحات كاملة داخل قاعدة البيانات ؟

 

بالتوفيق

 

Smart_Search_Pages_V1.zip

 

تم تعديل بواسطه Ahmos
حذف صورة مكرره
  • Thanks 1
رابط هذا التعليق
شارك

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

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

وكما ذكرتُ أخي الكريم، التعقيدات في هذه الطريقة (الصفحات) ترجع إلى أمرين:

الأول: وجود أكثر من حديث في صفحة واحدة

الثاني: وجود الأرقام بعد (-) وهي أرقام لا حاجة لها عند البحث وتؤثر في عرض النتيجة

وحتى نتفرغ للأمر الثاني لا بد من إنهاء الأول، لأنه السبب في معظم النتائج الخاطئة إن لم يكن كلها

لذلك لا بد من إكمال البحث في باقي الملف (TAB) حتى لو وجد النتيجة المطابقة، حتى لو كلفنا ذلك وقتا أطول بكثييير

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

وأنا هنا لدي استفسار بخصوص عرض كل النتائج، الذي فهمته أن حقل (allFoundMNO) تعرض فيه جميع النتائج قبل التصفية، لتقوم الدالة بفحص مواضع هذه الأرقام وما قبلها من أسماء الكتب واختيار المطابق منها، واستثناء الأرقام المطابقة لكن لكتب أخرى

لذلك يوجد فيه مثل هذا

  image.png.c87e3f86ab074af017774f1f2381d705.png

وأنا هنا أسأل، هل يمكن استثناء مثل هذه النتائج، ووضع حقل جديد، مثلا: (CorrectMNONumbers) توضع فيه الأرقام التي تنطبق عليها الشروط فقط، وكأنها الأرقام الصحيحة المعتمدة ..

يعني أن تقوم الدالة ببحث جديد كل مرة بعد أن تجد نتيجة مطابقة، لكن تبدأ من المكان الذي وصلت إليه من (TAB) وتبحث من بعده حتى تصل إلى نهايته، وفي كل مرة تجد رقما مطابقا تضعه في (CorrectMNONumbers)، وتكمل البحث من حيث وصلت، وهكذا ينتهي جدول (TAB)

 * وأما المثال الذي ذكرته أخي الكريم الأربعين للبكري (ص 38-39) // البكري في الأربعين (ص 39) فيغلب على ظني أن الخطأ ليس من تغير اسم الكتاب، لأن كل حديث في موضع مستقل، المشكلة في (-) والرقم الذي بعدها، فحتى لو كان اسم الكتاب في الموضع الثاني الأربعين للبكري (ص 39) فلن تلتفت له لأنها وجدت هذا الرقم (39) في موضع آخر قبله

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

رابط هذا التعليق
شارك

أبدأ من حيث انتهيت
الدالة الان تطابق وتبحث عن رقم الصفحة قبل او بعد الـ -
يمكن ان نجعل الدالة تطابق النتائج القريبة فقط أي بعد الجزء و الفاصل 
فقد كنت أفكر في هذا الأمر والحمد لله تم التعديل علي الدالة
إليك الدالة الجديدة ومثال عليها
 

Public Function isBookInTextPageNum(ByVal fullText As String, _
                                    ByVal BookName As String, _
                                    ByVal partNum As String, _
                                    ByVal pageNum As String, _
                                    Optional exactPartOnly As Boolean = True, _
                                    Optional Nearest As Boolean = True) As Boolean
    
    On Error GoTo ErrorHandler
    
    Dim regex           As Object
    Dim matches         As Object
    Dim match           As Object
    Dim pattern         As String
    
    Set regex = CreateObject("VBScript.RegExp")

    If exactPartOnly Then
        If Nearest Then
            pattern = "(?:" & BookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & partNum & "\s*[;¡`,|_/\\ -]*\s*[;¡`,|'\(\[\{""]*" & pageNum & ")"
        Else
            pattern = "(?:" & BookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & partNum & "\s*[;¡`,\d|_/\\ -]*\s*[;¡`,\d|'\(\[\{""]*" & pageNum & ")"
        End If
    Else
        If Nearest Then
            pattern = "(?:" & BookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & partNum & "\s*[;¡`,|_/\\ -]*\s*[;¡`,|'\(\[\{""]*" & pageNum & "\s*[|_/\\ -]*\s*[|'\)\(\[\{""]*" & ")"
        Else
            pattern = "(?:" & BookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & partNum & "\s*[;¡`,\d|_/\\ -]*\s*[;¡`,\d|'\(\[\{""]*" & pageNum & "\s*[\d|_/\\ -]*\s*[|'\)\(\[\{""]*" & ")"
        End If
    End If

    With regex
        .Global = False
        .MultiLine = True
        .IgnoreCase = False
        .pattern = pattern
    End With

    Set matches = regex.Execute(fullText)

    If Not matches Is Nothing And matches.count > 0 Then
'        Debug.Print "Book(s) found in text:"
'        For Each match In matches
'            Debug.Print "Found : " & match.Value
'        Next
        isBookInTextPageNum = True
    Else
        isBookInTextPageNum = False
    End If

CleanAndExit:
    If Not regex Is Nothing Then Set regex = Nothing
    If Not matches Is Nothing Then Set matches = Nothing
    Exit Function

ErrorHandler:
    Debug.Print "Error: " & Err.Description
    isBookInTextPageNum = False
    Resume CleanAndExit
End Function

إذا أردت طباعة النتائج وقت الاختبار فقط قم بتفعيل هذا الجزء داخل الدالة بحذف علامة '
 

'        Debug.Print "Book(s) found in text:"
'        For Each match In matches
'            Debug.Print "Found : " & match.Value
'        Next

الان كود التجربة والنتائج

Sub Test_isBookInTextPageNum()

    Dim fullText        As String
    Dim BookName        As String
    Dim partNum         As String
    Dim pageNum         As String
    Dim result          As Collection
    Dim match           As Variant

    fullText = "The text includes book names and parts such as: bookName (1 \ 100 - 200 , 100-140), bookName (2 \ 150)."
    BookName = "bookName"
    partNum = "1"
    pageNum = "100"
    Debug.Print "------------------------------------"
    Debug.Print isBookInTextPageNum(fullText, BookName, partNum, pageNum, True, True)
    Debug.Print "------------------------------------"
    Debug.Print isBookInTextPageNum(fullText, BookName, partNum, pageNum, False, True)
    Debug.Print "------------------------------------"
    Debug.Print isBookInTextPageNum(fullText, BookName, partNum, pageNum, True, False)
    Debug.Print "------------------------------------"
    Debug.Print isBookInTextPageNum(fullText, BookName, partNum, pageNum, False, False)
    Debug.Print "------------------------------------"
End Sub

الان النتائج هي:

------------------------------------
Book(s) found in text:
Found : bookName (1 \ 100
True
------------------------------------
Book(s) found in text:
Found : bookName (1 \ 100 - 
True
------------------------------------
Book(s) found in text:
Found : bookName (1 \ 100 - 200 , 100
True
------------------------------------
Book(s) found in text:
Found : bookName (1 \ 100 - 200 , 100-140)
True
------------------------------------

فقد قمت بإضافة للدالة تتيح الاختيار بين أربع احتمالات باستخدامهم معاً
 Optional exactPartOnly As Boolean = True
هذا يخبر الدالة ان تقف عن وجود تطابق ام تكمل حتي أخر (
Optional Nearest As Boolean = True
وهذا يخبرها ان تقف عند أقرب نتيجة ام تكمل

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

داخل الدالة نعدل التالي
With regex
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .pattern = pattern
    End With

تم تغير من
.Global = False
إلي
.Global = True
والان نذهب للمثال ونعدل النص إلي
fullText = "The text includes book names and parts such as: bookName (1 \ 100 - 200 , 100-140), bookName (1 \ 100)."


ونكمل حديثنا بعد تجربة أخرى إن شاء الله

  • Thanks 1
رابط هذا التعليق
شارك

أخي الكريم .. لو تتكرم وترفع الملف بعد التحديث

فقد جربت استبدال كود 

isBookInTextPageNum

بالذي هنا ولم يعط النتائج المطلوبة 

رابط هذا التعليق
شارك

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

Sub Test_isBookInTextPageNum()

وانا في انتظار أن تقوم بالتجربة ومن ثم تخبرني او نتناقش في اي البدائل أفضل ليتم تطبيقه

 

رابط هذا التعليق
شارك

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information