![]() |
استعلامات التحديث Update Queries إعداد : محمد طاهر |
استعلام التحديث Update Queries
لتحديث بيانات مجموعة من السجلات من جدول أو أكثر ، و يقوم بتحديث بينات حقول محددة فى جداول موجودة مسبقا .
الخطوة الاولي فى تكوين استعلام تحديث هي تصميم استعلام تحديد عادي Select Query ثم نحول نوع الاستعلام ، و نفس هذا الاجراء نستخدمه مع استعلامات الحذف و الاضافة و تكوين جدول ، و استعلام الجداول المحورية ، الا أن الأخير يمكن تكوينه باستخدام المعالج كما سبق و تحدثنا
لذا سنبدأ بتصميم استعلام اختيار ( تحديد ) أي Select query ، يحوي البيانات المطلوب تحديثها ، و ذلك باختيار الحقول المطلوب تحديثها ( تعديل قيمتها ) و المعايير التي ستخضع لها عملية التحديث
لنفرض أننا نريد تحديث جميع الأسعار باضافة 10% اليها ، و هذا يتمثل فى حقل UnitPrice من جدول الطبيات فسيكون استعلام الاختيار مثل Q1 فى المثال المرفق
SELECT
Products.UnitPrice
FROM Products;
و ينتج عنه عرض 77 سجل ، و بالتالي عند
التحويل الي
استعلام تحديث فى الخطوة القادمة سيتم تحديث 77 سجل
.
اما اذا أردنا قصر التعديل علي القيم الأكبر من 20 ، فسنضع شرط > 20 فى حقل المعايير Criteria و يكون الاستعلام مثل Q2 كالتالي :
SELECT
Products.UnitPrice
FROM Products
WHERE (((Products.UnitPrice)>20));
و ينتج عنه عدد 37 سجل ، و بالتالي عند التحويل الي تستعلام تحديث فى الخطوة القادمة سيتم تحديث 37 سجل فقط .
تحويل استعلام التحديد الي استعلام تحديث
ثم بعد
التأكد من صحة الاختيار
يأتي دور تعديل نوع الاستعلام
، من وضع تصميم الاستعلام نفتح ايقونة نوع الاستعلام
، و نختار استعلام تحديث
Update query .
فتظهر لنا بعد الاختيار خانة اضافية اسمها update To و التي سنكتب بها قيمة التحديث الذي سيحدث علي الحقل ، و هنا التحديث عبارة عن ضرب قيمة الحقل نفسه فى 1.1 .
و هنا يكون كافيا كتابة اسم الحقل فقط كالتالي
[UnitPrice]*1.1
و لكن كتابة اسم الحقل بعد اسم الجدول الذي يحويه هي الطريقة العامة ، حيث ان استعلام التحديث قد يحوي أكثر من جدول و ليس جدول واحد فقط لذا نكتب اسم الجدول .
و لكتابة اسم الحقل و اسم الجدول فى خانة Update To يمكن الكتابة مباشرة ، و لكن سننتهز الفرصة لنتعرف علي المعالج السحري ، المشار اليه فى الشكل السابق . فنقف اولا بالماوس فى خانة Update To ثم نضغط علي ايقونة المعالج السحري ، فتنفتح الشاشة التالية
و منها نختار الجداول ، ثم جدول المنتجات ، ثم اسم الحقل المطلوب ، و كل هذا بالنقر المذدوج ، ثم نضيف عملية الضرب * 1.1 ، و نضغط OK فتتم الكتابة فى شبكة الاستعلام
و كما نلاحظ فى الشكل السابق ، فان المعالج يساعدنا فى كتابة أسماء الكائنات المختلفة و اجراء العمليات عليها
نعود الي الاستعلام ، ثم نحفظ الاستعلام باسم q3
و تكون جملة الاس كيو ال به هي :
UPDATE
Products SET
Products.UnitPrice = [Products]![UnitPrice]*1.1
WHERE
(((Products.UnitPrice)>20));
و تبقي الخطوة الأخيرة ، و هي تنفيذ الاستعلام
تنفيذ استعلام التحديث
اذا قمت بتنفيذ استعلام تحديث ، فلن يمكنك استرجاع البيانات المعدلة ، لذا يعتبر من التطبيق الجيد أن تعرض الاستعلام الذي أعددته قبل أن تنفذه ، و ذلك :
باختيار
نوع الاستعلام
من الايقونة Select Query
و تشغيله
من زر التنفيذ
أو
الطريقة
الثانية : نختار عرض
البيانات فى وضع العرض datasheet view
و هي الاسهل
و بعد استعراض البيانات نعود ثانية الي استعلام التحديث :
باختيار ايقونة نوع الاستعلام و نختار الخيار الأخير Update Query فى الحالة الاولي
او نضغط علي زر التصميم فى حالة الطريقة
الثانية
ثم نختار تنفيذ الاستعلام من علامة التعجب
الحمراء
فى الزر المجاور .
فتظهر رسالة تحذيرية بانه سيتم تحديث البيانات ، و يممكنا اما
الموافقة او التراجع و الغاء عملية التحديث .
و الآن لننفذ استعلام تحديث أكثر تعقيدا
نريد تحديث الاسعار الي 110% بشرط أن يكون اسعر أكبر من 20 ، و يكون وصف المجموعة ( الموجود فى جدول آخر هو جدول التصنيفات ) يبدأ بكلمة sweet و فى نفس الوقت يتم تحديث وصف المجموعة باضافة sssss الي نهايته
جرب عمل الاستعلام ، و هو يقوم بتحديث 7 سجلات ، و هو موجود في المثال q4 فى الملف المرفق ، و جملة الاس كيو ال به هي
UPDATE
Categories INNER
JOIN Products
ON
Categories.CategoryID = Products.CategoryID
SET
Products.UnitPrice = [Products]![UnitPrice]*1.1, Categories.Description =
[Categories]![Description] & "ssss"
WHERE
(((Categories.Description) Like "sweet*")
AND
((Products.UnitPrice)>20));
جميل ؟؟؟
لا ما هو جميل هناك خطأ فى هذا الاستعلام ، الاو هو أن كل سجل من جدول التصنيف يناظره عدة سجلات فى جدول الاصناف
أي ان التصنيف الذي ينطبق عليه الشرط يشمل 7 منتجات فى جدول المنتدات
و بتنفيذ الاستعلام كما سبق ، سيتم تحديث جدول المنتجات بالنسبة للاسعار التي تزيد عن ال 20 لكل من المنتجات التي تندرج تحت هذا التصنيف
و لكن سيتم فى نفس الوقت اضافة sssss الي الوصف مع تحدبث كل سجل من السجلات . و ليس مرة واحد كما ينبغي .
لذا طلب مثل هذا كان ينبغي تنفيذه باستخدام استعلامي تحديث منفصلين
الاول يعدل القمية ، و الثانية يعدل الوصف ، حيث أن الحقلان المطلوب تعديلهما موجودان فى جدولان مختلفان بينهما علاقة من نوع واحد الي متعدد
و يكون الاستعلامان كما فى q5 و q6
UPDATE Categories
INNER JOIN Products ON Categories.CategoryID = Products.CategoryID
SET Products.UnitPrice = [Products]![UnitPrice]*1.1
WHERE (((Products.UnitPrice)>20) AND
((Categories.Description) Like "sweet*"));
و في الاستعلام الثاني لابد من اختيار خيار unique records كما تحدثنا سابقا لمنع التكرار :
UPDATE
DISTINCTROW Categories INNER JOIN Products
ON Categories.CategoryID = Products.CategoryID SET Categories.Description =
Categories!Description & "ssss"
WHERE (((Categories.Description) Like "sweet*") AND ((Products.UnitPrice)>20));
و طبعا ما اضطررنا الي ادراج جدول المنتجات ثم اختيار الحقول الفريدة ، هو وجود شرط علي حقل موجود فى هذا الجدول
------
تم
------