sql statment

الكاتب : bassam4000   المشاهدات : 2,768   الردود : 9    ‏2003-08-27
poll

هل تريد مني الاستمرار في نشر هذة الدروس المترجمة عن قواعد البيانات ؟

  1. نعم

    6 صوت
    100.0%
  2. لا

    0 صوت
    0.0%
      مشاركة رقم : 1    ‏2003-08-27
  1. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    الـSQL هو عبارة عن فاصل بين تبوبين ( تصنيفين ) منفصلين , كلاهما سوف يتم مناقشته بشكل مفصل في هذا الملحق .
    التبويب ( التصنيف ) الأول هو الـData Definition Language DDL لغة تعريف البيانات , وهو يستخدم لانشأ , تعديل , أو إزالة تعريف حقيقي في قاعدة بيانات محددة .
    التبويب ( التصنيف ) الثاني هو الـData Manipulation Language DML لغة التعامل مع البيانات وهو يستخدم من اجل انشأ , تعديل , إزالة , وتجميع المعلومات التي تحتل بنية قاعدة البيانات . بكلمات أخرى , سوف تتمكن من استخدام الـDLL في انشأ الجداول والحقول , والفهارس , , سوف تستخدم الـDML في إحلال , استبدال , استعادة المعلومات التي تحتل الجداول والحقول .

    الجدول A.1 فية سبعة أوامر SQL التي تكون أساسية في أي إعلان SQL :
    COMMAND Classification Description
    CREATE Definition Create a table, a field, or an index.
    ALTER Definition Modify a table by adding a field or changing a field definition.
    DROP Definition Drop a table or an index.
    SELECT Manipulation Query a database with given parameters.
    INSERT Manipulation Insert multiple records with one operation.
    UPDATE Manipulation Change information throughout a range with given parameters.
    DELETE Manipulation Remove records from the table.

    هذة الأوامر تتحقق من نوع الاستفهام query في إعلان الـSQL . وفي الجدول السابق يوجد تبويب لكل أمر من الأوامر إما كونة DDL اوDML .
    الـSQL command يستخدم الى جانب العناصر الاخرى من تصريح الـSQL statement وذلك لاٍنشأ اما فعل استفهام او استفهام محدد.
    حدث الاستفهام Action query هي التي تبداء مع الـSQL statement عوضاً عن الـselect .
    كما قد تخمن البداية مع الـselect هو selection query .
    عندما تستخدم الاستفهام query سوف تستخدم شروط (مفرد شرط) مختلفة التي تنفذ في الـSQL statement .
    في الجدول A.2 فية عدد من الشروط المتوفرة من اجل الـSQL تستخدم Microsoft Jet Engine (محرك =Engine , دفق=Jet )
    CLAUSE Descriptions
    FROM Specifies the table from which data is queried
    WHERE Specifies the condition(s) for the query
    GROUP BY Specifies the group(s) for the selected information
    HAVING Specifies the condition(s) for each group in the query
    ORDER BY Specifies the order of the query

    الشرط الاول من هذة الشروط هو , FORM , وهو يستخدم في يدل على الجدول او الاستفهام المستخدمة لتجميع المعلومات من اجل الـSQL statement . اكثر من واحد من واحد من الجداول او الاستفهام يمكن وضعها في الاعلان , بأستخدام الشرطFORM .
    عندما تعمل ذلك فأنك تنشأ على الاقل ملحق واحد للاستفهام .
    الملحق او المنضمjoin سيناقش لاحقاً في هذا الملحق .
    الشرط الثاني , WHERE , يعبر عن الحالة التي يجب ان تكون ملائمة للسجل لكي يصبح مضمن في نتيجة الاستفهام .
    كل واحد من هذة الحالات قادرة على استخدام عامل الشرط .
    الحالات الشرطية المتعددةMultiple condition تستخدم العامل المنطقي logical operators .
    الجدول A.3 يحوي الـconditional & logical المتوفرة :
    OPERATOR TYPE Condition Is Met When
    AND Logical Both expressions are true.
    OR Logical Either expression is true.
    NOT Logical The expression is false.
    < Comparison The first expression is less than the second expression.
    <= Comparison The first expression is less than or equal to the second expression.
    > Comparison The first expression is greater than the second expression.
    >= Comparison The first expression is greater than or equal to the second expression.
    = Comparison The first expression is equal to the second expression.
    <> Comparison The first expression is not equal to the second expression.
    BETWEEN Comparison The value belongs to a specified set of values.
    LIKE Comparison The value matches the pattern specified.
    IN Comparison The record belongs to a particular group in a database

    شرط الـSQL الثالث , GROUP BY , وهو يستخدم لوضع نتائج الاستفهام في مجموعة .
    الـGROUP BY يستخدم على الاقل اسم حقل واحد من الجدول او قائمة الاستفهام في اعلان الشرطFORM لكي يقيم السجل والمجموعة على انها قيم .
    يمكنك ايضاً وظيفة تجميع الحاصل aggregate function في اعلان الـSQL لانشأ ملخص عن المجموعات في الـrecordset .
    في الجدول A.4 هناك قائمة بوظائف تجميع الحاصل aggregate function :
    AVG Returns the average value of a specified field
    COUNT Returns the number of records in a query
    SUM Returns the sum of the values in a specified field
    MAX Returns the largest value in a specified field
    MIN Returns the smallest value in a specified field
    شرط الـSQL الرابع , HAVING , يعين الحالة الشرطية ( بنفس الطريقة المستخدمة مع شرط FORM ) المجموعات يجب ان تكون ملائمة لكي تتضمن نتائج الـrecordset .
    شرط الـSQL الاخير , ORDER , يستخدم اسماء الحقول للامر باعداد النتيجة في اسلوب معين .

    Data Definition Language لغة تعريف البيانات :
    اعلانات الـDDL تستخدم لانشأ , استبدال و وازالة الجداول , الحقول , الفهارس من قاعدة البيانات .
    اوامر الـSQL الثلاثة لعمل , CREATE , DROP ,ALTER كلها عبارة عن حدث استفهام Action query .
    الـAction queries في الفيجوال بيسك يمكن استهلالها بأحدى طريقتين .
    الطريقة الاولى في مناشدة الـaction query تكون بأستخدام الـQueryDef object .
    الطريقة الثانية بأستخدام طريقة التنفيذ Execute method لقاعدة البيانات كالتالي :
    db.Execute sSQLStatement

    هذا يفترض ان الـdb هو مشروع قاعدة بيانات متغير تم اعدادة بنجاح الى قاعدة بيانات شرعية , والـ sSQLStatement هي string شرعية متغيرة تشمل حدث SQL statement شرعي .
    The CREATE Command الامر المنشأ :
    الامر المنشأ يستخدم لانشأ جدول وفهرس في قاعدة بيانات محددة , لكي تنشأ جدول في قاعدة بيانات معطاة , استخدم the CREATE TABLE statement على النحو التالي :
    CREATE TABLE table (fld1 type [(sz)] [NOT NULL] [idx1] [, fld2 type [(sz)]
    [NOT NULL] [idx2] [, ...]] [, CONSTRAINT MFidx [, ...]])
    في السطور السابقة , اسم الجدول يُنجح اعلان انشأ الجدول ويتبع بـcomma-delimited list فاصلة محدودة لتعريف الحقل الذي استخدم لأنشأ جدول معين . على الاقل حقل واحد يجب ان يكون بين هلالين كما يظهر .
    أي نموذج شرعي من قواعد البيانات يمكن استخدامة لكي يدل على نموذج الحقل لكي يتم انشائة , والحجم( SZ ) يمكن ان تعين من اجل النص في الحقول المزدوجة .
    المثال التالي ينشأ جدول جديد في الـdb قاعدة البيانات مع ثلاثة حقول :
    db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
    & "CustName TEXT (25), Address TEXT (30))"
    الحقل الجديد المنشأ يدعى Customers =الزبائن . يشمل على حقل عداد اسمة CustNum وحقلين نص اسمهما CustName &Address .
    استخدام الـNOT NULL الثابتة اختيارية , يمكنك تعيين ان الحقل لايمكن ان يكون لدية قيمة NULL . اذا كانت الـNULL value
    منسوبة الى الحقل المنشأ بهذا الخيار , فان خطاء سوف يظهر . المثال التالي هو تعريف لجدول محصن بشكل جيد :
    db.Execute "CREATE TABLE Customers (CustNum INTEGER NOT NULL, " _
    & "CustName TEXT NOT NULL (25), Address TEXT (30))"
    نسخة الـ CREATE TABLE حدث استفهام يعين ان الارقام وقيمة حقل الـCustName لايمكن ان تحتوي على أي من قيم الـNULL
    مع ذلك فان حقل الـAddress يمكن ان يكون محتوي عليها .
    يمكنك ايضاً استخدام شرط التقييد CONSTRAINT clause في اعلان الـ CREATE TABLE لانشأ فهرس اما على حقل مفرد او حقول متعددة . المثال التالي ينشأ فهرس في جدول جديد :
    db.Execute "CREATE TABLE Customers (CustNum INTEGER, " _
    & "CustName TEXT (25), Address TEXT (30), " _
    & "CONSTRAINT CustIndex UNIQUE (CustNum, CustName))"
    هذا المثال انشأ جدول مع ثلاثة حقول كما ظهر قبلاً , لكنة ايضأ اضاف فهرس اسمة CustNumIndex
    لاحظ ان الفهرس الجديد المنشأ بواسطة شرط الـ CONSTRAINT , اسمة CustIndex , يكون رابط الجأش في كلا الحقلين الـCustName & CustNum الموصفين في اعلان الـSQL .
    الفرق بين انشأ فهرس حقل فردي واخر متعدد الحقول مع الـcreate table statement هو ان في الحقل الفردي يمكنك ان تدل على شرط الـCONSTRAINT التقييد , بعد اعطاء الحقل , بدون فاصلةcomma .
    اما انشأ فهرس لحقول متعددة بشرط التقييدCONSTRAINT , فانك تعين الفهرس بعد ان انشأ الحقول في الفهرس .
    كما سيظهر في المثال الاخير .
    للمزيد من المعلومات عن شرط التقييد CONSTRAINT ستجدها في " Using the CONSTRAINT Clause "
    ليس من الضروري ان تقوم بأنشأ الفهرس في الـCREATE TABLE STATEMENT --- يمكنك ايضاً انشأ الفهرس في باستخدام
    الـCREATE INDEX STATEMENT كما في المثال التالي :
    db.Execute "CREATE UNIQUE INDEX CustIndex ON Customers (CustNum, CustName)"

    هذا الاعلان يؤدي الى نفس النتيجة المستمدة من الـCREATE TABLE statement
    الاسلوب ( النحو syntax ) المتبع من اجل الـCREATE INDEX statement كالتالي :
    CREATE [UNIQUE] INDEX idx ON table (fld1 [ASC|DESC]
    [, fld2 [ASC|DESC], ...])
    [WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]

    عندما تستخدم الـCREATE INDEX statement , فانك تعين خيار الـUNIQUE كما في المثال السابق ,
    فانت تخبر الـJet Engine انة لا يوجد مجموعين , من اجل قيم الحقول المدرجة , التي اصبحت مسموح بها , هكذا تنشأ الـunique index فهرس فردي على الحقول .
    بشكل افتراضي فان الفهارس يتم انشائها بامر صاعدASC Keyword , لكن يمكنك ان تعيين قائمة الاوامر للقيم في الفهرس بأمر نازل
    بأستخدام DESC Keyword بعد ارسال اسم الحقل .
    القسم الاخير من الـ CREATE INDEX statement يسمح لك ان تعين , بشكل اكثر تفصيلاً , كيف يمكن التعامل مع الفهرس .
    يمكنك عمل هذا بواسطة الشرط الـ WITH للـCREATE INDEX statement . لاْنشا مفتاح اساسي في في الجدول , استخدم الـWITH PRIMARY statement .
    الاعلان ينشأ فهرس فريد unique index الذي هو الان مفتاح اساسي . فقط مسموح بمفتاح اساسي واحد في الجدول ومحاولة انشأ واحد اخر ستؤل الى ظهور رسالة خطاء .
    يمكنك ايضاً منع استخدام قيمة الـNULL في الفهرس بواسطةWITH DISALLOW NULL statement او يمكنك السماح لقيمة الـNULL
    بواسطة الـWITH IGNORE NULL statement .

    The ALTER Command امر الاستبدال :
    الامر الثاني المنتمي للـSQL DDL . يمكنك ايضاً استخدام الـALTER TABLE statement لاكمال اربعة مهام كاملة ومنفصلة .
    • Add a new field to a table.
    • Delete a field from a table.
    • Add a new index to a table.
    • Delete an index from a table.
    يمكنك اضافة او ازالة فقط حقل واحد او فهرس واحد لكل واحد من الـALTER TABLE statement . النحو الذي يقوم علية الـALTER TABLE statement كالتالي :
    ALTER TABLE table {ADD {COLUMN fld type[(size)] [NOT NULL] [CONSTRAINT idx]
    | CONSTRAINT MFidx} | DROP {COLUMN fld | CONSTRAINT indexname}}
    المثال التالي ينشأ حقل جديد في الجدول الموجود والمسمى Customers :
    db.Execute "ALTER TABLE Customers ADD COLUMN PhoneNum TEXT (12)"
    تماما كما يمكنك اضافة حقل الى الجدول يمكنك ازالتة منة , كما في المثال التالي :
    db.Execute "ALTER TABLE Customers DROP PhoneNum"
    يمكنك ايضاً تعيين فهارس جديدة تماماً كما فعلت مع الـCREATE TABLE , وتوقع انة يمكنك اضافة فهرس بعد ان يكون الجدول يكون منشأ اصلا ً كما يظهر في التالي :
    db.Execute "ALTER TABLE Customers " _
    & "ADD CONSTRAINT NameAndPhoneIndex (CustName, PhoneNum)"
    الان يمكنك ازالة الفهرس بهذا المثال النهائي :
    db.Execute "ALTER TABLE Customers DROP CONSTRAINT NameAndPhoneIndex"
    Using the CONSTRAINT Clause استخدام شرط التقييد :
    حتى الان لقد رايت ان شرط التقييد موجود في كلا الـCREATE & ALTER SQL command .
    الان القي نظرة قريبة على هذا الشرط واكتشف مدى قوتة . في شكله غير المركب , فان الـconstraint هو فهرس , ليس فقط شرط التقييد هو السماح لك بأنشأ او ازالة الفهارس كما يظهر في قطاعي الـ CREATE & ALTER command , لكنة ايضاً يسمح لك بانشأ مفتاح اساسي & foreign key لتعريف العلاقة و يؤكد صلة الوحدات . كما ظهر مؤخراً , بالمثال السابق , هناك نسختين من الـCONSTRAINT statement , واحد من اجل فهارس الحقول الفردية , والثاني من اجل فهارس الحقول المتعددة . بالنسبة للحقل الواحد كما يظهر في التالي :
    CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
    REFERENCES foreigntable
    [(foreignfield1, foreignfield2)]}
    اما من اجل فهرس الحقول المتعددة هو هذا :
    {PRIMARY KEY (primary1[, primary2 [, ...]]) |
    UNIQUE (unique1[, unique2 [, ...]]) |
    NOT NULL (notnull1[, notnull2 [, ...]]) |
    FOREIGN KEY (ref1[, ref2 [, ...]])
    REFERENCES foreigntable
    [(foreignfield1 [, foreignfield2 [, ...]])]}
    اسم الفهرس لكي يتم انشائة , يتم تعيينة مباشرة بعد الـ CONSTRAINT keyword . في نسخة اخرى يمكنك انشأ ثلاثة نماذج من الفهارس :
    *A UNIQUE index , هذا الفهرس المفرد ليس لدية حقلين ,كما يدلل على ذلك في شرط التقييد , بنفس القيمة .
    *A PRIMARY KEY index , هو مفتاح اساسي , بواسطة التعريف , والـunique . هذا يعني ان كل الحقول تضمن في تعريف المفتاح الاساسي الذي يجب ان يكونunique .
    *A FOREIGN KEY index . مفتاح الـforeign هو فهرس يستخدم جدول اخر من اجل انشأ فهرس على الجدول الصحيح .
    يمكنك انشأ foreign key لاْنشأ علاقة بين حقول متعددة كما في المثال التالي :
    db.Execute "ALTER TABLE Customers " _
    & "ADD CONSTRAINT NewIndex " _
    & "FOREIGN KEY (CustNum) REFERENCES Orders (CustNum)"
    هذا المثال ينشأ علاقة بين جدول الـCustomers وجدول الـOrders لمشروع قاعدة البيانات . فهرس جديد تم انشائة , NewIndex , الذي يربط قاعدة الجدولين علىاسم حقل CustNum .
    The DROP Command امر الانسدال :
    The DROP command يأتي بنكهتين : DROP TABLE وDROP INDEX كما يمكن ان تخمن ببساطة , الـthe DROP TABLE statement
    يزيل الجدول الموجود من قاعدة البيانات كما يظهر هنا :
    db.Execute "DROP TABLE Customers"
    The DROP INDEX statement تعمل بشكل مشابة DROP TABLE statement , ما عدا ان ذلك يزيل الفهرس من الجدول المعطى كما في المثال التالي :
    db.Execute "DROP INDEX CustNumIndex ON Customers"
    للذكر , تصرف الـDROP command يكون كالتالي:
    DROP {TABLE table | INDEX idx ON table}
    Data Manipulation Language لغة التعامل مع البيانات DML :
    اوامر الـDML تعمل مزيج من الاحداث والاستفهامات المحددات .الاوامر SELECT, INSERT, UPDATE, and DELETE تستخدم من اجل تسريع وتفعيل اداء الـJet Engine , والتعامل مع احلال البيانات في جداول معينة .
    The SELECT Command:
    هذا الامر يختلف عن كل الاوامر الاخرى في الـSQL مع انة جزء من تحديد الاستفهام او بالاحرى حدث استفهام . عندما تستخدم تحديد الاستفهام في تطبيقات الفيجوال بيسك , انة لمن الشائع في الـrecordset لقاعدة البيانات المعطاة . على افتراض ان الـrs هو اختصار الـrecordset الشرعي والـdb هو اختصار قاعدة البيانات التي هي في الاصل معدة على انها ملف قاعدة البيانات الشرعية , يمكنك استخدام الاعلان التالي لتجميع كل الـrecordset في جدول التCustomers لاختصار الـdb :
    Set rs = db.OpenRecordset("SELECT * FROM Customers")
    المثال يستخدم اغلب صفات وشكل القاعدة في الـ SELECT statement . هذا القسم سوف يوضح لك العناصر المختلفة من الـSELECT statement ويصور كيف يمكن للمبرمج ان يستخدم كل واحدة من المحتويات بأسلوب فعال وتنقية filter السجلات حسب حاجتة .
    مثال على الـSELECT statement :
    SELECT [predicate]
    { * | table.* |
    [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
    FROM tableexpression [, ...] [IN externaldatabase]
    [WHERE... ]
    [GROUP BY... ]
    [HAVING... ]
    [ORDER BY... ]
    انة سهل الفهم للغاية لكي تغمر بهذا التصريح , لكن ليس كل الشرط مضمنة في هذا المثال ان تكون مستخدمة بجانب بعضها ---مع انة من الممكن ان تكون كذلك :
    خذ هذا المثال فرضاً :
    SELECT DISTINCT CUSTNUM, CUSTNAME
    FROM Customers
    WHERE (CustNum >= 100) AND (CustNum <= 120)
    ORDER BY CustName;
    هذا الاعلان statement يسترد فقط حقلي الـCustNum & CustName من جدول الزبائن . شرط الـWHERE في هذا الاعلان يظهر حالتين شرطيتين . الحالة الاولى تقول ان قيمة حقل الـCustNum يجب ان تكون اكبر او تساوي 100 . الحالة الثانية تقرر ان قيمة حقل الـcustNum يجب ان اقل او تساوي 120 . حتى الان , يمكنك رؤية ان اعلان الـselect يظهر انة سوف يسرع من اعادة الـCustNum والـCustName من اجل كل السجلات مع ارقام الزبائن بين 100-120 . الجزء الاخير من هذا الاعلان هو امر اعادة السجل بواسطة الاستفهام بواسطة حقل الـCustName بكلمات اخرى , في اساسيات الامر. يمكنك ايضاً طلب السجلات لكي يتم اعادتها returned في اساسيات الامر بواسطة وضع الـDESC Keyword بعد الشرط الـORDER BY CustName .
    يمكنك ايضاً استخدام حالات الشرط المتعددة في الـSELECT statement كما يظهر في هذا الاعلان . من اجل قائمة كاملة من عوامل حالات الشرط operators conditions , كلا هما منطقيان ومتوازيان , القي نظرة على الجدولA.4 في بداية هذا القسم .
    انة لمن المهم ملاحظة ان الـDISTINCT keyword تتبع امر الــSELECT الذي يدعى اعلان او تصريح . هذة الـKeyword تدل على انة هناك جمع من الحقول المفردة unique مميزة سوف يتم اعادتها . في هذا المثال , اذا كان لديك ثلاثة سجلات في جدول الزبائن بنفس ارقام واسماء الزبائن , لكن بعنوان مختلف , لكن سجل واحد سوف يمكن اعادتة . اذا كنت قد اضفت حقل العنوانAddress field في قائمة الحقول في اعلان التحديد SELECT statement , سوف تتلقى لكل سجل معاد , نفس رقم الزبون نفس الاسم , لأن الجمع للـ(الرقم , الاسم والعنوان ) كان مفردUNIQUE لكل سجل معاد .
    DISTINCT keyword ليست التصريح الوحيد المتوفر في الـSELECT statement . في الجدول A.5 سنورد الخمسة تصريحات المتوفرة في الـSELECT statement :
    PREDICATE Description
    ALL Returns all records, even duplicates
    DISTINCT Returns only unique records, based on fields specified in the statement
    DISTINCTROW Returns only unique records, based on all fields in the specified table(s), even those not listed in the SELECT statement
    TOP Returns the first n records or the top p percentage of records of the selected recordset
    التصريح الافتراضي المستخدم في الـSELECT statements لا يصرح عن الكل , كلها تعيد السجلات التي تلاقي حالات الشرط للـselection query . التصريح TOP يستخدم في ارتباط مع الـORDER BY clause في الـSELECT statement . يمكن استخدامة بأحدى طريقتين:
    *TOP n يعيد السجل n الاول .
    *TOP p PERCENT يعيد النسبة المئوية لكامل السجل .
    اتبع المثال التالي لتصريح الـTOP (TOP predicate ) :
    SELECT TOP 10 PERCENT OrderNum, OrderPrice
    FROM Orders
    ORDER BY OrderPrice;
    هذا الاعلان سوف يعيد الـtop 10% من السجل في جدول الـOrders . مبنياً على حقل السعرOrderPrice field . اذا كنت قد امرت اعادة السجل بهذا الاعلانstatement بواسطة حقل الـOrderNum field , سوف تحصل على التtop 10% من السجل المبني على الـOrderNum , والتي من الممكن ان لا تكون منطقية تدخل العقل .
    انها نقطة قيمة في حال كان هناك قيمة لحقل للـORDER BY المعين , حيث هناك فرصة التي تكون اكثر من الرغبة في الحصول رقم السجل سوف يتم اعادتها , لنفترض على سبيل المثال انني اردت على الـtop 10 parts المبنية على كمية كبيرة من الاوامر , اذا كان هناك 9 كميات كبيرة ومنفصلة من القيم في قمة القائمة واثتين اخريين تتبعها , بنفس القيمة . سوف احصل على 11 سجل بدلاً من الـ10 التي اردٌتها .نفس الشيء صحيح مع الـTOP p PERCENT format . اذا اردت تلقي الـtop 2% من السعر بواسطة استفهامي الشرطي my selection query . سوف اتبع الاعلان التالي :
    SELECT TOP 2 PERCENT PartName
    FROM Orders
    ORDER BY PartPrice;
    هذا المثال يعيد اسماء المواد المسعرة في الـtop 2% . اذا كان لديك مواد رقمية كلها بنفس السعر , يتم اعتبارها مادة واحدة . لذلك انا استطيع بسهولة تلقي المزيد من السجلات اكثر مما توقعت . انة ايضاً لمن الضروري ان تفهم لماذا تطلب متى تستخدم الـTOP predicate .عل سبيل المثال , انة لمن المحتمل ان تعتقد انة يمكنك الحصول على الـtop 10 customers بناءً على المال المنفق . لكن عليك ان تعين الحالة التي تريد ان تحددها لكي يتم جعلها على الحقل كـTotalMoneySpent ومقارنتها مع الـTotalOrderPrice .
    يمكنك ايضاً جعل السجلات في مجموعة التي يتم اعادتها من الاستفهام بواسطة شرط الـGROUP BY في الـSELECT statement , كما يظهر في المثال التالي :
    SELECT PartName, Count(PartName)
    FROM Orders
    WHERE (PartPrice > 10)
    GROUP BY PartName;
    اعلان التحديد هذا يجمع السجلات ويجعلها في مجموعات من جدول الـOrders التي يكون فيها قيم حقل الـPartPrice اكبر من 10 .
    هذة السجلات يتم وضعها في مجموعات في حقل الـPartNum فقط , احصاء ارقام كل نموذج من الأجزاء المبيوعة المعادة . بكلمات اخرى ,نتيجة الـrecordset تحتوي على اسماء منفصلة من الاجزاء تكلف اكثر من 10$ واحصاء ارقام الاوامر لكل جزء .
    وظيفة الاحصاء COUNT , في هذا المثال تدعى aggregate function وظيفة تجميع حاصل . وظائف تجميع الحاصل الاخرى تتضمن AVG,SUM,MAX,MIN ....ارجع للجدول A.4 .
    مثال اخ لاستخدام وظيفة التaggregate كما يلي:
    SELECT PartName, SUM(PartPrice)
    FROM Orders
    WHERE (PartPrice > 10)
    GROUP BY PartName
    HAVING (SUM(PartPrice
    HAVING (SUM(PartPrice) > 1000) AND (PartName LIKE "WIDGET*");
    هذا المثال يقدم شرط الـHAVING . هذا الشرط تظاهر بتشابة كبير مع شرط الـWHERE , توقع انة يقوم بأختبار الحالة الشرطية المعينة بعد حدوث عملية وضعها في مجموعة , بعكس شرط الـWHERE , التي تختبر الحالة الشرطية للسجل لكي يتم تضمينها في مجموعه . اعلان التحديد السابق يجمع اسماء الاجزاء المنفصلة المميزة وحاصلsum اجمالي سعر البيع من جدول الـOrders . حالة الشرط الوحيدة من اجل السجل لكي يتم تضمينة في هذة عملية التجميع هذةgrouping هي ان السعر لكل جزء يكون اكبر من 10 . بعد ان تكون المجموعات قد اُنشأت بواسطة الـJet Engine , فقط المجموعات بملخص اجمالي PartPrice التي هي اكثر من 1,000 يتم تضمينها . في اضافات لهذة الحالة الشرطية , يمكنك رؤية الاستخدام للـLIKE keyword . يمكنك استخدام الـLIKE keyword في أي مكان تستطيع ان تعيين فية الحالة الشرطية . الـLIKE تستخدم نموذج ملائم لتفحص أي الحقول يجب ان يضمن في نتيجة الـrecordset . في هذا المثال , فقط المجموعات بقيمة حقل الـPartName تبداءبمحرف الاستنباط WIDGET سيضمن في الـrecordset .
    Joins الضم :
    الضم وظيفة شائعة الاستخدام في الـSELECT statement . الضم يستخدم لانشأ علاقة مؤقتة بين الجداول عند القيام بالاستفهام . كما في المثال التالي :
    SELECT ...
    FROM table1 [LEFT | RIGHT] JOIN table2 ON (table1.fld1 CompOp table2.fld2)
    الـ CompOp هو عامل مقارنة ( ارجع للجدول A.4 ) . الضم يفعل شرط الـ FROM للـ SELECT statementكما يظهر في الاعلان السابق.
    الضم الايسر والضم الايمن هما مراة كل واحد للاخر في التعريف . الضم الايسر ( يدعى الضم الخارجي الايسر ) يتضمن جميع السجلات من جدول1 , حتى اذا لم توجد علاقة سجلات موجودة في الجدول 2 . الضم الايمن ( يدعى الضم الخارجي الايمن ) يضمن كل السجلات من جدول2 حتى اذا لم توجد علاقة سجلات في الجدول 1 , اتبع الاعلان التالي , على سبيل المثال :
    SELECT Customers.*, Orders.*
    FROM Customers LEFT JOIN Orders ON (Customers.CustNum = Orders.CustNum);
    المثال السابق يعيد كل الحقول من جدول الزبائن وفقط الحقول من جدول الطلبات الـOrders المطابقة لحقول الـ CustNum. بكلمات اخرى نتيجة الـrecordset من هذا الاعلان يمكن ان يتضمن كل الزبائن والمعلومات على الطلبات لهؤلاء الزبائن الذين طلبوها .
    لأنشأ ضم يعيد فقط السجلات التي تكون مضمنة في كلا الجدولين (الضم الداخلي ) , ليس بمقدورك استخدام شرط الـ JOIN على الاطلاق كما يظهر في المثال التالي :
    SELECT Customers.*, Orders.*
    FROM Customers, Orders
    WHERE (Customers.CustNum = Orders.CustNum);
    هذا الاعلان يمكنة ان يعيد recordset مختصر عوضاً عن الاعلان السابق ,وافتراض ان هناك زبائن لم يقوموا بتقديم طلبات , في اعلان التحديد هذا SELECT statement , هناك الزبائن اللذين وضعوا طلبات فقط هم المؤهلين لكي يتم اعادتهم الى الـrecordset . وبالرغم من انة من الضروري عمل ذلك , هناك شرط SQL لتعيين الضم الداخلي , كما يظهر في المثال التالي :
    SELECT Customers.*, Orders.*
    FROM Customers INNER JOIN Orders ON (Customers.CustNum = Orders.CustNum);
    هذا الاعلان مساوي للذي سبقة , و في كثير من الحالات انة سهل في الحقيقة ان تقراء وتفهم بلمح البصر. ربما ايضاً تهتم بتعيين اكثر من حالة شؤط واحدة في أي واحدة من عمليات الضم , كما في المثال التالي :
    SELECT Customers.*, Orders.*
    FROM Customers INNER JOIN Orders
    ON ((Customers.CustNum = Orders.CustNum)
    AND (Customers.Flag = Orders.Flag));
    اذا كنت حقيقة تريد ان تتجاوز , وفي كثير من الاوقات انت بحاجة الى ذلك , فيمكنك جعل الضم مع كل واحد من الاخريات كما يظهر في المثال التالي :
    SELECT Customers.*, Orders.*, Tax.*
    FROM Customers INNER JOIN
    (Orders INNER JOIN Tax ON (Orders.State = Tax.State))
    ON (Customers.CustNum = Orders.CustNum));
    هذا الـ SELECT statement يعيد كل السجلات والتي يكون فيها ارقام الزبائن من جدول الزبائن و جدول الطلبات والحالة في جدول الطلبات وجدول الضرائب . يمكنك وضع ايضاً اما الضم الايسر او الايمن داخل الضم الداخلي INNER JOIN ,من ناحية اخرى , لا يمكنك وضع INNER JOIN داخل اما الـ LEFT JOIN or a RIGHT JOIN .
    The INSERT Command
    مر الادراج يستخدم في الـ INSERT INTO statement لانشأ استفهام ملحق , نموذج حدث الاستفهام . يمكنك استخدام الامر لاضافة rows مفرد او متعدد الى الجدول . نتبع المثال التالي لاضافة rows مفرد بأستخدام الـ INSERT INTO statement :
    INSERT INTO table [(fld1[, fld2[, ...]])]
    VALUES (val1[, val2[, ...])
    استخدام هذا النحو , يمكنك اضافة rows مفرد الى الجدول . يجب ان تعين كل واحد من الحقول وقيمتة التي تريد ان تضيفها . اذا اردت ان تخرج من الحقل وقيمته المرسلة , قيمة الـ NULL تدرج بشكل تلقائي في الحقل , السجلات الجديدة تلحق في نهاية الجدول . اتبع لالمثال التالي حول كيف تضيف صف اوrow على جدول معين :
    INSERT INTO Customers (CustNum, CustName)
    VALUES (1, "Kimberly");
    اذا كانت الحقول الاخرى في جدول الزبائن , وهي مفترضه لقيمة الـ NULL . اما المثال على اضافة rows متعددة يختلف قليلاً :
    INSERT INTO table2 [(fld1[, fld2[, ...]])]
    SELECT [table1.]fld1[, fld2[, ...]
    FROM ...
    هذا الاسلوب يأخذ تحديد معين من السجلات من الجدول 1 وادراجها في الجدول 2 . ارقام الحقول من اجل كلا الجدولين يجب ان تكون نفسها في الطلب الصحيح . المثال التالي يوضح الـ INSERT INTO statement :
    INSERT INTO Delivered (CustNum, DelPart, PriceCharged)
    SELECT CustNum, PartName, PartPrice
    FROM Orders
    WHERE (Delivered = True);
    المثال يدرج كل الطلبات الواصلة من جدول الطلبات في حقل المراسلات من جدول الطلبات . الـ INSERT INTO statement يٌلحق السجل في نهاية الجدول الموجود , لكن يمكنك ايضاً استخدام اعلان و تحديد مشابهه للسجلات لاْنشأ جدول جديد , كما في المثال التالي:
    SELECT CustNum, PartName, PartPrice
    INTO DeliveredBackup
    FROM Orders
    WHERE (Delivered = True);
    هذا المثال ينشأ جدول جديد يدعى DeliveredBackup , مع حقول و خصائص متطابقة لما هو مدرج في الحقول في شرط الـ SELECT من جدول الطلبات . الجدول الجديد سوف يتضمن كل السجلات مع قيمة حقل الـ Delivered الى true .
    The UPDATE Command
    امر التحديث UPDATE يستخدم لاعداد المعلومات الى الجدول الصحيح الى قيمة جديدة , اسلوب امر التحديث يكون على الشكل التالي :
    UPDATE table
    SET value
    WHERE criteria
    قيمة ال


    كل عام وانت بخير
     
  2.   مشاركة رقم : 2    ‏2003-08-27
  3. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    المزيد قريباً لمن يرد مني المتابعة في سلسلة الدروس التي انا قائم على ترجمتها من كتاب الـebook لتعلم قواعد البيانات بالفيجوال بيسك .
     
  4.   مشاركة رقم : 3    ‏2003-08-27
  5. العمراوي

    العمراوي مشرف سابق

    التسجيل :
    ‏2002-11-24
    المشاركات:
    7,510
    الإعجاب :
    4
    طبعا واصل والله معاك.,.,.,.,
     
  6.   مشاركة رقم : 4    ‏2003-08-29
  7. dreamy

    dreamy عضو

    التسجيل :
    ‏2003-08-09
    المشاركات:
    24
    الإعجاب :
    0
    اريد الكتاب الاليكتروني

    شكرا جزيلا للأخ بسام على المجهودات الذي يبذلها وعندي ملاحظة بسيطة يا حبذا لو يعمل لنا رابط الى الكتاب الاليكتروني او يقوم بوضع دروسه في ملف واحد ويضعه كمرفق مع الموضوع والواحد ينزله الى جهازه ويقراءه على راحته احسن من القراءة من الصفحة مباشرة ....... شكرا لك مرة اخرى واقدر لك كل ما بذلته
     
  8.   مشاركة رقم : 5    ‏2003-08-29
  9. نبض اليمن 2003

    نبض اليمن 2003 عضو متميّز

    التسجيل :
    ‏2003-06-15
    المشاركات:
    1,116
    الإعجاب :
    0
    شكراً لك أخي بسام
    SQL هي إختصار لكلمة Statment Query Language وتعني لغة الإستفسارات البنيوية وهي تعمل على جميع قواعد البيانات المعروفة .
    واصل في الترجمه ومشكور مقدماً
    تحياتي
     
  10.   مشاركة رقم : 6    ‏2003-08-29
  11. مُجَاهِد

    مُجَاهِد قلم ماسي

    التسجيل :
    ‏2003-05-11
    المشاركات:
    14,043
    الإعجاب :
    0
    واصل..
     
  12.   مشاركة رقم : 7    ‏2003-08-29
  13. Super Linx

    Super Linx عضو متميّز

    التسجيل :
    ‏2003-02-24
    المشاركات:
    1,880
    الإعجاب :
    0
    واصل..
     
  14.   مشاركة رقم : 8    ‏2003-08-31
  15. 3laa3sam

    3laa3sam عضو فعّال

    التسجيل :
    ‏2003-06-21
    المشاركات:
    619
    الإعجاب :
    0
    متشكرين...

    كمل يلسيدي ....أنا عن نفسي محتاج أتعلم حاجه زي دي
     
  16.   مشاركة رقم : 9    ‏2003-09-06
  17. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    Creating Queries with SQL


    *كيف انشأ recordset بتحديد السجلات من جدول مفرد .
    *تحديد قيم حقل معين في استفهام الـSQL .
    *استخدام المتغيرات و وظائف الفيجوال بيسك في استفهام الـSQL .؟
    *استخدام الـWildcards & ranges للقيم في استفهام الـSQL .؟
    *تعريف واستخدام الـparameter query ثابت الاستفهام .؟
    *انشأ الـrecordset بضم الحقول من جداول متعددة .؟
    *إيجاد السجلات في الجدول من دون corresponding entries في الجدول المتصل related table ؟
    *استرجاع المعلومات مثل الـcounts , والمعدل او المتوسطaverages , والـحاصل sums وعرضها بربطها بالـData control .؟
    *انشأ recordset يحتوي على سجلات عن طريق مضاعفة القيمة .؟
    *استخدام وظائف الفيجوال بيسك مع الـSQL statement .؟
    *عمل تحديث مضخمbulk updates لسجلات قاعدة البيانات .؟
    *انشأ وإزالة الجداول .؟
    *إلحاق Append وإزالة السجلات .؟
    *انشأ جدول جديد مع بيانات من جداول موجودةexisting table .؟
    *تعديل بنية الجداول .؟
    *انشأ a crosstab query ! .؟

    لغة الاستفهام البنيوية SQL هي لغة قياسية لتعريف و معاملة manipulating قواعد بيانات متصلة . في الواقع كل قواعد البيانات المنتجة في الأسواق حالياً هي تدعم الـSQL . الـJet database engine , هي قلب الفيجوال بيسك والميكروسوفت اكسس , وتستخدم الـSQL على انة طريقة تعريف و معاملة أساسية .

    من اجل مرونة الفهم , في برمجة قاعدة بيانات قوية , فان الـSQL يكون عنصر حي .يمكنك العمل مع قواعد بيانات الفيجوال بيسك من دون الـٍSQL , فالـJet database engine تزودك باعدادات نشيطة للـobjects والقدرات التي تمكنك من إنهاء أي عمل تقوم بة في الفيجوال بيسك والذي تستطيع انجازة في الـSQL .

    بسب تعدد استعمال الـJet database engine , فان المنفعة من الـSQL ليست بهذة السهولة . لمساعدتك في تصور قوة الـSQL يمكنك ان تضيف الى تطبيقك , وتختبر المثال التالي . افترض انك تريد ان تزيل كل السجلات مع الـShipmentDate
    في المرحلة ماقبل يناير1993 من جدول الطلبات في قاعدة بياناتك ACCOUNTS.mdb . برنامجك يستطيع ان يزيل السجلات باستخدام الـData Access Objects (DAO) بهذا الشكل :
    Dim dbfAccounts as Database
    Dim recOrders as Recordset
    Set dbfAccounts = DBEngine.Workspaces(0).OpenDatabase("ACCOUNTS.MDB")
    Set recOrders = dbfAccounts.OpenRecordset("Orders", dbOpenTable)
    If recOrders.RecordCount > 0 Then
    recOrders.MoveFirst
    Do Until recOrders.EOF
    If recOrders("ShipmentDate") < #1/1/1993# Then recOrders.Delete
    recOrders.MoveNext
    Loop
    End If
    recOrders.Close
    dbfAccounts.Close

    الان اختبر مثال الـSQL التالي ( هذا المثال سوف تراه في في القسم3.13 ) :
    Dim dbfAccounts as Database
    Set dbfAccounts = DBEngine.Workspaces(0).OpenDatabase("ACCOUNTS.MDB")
    dbfAccounts.Execute("DELETE Orders.* FROM Orders " & _
    "WHERE Orders.ShipmentDate < #1/1/1993#")
    dbfAccounts.Close

    كلا المثالين السابقين ينجز المطلوب , على العموم فان الـSQL تنتج ليس فقط استخدام القليل من الكود إنما أيضا
    في معظم الحالات , فنتائجها اسرع من الـJet database engine . المثال الاول , يوظف تقنيات الـDAO لتقوية عملية استرجاع كامل الجدول ومن ثم تفحص كل سجل واحد تلو الاخر , وازالتها اذا كان ذلك ضرورياً .
    المثال الثاني , يحدد, ويتفحص , ويزيل في خطوة واحدة فقط , سامحاً لقاعدة البيانات عوضاً عن الفيجوال بيسك ان تقوم بالازالة .

    على الرغم من ان تعلم لغة اخرى يكون مقلقاً نوعا ما , الا انك سترى ان باستطاعتك ان تنجز معظم مهام برمجة الـSQL في المرحلة الاولى من التدرب على الـSQL . في هذا الجزء يوضح معظم إعلانات statement الـSQL الهامة , وتقنياتها . علاوة على ذلك , اذا كان لديك ميكروسوفت اكسس , فلست بحاجة لتعلم الـSQL لكي تستخدم الـSQL في الفيجوال بيسك . فالاكسس يمكنة ان يكتب لك حتى اصعب الـSQL عن طريقة ادوات تصميم الاستفهام المختلفة و Wizard packaged في التطبيق .

    *1* انشأ الـrecordset بتحديد السجلات من جدول مفرد :
    ان الـSELECT statement هو الاساس في بناء الـblock من اجل استرجاع السجلات من قاعدة البيانات بواسطة الـSQL . في هذا الدرس سوف تتعلم كيف تنشأ SELECT statement الذي يعين الحقول والسجلات , والـsort order .

    مشكلة :-
    أنا أريد أن احدد مجموعة فرعيةsubset من السجلات في جدول ما , بناء على معيار قمت بتحديدة انا . انا لست بحاجة لرؤية كافة الجداول لكل واحد من السجلات , لكني اريد أن احدد أي سجل اريدة ان يظهر . كيف يمكن ان نقوم بذلك في الفيجوال بيسك باستخدام الـSQL ؟

    التقنية :-
    انشأ recordsets من البيانات في الجداول من خلال الـSQL SELECT statement . يمكنك تضمين الـSQL statement في كود الفيجوال بيسك التابع لك , او يمكنك استخدامة كـrecordsource للـData control .

    الـSQL SELECT STATEMENT :
    الجدول الأساسي في الـSQL SELECT statement لدية أربعة أجزاء , تظهر في الجدول 3.1 , الجزء 1 و2 يكونان مطلوبان في كل SELECT statement . الجزء3 و 4 هما اختياريين , فاذا حذفت الجزء3 , معيار الـrecord-selection , فان الـrecordset سوف يشمل كل السجلات في الجدول . اذا حذفت الجزء 4 , الـsort order , فان السجلات سيتم طلبها كما هي في الجدول .

    الجدول3.1 :
    PURPOSE EXAMPLE
    1. Specify which fields you want to see SELECT [Name], [Telephone]
    2. Specify the table FROM [Publishers]
    3. Specify the record-selection criteria WHERE [State] = "NY"
    4. Specify the sort order ORDER BY [Name]

    ضم الأربعة اسطر التي في الجدول يكمل الـSQL SELECT statement .
    SELECT [Name], [Telephone] FROM [Publishers] WHERE [State] = "NY" ORDER BY [Name]
    هذا المثال من الـBiblio.mdb الموجودة في الهارد ديسك والتي تنزل مع برنامج الفيجوال بيسك في المجلدVB98 على الأغلب .
    قاعدة البيانات هذة لديها جدول اسمة Publishers = الناشرون ومن بين الحقول التي جدول الناشرون هناك حقل اسمة Telephone و حقل اسمةState .
    في المثال اسم الحقل واسم الجدول محاطين كل على حدة بقوسين مربعين [] في حين ان النص NY= نيويورك تكون محاطة بعلامتي تنصيص "" . هذة المتطلبات تساعد الـJet database engine في تفسير الـSQL statement . في الجدول 3.2 قائمة بمتطلبات للـSQL statement .
    الجدول 3.2 :
    ELEMENT ENCLOSURES EXAMPLES WHEN REQUIRED
    Numeric data None
    Text data Single or double "NY" or `NY' Always quotation marks
    Date data Pound signs #6/11/1996# Always
    Field names Square brackets [Name], [Zip Code] When name has spaces or punctuation
    Table names Square brackets [Publisher Comments] When name has spaces or punctuation


    الأحرف الكبيرة ليست ضرورية CAPITALIZATION في تقبل الفيجوال بيسك لتصريح او اعلان الـSQL


    لاحظ انة في المثال في الجدول السابق , اسماء الحقل والجدول لاتتطلب علامتي تنصيص "" لان كل الاسماء تحتوي على كلمة مفردة من دون فراغ spaces او علامة فاصلة رقمية او غيرها . لاحظ ان الاقواس هي اختيارية عندما لايكون هناك فواصل او غيرها .

    الـحقول المضاعفةMultiple fields والمعايير المضاعفة Multiple Criteria :
    اذا كنت بحاجة الى اكثر من حقل في الـrecordset المرجع , عين الحقول بتمييزها بواسطة الـcommas( , ) افعل نفس الشيء لتشير للـMultiple-fields sort .
    المثال التالي يعيد ثلاثة حقول sorted تم فرزها اولاً بواسطة حقل الـState ومن ثم بواسطة الـCity field :
    SELECT [Name], [City], [State], FROM [Publishers]
    ORDER BY [State], [City]

    تعيين معايير مضاعفة من خلال الـAND والـOR . لنفترض ان لديك جدول يشتمل على فواتير بالحقول التي تظهر في الجدول 3.3 :
    الجدول3.3:
    FIELD TYPE
    Invoice Number Numeric
    Issue Date Date
    Amount Currency
    Customer Number Numeric

    تريد ان تنشأ recordset يشتمل على الفواتير للزبون رقم 3267 المؤرخة في اغسطس1,1995 , فان الـSQL SELECT statement قد يبدو كالتالي :
    SELECT [Invoice Number], [Issue Date], [Amount] FROM [Invoices]
    WHERE [Customer Number] = 3267 AND [Issue Date] >= #8/1/95#
    ORDER BY [Issue Date]

    لاحظ ان استخدام اكبر من او يساوي (>=) في الإعلان السابق ويسمى عامل . فان الـSQL تقارن العوامل المحاكية لها المتوفرة في الفيجوال بيسك (mimic محاكاة ) . لاحظ ايضاً ان بسبب كون رقم الزبون يكون حقل رقمي , وليس حقل نصي , فان رقم الزبون ليس محاط بعلامتي تنصيص .
    في وضع اخر , ربما تريد ان تجد الفاتورة المصدرة للزبون رقم 3267 ورقم 3396 . فان إعلانك ربما يكون على الشكل التالي :
    SELECT [Invoice Number], [Issue Date], [Amount] FROM [Invoices]
    WHERE [Customer Number] = 3267 OR [Customer Number] = 3396
    ORDER BY [Issue Date]

    يمكنك ضم AND وOR لتحديد فاتورةinvoices الزبون3267 والزبون3396 والتي تم إصدارهاissued في او بعد اغسطس1 ,1995 ويكون الإعلان كالتالي :
    SELECT [Invoice Number], [Issue Date], [Amount] FROM [Invoices]
    WHERE ([Customer Number] = 3267 OR [Customer Number] = 3396)
    AND [Issue Date] >= #8/1/95# ORDER BY [Issue Date]

    في المثال الأخير المعيار OR’d ضمن في القوسين ( ) . تقوم بهذا العمل لكي تعيين للـJet engine ان يكون الامر او الطلب حيثما يجب ان تقييم المعيار criteria . في هذا الوضع فان الـORs (جمع OR ) تذهب مجتمعه . وتريد ان تحدد الفاتورة المرسلة لكلا الزبونيين بعد التاريخ المعين .

    استخدام الـSQL statement مع الـData control :
    عندما تستخدم الـData control , فانت تعد خاصية الـcontrol’s الذي هيRecordSource لتعيين السجل الذي سيعرضة الـcontrol . الخاصية RecordSource يمكن اعدادها للجدول , لتخزين استفهام , او لتخزين SQL statement . عندما تستخدم الـSQL SELECT statement على انة RecordSource , يمكنك ان تعين السجلات الموجودة في الجدول بواسطة بالمعيار الذي تحددة , ويمكنك تعيين الـorder في اي سجل يكون . بفعل عدم امكانيتك لاستخدام الفهارس مع الـData control فان المقدرة على تعريف الـsort order هو شيء مهم .

    استخدام الـSQL statement مع الـOpenRecordset :
    ان اختصارات object قاعدة البيانات تتضمن طريقة تدعىOpenRecordset , مع إمكانية إنشائك للـdynaset او الـsnapshot باستخدام الـSQL statement على انها first argument .الـSQL statement يجب ان يكون على شكل string (وذلك يكون بتضمينة بعلامتي تنصيص ) .

    افترض ان لديك تصريح للـdbfTemp انها قاعدة بيانات والـrecTemp على انةrecordset وانك أشرت لقاعدة البيانات هذة . يمكنك عندها ان تنشأ recordset مع الاعلان التالي (الاعلان يجب ان يكون كلة في سطر واحد بالطبع ):
    Set recTemp = dbfTemp.OpenRecordset("SELECT [Name], [Telephone] FROM [Publishers]
    &Acirc;WHERE [State] = `NY' ORDER BY [Name]")

    بعد تنفيذ هذا الاعلان , فان الـrecTemp سوف يعد السجلات التي تتقابل مع المعايير المعينة في الـSQL statement . يمكنك استخدام أي من طرق الـRecordset object’s لكي تعمل مع هذة السجلات .

    لاحظ انة في المثال السابق بسبب كون كامل الـSQL statement محتوى كلة ضمن علامة تنصيص واحدة " .
    اذا كانت بداية النص مضمنة في اشارة تنصيص مفردة , فيجب ان تستخدم زوج من علامتي تنصيص "" .
    على سبيل المثال لنفترض انك تبحث عن سجلات تحت اسم الشركةJoe’s Beanery . فان الشرط WHERE في الـSQL statement سيكون التالي :
    WHERE [Company Name] = "Joe's Beanery"

    يمكنك ايضاً ان تنسب الـSELECT statement الى string variable ومن ثم استخدام الـstring variable كـargument لطريقة الـOpenRecordset . لنفترض ان الـsqlstmt قد تم التصريح لة على انة string وعلان النسب التالي يظهر كلة في سطر واحد :
    sqlStmt = "SELECT [Name], [Telephone] FROM [Publishers] WHERE [State] = `NY'
    &Acirc;ORDER BY [Name]" Set recTemp = dbfTemp.OpenRecordset(sqlStmt)

    وبسبب كون الـSQL statement قد يكون طويلاً نوعا ما , وأنت لا تستطيع استخدام خاصية السطر المستمر line-continuation في الفيجوال بيسك في وسط الاقتباس الـstring—assigning SQL statement
    للـstring غالباً ينتج المزيد من الكود المقرؤ . يمكنك ان تبني الـstring بواسطة الـconcatenation operator عامل تسلسل الأحداث :
    sqlStmt = "SELECT [Invoice Number], [Issue Date], [Amount] FROM [Invoices]"
    sqlStmt = sqlStmt & " WHERE ([Customer Number] = 3267 OR [Customer Number] = 3396)"
    sqlStmt = sqlStmt & " AND [Issue Date] >= #8/1/95# ORDER BY [Issue Date]"
    Set recTemp = dbfTemp.OpenRecordset(sqlStmt)

    الخطوات :-
    افتح مشروع SELECT.vbp . غير خاصية الـDatabaseName للـData control وحولها الىBiblio.mdb المنزلة مع الفيجوال بيسك كما ذكرنا سابقاً . ثم شغل المشروع كما في الشكل .

    1- انشا new project وسميةSELECT1.vbp , استخدم الـForm1 لبناء الـObject’s بالخصائص في الجدول 3.4 ثم احفظ الـForm1=SELECT1.vbp .
    الجدول3.4 :
    OBJECT PROPERTY SETTING
    Form Name Form1
    Caption Chapter 3.1 Example
    CommandButton Name cmdClose
    Caption Close
    Default True
    ListBox Name lstTitles
    Data Name dtaData
    Caption dtaData
    RecordSource SELECT [Company Name] FROM [Publishers] WHERE STATE = `NY' ORDER BY [Company Name]
    Visible False
    DBList Name dlstPublishers
    RowSource dtaData
    ListField Company Name

    2- اضف الكود التالي الى قسم التصريحdeclarations section من الـForm1 .
    Option Explicit
    `Change the following to point to your copy of BIBLIO.MDB.
    Private Const BIBLIO_PATH = _
    "D:\Program Files\Microsoft Visual Studio\VB6\Biblio.MDB"

    3-أضف الكود التالي إلى الـload event للـForm1 . الـForm_load event سوف يعد الخاصية DatabaseName للـData control’s الى الـdtaData , سامحاً لها ان تسترجع البيانات او تتلقاها . ومن ثم فان الـsnapshot-type Recordset object تقوم بضم السجلات من عناوين الجدول حيثما يكون
    حقل[years Published] مساوياً لـ1993 او1994 يكون انشأ , والعناوين أضيفت إلى الـlstTitles list box .
    PPrivate Sub Form_Load()
    Dim dbfBiblio As Database, recSelect As Recordset
    Dim strSQL As String
    `Set up the error handler.
    On Error GoTo FormLoadError
    `Get the database name and open the database.
    dtaData.DatabaseName = BIBLIO_PATH
    dtaData.Refresh
    Set dbfBiblio = _
    DBEngine.Workspaces(0).OpenDatabase(BIBLIO_PATH)
    `Open a snapshot-type recordset on the [Titles] table,
    ` selecting only those titles published in 1993 or 1994,
    ` sorting by the ISBN number. Note the use of the line
    ` continuation character (_), used throughout the
    ` examples, to make code more readable. " & _
    strSQL = "SELECT [Title], [ISBN] FROM [Titles] " & _
    "WHERE [Year Published] = 1993"
    Or [Year Published] = 1994 " & _
    "ORDER BY [ISBN]"
    `Create the recordset.
    Set recSelect = dbfBiblio_OpenRecordset(strSQL, _
    dbOpenSnapshot)
    `Iterate through the recordset until the end of the file
    `(EOF) is reached. Display each record in the unbound
    `list box lstTitles.
    If recSelect.RecordCount > 0 Then
    recSelect.MoveFirst
    Do Until recSelect.EOF
    lstTitles.AddItem recSelect![ISBN] & ": " & _
    recSelect![Title]
    recSelect.MoveNext
    Loop
    End If
    Exit Sub
    FormLoadError:
    `If an error occurs, display it with a MsgBox command.
    MsgBox Err.Description, vbExclamation
    Exit Sub
    End Sub

    4-أضف الكود التالي الى الـClick-event للـcmdClose_Click event سوف ينهي التطبيق :
    Private Sub cmdClose_Click()
    End
    End Sub

    ألان نشرح كيف تم العمل السابق بالكامل :
    في المثال السابق تم عرض قائمتين , كل واحدة منها تظهر السجلات في الـrecordset المولد او المنتج بواسطة الـSQL SELECT statement . القائمة التي في الأعلى هي DBList control bound للـData control dtaData ( الـdtaData هو اسم قاعدة البيانات الذي وضعناة نحن ) .
    الـSQL statement الذي يُنتج الـrecordset يكون مجهز على ان الخاصية RecorSource للـData control .
    القائمة في الأسفل هي unbound ListBox . والتي يولد الـrecordset الخاص بها , بواسطة الطريقة method OpenRecordset وذلك باستدعى من الـForm_load event .

    التعليق :-
    كما قد يبدو هذا المثال , فانه حجر الأساس لإدخال البيانات في الفيجوال بيسك باستخدام الـSQL . ولا اهمية لاي طريقة تستخدمها (Data control , Data Access Object ) او غيرها , الـSQL هو حجر الاساس لكل من هذة الطرق .


    القسم الثاني من هذا الجزء

    كيف يتم تحديد قيم حقل unique في الـSQL query ؟

    مشكلة :-
    انا اعلم ان السجلات في جدولي تحوي قيم متكررة او منسوخة duplicate value في حقل محدد . فكيف يمكن ان انشا قائمة بهذة القيم في الحقل ؟

    التقنية :-
    بشكل افتراضي فان الـSQL statement ترجع صف واحد لكل صف من هذة الصفوف في الجدول , التي تقابل المعيار المعين في اعلان الشرطWHERE . اذا كانت نتيجة هذا الحدث في الصفوف المكررة , فان هذا التكرار duplications يعاد انتاجة او توليده في الـoutput recordset . على سبيل المثال , لنفترض ان شركتك لديها منج معين بالوان مختلفة لكنها تحمل نفس رقم الانتاج ( أي نفس الرقم لكل الوان المنتج ) . قد يكون جدول المنتجات على الشكل التالي :
    Product Number Color
    AGD44523 Green
    AGD44523 Red
    AGD44527 Red

    لديك سجلين في الحقل [products number] تساوي الرقمAGD44523 , كلها بنفس المدخل في الحقل [color]
    فان الاستفهام في هذا الجدول سيكون على الشكل التالي :
    SELECT [Product Number] FROM [Products]

    وتتضمن نتيجة الـrecordset صفين توامين , كل منهما يحمل القيمةAGD44523 .
    ربما تكون رغبتك في بقائمة بالـunique numbers , بدون تكرار duplication . يمكنك اخبار الـJet engine ان تقوم بفلترة الـduplicates خارج نتيجة الـrecordset بإدراج الكلمة DISTINCT بشكل فوري بعد الكلمةSELECT . عليك الان ان تعيد كتابة الـSQL statement كالتالي :
    SELECT DISTINCT [Product Number] FROM [Products]

    هذا الاعلان سوف يؤدي الى نتيجة في الـrecordset مع حادثة واحدةoccurrence للقيمةAGD44523 .

    سؤال: ايهما اسرع الـSQL ام الـPROCEDURAL الاجراء ؟

    الاجابة : انة لمن المعقد في الاجابة على ذلك , الكثير من الحالات طرق الـSQL سوف تكون اسرع من الاجراءات التقليدية النظيرة لها .
    اذا كانت العملية time critical , فيجب ان نضع في فكرنا أي من الـSQL اوالـprocedural يكون مربح في الاستخدام قبل ان نتخذ القرار في الاختيار .
    انة لمن المهم معرفة ان في الصفوف الدراسية العالية يوجد تعميم في ان الـSQL هي عادة اسرع بالاعتماد على الدخول العشوائي الى فهارس الجدول باستخدام الـseek method عندما تكون كل واحدة من عمليات الـSeek متبوعة بعمليات على عدد صغير من السجلات . الكود التالي يمثل هذا الكلام :
    Set recSelect = dbfTest.OpenRecordset("MyTable", dbOpenTable)
    recSelect.Index = "MyIndex"
    recSelect.Seek "=", intSomeValue
    If Not recSelect.NoMatch Then
    ` Perform an action on the record sought
    End If
    ` If needed, perform another Seek, or close the recordset and
    ` move on.
    In such cases, the traditional procedural methods are usually faster than SQL statements.

    ملحوظة :- لقد قمت بنشر جزء من الدرس الثاني للـSQL statement لكن كما ترون فانة غير منسق والسبب اني قليل الخبرة في ادراج الجداول والصور او حتى ارفاق الملف مضغوط , فلقد سألتكم من قبل لكن لم يرد احد .
    فمعظم الكلام المكتوب بالا نغليزي هي اساسأ جداول , لكن المهم اتوقع ان يتبرع واحد منكم ويذكر لي طريقة لكي انشر الصفحة كما هي عندي في الميكروسوفت وورد او المستكشف بالجداول والصور ……..
    والسلام ختام …………..
    [WEB]http://www.ye1.org/vb/showthread.php?s=&threadid=50101[/WEB]
     
  18.   مشاركة رقم : 10    ‏2003-09-06
  19. 3laa3sam

    3laa3sam عضو فعّال

    التسجيل :
    ‏2003-06-21
    المشاركات:
    619
    الإعجاب :
    0
    والله مجهود جبار....

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

مشاركة هذه الصفحة