У меня есть следующая таблица в MS Access:
Пример данных моей таблицы:
tblapp
app_id app
1 NO
2 No
3 YES
Я хотел бы преобразовать столбец app
, чтобы показать число
no = 1
и yes = 2
используя vba
Преобразование таблицы желаний:
tblapp
app_id app
1 1
2 1
3 2
Одним из решений является создание нового столбца, копирование данных. Затем удалите старый столбец и переименуйте новый в старое имя.
Любое другое решение?
@Густав Спасибо, Густав. Я пойду на это решение. Я верю в ваши сообщения.
@Gustav Могу ли я переименовать столбец с помощью ALTER TABLE Statement
?
Не то, чтобы я знал об операторе ALTER TABLE (Microsoft Access SQL). Итак, скопируйте во временное поле, удалите старое, создайте его заново с правильным типом данных, скопируйте данные из временного поля, удалите временное поле.
@Gustav Я создаю следующий ответ. Он работает нормально.
Если таблица очень большая, вы можете счесть более эффективным с точки зрения скорости создание новой таблицы в соответствии с новыми столбцами, которые вы хотите, где вы просто переносите данные с соответствующими преобразованиями. Скорее всего, вы могли бы сделать это все с сохраненными запросами (таким образом избегая необходимости в VBA) или, альтернативно, запустить SQL для запросов из VBA.
Причина, по которой это может быть более эффективным, заключается в том, что данные таблицы, вероятно, хранятся непрерывно на диске, так что добавление нового столбца не просто добавляет новые данные в конец непрерывной области, но добавляет новое пространство каждые n байт для значения каждой строки для нового столбца. Это может привести к большой реорганизации пространства на диске. Если вместо этого вы следовали вышеуказанному альтернативному методу, он может временно занять больше места (поскольку вам нужно создать вторую таблицу), но в целом может быть немного быстрее.
Основываясь на комментарии Gustav
, я сделал следующее решение.
Код VBA:
Private Sub btn_Click()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sql As String
Set dbs = CurrentDb
' Add temp column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN temp_app NUMBER;"
' Add-update data to temp column.
Set rst = dbs.OpenRecordset("SELECT app_id, IIF(app = "NO", 1, 2) AS temp_app FROM tblapp;", dbOpenDynaset)
With rst
Do Until .EOF
sql = "UPDATE [tblapp] SET [temp_app] = '" & rst!temp_app & "' WHERE [app_id] = " & rst!app_id & " ;"
dbs.Execute (sql)
.MoveNext
Loop
End With
' Delete app column(old).
dbs.Execute "ALTER TABLE tblapp DROP app;"
' Add new app column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN app NUMBER;"
' Copy data from temp to app column.
dbs.Execute "UPDATE tblapp Set app = temp_app;"
' Delete temp column.
dbs.Execute "ALTER TABLE tblapp DROP temp_app;"
rst.Close
dbs.Close
End Sub
Это хорошее решение. Вперед, продолжать.