Creare a runtime indice in db access

di il
9 risposte

Creare a runtime indice in db access

Buongiorno,

Ho un'applicazione che gira su un db sql con vbnet.  Voglio scaricare dinamicamente alcune tabelle su un db access in modo da poter utilizzare il programma da una chiavetta.

per accedere ad acces utilizzo "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" percorso + nome file

definisco la tabella con i campi

create table Cretab (tavola memo not null,tipo memo not null, definizione memo not null) e la tabella viene creata

cerco di creare l'indice con l'istruzione

create [unique] index cretab01 on Cretab (tavola [asc]) [with primary]

e mi risponde problema nell'operazione create table

Cosa sto sbagliando?

Grazie per i consigli

9 Risposte

  • Re: Creare a runtime indice in db access

    01/01/2024 - guggo ha scritto:


    create [unique] index cretab01 on Cretab (tavola [asc]) [with primary]

    Sono passato per sbaglio su questo thread, ho visto scritto “Access”, però forse qualcosa posso dirti: se l'hai scritta così è ovvio che non funziona. Quello che è tra parentesi quadre è un elemento facoltativo, puoi inserirlo o meno ma se c'è non si scrive tra parentesi quadre.

    Potrebbe essere 

    CREATE UNIQUE INDEX cretab01 ON Cretab (tavola ASC);

    ma lo sai tu se è un indice Unique e l'ordinamento da applicare sul campo “tavola”

  • Re: Creare a runtime indice in db access

    Non funziona neanche così

    create [unique] index cretab01 on Cretab (tavola [asc])  

    e sono abbastanza sicuro che non ci voglia il ; finale

    e comunque ho preso da Microsoft la sintassi.

    Ovviamente so se l'indice è unique  e l'ordinamento,

    Come detto parto da un db sql

    quindi con l'istruzione "Select * from " & DBname & ".sys.tables order by name " ricavo tutte le tabelle del db

    con l'istruzione "Select * from " & DBname & ".INFORMATION_SCHEMA.COLUMNS where table_name = NAME ricavo i campi  della tabella, nome e data_type

    e con l'istruzione

    select a.name as name, a.type_desc, c.name as nome, b.is_descending_key  from " & DBname & ".sys.indexes a, " & DBname & ".sys.index_columns b, " & DBname & ".sys.all_columns c where a.object_id = " & Appo.Rows(cucu).Cells("object_id").Value & " and a.object_id = b.object_id and a.object_id = c.object_id and a.index_id = b.index_id and b.column_id = c.column_id and a.type_desc = 'CLUSTERED'"

    ricavo il nome dell'indice primario, e il nome dei campi che compongono l'indice.

    Il problema è che sono abituato a creare tabelle sql anche a runtime con indice primario e altri indici, ma con access ho sempre creato solo tabelle senza indice e volevo evitare, una volta creata di entrare con access per definire gli indici

  • Re: Creare a runtime indice in db access

    Ma il comando che hai dato è esattamente questo ??

    create [unique] index cretab01 on Cretab (tavola [asc])  
  • Re: Creare a runtime indice in db access

    01/01/2024 - guggo ha scritto:

    Non funziona neanche così

    create [unique] index cretab01 on Cretab (tavola [asc])  

    Per forza: hai riscritto la stessa cosa del post di apertura, che già dava errore e che ti avevo detto essere sbagliata. Pure Sirjo l'ha letta con stupore.

    Sottolineando che creare (o metter mano ad) una tabella a runtime è una cosa molto strana, se una query DDL non va (prima però bisogna scriverla giusta) l'unica altra strada è metter mano al file con il modello ad oggetti DAO (strada maestra anche quando si lavora direttamente su Access tramite vba) o con ADO. Siccome però sono un pesce fuor d'acqua con vb.net, nello specifico non saprei darti consigli concreti.

  • Re: Creare a runtime indice in db access

    Evidentemente non riesco a spiegarmi.

    Ho una serie di db Sql server. ciascun database ha diverse tabelle con chiavi primarie e secondarie e dei software vb 2019 che ci accedono e le gestiscono. Questi software sono in grado di funzionare sia con db Sql server che access. Ho un software generalizzato funzionante che con le istruzioni indicate precedentemente mi crea dei db access con le relative tabelle che scelgo, con relativi campi e effettua lo scarico da sql server ad access.

    Il problema è che la tabella access è senza indici quindi alcuni accessi non sono performanti, per cui ho guardato sul supporto di microsoft che dice 

    "Per creare un indice in una tabella esistente, usare il comando CREATE INDEX. La sintassi del comando CREATE INDEX è la seguente:

    CREATE [UNIQUE] INDEX index_name
     ON table (field1 [DESC][, field2 [DESC], ...])
     [WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}] "

    valido per Access per Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 

    ed io uso  access 2013

    ho quindi scritto l'istruzione riportata dal supporto microsoft e mi da l'errore segnalato e per questo ho chiesto supporto.

    usare tabelle a runtime  non è proibito e può essere  utile.  Ho delle applicazioni batch Host che girano mensilmente e che si creano delle tabelle host db2 al volo le usano per  il loro scopo e poi la droppano

    comunque grazie lo stesso, creerò di volta in volta gli indici a mano

  • Re: Creare a runtime indice in db access

    Se non rispondi alle domande che ti facciamo non possiamo aiutarti.
    Per favore riporta ESATTAMENTE il comando che hai dato per creare l'indice, senza aggiungere, senza togliere nulla, e da lì possiamo dirti cosa stai sbagliando.
    Se non ci dai questa informazione per me il thread finisce qui.

  • Re: Creare a runtime indice in db access

    create [unique] index cretab01 on Cretab (tavola [asc]) 

  • Re: Creare a runtime indice in db access

    Come ti aveva già detto Phil, le parentesi quadre servono solo per far capire che quel parametro è opzionale, e ti aveva detto che se mettevi quel parametro la parentesi non ci va.

    Prova con

    create unique index cretab01 on Cretab (tavola asc) 
  • Re: Creare a runtime indice in db access

    02/01/2024 - guggo ha scritto:

    create [unique] index cretab01 on Cretab (tavola [asc]) 

    Non funzionava, l'hai scritto nel post di apertura e ti ho detto come scriverlo ma evidentemente non hai provato perché hai riscritto ancora la stessa cosa. Almeno gli errori sono coerenti. 

    Sei andato su questa pagina

    https://support.microsoft.com/it-it/office/creare-o-modificare-tabelle-o-indici-utilizzando-una-query-di-definizione-dei-dati-d935e129-229b-48d8-9f2d-1d4ee87f418e

    ed hai trovato questo

    Per creare un indice in una tabella esistente, usare il comando CREATE INDEX. La sintassi del comando CREATE INDEX è la seguente:

    CREATE [UNIQUE] INDEX index_name
     ON table (field1 [DESC][, field2 [DESC], ...])
     [WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]

    E' convenzione "molto diffusa" (non so se definirla universale) utilizzare queste regole quando nei siti (e nei libri) pubblicano la sintassi

    https://learn.microsoft.com/it-it/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql?view=sql-server-ver16

    (è per T-SQL ma vale in generale, qui c'è anche la traduzione in italiano… da prendere con cautela)

    ConvenzioneUtilizzo
    LETTERE MAIUSCOLEParole chiave di Transact-SQL.
    corsivoParametri della sintassi Transact-SQL specificati dall'utente.
    grassettoDigitare nomi di database, tabelle, colonne, indici, stored procedure, utilità, tipi di dati e testo esattamente come indicato.
    | (barra verticale)Separazione di elementi sintattici racchiusi tra parentesi quadre o graffe. Indica che è possibile utilizzare solo uno degli elementi.
    [ ] (parentesi quadre)Elemento di sintassi facoltativo.
    { } (parentesi graffe)Elementi sintattici obbligatori. Le parentesi graffe non devono essere digitate.
    [ , ...n ]Indica che l'elemento precedente può essere ripetuto n volte. Le occorrenze sono separate da virgole.
    [ ...n ]Indica che l'elemento precedente può essere ripetuto n volte. Le varie occorrenze dell'elemento sono separate da spazi.
    ;Carattere di terminazione delle istruzioni Transact-SQL. Anche se per la maggior parte delle istruzioni in questa versione di SQL Server non è necessario usare il punto e virgola, questo requisito verrà introdotto in una versione futura.
    ::=Nome di un blocco della sintassi. Usare questa convenzione per raggruppare ed etichettare sezioni di sintassi estese oppure un'unità sintattica che è possibile usare in più posizioni di un'istruzione. Ogni posizione in cui si potrebbe usare il blocco di sintassi è indicata dall'etichetta racchiusa tra parentesi angolari: <label>.

    Un set è una raccolta di espressioni, ad esempio <set di raggruppamento>, mentre un elenco è una raccolta di set, ad esempio <elenco di elementi composti>.

    Così hai una panoramica completa di come si legge quello che si trova su internet che riguarda SQL e le varianti specifiche di ogni RDBMS (o nei libri, anche se li di solito all'inizio lo scrivono).

    Per il resto anche Sirjo ha detto come va scritta. Prova, male non fa finché non c'è un DELETE FROM.

Devi accedere o registrarti per scrivere nel forum
9 risposte