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

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

قام بنشر (معدل)

السلام عليكم

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

test.mdb

تم تعديل بواسطه ابو جودي
تنسيق
قام بنشر

ان شاء الله عند استخدم هذه الجمله فى استعلام تجد من ورائها مبتغاك
 

SELECT t1.*
FROM test AS t1
WHERE EXISTS (
    SELECT 1
    FROM test AS t2
    WHERE 
        t2.[رقم الزبون] = t1.[رقم الزبون]
        AND t2.[إسم المادة] = t1.[إسم المادة]
        AND t2.[تاريخ الفاتورة] < t1.[تاريخ الفاتورة]
        AND t2.[تاريخ الفاتورة] >= DateAdd("m", -3, t1.[تاريخ الفاتورة])
);

ملاحظة هامة :- 
استخدمت t1 وt2 ليس تغييرا في اسم الجدول
بل هو اسم مستعار مؤقت داخل الاستعلام
أفضل ذلك عندما أستخدم نفس الجدول مرتين في مقارنة داخلية
حتى يفهم Access أي نسخة نقصد داخل الاستعلام (خصوصا مع EXISTS أو JOIN)

 

في الاستعلام المستخدم نحن نبحث داخل نفس الجدول test مرتين:

  • مرة للصف الأساسي (t1)
  • ومرة للصفوص الأخرى التي نبحث بينها عن التكرارات (t2)


t1 هو السجل الأساسي الذي نتحقق منه
t2 هو سجل آخر في الجدول نبحث فيه عن تطابقات

الشرط EXISTS يتحقق من وجود أي سجل آخر بنفس اسم المادة ورقم الزبون في نطاق 3 شهور قبل تاريخ الفاتورة الحالية



ولكن نصيحة ذهبيه

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

قام بنشر

هذا استعلام مركب
الاستعلام الاساسى الذى يمثل الجدول ككل هو
وتتم عملية التسمية المؤقته كما شرحتها لك سابقا من خلال : AS t1

SELECT t1.*FROM test AS t1 ;

واضفت بداخله ستعلام فرعى وبه جمله شرطيه 

SELECT 1
FROM test AS t2
WHERE t2.[رقم الزبون] = t1.[رقم الزبون]
        AND t2.[إسم المادة] = t1.[إسم المادة]
        AND t2.[تاريخ الفاتورة] < t1.[تاريخ الفاتورة]
        AND t2.[تاريخ الفاتورة] >= DateAdd("m", -3, t1.[تاريخ الفاتورة]);

وطبعا فى الاستعلام الغرعى والخاص بجملة الشرط استخدمت التسمية المؤقته : AS t2

كما تقدم فى الشرح السابق سبب استخدام تسميات مختلفى لنفس الجدول

قام بنشر

مشكور اخي 

إدا كان  تاريخ الفاتورة مكرر مرتين نفس اليوم

وادا اردت اضافة شرط  اخر  هل اكتب هكذا

SELECT 1
FROM test AS t2
WHERE t2.[رقم الزبون] = t1.[رقم الزبون]
        AND t2.[إسم المادة] = t1.[إسم المادة]
        AND t2.[حجم المادة] = t1.[حجم المادة]
        AND t2.[تاريخ الفاتورة] < t1.[تاريخ الفاتورة]
        AND t2.[تاريخ الفاتورة] >= DateAdd("m", -3, t1.[تاريخ الفاتورة]);
قام بنشر

لا افهم ماذا تريد تحديدا

هل السؤال

24 دقائق مضت, RAIANESAMI said:

إدا كان  تاريخ الفاتورة مكرر مرتين نفس اليوم

الاجابه لا جديد ولا تعديل على الكود فالسطر :
 

 AND t2.[تاريخ الفاتورة] >= DateAdd("m", -3, t1.[تاريخ الفاتورة]);

يحتوى على  >=


ولو كان هذا سؤال أخر منفصل بذاته عن موضوع تكرار تاريخ الفاتورة مرتين نفس اليوم

24 دقائق مضت, RAIANESAMI said:

وادا اردت اضافة شرط  اخر  هل اكتب هكذا
 

AND t2.[حجم المادة] = t1.[حجم المادة]

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


طيب اذا كان التاريخ متضمنا وقت
لنتلافى ههذ المشكلة تكون جملة الاستعلام بالشكل التالى من خلال : DateValue


 

SELECT t1.*
FROM test AS t1
WHERE EXISTS (
    SELECT 1
    FROM test AS t2
    WHERE 
        t2.[رقم الزبون] = t1.[رقم الزبون]
        AND t2.[إسم المادة] = t1.[إسم المادة]
        AND DateValue(t2.[تاريخ الفاتورة]) >= DateAdd("m", -3, DateValue(t1.[تاريخ الفاتورة]))
        AND DateValue(t2.[تاريخ الفاتورة]) <= DateValue(t1.[تاريخ الفاتورة])
        AND t2.[تاريخ الفاتورة] <> t1.[تاريخ الفاتورة]
);

 

قام بنشر

استخدم الكود التالى كجملة استعلام عن طريق Count
ولا تزعل نفسك يا سيدى انت تأمر :eek2:

 

SELECT t1.*
FROM test AS t1
WHERE ((((SELECT Count(*)
    FROM test AS t2
    WHERE 
        t2.[رقم الزبون] = t1.[رقم الزبون]
        AND t2.[إسم المادة] = t1.[إسم المادة]
        AND t2.[حجم المادة] = t1.[حجم المادة]
        AND DateValue(t2.[تاريخ الفاتورة]) >= DateAdd("m", -3, DateValue(t1.[تاريخ الفاتورة]))
        AND DateValue(t2.[تاريخ الفاتورة]) <= DateValue(t1.[تاريخ الفاتورة])
    ))>1));

 

قام بنشر


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

SELECT t1.*
FROM test AS t1
INNER JOIN (
    SELECT [رقم الزبون], [إسم المادة], [حجم المادة]
    FROM test
    GROUP BY [رقم الزبون], [إسم المادة], [حجم المادة]
    HAVING COUNT(*) > 1
      AND MAX([تاريخ الفاتورة]) >= DateAdd("m", -3, MIN([تاريخ الفاتورة]))
) AS t2
ON t1.[رقم الزبون] = t2.[رقم الزبون]
   AND t1.[إسم المادة] = t2.[إسم المادة]
   AND t1.[حجم المادة] = t2.[حجم المادة];



 

  • روح لـ Create > Query Design
  • في SQL View الصق الكود أعلاه

    المرفق

     

test_05.mdb

قام بنشر
4 دقائق مضت, RAIANESAMI said:

نفس ناريح صحيحة

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

 

الصورة دى مش من المرفق الاخيـــر صح ؟

 

قام بنشر

للتوضيح اكثر اذا كان تاريخ الفاتورة 01/03/2025

أي تاريخ موجود قبل تاريخ 01/03/2025 لمدة 03اشهر أقل منه او يساويه يخرجه الاستعلام

مثل

01/03/2025

10/02/2025

أي في  مجال من 01/12/2024الى  غابة 01/03/2025

قام بنشر

السلام عليكم 

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

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

Important Information