Newsgroup: it.comp.appl.access
Titolo: Modifica struttura tabella in VB6

Salve a tutti!
    ho il seguente quesito da risolvere:
devo modificare la struttura della seguente tabella in Access 97:
Tab. Clienti
Nome Campo       Tipo
Codice                  contatore
RagSoc                 text(50)
Indirizzo                text(50)
...
di modo che il campo 'Codice' di tipo contatore diventi di tipo long
integer.
il tutto andrebbe fatto con codice vb6, come si puo' fare?
grazie!
Alberto

 ha scritto nel messaggio
news:41fa18b4$0$133$5fc...@news.tiscali.it...

Ti butto tutto un modulo nel quale trovi con ADOX tutto ciò che
serve per accedere alle proprietà di un campo di una tabella
anche di un DATABASE Remoto.
Public colI As Collection
Public Temp As New ADOX.Index
Public Catalog As New ADOX.Catalog
Public Sub Modify_Column(ByRef MyCnn As ADODB.Connection, _
                        MyTblName As String, _
                        MyColName As String, _
                        MyNewColName As String, _
                        Optional MyLen As Long)
    Dim Col     As ADOX.Column
    Dim Cols    As ADOX.Columns
    Dim Grp     As ADOX.Group
    Dim Grps    As ADOX.Groups
    Dim Ndx     As New ADOX.Index
    Dim Ndxs    As ADOX.Indexes
    Dim Key     As ADOX.Key
    Dim Keys    As ADOX.Keys
    Dim Proc    As ADOX.Procedure
    Dim Procs   As ADOX.Procedures
    Dim Prop    As ADOX.Property
    Dim Props   As ADOX.Properties
    Dim Table   As ADOX.Table
    Dim Tables  As ADOX.Tables
    Dim User    As ADOX.User
    Dim Users   As ADOX.Users
    Dim View    As ADOX.View
    Dim Views   As ADOX.Views
    Dim MyXcol As New ADOX.Column
    Dim ThisIndex As New ADOX.Index
    Dim MyRecordset As ADODB.Recordset
    Dim MyArray() As Variant
    Dim IsCounter As Boolean
    Dim I As Integer
    Dim n As Integer
    Dim a As Integer
    Dim iFile As Integer
    Dim sFile As String
    Dim strTempName As String
    strTempName = MyColName & "_tmpFM"
    Set Catalog.ActiveConnection = MyCnn
    Set Tables = Catalog.Tables
    Set Table = Tables(MyTblName)
    Set colI = New Collection
    '(GP) Verifico la presenza di indici li salvo _
     in nella collezione ColIndexes e li rimuovo...
'###########################################################################
##############
      For I = 0 To Table.Indexes.Count - 1
        If Left$(Table.Indexes(I).Name, 2) <> "s_" Then
            Set ThisIndex = Table.Indexes(I)
            RecordIndexInfo Table.Indexes(I), colI
            Set ThisIndex = Nothing
        End If
      Next
      'Elimino...
      Do While Table.Indexes.Count > 0   ' Inner loop.
            Table.Indexes.Delete Table.Indexes(0).Name
      Loop
'###########################################################################
##############
    With Table
        .Name = MyTblName
            Set Cols = Tables(MyTblName).Columns
            For Each Col In Cols
                '(GP)Verifico se il nome campo passato corrisponde _
                    ad un campo realmente esistente...
                    If Col.Name = MyColName Then
                        MyXcol.Name = strTempName
                        MyXcol.Type = Col.Type
                        MyXcol.NumericScale = Col.NumericScale
                        MyXcol.DefinedSize = Col.DefinedSize + MyLen
                        MyXcol.ParentCatalog = Catalog
                        If Col.Properties(0).Value = False Then
                            IsCounter = False
                        ElseIf Col.Properties(0).Value = True Then
                            IsCounter = True
                        End If
                        '(GP)Store data into array...
'######################################################################
                        If Not IsCounter Then
                            Set MyRecordset = New ADODB.Recordset
                            MyRecordset.Open MyTblName, MyCnn, adOpenKeyset,
, adCmdTable
                            ReDim MyArray(MyRecordset.RecordCount)
                            If MyRecordset.RecordCount > 0 Then
                                MyRecordset.MoveFirst
                                    I = 0
                                    Do Until MyRecordset.EOF
                                        MyArray(I) =
MyRecordset.Fields(MyColName).Value
                                        MyRecordset.MoveNext
                                        I = I + 1
                                    Loop
                                    I = 0
                            End If
                            MyRecordset.Close
                        End If
'######################################################################
                           'MyXcol.Attributes =
.Columns.Item(MyColName).Attributes '(GP)NOT USED...
                            For I = 0 To Col.Properties.Count - 1
                                Select Case Col.Properties(I).Name
                                    Case "Autoincrement"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Default"
                                        If Not
IsEmpty(Col.Properties(I).Value) Then
                                        'inserire controllo sul type col...
etc.etc...
                                        Else
                                            MyXcol.Properties(I).Value =
Empty
                                        End If
                                    Case "Description"
                                        If Col.Properties(I).Value <> ""
Then
                                            MyXcol.Properties(I).Value =
CStr(Col.Properties(I).Value)
                                        Else
                                            MyXcol.Properties(I).Value = ""
                                        End If
                                    Case "Nullable"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Fixed Length"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
'*****************************************************
                                    ' SI POSSONO SETTARE SOLO DOPO L' APPEND
...
                                    'Case "Seed"
                                    '    If IsCounter = True Then
                                    '        MyXcol.Properties(I).Value =
CInt(Col.Properties(I).Value)
                                    '    Else
                                    '        MyXcol.Properties(I).Value = 1
                                    '    End If
                                    'Case "Increment"
                                    '    If IsCounter = True Then
                                    '        MyXcol.Properties(I).Value =
CInt(Col.Properties(I).Value)
                                    '    Else
                                    '        MyXcol.Properties(I).Value = 1
                                    '    End If
'*****************************************************
                                    Case "Jet OLEDB:Column Validation Text"
                                        If Col.Properties(I).Value <> ""
Then
                                            MyXcol.Properties(I).Value =
CStr(Col.Properties(I).Value)
                                        Else
                                            MyXcol.Properties(I).Value = ""
                                        End If
                                    Case "Jet OLEDB:Column Validation Rule"
                                        If Col.Properties(I).Value <> ""
Then
                                            MyXcol.Properties(I).Value =
CStr(Col.Properties(I).Value)
                                        Else
                                            MyXcol.Properties(I).Value = ""
                                        End If
                                    Case "Jet OLEDB:IISAM Not Last Column"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Jet OLEDB:AutoGenerate"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Jet OLEDB:One BLOB per Page"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Jet OLEDB:Compressed UNICODE
Strings"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Jet OLEDB:Allow Zero Length"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                    Case "Jet OLEDB:Hyperlink"
                                        If Col.Properties(I).Value = False
Then
                                            MyXcol.Properties(I).Value =
False
                                        ElseIf Col.Properties(I).Value =
True Then
                                            MyXcol.Properties(I).Value =
True
                                        End If
                                End Select
                            Next
                        '    iFile = FreeFile()
                        '    sFile = "c:\col.txt"
                        '    Open sFile For Output As #iFile
                        '    Print #iFile, "VECCHIA COLONNA"
                        '    Print #iFile, .Columns(MyColName).Attributes
                        '    For i = 0 To
.Columns(MyColName).Properties.Count - 1
                        '        Print #iFile,
.Columns(MyColName).Properties(i).Name & Chr(9) &
.Columns(MyColName).Properties(i).Value
                        '    Next i
                        '    Close iFile
                        '    iFile = FreeFile()
                        '    sFile = "c:\myxcol.txt"
                        '    Open sFile For Output As #iFile
                        '    Print #iFile, "NUOVA COLONNA"
                        '    Print #iFile, MyXcol.Attributes
                        '    For i = 0 To MyXcol.Properties.Count - 1
                        '        Print #iFile, .Properties(i).Name & Chr(9)
& MyXcol.Properties(i).Value
                        '    Next i
                        '    Close iFile
                            '.Columns.Delete MyColName
                            '.Columns.Refresh
                            '(GP) Assegno nuovo nome alla colonna...
                            MyXcol.Name = MyNewColName
                            Catalog.Tables(Table.Name).Columns.Append MyXcol
                                '(GP)Get data from array...
'######################################################################
                                If Not IsCounter Then
                                    Set MyRecordset = New ADODB.Recordset
                                    MyRecordset.Open MyTblName, MyCnn,
adOpenKeyset, adLockOptimistic
                                    If MyRecordset.RecordCount > 0 Then
                                        MyRecordset.MoveFirst
                                           I = 0
                                           Do Until MyRecordset.EOF
                                               If Len(MyArray(I)) <> 0 Then
                                                    If MyNewColName <> ""
Then
MyRecordset.Fields(MyNewColName) = MyArray(I)
                                                    Else
MyRecordset.Fields(MyColName) = MyArray(I)
                                                    End If
                                               End If
                                               MyRecordset.MoveNext
                                               I = I + 1
                                           Loop
                                    End If
                                    MyRecordset.Close
                                End If
'######################################################################
                                '(GP)Restore degli indici...
                                For Each Temp In colI
                                    Set ThisIndex = New ADOX.Index
                                    Set ThisIndex = Temp
                                    '(GP) Se necessario modifico nome indice
e nome colonna indice _
                                            solo nel caso in cui sia stato
assegnato un nuovo nome alla colonna...
                                            If ThisIndex.Name = MyColName
Then
                                                ThisIndex.Name =
MyNewColName
                                            End If
                                            For I = 0 To
ThisIndex.Columns.Count - 1
                                                If
ThisIndex.Columns.Item(I).Name = MyColName Then
ThisIndex.Columns.Item(I).Name = MyNewColName
                                                End If
                                            Next
                                        Table.Indexes.Append ThisIndex
                                    Set ThisIndex = Nothing
                                Next Temp
                                Table.Columns.Delete MyColName
                            Exit For
                    End If
            Next Col
    End With
End Sub
Private Sub RecordIndexInfo(ByVal I As ADOX.Index, colI As Collection)
' (GP)Records information about fields in the index and about the index
itself
' into the colI collection.
  Dim idxTemp As New ADOX.Index
  Dim idxCol As ADOX.Column
  Dim x As Integer
  Dim y As Integer
  Dim z As Integer
  idxTemp.Name = I.Name
  idxTemp.PrimaryKey = I.PrimaryKey
  idxTemp.Unique = I.Unique
  idxTemp.Clustered = I.Clustered
  idxTemp.IndexNulls = I.IndexNulls
  For x = 0 To I.Columns.Count - 1
    Set idxCol = New ADOX.Column
    idxCol = I.Columns.Item(x)
    Set idxCol.ParentCatalog = Catalog
    idxTemp.Columns.Append idxCol
    idxTemp.Columns.Refresh
    Set idxCol = Nothing
  Next
  colI.Add idxTemp
  Set idxTemp = Nothing
End Sub
'###########################################################################
####################
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 ha scritto nel messaggio
news:41fa1ef0$0$133$5fc...@news.tiscali.it...

Ciao e grazie per aver risposto,
    mi sono scopiazzato il codice che mi hai mandato (grazie ancora),
io pero' uso ancora DAO, per caso hai il codice relativo?
Alberto

 Alberto
Solitamente anch'io, ma non mi è mai capitato di farlo con DAO....!
Non sono certo ma credo che con DAO non ci sia la possibilità
di modificare il Type e il Size del Field già creato, ma solo in fase di
creazione.
Puoi provare anche questo che, se non sbaglio, potrebbe non funzionare
per le stesse considerazioni di cui sopra:
DoCmd.RunSQL "ALTER TABLE MyTable ALTER COLUMN MyField Text(100)"
Per non usare ADO eventualmente potresti crearne uno nuovo copiarci il
contenuto
del Counter, eliminare il Counter e rinominare il Nuovo....!!!
La vedo male per le relazioni.....!
Ciao



Ciao,
ho provato l' ALTER COLUMN ma non funziona... a questo punto non mi resta
altro che la soluzione con ADO...
ho un altro dubbio... quella odiosa tabella ha anche alcune relazioni
settate da access con altre tabelle, ora mi domando, con le istruzioni che
mi hai dato è possibile cambiare il tipo di dati di un campo chiave che è in
relazione con altre tabelle? devo cambiare da tipo contatore a tipo long
integer, non dovrebbero esserci grossi cambiamenti, o no?
sono disperato.  :)))
Alberto

 Alberto
Ovviamente le mie perplessità sono smentibili...(spero).
In ogni caso con ADOX si può fare, e trattandosi di Counter
credo non ti dia alcun tipo di problemi la conversione in LongInteger.
FAI UN BACKUP poi prova.
Ciao
-- 
@Alex (Alessandro Baraldi)


 DoCmd.RunSQL "ALTER TABLE MyTable ALTER COLUMN MyField Text(100)"
ALTER COLUMN è stato introdotto con JET4 vuol dire >=A00.
-- 
cu
Karl
*********
Access FAQ: 
www.donkarl.com/it
+info sulla prima Conferenza Italiana per Sviluppatori di Access (CISA1)