VBA Как добавить программно таблицу и создать в ней поля в б/д Access ?

Андрей159
Дата: 11.02.2016 14:18:39
Private Sub Form_Load()
  Set BD = DAO.OpenDatabase("D:\Prohect\MySite.mdb")


        CmdCommand.CommandText = "SELECT * FROM " & List5.List(f)
        Set Rec = CmdCommand.Execute()
        
        Set tdfNew = BD.CreateTableDef(s)
        
        For f3 = 0 To Rec.Fields.Count - 1
          
          If Rec.Fields(f3).Type = 3 Or Rec.Fields(f3).Type = 19 Or Rec.Fields(f3).Type = 17 Then 'Long (Длинное целое) AUTO_INCREMENT
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbLong)
          ElseIf Rec.Fields(f3).Type = 203 Then 'Текст
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbMemo)
            'fld.size = Tbl.Fields(f3).size
          ElseIf Rec.Fields(f3).Type = 16 Or Rec.Fields(f3).Type = 2 Then
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbInteger)
          ElseIf Rec.Fields(f3).Type = 202 Or Rec.Fields(f3).Type = 130 Then 'CHAR
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbText)
'            fld.size = Tbl.Fields(f3).size
          
          ElseIf Rec.Fields(f3).Type = 11 Then
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbBoolean)
          
          ElseIf Rec.Fields(f3).Type = 4 Then
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbCurrency)
            
          ElseIf Rec.Fields(f3).Type = 5 Then
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbDouble)
          ElseIf Rec.Fields(f3).Type = 135 Or Rec.Fields(f3).Type = 133 Then 'Date
            Set fld = tdfNew.CreateField(Rec.Fields(f3).name, dbDate)
        
          Else
            Stop
            tdfNew.Fields.Append tdfNew.CreateField(Rec.Fields(f3).name, dbText)
          End If
          
          
          
          If Rec.Fields(f3).Properties("ISAUTOINCREMENT").value Then
            fld.Attributes = dbAutoIncrField
          End If
          
          tdfNew.Fields.Append fld
        Next


Вот такой пример повсюду. Каждая строка срабатывает без ошибок, но результата никакого. Как впустую.
Чуть переделал пример под себя для синхронизации. Уже интересуюсь SQL запросом, но еще надеюсь может быть есть объяснение по этому коду.
Predeclared
Дата: 11.02.2016 14:30:23
?
Debug.Print Rec.RecordCount
Андрей159
Дата: 11.02.2016 14:37:57
Predeclared,
Rec это другая таблица из MySQL на отдаленном сервере. Проверяю какие там поля и создаю таблицу tdfNew
В tdfNew (б/д ACCESS) никаких изменений.
Predeclared
Дата: 11.02.2016 14:47:33
Ты сделал то, что я просил?
__Michelle
Дата: 11.02.2016 14:47:52
Андрей159
Private Sub Form_Load()
  Set BD = DAO.OpenDatabase("D:\Prohect\MySite.mdb")


        CmdCommand.CommandText = "SELECT * FROM " & List5.List(f)
        Set Rec = CmdCommand.Execute()
        
        Set tdfNew = BD.CreateTableDef(s)
        
        For f3 = 0 To Rec.Fields.Count - 1
          
       ............................................................
       ............................................................
          
          tdfNew.Fields.Append fld
        Next


Вот такой пример повсюду. Каждая строка срабатывает без ошибок, но результата никакого. Как впустую.
Чуть переделал пример под себя для синхронизации. Уже интересуюсь SQL запросом, но еще надеюсь может быть есть объяснение по этому коду.
После добавления поля - Refresh
  Tabl.Fields.Append Fld
  Tabl.Fields.Refresh
Андрей159
Дата: 11.02.2016 18:06:05
RecordCount
Показывает будто все работает, но в Access таблице ничего не происходит после любых рефрешов.

Примеры реально нерабочие. Просто теория для ознакомления. По сути таблица не создается. Поля создаются виртуально, но никуда не сохраняются. Если в конце сделать вот так: BD.TableDefs.Append tdfNew, то объект с раннее созданными виртуальными полями сохранится в таблицу, но таблице нужно через свойства дать имя. А пример который повсюду распространяется - нерабочий. Рабочий код должен выглядеть следующим образом: создается виртуальная переменная типа таблицы, отдельно переменная типа поля. Поля кладем в таблицу через метод. И таким же образом создаем таблицу. Но честно эти заморочки так подзамахивают, что легче сделать чем по проще и побыстрей:
BD.Execute "CREATE TABLE " & s
Андрей159
Дата: 11.02.2016 18:32:42
мда... еще больше разочарование((:
Оказывается в ACCESS в таблице может быть не больше 256 полей.
ошибка №3190 "Определено слишком много полей". Жесть))
Predeclared
Дата: 11.02.2016 18:47:05
Андрей159
...Оказывается ...

Внезапно!
:)