Est-il possible de créer une contrainte de vérification en matière d'accès et / ou DAO?

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

  •  11-09-2019
  •  | 
  •  

Question

Je suis en train de créer une contrainte de vérification sur une table d'accès (jet?).

Alors, j'ouvre le fichier .mdb avec accès, allez dans queries-> Créer une requête en vue de la conception, Type esc, puis menu-> view-> requête et enfin tapez

créer la table X (   un numéro,   chèque (a> 20) )

, mais l'accès pense que j'ai une « erreur de syntaxe dans la définition du champ ». Cependant, je ne pense pas. Par conséquent, ma question: est-il possible de créer une contrainte de vérification avec accès. Si oui:. Comment

De plus, je voudrais créer la contrainte avec dao / vba, pas sur l'interface graphique. Est-ce possible?

Enfin, sur une note légèrement liée: comment entrez-vous des instructions SQL dans l'accès. Je ne peux pas imaginer que je dois utiliser le queries-> conception view-> query-> itinéraire de vue afin de le faire. Je suis habitué à SQL * Plus, qui me plaît beaucoup d'Oracle, et je l'espère, il y a quelque chose de similaire pour l'accès aussi bien.

Merci pour toute entrée René

Était-ce utile?

La solution

Voici quelques notes.

Vous pouvez créer un requête SQL pour Oracle (Sélectionner le menu "requête"> "SQL spécifique"> "Pass-Through")

Depuis Access 2003, vous pouvez sélectionner SQL Server compatible Syntaxe (ANSI 92) ( http://office.microsoft.com/en-us/access/HA010345621033.aspx )

Une règle de validation avec 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"

Contraintes avec ADO / VBA. Voir [pour Access 2000 Microsoft Jet SQL intermédiaire] ( 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

Autres conseils

Il y a la règle de validation sur une colonne. Vous pouvez utiliser VB pour Access. pas SQL * Plus ici ... Vous pouvez toujours utiliser SQL Express comme source de données -. Avec tous les avantages du vrai serveur sql et utiliser l'accès uniquement comme avant

Pour ce faire, dans Access, vous devez d'abord ouvrir l'interface en ANSI -92 mode de requête . Je l'ai testé votre code SQL DDL:. Il fonctionne très bien et crée une colonne de type FLOAT (Double)

est-n'est pas possible de le faire en utilisant DAO mais vous pouvez utiliser ADO. Longue histoire courte: contraintes de CHECK ont été introduites dans le moteur à l'ère Jet 4.0 lorsque l'équipe d'accès ont été ADO favorise. Avec effet à partir Access2007, l'équipe d'accès sont de retour à favoriser OAC, mais ne sont pas encore boucher les « trous » Jet 4.0 dans DAO. Donc, pour la majorité des Jet 4.0 fonctionnalité -seulement (types de données compressibles, types de données de texte de longueur fixe, clés étrangères rapides, etc.) vous devez utiliser ADO.

Vous ne pouvez pas utiliser la norme ANSI dans le générateur de requête vous définissez la SAUF SI base de données sql ansi compatibles. Si vous modifiez ce paramètre, alors vous pouvez pouvez utiliser le sql dans le générateur de requête que vous avez. Je ne recommanderais pas modifier ce paramètre pour les bases de données existantes cependant.

Si vous le faites, vous pouvez taper:

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

vous n'avez pas besoin de sauver le sql dans le générateur de requête, et vous voulez juste taper dans le sql, puis simplement Whack ctrl-g pour obtenir la commande d'accès rapide de la ligne, et vous pouvez taper puis dans:

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

Le ci-dessus serait tapé sur une seule ligne. Ainsi, vous pouvez utiliser l'invite de ligne de commande si vous voulez ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top