Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/64: Рейтинг темы: голосов - 64, средняя оценка - 4.92
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086

Создание таблицы посредством VBA

11.12.2017, 09:57. Показов 13917. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Скажите пожалуйста, у типов полей: BINARY, TINYINT, INTEGER, TINYINT, DECIMAL нельзя указать ограничение по длине?
Просто, например, в MySQL можно https://dev.mysql.com/doc/refm... rview.html
а что же JetSQL(?) что-то непонятки.

Это нужно, чтобы собрать CREATE TABLE в VBA, например этот кусок:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' Если тип поля является строкой
        If CreateTable!U_C_Type = "STRING" Then
        
            ' И если у него пустое значение длины устанавливаем тип MEMO
            If IsNull(CreateTable!N_Length) Then
                f = "memo"
            ' Иначе TEXT(LEN)
            Else
                f = "text(" & CreateTable!N_Length & ")"
            End If
            
        ' Иначе же просто определяем наж тип
        ElseIf (CreateTable!U_C_Type = "INTEGER" Or CreateTable!U_C_Type = "TINYINT" Or CreateTable!U_C_Type = "SMALLINT") Then
            f = CreateTable!U_C_Type
        Else
            f = CreateTable!U_C_Type & "(" & CreateTable!N_Length & ")"
        End If
Ничего умнее как перечислить все BINARY, TINYINT, INTEGER, TINYINT, DECIMAL в условии не придумал... Можно это реализовать красиво? На выходе должны быть правильно сформированные строки типа INTEGER либо VARCHAR(255)

з.ы. За U_C_Type, N_Length - не ругайте, препод так заставляет писать)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2017, 09:57
Ответы с готовыми решениями:

Вывод таблицы в Word посредством vba.
Доброго времени суток. Делаю отчет в Access кодом VBA и вывожу в вордовский документ. Подскажите код на создание таблицы таким же образом....

Создание таблицы средствами VBA
Здравствуйте, уважаемые пользователи, прошу помощи!!! Работаю в Аксесе, создал модуль по созданию новой таблицы в базе данных(текст...

Автоматическое создание формы на основе созданной таблицы в результате импорта данных (VBA)
Доброе время суток, Уважаемые! Подскажите, пожалуйста, решение задачи. Задача: Необходимо после импорта данный из разных однотипных...

30
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 12:34  [ТС]
Студворк — интернет-сервис помощи студентам
Capi, как сказал выше, что сработало, спасибо)
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 12:50  [ТС]
Capi, Eugene-LS, mobile, а кто подскажет другой вариант, когда строка типа VARCHAR(255) формируется уже в запросе, для для типов INTEGER, DATETIME, DOUBLE как я понимаю не нужны длины и это сформирует ошибочную конструкцию INTEGER(255) [именно в SQL CREATE TABLE tbl ()]

Например вот запрос:
SQL
1
2
3
SELECT 
*, "[" & C_FildName & "]" & " " & UCase(DataType) & "(" & N_symbol & ")" AS Выражение1
FROM Tabl3;
И данные как на картинке 1(на этот раз база не моя), и итог как на картинке 2, там поле Выражение1 ведь CREATE TABLE выведет ошибку при таких данных...

Как исправить ситуацию, можно ли как-то сделать запрос с функцией VBA:
SQL
1
2
3
SELECT 
*, "[" & C_FildName & "]" & " " & getFieldsWithLen(UCase(DataType), N_symbol) AS Выражение1
FROM Tabl3;
Который бы возвращал правильно сформированную, проверенную строку?
Ну например:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Select Case Type
            Case "STRING", "CHAR", "VARCHAR", "TEXT"
                If IsNull(Length) Then
                    f = "memo"
                ElseIf (Type <> "STRING" And Not IsNull(Length)) Then
                    f = Type & "(" & ength & ")"
                Else
                    f = "TEXT" & "(" & Length & ")"
                End If
            Case "INTEGER", "BINARY", "LONG", "DOUBLE", "DATETIME", "CURRENCY", "BYTE"
                f = Type
            Case Else
                f = "memo"
        End Select
 
' тут return
        getFieldsWithLen f
было бы хорошо...
Миниатюры
Создание таблицы посредством VBA   Создание таблицы посредством VBA  
0
Эксперт MS Access
 Аватар для Eugene-LS
13269 / 5946 / 1529
Регистрация: 05.10.2016
Сообщений: 16,639
11.12.2017, 12:53
Цитата Сообщение от FloppyDisc Посмотреть сообщение
когда строка типа VARCHAR(255)
Это dbText (до 255 символов)
Если я правильно понял.
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 13:00  [ТС]
А дальше уже было бы что-то типа этого:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub create()
 
Dim db As dao.Database, CreateTable As dao.Recordset
Dim DescriptionTable, CreationTable As String
Dim Query, r, f
 
Set db = CurrentDb
DescriptionTable = "tabl4"
CreationTable = "creationTbl2"
 
Set CreateTable = db.OpenRecordset("Zapros04") ' тут тот запрос выше
 
r = "CREATE TABLE [" & CreationTable & "] ( "
 
 Do Until CreateTable.EOF
    If Len(CreateTable!Выражение1) > 0 Then
       
        f = ""
    
       ' Собираем поле со всеми собранными атрибутами
        f = "" & CreateTable!Выражение1 & "" & " " & f
        
       ' Собираем текущую конструкцию с предыдущим а так же с собранным полем
        Query = Query & "," & f
       
        CreateTable.MoveNext
    End If
  Loop
  
 ' Сборка конечной конструкции
  Query = r & Mid(Query, 2) & ")"
  
  ' Посмотрим что получилось
  MsgBox Query
  
  db.Execute Query
 
 
End Sub
Добавлено через 2 минуты
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Это dbText (до 255 символов)
Если я правильно понял.
Ну тут дело не в этом, а именно в том, чтобы правильно сформировать, например CHAR(50), TEXT(50), а не TEXT, INTEGER(1000), DATETIME(999), я думал можно все это бремя навесить на функцию-обработчк VBA...

Цитата Сообщение от Eugene-LS Посмотреть сообщение
Это dbText (до 255 символов)
нет, на этот раз я работаю без объектной модели, тут она не подходит...

Добавлено через 4 минуты
Т.е в CreateTable!Выражение1
Visual Basic
1
f = "" & CreateTable!Выражение1 & "" & " " & f
уже должна быть правильная строка, не вызывающая никакой ошибки в CREATE TABLE
0
Эксперт MS Access
 Аватар для Eugene-LS
13269 / 5946 / 1529
Регистрация: 05.10.2016
Сообщений: 16,639
11.12.2017, 13:00
FloppyDisc, перед копированием кода переключайтесь на РУС язык - кракозябров не будет ...
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 13:00  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
перед копированием кода переключайтесь на РУС язык - кракозябров не будет ...
исправил
0
Эксперт MS Access
 Аватар для Eugene-LS
13269 / 5946 / 1529
Регистрация: 05.10.2016
Сообщений: 16,639
11.12.2017, 13:10
FloppyDisc, Ух вы замутили код!
Логика ясна, но я нить потерял (к своему стыду).
И вообще у меня сегодня выходной - пошел я пьянствовать и морально разлагаться.
Успехов!
0
Модератор
Эксперт MS Access
6231 / 2909 / 708
Регистрация: 12.06.2016
Сообщений: 7,839
11.12.2017, 13:27
Лучший ответ Сообщение было отмечено FloppyDisc как решение

Решение

FloppyDisc,

А если как нибудь так (без функции, сразу в запросе):
SQL
1
2
3
4
5
6
SELECT *, 
       "[" & C_FildName & "]" & " " & 
       IIf(DataType IN ("INTEGER","BINARY","LONG","DOUBLE","DATETIME","CURRENCY","BYTE"),
           UCase(DataType),
           IIf(N_Length IS NULL, "Memo", "Text" & "(" & N_Length & ")")) AS Выражение1
FROM Tabl3
Вот только N_Length на картинках не вижу...
2
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 13:33  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
А если как нибудь так (без функции, сразу в запросе):
Тоже прекрасно!
Цитата Сообщение от Capi Посмотреть сообщение
Вот только N_Length на картинках не вижу...
Я со своего примера случайно написал... В данном случае N_Symbol. А если еще и VARCAHR, CHAR и остальные типы? Т.е не просто TEXT(LEN), А CHAR(50), VARCHAR(50) ну и конечно TEXT(если тип просто STRING по ошибке написали) и для всех остальных пусть будет MEMO
0
Модератор
Эксперт MS Access
6231 / 2909 / 708
Регистрация: 12.06.2016
Сообщений: 7,839
11.12.2017, 13:36
Цитата Сообщение от FloppyDisc Посмотреть сообщение
А если еще и VARCAHR, CHAR и остальные типы?
Превращаются в Text (если длина непустая) или в Memo (если длина пустая).
1
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
11.12.2017, 13:48  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
Превращаются в Text (если длина непустая) или в Memo (если длина пустая).
Оу, не до конца просто понял IIF Спасибо)

Добавлено через 7 минут
Capi, Eugene-LS, mobile, еще раз спасибо всем БОЛЬШОЕ!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2017, 13:48

Об экспорте данных посредством VBA
Помогите, плз, разобраться в таком вопросе. Передо мной стоит задача экспорта данных в текстовый файл с полями фиксированной ширины. Как...

Изменение поля посредством VBA
Такая проблема. Нужно при нажатии на форме кнопки изменить данные в таблице. Из таблицы компьютеры принимается заявка на ремонт....

Скрытие, отображение вкладки посредством VBA
Доброго времени суток! Не могу понять, что происходит с наборомВкладок в разделенной форме: Хочу сделать чтобы при переходе по записям,...

Блокировка записи через VBA посредством ADODB
Здравствуйте. Всё в базе работает через VBA (Select, Update, формы и т.д.). Решил проверку записи на изменение сделать через блокировку...

Автоматическая обработка записей при загрузке формы посредством VBA
Здравствуйте! Есть форма, данные из таблицы. В ней есть порядковый номер особи и номер вида животного (подсталяется из другой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru