استعلامات  التحديث

    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));

 

 

و طبعا ما اضطررنا الي ادراج جدول المنتجات ثم اختيار الحقول الفريدة ، هو وجود شرط علي حقل موجود فى هذا الجدول

 

 

 ------

تم

------