في بعض الأحيان قد ترغب في سرد السجلات من استعلام أو جدول مع تلك الموجودة في جدول واحد أو أكثر لتشكيل مجموعة واحدة من السجلات - قائمة تضم جميع السجلات من جدولين أو أكثر. هذا هو الغرض من استعلام موحد في Access.
لفهم الاستعلامات الموحدة بشكل فعّال، يجب أولاً أن تكون على دراية بكيفية تصميم استعلامات التحديد الأساسية في Access. للتعرّف على المزيد حول كيفية تصميم استعلامات تحديد، اطلع على إنشاء استعلام تحديد بسيط.
دراسة مثال لاستعلام موحد قيد العمل
إذا لم تقم بإنشاء استعلام موحد من قبل، فقد تجد أنه من المفيد أولاً دراسة مثال قيد العمل في قالب Northwind Access. يمكنك البحث عن قالب النموذج لـ Northwind في صفحة بدء استخدام Access عن طريق النقر فوق ملف > جديد أو يمكنك تنزيل نسخة من هذا الموقع مباشرةً: قالب نموذج Northwind.
بعد أن يفتح Access قاعدة بيانات Northwind، تجاهل نموذج مربع حوار تسجيل الدخول الذي يظهر أولاً ثم قم بتوسيع "جزء التنقل". انقر فوق الجزء العلوي من "جزء التنقل" ثم حدد نوع العنصر لتنظيم جميع عناصر قاعدة البيانات حسب نوعها. بعد ذلك، قم بتوسيع المجموعة استعلامات وسيظهر استعلام يُسمى معاملات المنتج.
من السهل التمييز بين الاستعلامات الموحدة وعناصر الاستعلام الأخرى نظراً لأنها تحتوي على رمز خاص يشبه دائرتين متشابكتين يمثلان مجموعة متحدة من مجموعتين:
بخلاف استعلامات التحديد العادية والاستعلامات الإجرائية، لا ترتبط الجداول في استعلام موحد ما، وهذا يعني أنه لا يمكن استخدام مصمّم الاستعلام الرسومي في Access لإنشاء الاستعلامات الموحدة أو تحريرها. سوف تواجه ذلك إذا قمت بفتح استعلام موحد من "جزء التنقل"؛ يقوم Access بفتحه وعرض النتائج في طريقة عرض ورقة البيانات. ضمن الأمر طرق العرض على علامة التبويب الصفحة الرئيسية، ستلاحظ أن طريقة عرض التصميم غير متوفرة عند العمل على الاستعلامات الموحدة. يمكنك فقط التبديل بين طريقة عرض ورقة البيانات وطريقة عرض SQL عند العمل باستخدام الاستعلامات الموحدة.
لمتابعة دراسة مثال الاستعلام الموحد هذا، انقر فوق الصفحة الرئيسية > طرق العرض > طريقة عرض SQL لعرض بناء جملة SQL الذي يحدد ذلك. في الرسم التوضيحي التالي، قمنا بإضافة بعض التباعد الإضافي في SQL حتى تتمكن من رؤية الأجزاء المختلفة التي تشكل استعلام موحد بسهولة.
لنبدأ دراسة بناء جملة SQL الخاص بهذا الاستعلام الموحد من قاعدة بيانات Northwind بالتفصيل:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
الجزءان الأول والثالث من عبارة SQL هذه هما في الأساس استعلامي تحديد. تسترد هذه الاستعلامات مجموعتين مختلفتين من السجلات؛ أحدهما من جدول طلبات المنتج والآخر من جدول مشتريات المنتجات.
يمثل الجزء الثاني من عبارة SQL هذه الكلمة الأساسية UNION التي تحدد لـ Access أن هذا الاستعلام سيقوم بدمج هاتين المجموعتين من السجلات.
يحدد آخر جزء من عبارة SQL هذه ترتيب السجلات المدمجة باستخدام عبارة ترتيب حسب ORDER BY. في هذا المثال، سيقوم Access بترتيب السجلات بواسطة الحقل "تاريخ الطلب" بترتيب تنازلي.
ملاحظة: تكون الاستعلامات الموحدة للقراءة فقط دائماً في Access؛ لا يمكنك تغيير أي قيم في طريقة عرض ورقة البيانات.
إنشاء استعلام موحد عن طريق إنشاء استعلامات التحديد ودمجها
على الرغم من أنه يمكنك إنشاء استعلام موحد عن طريق كتابة بناء جملة SQL بشكل مباشر في طريقة عرض SQL، قد تجد أنه من الأسهل إنشائه في الأجزاء التي تحتوي على استعلامات التحديد. يمكنك بعد ذلك، نسخ أجزاء SQL ولصقها في استعلام موحد مدمج.
إذا كنت ترغب في تخطي قراءة الخطوات ومشاهدة مثال بدلاً من ذلك، فاطلع على المقطع التالي، مشاهدة مثال لإنشاء استعلام موحد.
-
على علامة التبويب إنشاء، في المجموعة استعلامات، انقر فوق تصميم الاستعلام.
-
انقر نقرا مزدوجا فوق الجدول الذي يحتوي على الحقول التي تريد تضمينها. يُضاف الجدول إلى نافذة تصميم الاستعلام.
-
في نافذة تصميم الاستعلام، انقر نقراً مزدوجاً فوق كل حقل من الحقول التي تريد تضمينها. عند تحديد الحقول، تأكد من إضافة عدد الحقول نفسه الذي أضفته إلى استعلامات التحديد الأخرى، وبالترتيب نفسه. انتبه إلى أنواع البيانات الخاصة بالحقول، وتأكد من أنها تتضمن أنواع بيانات متوافقة مع الحقول الموجودة في المكان نفسه في الاستعلامات الأخرى التي تقوم بدمجها. على سبيل المثال، إذا كان استعلام التحديد الأول يتضمن خمسة حقول، ويحتوي الحقل الأول على بيانات التاريخ/الوقت، فتأكد من أن كل استعلام تحديد من استعلامات التحديد الأخرى التي تقوم بدمجها يشتمل على خمسة حقول أيضاً، يحتوي أولها على بيانات التاريخ/الوقت، وهكذا.
-
يمكنك، بشكل اختياري، إضافة معايير إلى الحقول عن طريق كتابة التعبيرات المناسبة في الصف "معايير" الخاص بشبكة الحقل.
-
بعد الانتهاء من إضافة الحقول ومعايير الحقل، يجب تشغيل استعلام التحديد ومراجعة الإخراج الخاص به. ضمن علامة التبويب تصميم، في المجموعة نتائج، انقر فوق تشغيل.
-
بدّل الاستعلام إلى طريقة عرض التصميم.
-
احفظ استعلام التحديد، واتركه مفتوحاً.
-
كرر هذا الإجراء لكل استعلامات التحديد التي تريد دمجها.
الآن بعد أن قمت بإنشاء استعلامات التحديد الخاصة بك، لقد حان الوقت لدمجها. في هذه الخطوة، يمكنك إنشاء الاستعلام الموحد عن طريق نسخ ولصق عبارات SQL.
-
على علامة التبويب إنشاء، في المجموعة استعلامات، انقر فوق تصميم الاستعلام.
-
ضمن علامة التبويب تصميم، في المجموعة استعلام، انقر فوق موحد. سيقوم Access بإخفاء نافذة تصميم الاستعلام وإظهار علامة تبويب عنصر طريقة عرض SQL. في هذه المرحلة، تكون علامة تبويب طريقة عرض SQL الخاصة بالعنصر فارغة.
-
انقر فوق علامة التبويب الخاصة باستعلام التحديد الأول الذي تريد دمجه في الاستعلام الموحد.
-
ضمن علامة التبويب الصفحة الرئيسية، انقر فوق عرض > طريقة عرض SQL.
-
انسخ عبارة SQL الخاصة باستعلام التحديد. انقر فوق علامة التبويب الخاصة بالاستعلام الموحد الذي بدأت في إنشائه مسبقاً.
-
الصق جملة SQL الخاصة باستعلام التحديد في علامة تبويب كائن طريقة عرض SQL الخاصة باستعلام التوحيد.
-
احذف الفاصلة المنقوطة (;) الموجودة في نهاية جملة SQL الخاصة باستعلام التحديد.
-
اضغط على مفتاح الإدخال Enter لنقل المؤشر بمقدار سطر واحد للأسفل، ثم اكتب "UNION" على السطر الجديد.
-
انقر فوق علامة التبويب الخاصة باستعلام التحديد التالي الذي تريد دمجه باستعلام التوحيد.
-
كرر الخطوات من 5 إلى 10 الخاصة بهذا الإجراء حتى تقوم بنسخ كافة جمل SQL الخاصة باستعلامات التحديد ولصقها في نافذة طريقة عرض SQL الخاصة باستعلام التوحيد. لا تحذف الفاصلة المنقوطة أو تكتب أي شيء بعد جملة SQL الخاصة باستعلام التحديد الأخير.
-
من علامة التبويب تصميم، في المجموعة النتائج، انقر فوق تشغيل.
تظهر نتائج الاستعلام الموحد في طريقة عرض ورقة البيانات.
مشاهدة مثال حول إنشاء استعلام موحد
إليك مثال يمكنك إعادة إنشاؤه في قاعدة بيانات نموذج Northwind. يجمع هذا الاستعلام الموحد أسماء الأشخاص من جدول العملاء ويدمجها مع أسماء الأشخاص من جدول الموردين. إذا كنت ترغب في المتابعة، يمكنك العمل من خلال هذه الخطوات في نسختك من قاعدة بيانات نموذج Northwind.
فيما يلي الخطوات اللازمة لإنشاء هذا المثال:
-
قم بإنشاء استعلامي تحديد باسم "استعلام 1" و"استعلام 2" باستخدام جداول "العملاء" و"الموردين" على التوالي كمصادر بيانات. استخدم حقول "الاسم الأول" و"اسم العائلة" كقيم للعرض.
-
قم بإنشاء استعلام جديد يسمى "استعلام 3" بدون مصدر بيانات في البداية ثم انقر فوق الأمر موحد على علامة التبويب تصميم لتحويل هذا الاستعلام إلى استعلام "موحد".
-
قم بنسخ عبارات SQL ولصقها من استعلام 1 واستعلام 2 في استعلام 3. تأكد من إزالة الفاصلة المنقوطة الإضافية وإضافتها في الكلمة الأساسية "UNION". يمكنك بعد ذلك التحقق من النتائج في طريقة عرض ورقة البيانات.
-
يمكنك الإضافة في عبارة ترتيب في أحد الاستعلامات ثم لصق العبارة "ORDER BY" في طريقة عرض SQL الخاصة بالاستعلام الموحد. لاحظ أن في "الاستعلام 3"، الاستعلام الموحد، عندما يكون الطلب على وشك الإلحاق، تتم أولاً إزالة الفواصل المنقوطة، ثم اسم الجدول من أسماء الحقول.
-
يتمثل SQL الأخير الذي يقوم بدمج وفرز الأسماء لمثال الاستعلام الموحد هذا في التالي:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
إذا كنت مرتاحاً بشكل كبير حيال كتابة بناء جملة SQL، يمكنك بالتأكيد كتابة عبارة SQL الخاصة بك للاستعلام الموحد مباشرةً إلى طريقة عرض SQL. ومع ذلك، قد تجد أنه من المفيد اتباع نهج نسخ SQL ولصقه من عناصر الاستعلام الأخرى. يمكن أن يكون كل استعلام أكثر تعقيداً من أمثلة استعلام التحديد البسيطة المستخدمة هنا. ويمكن أن يكون لصالحك أن تقوم بإنشاء واختبار جميع الاستعلامات بعناية قبل دمجها في الاستعلام الموحد. في حالة فشل الاستعلام الموحد في التشغيل، يمكنك ضبط كل استعلام على حدة حتى ينجح ثم إعادة إنشاء استعلام موحد باستخدام بناء الجملة الذي تم تصحيحه.
يمكنك الاطلاع على المقاطع المتبقية من هذه المقالة للتعرّف على المزيد من التلميحات والنصائح حول استخدام الاستعلامات الموحدة.
في المثال من المقطع السابق باستخدام قاعدة بيانات Northwind، يتم دمج البيانات من جدولين فقط. ومع ذلك، يمكنك دمج ثلاثة من الجداول أو أكثر بسهولة في استعلام موحد. على سبيل المثال، استناداً إلى المثال السابق، قد ترغب أيضاً في تضمين أسماء الموظفين في إخراج الاستعلام. يمكنك تنفيذ هذه المهمة عن طريق إضافة استعلام ثالث والدمج مع عبارة SQL السابقة مع كلمة أساسية إضافية "UNION " كما يلي:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
عند عرض النتيجة في طريقة عرض ورقة البيانات، سيتم سرد جميع الموظفين باستخدام اسم الشركة النموذجي، وهو على الأرجح أمر غير مفيد للغاية. إذا كنت تريد أن يشير هذا الحقل إلى ما إذا كان الشخص موظفاً داخل الشركة أو من أحد الموردين أو من أحد العملاء، يمكنك تضمين قيمة ثابتة بدلاً من اسم الشركة. فيما يلي كيفية ظهور SQL:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
فيما يلي كيفية ظهور النتيجة في طريقة عرض ورقة البيانات. يعرض Access سجلات الأمثلة الخمسة التالية:
التوظيف |
اسم العائلة |
الاسم الأول |
داخل الشركة |
هوتاكي |
آيلة |
داخل الشركة |
ناتشي |
علياء |
المورّد |
معلوف |
عبد الوهاب |
العميل |
سراف |
مختار |
العميل |
صايغ |
مجاهد |
يمكن تقليل الاستعلام الموجود أعلاه بشكل أكبر نظراً لأن Access يقرأ أسماء حقول الإخراج فقط من الاستعلام الأول في استعلام موحد. سيظهر هنا أننا قمنا بإزالة الإخراج من مقطعي الاستعلام الثاني والثالث:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
في أحد استعلامات Access الموحدة، يتم السماح بالترتيب مرة واحدة فقط ولكن يمكن تصفية كل استعلام بشكل فردي. بناءً على الاستعلام الموحد للمقطع السابق، فيما يلي مثال على المكان الذي تمت فيه تصفية كل استعلام عن طريق إضافة عبارة "WHERE".
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر النتائج مماثلة لما يلي:
التوظيف |
اسم العائلة |
الاسم الأول |
المورّد |
باز |
فاضلة |
داخل الشركة |
هوتاكي |
آيلة |
العميل |
قريشي |
رجب |
داخل الشركة |
سماحة |
نيهاد |
المورّد |
بتلوني |
خديجة |
العميل |
سلمان |
امتياز |
المورّد |
حكيمي |
ثقيب |
المورّد |
شعبان |
ناجي |
داخل الشركة |
معروف |
نابغة |
المورّد |
أسود |
ملكة |
داخل الشركة |
كزبري |
غدي |
إذا كانت الاستعلامات الخاصة بالوحدة مختلفة تماماً، فقد تواجهك حالة حيث يجب أن يقوم حقل إخراج ما بجمع البيانات من أنواع بيانات مختلفة. إذا كان الأمر كذلك، فغالباً ما سيقوم الاستعلام الموحد بعرض النتائج كنوع بيانات نصية نظراً لأن هذا النوع من البيانات يمكنه الاحتفاظ بكل من النص و الأرقام.
لفهم كيفية عمل ذلك، سنستخدم الاستعلام الموحد الخاص بـ معاملات المنتج في قاعدة بيانات نموذج Northwind. افتح نموذج قاعدة البيانات هذا، ثم افتح الاستعلام "معاملات المنتج" في طريقة عرض ورقة البيانات. يجب أن تكون السجلات العشرة الأخيرة مماثلة لهذا الإخراج:
معرّف المنتج |
تاريخ الطلب |
اسم الشركة |
المعاملات |
الكمية |
77 |
2006/1/22 |
مورّد ب |
شراء |
60 |
80 |
2006/1/22 |
المورّد د |
شراء |
75 |
81 |
2006/1/22 |
مورد أ |
شراء |
125 |
81 |
2006/1/22 |
مورد أ |
شراء |
200 |
7 |
2006/1/20 |
الشركة د |
بيع |
10 |
51 |
2006/1/20 |
الشركة د |
بيع |
10 |
80 |
2006/1/20 |
الشركة د |
بيع |
10 |
34 |
2006/1/15 |
الشركة أأ |
بيع |
100 |
80 |
2006/1/15 |
الشركة أأ |
بيع |
30 |
لنفترض أنك تريد تقسيم حقل الكمية إلى قسمين - شراء وبيع. ولنفترض أيضاً أنك تريد الحصول على قيم صفرية ثابتة للحقل بدون قيمة. فيما يلي كيفية قيام SQL بالبحث عن هذا الاستعلام الموحد:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
في حالة التبديل إلى طريقة عرض ورقة البيانات، فسترى السجلات العشرة الأخيرة المعروضة الآن كما يلي:
معرّف المنتج |
تاريخ الطلب |
اسم الشركة |
المعاملات |
شراء |
بيع |
74 |
2006/1/22 |
مورّد ب |
شراء |
20 |
0 |
77 |
2006/1/22 |
مورّد ب |
شراء |
60 |
0 |
80 |
2006/1/22 |
المورّد د |
شراء |
75 |
0 |
81 |
2006/1/22 |
مورد أ |
شراء |
125 |
0 |
81 |
2006/1/22 |
مورد أ |
شراء |
200 |
0 |
7 |
2006/1/20 |
الشركة د |
بيع |
0 |
10 |
51 |
2006/1/20 |
الشركة د |
بيع |
0 |
10 |
80 |
2006/1/20 |
الشركة د |
بيع |
0 |
10 |
34 |
2006/1/15 |
الشركة أأ |
بيع |
0 |
100 |
80 |
2006/1/15 |
الشركة أأ |
بيع |
0 |
30 |
متابعة هذا المثال، ماذا لو كنت تريد أن تكون الحقول ذات الصفر فارغة؟ يمكنك تعديل SQL لعرض أي شيء بدلا من الصفر عن طريق إضافة في الكلمة الأساسية Null كما يلي:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
على الرغم من ذلك، نظراً لأنك قد لاحظت التبديل إلى طريقة عرض ورقة البيانات، لديك الآن نتيجة غير متوقعة. في العمود "شراء"، يتم مسح كل حقل:
معرّف المنتج |
تاريخ الطلب |
اسم الشركة |
المعاملات |
شراء |
بيع |
74 |
2006/1/22 |
مورّد ب |
شراء |
||
77 |
2006/1/22 |
مورّد ب |
شراء |
||
80 |
2006/1/22 |
المورّد د |
شراء |
||
81 |
2006/1/22 |
مورد أ |
شراء |
||
81 |
2006/1/22 |
مورد أ |
شراء |
||
7 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
51 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
80 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
34 |
2006/1/15 |
الشركة أأ |
بيع |
100 |
|
80 |
2006/1/15 |
الشركة أأ |
بيع |
30 |
ويحدث هذا نظراً لأن Access يحدد أنواع بيانات الحقول من الاستعلام الأول. في هذا المثال، لا تعتبر القيمة "Null" رقماً.
ماذا يحدث إذا حاولت إدراج سلسلة فارغة للقيمة الفارغة للحاويات؟ قد يبدو SQL لهذه المحاولة كما يلي:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
عند التبديل إلى طريقة عرض ورقة البيانات، سترى أن Access يسترد القيم "شراء"، ولكنه قام بتحويل القيم إلى نص. يمكنك معرفة أن هذه هي قيم نصية لأنه تمت محاذاتها إلى اليمين في طريقة عرض ورقة البيانات. السلسلة الفارغة في الاستعلام الأول ليست رقماً وهذا هو سبب ظهور هذه النتائج. كما ستلاحظ أن قيم "البيع" يتم تحويلها أيضاً إلى نص لأن سجلات الشراء تحتوي على سلسلة فارغة.
معرّف المنتج |
تاريخ الطلب |
اسم الشركة |
المعاملات |
شراء |
بيع |
74 |
2006/1/22 |
مورّد ب |
شراء |
20 |
|
77 |
2006/1/22 |
مورّد ب |
شراء |
60 |
|
80 |
2006/1/22 |
المورّد د |
شراء |
75 |
|
81 |
2006/1/22 |
مورد أ |
شراء |
125 |
|
81 |
2006/1/22 |
مورد أ |
شراء |
200 |
|
7 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
51 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
80 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
34 |
2006/1/15 |
الشركة أأ |
بيع |
100 |
|
80 |
2006/1/15 |
الشركة أأ |
بيع |
30 |
كيف يمكنك حل هذا اللغز؟
يتمثل الحل في دفع الاستعلام على توقع أن تكون قيمة الحقل رقماً. يمكن تحقيق ذلك باستخدام التعبير التالي:
IIf(False, 0, Null)
إن شرط التحقق، False، لن يكون أبداً True، وبالتالي سيعرض التعبير دائماً القيمة Null، ولكن لا يزال Access يقيّم كل من خيارات الإخراج ويقرر أن يكون الإخراج رقمياً أو "Null".
في ما يلي كيفية استخدام هذا التعبير في مثال العمل لدينا:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
لاحظ أنه ليس من الضروري تعديل الاستعلام الثاني.
في حالة التبديل إلى طريقة عرض ورقة البيانات، ستظهر الآن النتيجة المطلوبة:
معرّف المنتج |
تاريخ الطلب |
اسم الشركة |
المعاملات |
شراء |
بيع |
74 |
2006/1/22 |
مورّد ب |
شراء |
20 |
|
77 |
2006/1/22 |
مورّد ب |
شراء |
60 |
|
80 |
2006/1/22 |
المورّد د |
شراء |
75 |
|
81 |
2006/1/22 |
مورد أ |
شراء |
125 |
|
81 |
2006/1/22 |
مورد أ |
شراء |
200 |
|
7 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
51 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
80 |
2006/1/20 |
الشركة د |
بيع |
10 |
|
34 |
2006/1/15 |
الشركة أأ |
بيع |
100 |
|
80 |
2006/1/15 |
الشركة أأ |
بيع |
30 |
أحد الأساليب البديلة لتحقيق النتيجة نفسها تتمثل في إضافة الاستعلامات في الاستعلام الموحد مع استعلام آخر:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
بالنسبة لكل حقل، يعرض Access القيم الثابتة من نوع البيانات الذي تحدده. وبطبيعة الحال، فأنت لا ترغب في أن يتداخل إخراج هذا الاستعلام مع النتائج لذا تتمثل المهارة لتجنب ذلك في تضمين عبارة "WHERE" إلى "False":
WHERE False
هذه خدعة صغيرة نظراً لأن هذه القيمة دائماً ما تكون خاطئة ولا يعرض الاستعلام أي شيء. يمكنك دمج هذه العبارة مع SQL الموجود وسنصل إلى عبارة مكتملة كما يلي:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
ملاحظة: يعرض الاستعلام المدمج في هذا المثال باستخدام قاعدة بيانات Northwind 100 سجل، بينما يعرض الاستعلامان الفرديان 58 و43 سجل لإجمالي 101 من السجلات. والسبب في هذا التعارض لأن اثنين من السجلات ليست فريدة من نوعها. اطلع على المقطع، العمل مع سجلات مميزة في الاستعلامات الموحدة باستخدام UNION ALL، للتعرّف على كيفية حل هذا السيناريو باستخدام UNION ALL.
تتمثل أحد الحالات الخاصة لاستعلام موحد في دمج مجموعة من السجلات مع سجل واحد يحتوي على مجموع حقل واحد أو أكثر.
إليك مثال آخر يمكنك إنشاؤه في قاعدة بيانات نموذج Northwind لتوضيح كيفية الحصول على إجمالي في استعلام موحد.
-
قم بإنشاء استعلام جديد بسيط لعرض شراء المشروبات (معرّف المنتج= 34 في قاعدة بيانات Northwind) باستخدام بناء جملة SQL التالي:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر عمليات الشراء الأربعة:
تاريخ الاستلام
الكمية
2006/1/22
100
2006/1/22
60
4/4/2006
50
4/5/2006
300
-
للحصول على الإجمالي، قم بإنشاء استعلام تجميع بسيط باستخدام SQL التالي:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
قم بالتبديل إلى طريقة عرض ورقة البيانات وسيظهر سجل واحد فقط:
تاريخ استلام الحد الأقصى
مجموع الكمية
4/5/2006
510
-
ادمج هذين الاستعلامين في استعلام موحد لإلحاق السجل بإجمالي الكمية لسجلات الشراء:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر لك عمليات الشراء الأربعة مع مجموع كل عملية متبوعة بسجل يحسب إجمالي الكمية:
تاريخ الاستلام
الكمية
2006/1/22
60
2006/1/22
100
4/4/2006
50
4/5/2006
300
4/5/2006
510
التي تتناول أساسيات إضافة الإجماليات إلى استعلام موحد. قد ترغب أيضاً في تضمين قيم ثابتة في كل من الاستعلامين مثل "التفاصيل" و"الإجمالي" لفصل السجل الكلي عن السجلات الأخرى بشكل مرئي. يمكنك مراجعة استخدام القيم الثابتة في المقطع دمج ثلاثة أو أكثر من الجداول أو الاستعلامات في استعلام موحد.
تتضمن الاستعلامات الموحدة في Access بشكل افتراضي سجلات مميزة فقط. ولكن ماذا لو كنت تريد تضمين جميع السجلات؟ قد يكون هناك مثال آخر مفيد هنا.
في المقطع السابق، وضحنا لك كيفية إنشاء إجمالي في استعلام موحد. قم بتعديل هذا الاستعلام الموحد الخاص بـ SQL لتضمين "معرّف المنتج"= 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر لك نتيجة مضللة إلى حد ما:
تاريخ الاستلام |
الكمية |
2006/1/22 |
100 |
2006/1/22 |
200 |
لا يعرض سجل واحد بالتأكيد الكمية مرتين في الإجمالي.
ويكون السبب في رؤية هذه النتيجة هو أنه في يوم واحد تم بيع نفس الكمية من الشوكولاتة مرتين - كما هو مسجل في جدول "تفاصيل طلبات الشراء". فيما يلي نتيجة استعلام تحديد بسيط يعرض كل من السجلين في قاعدة بيانات نموذج Northwind:
معرف طلب الشراء |
المنتج |
الكمية |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
في الاستعلام الموحد الذي تمت الإشارة إليه مسبقاً، يمكنك ملاحظة أن حقل "معرّف طلب الشراء" غير مضمّن وأن الحقلين لا يشكلان سجلين مميزين.
إذا كنت تريد تضمين جميع السجلات، يمكنك استخدم "UNION ALL" بدلاً من "UNION" في SQL. من المرجح أن يكون لهذا تأثير على فرز النتائج، لذا قد تحتاج أيضاً إلى تضمين عبارة "ORDER BY" لتحديد ترتيب الفرز. فيما يلي استعلام SQL المعدل استناداً إلى المثال السابق:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر لك جميع التفاصيل بالإضافة إلى إجمالي كسجل أخير:
تاريخ الاستلام |
الإجمالي |
الكمية |
2006/1/22 |
100 |
|
2006/1/22 |
100 |
|
2006/1/22 |
الإجمالي |
200 |
يتمثل أحد الاستخدامات الشائعة لاستعلام موحد في أن يعمل كمصدر السجل لعنصر تحكم مربع تحرير وسرد في نموذج. يمكنك استخدام مربع التحرير والسرد هذا لتحديد قيمة لتصفية سجلات النموذج. على سبيل المثال، تصفية سجلات الموظفين حسب مدينتهم.
للاطلاع على كيفية عمل ذلك، إليك مثال آخر يمكنك إنشاؤه في قاعدة بيانات نموذج Northwind لتوضيح هذا السيناريو.
-
قم بإنشاء استعلام تحديد بسيط باستخدام بناء جملة SQL التالي:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر النتائج التالية:
المدينة
عامل التصفية
مكة
مكة
الرياض
الرياض
المنامة
المنامة
الدوحة
الدوحة
مكة
مكة
المنامة
المنامة
مكة
مكة
المنامة
المنامة
مكة
مكة
-
بالنظر إلى هذه النتائج، قد لا ترى الكثير من القيم. قم بتوسيع الاستعلام وتحويلها إلى استعلام موحد باستخدام SQL التالي:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
قم بالتبديل إلى طريقة عرض ورقة البيانات وستظهر النتائج التالية:
المدينة
عامل التصفية
<الكل>
*
الرياض
الرياض
الدوحة
الدوحة
المنامة
المنامة
مكة
مكة
يقوم Access بإجراء توحيد للسجلات التسعة، المعروضة مسبقاً، مع قيم الحقل الثابتة من <الكل> و"*".
نظراً لعدم احتواء عبارة الوحدة هذه على "UNION ALL"، فسيقوم Access بعرض السجلات المميزة فقط مما يعني أن كل مدينة يتم عرضها مرة واحدة فقط بقيم متطابقة ثابتة.
-
الآن وبعد أن يصبح لديك استعلام موحد مكتمل يعرض اسم كل مدينة مرة واحدة فقط، بالإضافة إلى خيار يحدد جميع المدن بشكل فعالة، يمكنك استخدام هذا الاستعلام كمصدر سجل لمربع تحرير وسرد في نموذج. باستخدام هذا المثال المحدد كنموذج، يمكنك إنشاء عنصر تحكم مربع تحرير وسرد في نموذج وتعيين هذا الاستعلام كمصدر سجل له وتعيين الخاصية "عرض العمود" لعمود "التصفية" إلى 0 (صفر) لإخفائه بشكل مرئي، ثم تعيين الخاصية "عمود منضم" إلى 1 للإشارة إلى فهرس العمود الثاني. في خاصية "عامل التصفية" للنموذج نفسه، يمكنك بعد ذلك الإضافة في التعليمات البرمجية كما يلي لتنشيط عامل تصفية نموذج باستخدام قيمة ما تم تحديده في عنصر تحكم مربع التحرير والسرد:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
يمكن لمستخدم النموذج بعد ذلك تصفية سجلات النموذج إلى اسم مدينة محددة أو تحديد <الكل> لسرد جميع السجلات لجميع المدن.