هل من الممكن إنشاء قيود فحص في الوصول و / أو DAO؟

StackOverflow https://stackoverflow.com/questions/1660512

  •  11-09-2019
  •  | 
  •  

سؤال

أحاول إنشاء قيود فحص على جدول Access (Jet؟).

لذلك، افتح ملف .mdb مع الوصول، انتقل إلى استفسارات -> إنشاء استعلام في طريقة عرض التصميم، اكتب ESC، ثم Menu-> عرض-> Query وأخيرا

إنشاء جدول X (رقم، تحقق (a> 20))

لكن الوصول يفكر في أن لدي "خطأ في بناء الجملة في تعريف الحقل". ومع ذلك، لا أعتقد ذلك. لذلك سؤالي: هل من الممكن إنشاء قيود تحقق مع الوصول. إذا كان الأمر كذلك: كيف.

بالإضافة إلى ذلك، أود إنشاء قيد القيد مع DAO / VBA، وليس على واجهة المستخدم الرسومية. هل هذا ممكن؟

وأخيرا، في ملاحظة ذات صلة قليلا: كيف تدخل بيانات SQL في الوصول. لا أستطيع أن أتخيل أنني لا بد لي من استخدام الاستفسارات-> عرض التصميم-> استعلام - عرض المسار من أجل القيام بذلك. أنا معتاد على أوراكل SQL * Plus، التي أحبها كثيرا، وأتمنى أن يكون هناك شيء مشابه للوصول أيضا.

شكرا لأي مدخلات رينيه

هل كانت مفيدة؟

المحلول

هنا بعض الملاحظات.

يمكنك إنشاء استعلام تمرير من أجل Oracle (حدد "استعلام"> "SQL محددة"> "Pass عبر")

منذ الوصول إلى 2003، يمكنك اختيار بناء جملة متوافق SQL Server (ANSI 92) (http://office.microsoft.com/en-us/access/ha034562103.aspx.)

قاعدة التحقق من الصحة مع VBA / DAO

''Reference: Microsoft DAO x.x Object Library

Dim tdf As TableDef
Dim db As Database

Set db = CurrentDb

Set tdf = db.TableDefs("Table1")

tdf.Fields("aDouble").ValidationRule = "<10"
tdf.Fields("aDouble").ValidationText = "Must be less than 10"

القيود مع ADO / VBA. انظر [Mixmediate Microsoft Jet SQL للوصول إلى 2000] (http://msdn.microsoft.com/en-us/library/aa140015(office.10).aspx)

''Reference: Microsoft ADO Ext. x.x for DDL and Security

Dim cn As ADODB.Connection 'For action queries
Dim rs As ADODB.Recordset  'For select queries
Dim s As String
Dim RecordsAffected As Long

Set cn = CurrentProject.Connection

''You can store sql in a table
s = DLookup("SQLText", "sysSQL", "ObjectName='q1'")
''Result: CREATE TABLE tblCreditLimit (LIMIT DOUBLE)
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''You can run queries from VBA
s = "INSERT INTO tblCreditLimit VALUES (100)"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "CREATE TABLE tblCustomers (CustomerID COUNTER, CustomerName Text(50))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "INSERT INTO tblCustomers VALUES (1, 'ABC Co')"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "ALTER TABLE tblCustomers " _
   & "ADD COLUMN CustomerLimit DOUBLE"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''You can add contraints using ADO like so:
s = "ALTER TABLE tblCustomers " _
   & "ADD CONSTRAINT LimitRule " _
   & "CHECK (CustomerLimit <= (SELECT LIMIT " _
   & "FROM tblCreditLimit))"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "UPDATE tblCustomers " _
   & "SET CustomerLimit = 200 " _
   & "WHERE CustomerID = 1"
''Error occurs here
cn.Execute s, RecordsAffected

s = "UPDATE tblCustomers " _
   & "SET CustomerLimit = 90 " _
   & "WHERE CustomerID = 1"
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

''Clean up
''You cannot do this through the database window,
''because of the constraint.
s = "ALTER TABLE tblCustomers DROP CONSTRAINT LimitRule "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "DROP TABLE tblCustomers "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

s = "DROP TABLE tblCreditLimit "
cn.Execute s, RecordsAffected
Debug.Print RecordsAffected

نصائح أخرى

هناك قاعدة التحقق من الصحة على عمود. يمكنك استخدام VB للوصول. لا SQL * Plus هنا ... يمكنك دائما استخدام SQL Express كصور بيانات - مع جميع فوائد SQL Server واستخدام الوصول فقط كملحق فقط.

للقيام بذلك في الوصول، تحتاج إلى فتح الواجهة أولا وضع الاستعلام ANSI-92. وبعد لقد اختبرت رمز SQL DDL الخاص بك: إنه يعمل بشكل جيد ويخلق عمود من النوع FLOAT (مزدوج).

لا يمكن القيام بذلك باستخدام DAO ولكن يمكنك استخدام ADO. قصة طويلة قصيرة: CHECK تم تقديم القيود في المحرك في عصر Jet 4.0 عندما كان فريق الوصول يفضل ADO. مع تأثير من Access2007، عاد فريق الوصول إلى تفضيل DAO لكنه لم يقم بعد بتوصيل ثقوب Jet 4.0 في DAO. لذلك بالنسبة لغالبية وظائف Jet 4.0 -only (أنواع البيانات المضغوطة، أنواع بيانات النص الثابتة ذات الطول الثابت، مفاتيح أجنبية سريعة، إلخ) تحتاج إلى استخدام ADO.

لا يمكنك استخدام ANSI القياسية في منشئ الاستعلام ما لم تقم بتعيين قاعدة البيانات كمتوافق SQL ANSI. إذا قمت بتغيير هذا الإعداد، فيمكنك استخدام SQL في Builder Query كما لديك. لن أوصي بتغيير هذا الإعداد لقواعد البيانات الحالية ومع ذلك.

إذا قمت بذلك، فيمكنك كتابة:

CREATE TABLE z1 
       (id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
check (id < 20),  
constraint Mypk primary key (id) )

لا تحتاج إلى حفظ SQL في منشئ الاستعلام، وتريد فقط اكتب SQL، ثم ببساطة Whack Ctrl-G للحصول على موجه سطر الأوامر Access، ويمكنك كتابة ذلك:

currentproject.Connection.Execute "CREATE TABLE
    z1(id int IDENTITY , FirstName CHAR, LastName CHAR, SSN INTEGER ,
    check (id < 20),
    constraint Mypk primary key (id) )"

سيتم كتابتها أعلاه على سطر واحد. لذلك، يمكنك استخدام موجه سطر الأوامر إذا كنت تريد ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top