Domanda

Sto cercando di creare un vincolo di controllo su un accesso (jet?) Della tabella.

Quindi, apro il file mdb con accesso, vado in queries-> creare query in visualizzazione struttura, Tipo esc, quindi Menu-> Visualizza-> query e infine digitare

create table X (   un numero,   controllo (a> 20) )

ma l'accesso pensa che ho un "errore di sintassi nella definizione del campo". Comunque, io non la penso così. Quindi la mia domanda: è possibile la creazione di un vincolo di controllo con accesso. Se è così:. Come

Inoltre, mi piacerebbe creare il vincolo con dao / VBA, non sulla GUI. È possibile?

E, infine, su una nota leggermente correlati: Come si entra istruzioni SQL in Access. Non riesco a immaginare che devo usare il queries-> disegno Visualizza-> query-> Visualizza percorso al fine di farlo. Sono abituato a Oracle SQL * Plus, che mi piace molto, e mi auguro che ci sia qualcosa di simile per l'accesso pure.

Grazie per ogni ingresso Rene

È stato utile?

Soluzione

Ecco alcune note.

È possibile creare un pass-through query per Oracle (Selezionare il menu "Query"> "SQL specifico"> "Pass-Through")

Dal Access 2003, è possibile selezionare SQL Server sintassi compatibile (ANSI 92) ( http://office.microsoft.com/en-us/access/HA010345621033.aspx )

Una regola di convalida con 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"

I vincoli con ADO / VBA. Vedere [Intermedio SQL di Microsoft Jet per Access 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

Altri suggerimenti

Non c'è regola di convalida su una colonna. È possibile utilizzare VB per l'accesso. non SQL * Plus qui ... È sempre possibile utilizzare SQL Express come fonte di dati -. Con tutti i vantaggi di sql server reale e utilizzare l'accesso solo come un fronte

Per fare questo in Access, è necessario aprire prima l'interfaccia in ANSI -92 Modalità query . Ho provato il codice DDL SQL:. Funziona benissimo e crea una colonna di tipo FLOAT (doppio)

È non è possibile farlo utilizzando DAO ma è possibile utilizzare ADO. Per farla breve: vincoli CHECK sono stati introdotti nel motore in epoca Jet 4.0 quando il team di accesso sono stati favorendo ADO. Con effetto dal Access2007, la squadra di accesso sono di nuovo a favorire DAO ma devono ancora tappare i 'buchi' Jet 4.0 a DAO. Così, per la maggior parte delle funzionalità di Jet 4.0 -solo (tipi di dati comprimibili, i tipi di dati a lunghezza fissa di testo, chiavi esterne veloci, ecc) è necessario utilizzare ADO.

Non è possibile utilizzare standard ANSI nel generatore di query se non si imposta il database come SQL ANSI compatibile. Se si modifica questa impostazione, quindi è possibile utilizzare lo SQL nel generatore di query come si deve. Io non consiglierei di modificare questa impostazione per tutto il database esistente.

Se lo fai, è possibile digitare:

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

In te non c'è bisogno di salvare lo SQL nel generatore di query, e solo voglia di digitare lo SQL, poi semplicemente colpire Ctrl-g per ottenere il prompt della riga di comando di accesso, e quindi è possibile digitare:

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

È possibile che questo sarebbe stato digitato su una sola riga. Quindi, è possibile utilizzare la riga di comando se si vuole ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top