Newsgroup: it.comp.lang.visual-basic
Titolo: Indici

Scusate tutti ma credo di non aver capito granchè di questi indici.
Ho un bottone ed il relativo codice:
    Set dbs = OpenDatabase(C:\database.mdb)
    Set tdf = dbs.TableDefs("Tabella")
    Set indice = tdf.CreateIndex
    indice.Name = "IndiceMio"
    tdf.Fields.Append ind1.CreateField("[ora inizio]", dbdate)
    tdf.Indexes.Append indice
    tdf.Indexes.Refresh
    Debug.Print tdf.Indexes.Count & " Indexes in " & tdf.Name & " TableDef"
    dbs.Close
Ma che cosa dovrebbe fare questo bottone quando lo clicco?
Secondo la MSDN (oggi pare che mi funzioni), tramite questo codice creo un
campo "Ora Inizio" ti tipo 'data/ora' nella mia 'tabella' e poi associo tale
campo all'indice 'IndiceMio'.
Giusto?
Ma a me questo non interessa, voglio assegnare un indice ad un campo già
esitente (che potrebbe essere 'testo', 'numerico', ...). Come fare?
Grazie a tutti.

 esitente (che potrebbe essere 'testo', 'numerico', ...). Come fare?
cambi i nomi e i tipi dell'esempio, ci metti quelli corrispondenti al tuo
db, e provi a premere il pulsante (*). tipo:
     tdf.Fields.Append ind1.CreateField("[cognome]", dbtext)
l'esempio l'ho improvvisato, magari controlla se il tipo esiste.
(*) premendo il bottone ti puoi far male alla pancia, o addirittura alla
gola se non hai la cravatta o se hai una polo :)

per farti capire, io ho un database con un 'tabella' che ha tre campi:
'campo1' - 'campo2' - 'campo3'.
    Dim ind1 As Index
    Set dbs = OpenDatabase("c:\database.mdb")
    Set tdf = dbs.TableDefs("Tabella")
    Set ind1 = tdf.CreateIndex
    ind1.Name = "MioIndice"
    tdf.Fields.Append ind1.CreateField("campo2", dao.dbText)
    tdf.Indexes.Append ind1
    tdf.Indexes.Refresh
    Debug.Print tdf.Indexes.Count & " Indexes in " & tdf.Name & " TableDef"
    dbs.Close
e quando faccio una cosa del genere mi dice:
    "impossibile definire il campo più di una volta"
Ed allora ho tratto le conclusioni che con questo codice Creo un nuovo campo
chiamato 'campo2' (oltre a creare un indice 'ind1').
Invece tu mi dici che con questo codice creo un indice basato sul campo
'campo2'
già esistente della mia tabella.
Ciao.

 ha scritto

normalmente non uso questo metodo, uso access, anche per definire gli
indici.
cmq dice "definire", non "creare" o simili.
se togli "dao.dbtext" ?

 ha scritto nel messaggio
news:96gjqt$k2514$2...@ID-51318.news.dfncis.de...


 Ciao e grazie
guarda, ho fatto la prova adesso seguendo pari pari l'esempio msdn.
nel form qui sotto (rif dao 3.51) ci sono 3 lstboxes, 2 cmd, 1 label
nel db c'e' solo la tabella "test", con i campi "codice" e "descrizione" e i
relativi due indici, ognuno con lo stesso nome del campo.
premendo il cmd "add index" e poi "refresh all" vedo che si agggiunge
l'indice idx_prova
basato sul campo "codice"
mi sorge un dubbio: il campo su cui cerchi di fare il nuovo indice c'e' gia'
nella tabella ? _deve_ esserci...
ciao, a.
------------
Option Explicit
Dim db As Database
Private Sub cmdAddIndex_Click()
    Dim td As TableDef
    Dim idx As Index
    Set td = db!test
    With td
        Set idx = .CreateIndex("idx_prova")
        With idx
            .Fields.Append .CreateField("codice")
        End With
        .Indexes.Append idx
        .Indexes.Refresh
    End With
End Sub
Private Sub cmdRefresh_Click()
    lstTables.Clear
    lstIndexes.Clear
    lstFields.Clear
    Label1 = ""
    Dim td As TableDef
    Set db = OpenDatabase("mdb97")
    For Each td In db.TableDefs
        lstTables.AddItem td.Name
    Next
End Sub
Private Sub Form_Load()
    Dim td As TableDef
    Set db = OpenDatabase("mdb97")
    For Each td In db.TableDefs
        lstTables.AddItem td.Name
    Next
End Sub
Private Sub lstindexes_Click()
    'On Error GoTo errman
    lstFields.Clear
    Dim f As Field, tdn As String, idxn As String
    tdn = lstTables.List(lstTables.ListIndex)
    idxn = lstIndexes.List(lstIndexes.ListIndex)
    Label1 = tdn & " - " & idxn
    For Each f In db.TableDefs(tdn).Indexes(idxn).Fields
        lstFields.AddItem f.Name
    Next
    Exit Sub
errman:    MsgBox Err & " - " & Error
End Sub
Private Sub lstTables_Click()
    On Error Resume Next 'tabelle senza indici
    lstIndexes.Clear
    Dim idx As Index, tdn As String
    tdn = lstTables.List(lstTables.ListIndex)
    For Each idx In db.TableDefs(tdn).Indexes
        lstIndexes.AddItem idx.Name
    Next
End Sub
----- esempio msdn -- ho usato il minimo -----
Esempio di oggetto Index e insieme Indexes
Nel seguente esempio viene creato un nuovo oggetto Index che viene accodato
all'insieme Indexes dell'oggetto TableDef Impiegati, si enumera l'insieme
Indexes di TableDef. Infine, si enumera quindi un oggetto Recordset
utilizzando prima l'oggetto Index primario, quindi utilizzando il nuovo
oggetto Index. Per eseguire questa routine è necessaria la routine
OutputIndice.
Sub IndexObjectX()
 Dim dbsNorthwind As Database
 Dim tdfImpiegati As TableDef
 Dim idxNuovo As Index
 Dim idxCiclo As Index
 Dim rstImpiegati As Recordset
 Set dbsNorthwind = OpenDatabase("Northwind.mdb")
 Set tdfImpiegati = dbsNorthwind!Impiegati
 With tdfImpiegati
  ' Crea un nuovo indice, quindi crea ed accoda
  ' gli oggetti Field al relativo insieme Fields.
  Set idxNuovo = .CreateIndex("NuovoIndice")
  With idxNew
   .Fields.Append .CreateField("Paese")
   .Fields.Append .CreateField("Cognome")
   .Fields.Append .CreateField("Nome")
  End With
  ' Aggiunge un nuovo oggetto Index all'insieme
  ' Indexes dell'insieme della tabella Impiegati.
  .Indexes.Append idxNuovo
  .Indexes.Refresh
  Debug.Print .Indexes.Count & " Indexes in " & _
   .Name & " TableDef"
  ' Enumera l'insieme Indexes della tabella
  ' Impiegati.
  For Each idxCiclo In .Indexes
   Debug.Print "    " & idxCiclo.Name
  Next idxCiclo
  Set rstImpiegati = _
   dbsNorthwind.OpenRecordset("Impiegati")
  ' Stampa il report utilizzando il vecchio ed il nuovo indice.
  OutputIndice rstImpiegati, "PrimaryKey"
  OutputIndice rstImpiegati, idxNuovo.Name
  rstImpiegati.Close
  ' Cancella il nuovo oggetto Index perché
  ' si tratta di un esempio.
  .Indexes.Delete idxNuovo.Name
 End With
 dbsNorthwind.Close
End Sub
Sub OutputIndice(rstTemp As Recordset, _
 strIndice As String)
 ' Funzione di report per FieldX.
 With rstTemp
  ' Imposta l'indice.
  .Index = strIndice
  .MoveFirst
  Debug.Print "Recordset = " & .Name & _
   ", Index = " & .Index
  Debug.Print "    IDImpiegato - Paese - Nome"
  ' Enumera il set di record utilizzando
  ' l'indice specificato.
  Do While Not .EOF
   Debug.Print "    " & !IDImpiegato & " - " & _
    !Paese & " - " & !Cognome & ", " & !Nome
   .MoveNext
  Loop
 End With
End Sub