Manipolazione Tabelle Access da codice

di il
23 risposte

Manipolazione Tabelle Access da codice

Salve, ringrazio fin da subito per la vostra disponibilità.
Ho cercato attraverso la ricerca eventuali discussioni già aperte in merito al problema che vorrei porvi ma, ahimè, non ho trovato nulla.

Sto lavorando da molto tempo con Delphi7 su un progetto (Programma Gestionale) in continua evoluzione.
Per lo stesso mi sono avvalso, oltre a dei CDS, di Tabelle Access.
Non ho mai avuto problemi a "manipolare" le stesse attraverso codice (CREATE TABLE, ALTER TABLE, ecc.).
Purtroppo, inizialmente, in una di queste Tabelle ho creato un vincolo (Valido se (>=0 And <6)).
Ora questo vincolo non corrisponde più alle mie esigenze avendo ampliato il range di inserimento dei valori.

Ho provato in tutte le salse a toglierlo o modificarlo ma non c'è stato nulla da fare.
Sicuramente uso qualche termine che da "fastidio" al codice.

Grazie

23 Risposte

  • Re: Manipolazione Tabelle Access da codice

    Mostra il codice, allora, e spiega quale errore ottieni.
  • Re: Manipolazione Tabelle Access da codice

    Questa è la procedura che solitamente seguo, appoggiandomi ad una query, per Creare/Modificare le Tabelle di Access.
    Nel caso specifico (Valido se):

    Qy.Connection := DatiDB;
    Qy.SQL.Clear;
    Qy.SQL.Add('CREATE TABLE Tabella (Colonna INT NOT NULL CHECK (Colonna >=0 AND <15))');
    try Qy.ExecSQL except end;


    Qy.Connection := DatiDB;
    Qy.SQL.Clear;
    Qy.SQL.Add('ALTER TABLE Tabella ALTER Colonna CHECK (Colonna >=0 AND <15)');
    try Qy.ExecSQL except end;

    Ovviamente con l'ExecSQL racchiuso nel try except non da alcun errore altrimenti da il seguente msg:
    "Errore di sintassi nella definizione del Campo"
  • Re: Manipolazione Tabelle Access da codice

    Prima devi fare il DROP, poi lo ricrei

    SQL CHECK Constraint
    https://www.w3schools.com/sql/sql_check.as
  • Re: Manipolazione Tabelle Access da codice

    Innanzi tutto ti ringrazio Gibra.
    Ho seguito il tuo consiglio e sono riuscito a creare Tabelle con clausole e quindi ad eliminarle.
    Il problema sta nel fatto che non riesco ad eliminare (DROP) un vincolo assegnato in una Tabella creata con Access.
    Non conosco il nome del CONSTRAINT.
  • Re: Manipolazione Tabelle Access da codice

    Allora le strade sono due:
    1) esplori gli oggetti del database, alla ricerca del nome del CONSTRAINT che ti interessa
    2) apri il database con MSAccess e modifichi la struttura della tabella manualmente

    La 2ª è sicuramente la via più facile e comoda (io faccio sempre così).
  • Re: Manipolazione Tabelle Access da codice

    Andrew61 ha scritto:


    Innanzi tutto ti ringrazio Gibra.
    Ho seguito il tuo consiglio e sono riuscito a creare Tabelle con clausole e quindi ad eliminarle.
    Il problema sta nel fatto che non riesco ad eliminare (DROP) un vincolo assegnato in una Tabella creata con Access.
    Non conosco il nome del CONSTRAINT.
    Tutto ciò suggerito da gibra è correttissimo
    Giusto un paio di specifiche in più:
    Innanzitutto la gestione dei CheckConstraint si può fare con ADO, ma utilizzando il provider JET.OLEDB.4.0
    Inoltre ti consiglio di utilizzare i TAdoCommand invece di TAdoQuery per la creazione, modifica, eliminazione di Tabelle, campi o indici, dato che non necessiti di un oggetto dataset come return.

    Riguardo al risalire ai Constraints presenti, in Struttura Tabella non vedi quelli di tipo CheckConstraint.

    Io di solito uso Analizzatore Database (da MS Access), seleziono la tabella che mi interessa, entro in Opzioni e spunto sia 'Includi per campi' che 'Includi per indici', scegliendo la terza opzione per entrambi (Nomi, campi e proprietà)

    Nel report include quindi anche i Constraints di tipo Check.

    trovato il tuo lo 'droppi' come suggerito in precedenza.

    Infine, quando crei un Check 'Valido Se' con limiti, ti consiglio di usare BETWEEN.
    Per esempio (Colonna >=0 AND <15) puoi scriverlo (Colonna BETWEEN 0 AND 14), che significa esattamente la stessa cosa (BETWEEN include tutti i valori tra il primo ed il secondo). Eviti di incorrere in errori di sintassi (Colonna andrebbe ripetuto) e utilizzi un comando già presente nel motore sql.
  • Re: Manipolazione Tabelle Access da codice

    Esiste un altro modo per ottenere i checkconstraints da codice, come spiegava gibra al punto 1.

    Crei un progetto nuovo. Metti un TAdoConnection sulla form e lo colleghi al database.
    Poi metti un TAdoDataset e imposti solo la proprietà Connection puntando a AdoConnection1
    Lega una TDataSource al AdoDataset1 e una TDBGrid a DataSource1
    Infine, con un TButton, al click utilizzerai questo codice:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      AdoConnection1.Connected := true;
      AdoConnection1.OpenSchema(siCheckConstraints, EmptyParam, EmptyParam, AdoDataset1);
    end;
    Nella Griglia vedrai tutte le informazioni relative ai CheckConstraint.

    OpenSchema restituisce un recordset contenente le informazioni del database relative al tipo di schema a cui accedi
    In ADODB.pas è dichiarato TSchemaInfo, che puoi usare per ottenere diverse informazioni.
    TSchemaInfo = (siAsserts, siCatalogs, siCharacterSets, siCollations,
        siColumns, siCheckConstraints, siConstraintColumnUsage,
        siConstraintTableUsage, siKeyColumnUsage, siReferentialConstraints,
        siTableConstraints, siColumnsDomainUsage, siIndexes, siColumnPrivileges,
        siTablePrivileges, siUsagePrivileges, siProcedures, siSchemata,
        siSQLLanguages, siStatistics, siTables, siTranslations, siProviderTypes,
        siViews, siViewColumnUsage, siViewTableUsage, siProcedureParameters,
        siForeignKeys, siPrimaryKeys, siProcedureColumns, siDBInfoKeywords,
        siDBInfoLiterals, siCubes, siDimensions, siHierarchies, siLevels,
        siMeasures, siProperties, siMembers, siProviderSpecific);
    Ora hai un sacco di informazioni in più. Divertiti
  • Re: Manipolazione Tabelle Access da codice

    gibra ha scritto:


    Allora le strade sono due:
    1) esplori gli oggetti del database, alla ricerca del nome del CONSTRAINT che ti interessa
    2) apri il database con MSAccess e modifichi la struttura della tabella manualmente

    La 2ª è sicuramente la via più facile e comoda (io faccio sempre così).
    Purtroppo non posso optare per la seconda soluzione da te suggerita perché lavoro su un progetto in uso ad utenti.
    Quindi la mia unica possibilità è quella di apportare le modifiche attraverso un aggiornamento.

    Comunque sono riuscito a trovare il nome del CONSTRAINT e ad eliminarlo anche attraverso i suggerimenti di f3rr0.
    E questo è sicuramente un primo passo.
    Purtroppo però non c'è verso di togliere e/o sostituire il "Valido se" presente nelle caratteristiche del campo.
    Oltretutto ad ogni tentativo di variazione (per altro con nessun msg di errore) si crea un nuovo CONSRTAINT.
  • Re: Manipolazione Tabelle Access da codice

    Non so se dico una cavolata, dunque prendi la mia risposta con le dovute cautele

    Per cambiare il constraint sul campo potresti fare il gioco delle 6 tavolette :

    Primo passo: crei un campo nuovo di supporto dello stesso tipo del campo con constraint
    ALTER TABLE Tabella ADD Colonna_dummy Integer;

    Secondo passo: riempi il nuovo campo con i valori del campo contenente il constraint
    update tabella set Colonna_dummy=Colonna;

    Terzo passo: elimini il campo con il constraint
    Alter table tabella DROP COLUMN Colonna;

    Quarto passo: ricrei il campo con il nuovo constraint
    ALTER TABLE Tabella ADD Colonna CHECK (Colonna >=0 AND <15)')

    Quinto passo: riempi il nuovo campo con i valori del campo temporaneo
    update tabella set Colonna=Colonna_dummy;

    Sesto passo: elimini il campo temporaneo
    ALTER TABLE tabella DROP COLUMN Colonna_dummy;

    W.
  • Re: Manipolazione Tabelle Access da codice

    Wolfen ha scritto:



    Quarto passo: ricrei il campo con il nuovo constraint
    ('ALTER TABLE Tabella ADD Colonna CHECK (Colonna >=0 AND <15)')

    W.
    Penso che anche il tuo suggerimento fili liscio... Interessante!
    Però mi da un errore di sintassi.
    ???
  • Re: Manipolazione Tabelle Access da codice

    Probabilmente dividere in 2 la creazione del campo e quella del constraint
    ALTER TABLE Tabella ADD Colonna integer;
    ALTER TABLE Tabella ALTER Colonna CHECK (Colonna BETWEEN 0 AND 14);
  • Re: Manipolazione Tabelle Access da codice

    Wolfen ha scritto:


    ('ALTER TABLE Tabella ALTER Colonna CHECK (Colonna BETWEEN 0 AND 14)');
    Purtroppo anche qui mi da un errore di sintassi...
  • Re: Manipolazione Tabelle Access da codice

    Sbagliare è umano.
    L'indicazione di Wolfen delle 6 tavolette è corretta.

    Però se sbagliate la sintassi è ovvio che poi vi beccate un errore.

    Andrew, ti ho già indicato il link con 'le sintassi corrette' ......

  • Re: Manipolazione Tabelle Access da codice

    Dal mio lettino di influenzato e dall'alto dei miei 39 di febbre, aggiungo solo che in quel link, se proprio vuoi un ulteriore indizio, scorri fino alla sezione 'SQL CHECK on ALTER TABLE'.
    Vedrai che troverai la soluzione. Il problema non sta nel BETWEEN ma...
Devi accedere o registrarti per scrivere nel forum
23 risposte