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

استعلام لايجاد حقول متعددة قيمتها خالية

مغلق
بدأه عربية في 7 يناير 2003 · 24 رد · 2,310 مشاهدة · في مراجعة المواضيع
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي جدول يحتوي على عدد 390 سجل يتضمن كل سجل مجموعة حقول والبعض من هذا الحقول لايوجد به بيانات

احاول الحصول على قائمة بالسجلات تلك

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

تاريخ - نص - رقم

بعضها اعتقد انه يحتوي مسافات او قيمة اخرى فهو لا يظهر ضمن استعلام يرجع قيم Null ولا مع هذه العلامة""

اريد عمل استعلام يعيد السجلات التي تحتوي اي حقل خالي

شكراً للجميع

#2

ممكن ذلك اضغطي على الرابط في الاستعلام في الزر الايمن ثم اذهبي الى خصائص واختاري الخيار الثاني او الثالث حسب المطلوب

وبالتوفيق

من سار على الدرب وصل

#3

شكرا لك مفرح

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

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

اما البرنامج يعتبرها مختلفة عند التعامل معها

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

فكرت بتجربة الاستبدال لوضع عبارة او مسافة واحدة في الحقول بعد فرزها لكنني احببت استشارتكم قبل ذلك خوفاً من ضياع او تلف بيانات الجدول

شكراً لكم

#4

أرجوا تجربة التالي:

يصمم استعلام يحتوي على الجدول أو الجداول التي بها الحقول المطلوبة ثم

يوضع التعبير التالي ([اسم الحقل])LEN ويسمى مثلاً EXP ويوضع الشرط التالي في حقل المعايير اسفل هذا التعبير0=([اسم الحقل])LEN أرجو أن تظهر بعد ذلك الحقول الغير محتويه على بيانات.

#5

الأخت الكريمة

السلام عليكم

بالنسبة التعامل أكسس مع الحقول الفارغة فهي في الغالب إما خالية Null أو صفرية "" أما ما ذكرته عن المسافات فهو نادر لأنه عادة يكون من فعل المستخدم

على كل حال حتى يكون حديثي واضحاً فلعلي أفرعه في النقاط التالية :

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

2- القيم الخالية Null يمكن أن توجد في أي حقل من حقول البيانات

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

http://www.arabteam2000.com/vb/showthread....&threadid=17811

4- بالنسبة لاحتمال وضع المستخدم مسافات في الحقل فهذه يمكن القضاء عليها بسهولة عن طريق استخدام دالة Trim التي تقوم بإزالة المسافات من أول وآخر النص المرر لها ويمكن استخدامها بالصيغة التالية :

Trim ( "     أبو هاجر      ")

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

ولو استعملت الدالة السابقة في استعلام تحديث فسيتم حذف أي مسافات موجودة في الحقول

هذا ما أستطيع أن أوضحه في هذه العجالة

تحياتي

أخوك / أبو هاجر

#6

شكرا لك المزيني

لكنني اريد البحث خلال الجدول عن الحقول وقد جربت طريقتك وهي تعمل في حال تطبيقها على حقل واحد ويكون طولة =0

في الاستعلام وعند استعمال التدرج في معايير الاستعلام بواسطة وضع الشرط في صفوف متتالية تحت الحقول لا تعمل فما السبب

شكراُ لك

#7

شكراً لاستاذنا ابو هاجر لم اشاهد ردك الا الآن

#8

بعد إذن أبي هاجر :

مما تقدم يمكننا أن نخلص إلى التالي :

يمكننا أن نفحص الـ Null و "" و Spaces (المسافات) بهذه التركيبة :

Trim(Nz([Field1]))=""

وذلك لأنواع الحقول التالية :

Text,Memo,Number,Date

أما الـ YesNo فحسب علمي لا يمكن فحص قيمة الـ Null حيث القيمة الإفتراضية لها هي False أو صفر . ( آمل من أخي أبو هاجر التعليق على هذه النقطة إن أمكن ) .

تحياتي .

#9

إضافة بسيطة :

اقتباس
دالة Trim التي تقوم بإزالة المسافات من أول وآخر النص

وأضيف عليها وإزالة المسافات من وسط النص أيضا .

ويوجد شبيها لها مثل :

RTrim لإزالة المسافات التي على يمين النص فقط .

LTrim لإزالة المسافات التي على يسار النص فقط .

تحياتي .

#10

إذا حضر الماء بطل التيمم وإذا تحدث أبو هاجر رفعت أناملي عن مفاتيح لوحتي.

#11

السلام عليكم

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

يعلم الله كم أفرح حين أشاهد مداخلاتك ولا تتصور كم تثريني وأستفيد منها

أخي الكريم

بالنسبة لدالة Trim فهي في الحقيقة تزيل المسافات من أول النص وآخره فقط أو بعبارة أخرى من يمينه ويساره فيه تقوم بدور الدالتين RTrim و LTrim معاً وهي مشابهة للصيغة التالية :

Ltrim(rtrim("yourtext"))

إذ تؤدي نفس النتيجة

بالنسبة لحقول False/True فهي في الحقيقة في الجدول تحتمل القيمتين False/True فقط أما في عناصر التحكم غير المرتبطة في النموذج فتحتمل القيم الثلاث : القيمتين السابقتين مع قيمة خالي NULL

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

أخيراً بالنسبة للكود الذي ذكرته وهو :

Trim(Nz([Field1]))=""

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

الأخ المزيني

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

تحياتي لكم جميعاً

أخوكم / أبو هاجر

#12

أخي أبا هاجر .. بارك الله فيك

يشهد الله أنه شعور متبادل .

أخي لقد التبس علي أمر الدالة المستخدمة بالأكسل Trim worksheet function فأنا من محبي الأكسل وأكثر من استخدامه وهذا ما يجعل دائما الأمور تختلط علي بين الأكسس والأكسل . فهي في الأكسل تزيل كل المسافات ولكن مع فرق بسيط مما ذكرته وهو الإبقاء على مسافة واحدة فقط بين الكلمات .

أما موضوع الـ YesNo نوع الحقل بالجداول فلا زلت غير واثق من قيمة الـ Null وأعتقد أن ما أوضحته هو قيمة الأداة Check box للنماذج .

أعتقد لو أن قيمة حقل الـ YesNo تحتوي على الـ Null فسوف تتفاعل مع دالة IsNull ولكنها لا تفعل .

تحياتي

ملاحظة : أنا أستخدم أكسس 97 وقد يكون هناك اختلافات في الإصدارات الأخرى .

#13

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

السلام عليكم

اقتباس
أما موضوع الـ YesNo نوع الحقل بالجداول فلا زلت غير واثق من قيمة الـ Null وأعتقد أن ما أوضحته هو قيمة الأداة Check box للنماذج  

.

بالضبظ هذا صحيح

أخوك / أبو هاجر

#14

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

جزاكم الله خير جميعا .

وإلى المزيد

#15

وهذين كودين لمعالجة موضوع المسافات حسب ما استفدته من الموضوع أعلاه ، أرجو الملاحظة :

Public Function OnlyOneSpace(ByVal TheStr As Variant)
' كود يزيل المسافات من أول الاسم وآخره ويزيل المسافات المتكررة في الوسط
Dim TheLetter As String, PreviousLetter As String, TheNewWord As String
Dim I As Integer

TheStr = CStr(Nz(TheStr, ""))

For I = 1 To Len(TheStr)
    TheLetter = Mid(TheStr, I, 1)
    If I <> 1 Then PreviousLetter = Mid(TheStr, I - 1, 1)
    If Trim(TheLetter) <> TheLetter And Trim(PreviousLetter) <> PreviousLetter Then TheLetter = ""
    TheNewWord = TheNewWord & TheLetter
Next

OnlyOneSpaces = Trim(TheNewWord)

End Function

Public Function NoSpaces(ByVal TheStr As Variant)
' كود يزيل جميع المسافات من الاسم
' يفيد في البحث عن بعض الأسماء التي يكثر الخطأ في المسافات فيها مثل عبد الرحمن
Dim TheLetter As String, TheNewWord As String
Dim I As Integer

TheStr = CStr(Nz(TheStr, ""))

For I = 1 To Len(TheStr)
    TheLetter = Mid(TheStr, I, 1)
    If Trim(TheLetter) <> TheLetter Then TheLetter = ""
    TheNewWord = TheNewWord & TheLetter
Next

NoSpaces = TheNewWord
End Function

وبرفقه مثال

nospace3.zip

#16

أخي الكريم حارث

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

السلام عليكم

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

الدالة التالية يمكن أن تقوم بعمل دالة Replace هي تصلح مع أي نص

Public Function Replace(sString As Variant _

          , sFind As String _

          , sReplace As String _

          , Optional iCompare As Long = vbBinaryCompare) 

       _ As Variant



    Dim iStart As Integer, iLength As Integer

    If IsNull(sString) Then

        Replace = Null

    Else

        iStart = InStr(1, sString, sFind, iCompare)

        Do While iStart > 0

            sString = Left(sString, iStart - 1) _

                    & sReplace & Mid(sString, iStart + Len(sFind), Len(sString) - iStart - Len(sFind) + 1)

            iStart = InStr(iStart, sString, sFind)

        Loop

        Replace = sString

    End If



End Function

المتغيرات

sString النص

sFind النص الذي تريد استبداله

sReplace النص الذي تريد وضعه مكان النص السابق

iCompare نوع المقارنة ثنائي أو عشري

تحياتي

أخوكم / أبو هاجر

#17

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

مثلا : عند استبدال مسافتين بمسافة واحدة في نص ما :

تتحول المسافتين إلى مسافة

والثلاث مسافات والأربع إلى مسافتين

والخمس مسافات والست إلى ثلاث مسافات .

لهذا في الوورد -الذي تكثر فيه هذه المشكلة - أجريه أحيانا باستخدام زر الاستبدال بالشكل التالي :

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

#18

تعديل على دالة الأخ أبي هاجر للتلاءم مع مطلب الأخ حارث :

Public Function myTrim(sString As Variant) As Variant

  Dim iStart As Integer

    

  If IsNull(sString) Then

    myTrim = Null

  Else

    sString = Trim(sString)

    iStart = InStr(1, sString, "  ")

    Do While iStart > 0

      sString = Left(sString, iStart - 1) & _

                Mid(sString, iStart + 1, Len(sString))

      iStart = InStr(iStart, sString, "  ")

    Loop

    myTrim = sString

  End If

    

End Function

تحياتي .

#19

جزاكم الله خير جميعا ، وجعل ذلك في موازين حسناتكم

وتنبهت من ردك أخي أبو هادي أن كود أبو هاجر من الأساس كان يفي بالغرض

وهذا مثال على الكودين

replace22.zip

#20

السلام عليكم

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

أخي حارث لم أقم بعد بتنزيل المثال وسوف أفعل بعد حين .

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

#21

نعم أخي حارث أنه مثال ممتاز يدعو للتأمل .

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

سوف أقوم بتبديل بسيط .. بسيط جدا ولم آتي بأي إضافة على عدد الحروف أو الكلمات المستعملة في استخدامك لدالة التبديل Replace ولك كل الحق في أخذ الوقت الكافي في تأمله ( أي التبديل البسيط ) والرجوع إلينا بما توصلت إليه إن شاء الله .

لقد استخدمت الدالة في الإستعلام كالتالي :

Trim(Replace([Str],"  "," "))

واقتراحي لتحسين استخدام نفس الدالة كالتالي :

 Replace(Trim([Str]),"  "," ")

وكذلك هذه الملاحظة للجميع آمل منكم المداخلة .

تحياتي .

#22

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

السلام عليكم

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

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

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

تحياتي

أخوكم / أبو هاجر

#23

لقد عملت إضافة لمثال حارث لإختبار السرعات آمل الملاحظة .

trimfunction.zip

#24

تعديل المثال لتوضيح الفكرة بشكل أكبر

trimfunction.zip

#25

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

ومثال المقارنة واضح جدا .

وحقيقة لما كنت أكتب المثال حرت بين الصيغتين

Trim(Replace(strOld, " ", " "))

و

Replace(Trim(strOld), " ", " ")

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

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

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

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

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

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

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

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

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