Столбец изменения MS Access VBA для отображения из списка значений в число

У меня есть следующая таблица в MS Access:

  • app_id = PK, автоинкремент
  • приложение = число, отображаемое в виде списка значений (нет, да)

Пример данных моей таблицы:

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 18.12.2020 16:31

@Густав Спасибо, Густав. Я пойду на это решение. Я верю в ваши сообщения.

YvetteLee 18.12.2020 16:32

@Gustav Могу ли я переименовать столбец с помощью ALTER TABLE Statement?

YvetteLee 18.12.2020 16:36

Не то, чтобы я знал об операторе ALTER TABLE (Microsoft Access SQL). Итак, скопируйте во временное поле, удалите старое, создайте его заново с правильным типом данных, скопируйте данные из временного поля, удалите временное поле.

Gustav 18.12.2020 16:48

@Gustav Я создаю следующий ответ. Он работает нормально.

YvetteLee 20.12.2020 21:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
193
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если таблица очень большая, вы можете счесть более эффективным с точки зрения скорости создание новой таблицы в соответствии с новыми столбцами, которые вы хотите, где вы просто переносите данные с соответствующими преобразованиями. Скорее всего, вы могли бы сделать это все с сохраненными запросами (таким образом избегая необходимости в 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

Другие вопросы по теме