Newsgroup: it.comp.appl.access
Titolo: Come eliminare campi indicizzati da VBA (DAO)?

Con un oggetto scritto cosě bene non c'č bisogno che mi spieghi
ulteriormente., ma siccome soffro di una grave forma di logorrea
piuttosto grave, vi faccio un esempio:
*************
Set tbd5 = db5.TableDefs("Contacts_sel")
....
With tbd5
        .Fields.Delete "ID"
        .Fields.Append .CreateField("IDCompany", dbText, 50)
End With
.....
***************
Mi dice che non puň eliminare "ID" perchč č indicizzato, ma IO lo
voglio E-L-I-M-I-N-A-R-E,  e lo voglio fare da VBA.
Esiste un modo per controllare se un campo č indicizzato e, se lo č,
di togliergli l'indicizzazione cosě da poterlo eliminare, una cosa
tipo:
IF tbd5!id <indicizzato>THEN
	<rimuovi indice>
Ciao. Fabrizio.
(Access XP (sp2), Win ME, P4 1Ghz, 320 RAM)

 tipo:
Hai provato con una stringa SQL del tipo "ALTER oppure DROP nel tuo
caso....!
Ciao.
@Alex.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

"oizirbaF" <fabrizio...@SPAMtiscalinet.it> ha scritto nel messaggio
news:r0p9uukl6m03ugngn...@4ax.com...

Per eliminare l'indice chiamato Pippo contenuto nella tabella chiamata
Tabella1 del database corrente, genera il seguente codice VBA:
Dim db As Database
Dim tdf As TableDef
Dim idx As Index
Set db = CurrentDb()
Set tdf = db!Tabella1
Set idx = tdf.Indexes!Pippo
tdf.Indexes.Delete idx.Name
Set idx = Nothing
Set tdf = Nothing
Set db = Nothing
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

@Alex.
Grazie non c'avevo proprio pensato.
Si può fare in effetti e infatti ho fatto così:
*****************
' definisco il db corrente e la giusta tabledef
    Set db5 = CurrentDb()
    Set tbd5 = db5.TableDefs("Contacts_sel")
 
    'tolgo il campo ID
    'db5.Execute ("ALTER TABLE Contacts_sel DROP CONSTRAINT ID")
    'db5.Execute ("ALTER TABLE Contacts_sel DROP COLUMN ID")
    db5.Execute ("DROP INDEX ID ON Contacts_sel")
    db5.Execute ("ALTER TABLE Contacts_sel DROP COLUMN ID")
 
    'Aggiungo il campo che manca a posto di ID
    With tbd5
        '.Fields.Delete "ID"
        .Fields.Append .CreateField("IDCompany", dbText, 50)
    End With
****************
Il problema è che, se il campo non è indicizzato, mi da errore: come
faccio a sapere se il campo è indicizzato ?
p.s. commentati ho messo un po' di modi in cui si può fare.


"oizirbaF" <fabrizio...@SPAMtiscalinet.it> ha scritto nel messaggio
news:uct9uu0kbqn8h9iu6...@4ax.com...

Gestisciti tu l'errore; in Access 97 dà l'errore numereo 3265.
.......
.......
On Error GoTo Errore_Index
db5.Execute ("DROP INDEX ID ON Contacts_sel")
.........
........
Errore_Index:
    If Err.Number = 3265 Then
        Resume Next
    End If
.........
........


 .........
Ottimo.........!!!
@Alex.

Set db = Nothing
Ho fatto cosě:
************
Public Sub Inserisco_Record6()
'provo solo l'eliminazione del campo ID attraverso
'il codice suggeritomi da Robč
Dim db As Database
Dim tdf As DAO.TableDef
Dim idx As Index
'Gestore errori per il campo ID e per errori generici
On Error GoTo Inserisco_Err:
    'setto i vari parametri
    Set db = CurrentDb()
    Set tdf = db.TableDefs("Contacts_sel")
 
    'Gestisco e tolgo l'indice a ID
    Set idx = tdf.Indexes!ID
     tdf.Indexes.Delete idx.Name
 
    With tdf
        .Fields.Delete "id"
        .Fields.Append .CreateField("IDCompany", dbLong, 50)
    End With
 
    Set idx = Nothing
    Set tdf = Nothing
    Set db = Nothing
'gestore errori
Inserisco_Exit:
    Exit Sub
 
Inserisco_Err:
    If Err.Number = 3265 Or Err.Number = 91 Then
        Resume Next:
    Else
        MsgBox Err.Number & " " & Err.Description
        Resume Inserisco_Exit:
    End If
 
End Sub
**********
Ho aggiunto il gestore di errore come mi hai suggerito nell'altro ramo
del 3d, noterai che devo intercettare due errori : 
quello del 'Set idx....' e quello del 'tdf.indexes.delete...'.
Grazie Robč


........
MOSTRO!!!! ( di bravura) ;-)
Ho fatto così:
**********
Private Sub Inserisco_Record5()
 
Dim rds5 As DAO.Recordset
Dim tbd5 As DAO.TableDef
Dim db5 As Database
'gestore di errori : lo uso sia per gestire l'eliminazione
'di un eventuale campo ID non indicizzato che per errori generici
On Error GoTo Error_index
    'prima distruggo tutti i record nella tabella
    CurrentDb.Execute ("DELETE * FROM Contacts_sel")
 
    ' definisco il db corrente e la giusta tabledef
    Set db5 = CurrentDb()
    Set tbd5 = db5.TableDefs("Contacts_sel")
 
    'tolgo al campo ID l'indice
    db5.Execute ("ALTER TABLE Contacts_sel DROP CONSTRAINT ID")
 
    'Distruggo il campo ID e aggiungo il campo che manca
    With tbd5
        .Fields.Delete "ID"
        .Fields.Append .CreateField("IDCompany", dbLong, 50)
    End With
    db5.Close
    Set db5 = Nothing
 
     ' aggiungo un po' di record
    Set rds5 = CurrentDb.OpenRecordset("Contacts_sel", dbOpenDynaset)
    With rds5
        .AddNew
        !IdCompany = 1
        !Company_Name = "Pissi"
        !Company_City = "BaoCity"
        .Update
        .AddNew
        ...............
        .Update
    End With
 
 'gestore di errori
Inserisco_Record5_exit:
    Exit Sub
 
Error_index:
    If Err.Number = 3755 Then
        Resume Next:
    Else
        MsgBox Err.Number & " " & Err.Description
        Resume Inserisco_Record5_exit:
    End If
End Sub
***************
L'errore 3755 è: "vincolo CHECK ID non esistente"
Grazie Robè e grazie Alex , adesso ho risolto. ;-)
