![]()  | 
      
       استعلامات التحديث 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));
 
و طبعا ما اضطررنا الي ادراج جدول المنتجات ثم اختيار الحقول الفريدة ، هو وجود شرط علي حقل موجود فى هذا الجدول
------
تم
------