Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2017, 11:28   #1
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию VBA.Access Нарушен порядок данных при импорте

Доброго времени суток

Делаю программу для импорта таблицы из Экселевского файла в Access
Код:
Public Sub Ex2Acc()
Dim book As Excel.Workbook
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim appXl As Excel.Application
Dim wrksheet As Excel.Worksheet
Dim i As Long

Set appXl = CreateObject("Excel.Application")
Set book = appXl.Workbooks.Open(Forms![Form1].[Поле3].Value) 

Set dbs = CurrentDb
Set rst = CurrentDb.OpenRecordset("Test")
Set wrksheet = book.Sheets(1)

  With book.Sheets(1)
  For i = 5 To .Rows.Count
  If Len(wrksheet.Cells(i, "B")) > 0 Then
  With rst
     .AddNew
   ' On Error Resume Next
     ![Код] = zamena(wrksheet.Cells(i, "A"))
     ![OBSN] = zamena(wrksheet.Cells(i, "B"))
     ![NAIM] = zamena(wrksheet.Cells(i, "C"))
     ![ED_IZM] = zamena(wrksheet.Cells(i, "D"))
     ![BRUTTO] = wrksheet.Cells(i, "E")
     ![C_BASE] = zamena(wrksheet.Cells(i, "F"))
     ![CLASS_GR] = zamena(wrksheet.Cells(i, "G"))
     ![COD_UZ] = zamena(wrksheet.Cells(i, "H"))
     ![C_OPT] = zamena(wrksheet.Cells(i, "I"))
     ![C_SMET] = zamena(wrksheet.Cells(i, "J"))
     ![IND] = zamena(wrksheet.Cells(i, "K"))
     .Update
  End With
  End If
   Next
   End With
   rst.Close: Set rst = Nothing
   dbs.Close: Set rst = Nothing
   book.Close: Set book = Nothing
   appXl.Quit: Set appXl = Nothing
   
         
MsgBox "Завершено"
End Sub
Проблема: процедура вставляет записи в таблицу, однако, нарушен их порядок. Изначально, в создаваемой таблице поле Код создавалось счётчиком и при импорте не заполнялось значениями из А. То, что приведено в коде - переписал формат поля на текстовый и попробовал заполнить. Ситуация та же. (собственно, по полю Код проблема и была обнаружена, в таблице за 150 килострок)
В чём может быть причина?
Ethex вне форума Ответить с цитированием
Старый 24.05.2017, 11:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Ethex Посмотреть сообщение
Проблема: процедура вставляет записи в таблицу, однако, нарушен их порядок.
а почему это важно?
Насколько я помню теорию, никто в СУБД порядок записей не гарантирует.
Если Вам нужно получать записи в определённом порядке - используйте SELECT ... FROM ... ORDER BY

А ещё можете создать запрос с нужным порядком и обращаться к нему (по имени запроса)

p.s. а если это действительно важно - то вставляйте записи во временную таблицу, а результирующую создавайте через select с ORDER BY
(см. How to: Create a DAO Recordset From a Query)

Последний раз редактировалось Serge_Bliznykov; 24.05.2017 в 11:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.05.2017, 11:43   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Ethex Посмотреть сообщение
Делаю программу для импорта таблицы из Экселевского файла в Access
Дело, конечно, Ваше, но стандартных средств импорта Акцесса недостаточно?


Цитата:
Сообщение от Ethex Посмотреть сообщение
собственно, по полю Код проблема и была обнаружена
Возможно, потому что Акцесс требует указания ключевого поля. В первом случае Вы пытались текстовые данные сохранить в автоинкрементируемое поле и вполне естественно ему это не понравилось. Во втором случае Вы, возможно, изменили тип поля Код с автоинкремента на текстовый, но забыли убрать с него признак ключевого поля.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 24.05.2017, 11:44   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Насколько я помню теорию, никто в СУБД порядок записей не гарантирует
А я так понял, что столбцы неправильно вставляет...

Походу, требуется уточнение у автора А лучше - сам файл проекта увидеть.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 24.05.2017, 11:48   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Ну не выполняйте ету строку
Цитата:
Сообщение от Ethex Посмотреть сообщение
![Код] = zamena(wrksheet.Cells(i, "A"))
раз КОД счетчик.
или замените часть
.AddNew ... .Update на DoCmd.RunSQL с INSERTом в таблицу нужных данных
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 24.05.2017, 12:08   #6
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
А я так понял, что столбцы неправильно вставляет...
Со столбцами то всё ровно. Строки располагаются не по порядку. Файл придётся подготовить, т.к. по жопе дадут, если рабочий эксельник обнародую
Ethex вне форума Ответить с цитированием
Старый 24.05.2017, 12:39   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вообще, если не ошибаюсь, Акцесс позволяет подключить таблицу Ёкселя и работать с ней как с таблицей БД. Поэтому удобнее было бы делать SQL вида:

Код:
SELECT INTO Таблица_Акцесса FROM Таблица_Экселя ORDER BY Нужное поле
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 24.05.2017, 13:26   #8
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию

Aleksandr H., правильно понял? Ни разу ещё из рекордсета инсертом ничего не брал
Код:
...
For i = 5 To .Rows.Count
  If Len(wrksheet.Cells(i, "B")) > 0 Then
  With rst
DoCmd.RunSQL "INSERT INTO Test" _
& "(OBSN, NAIM, ED_IZM, BRUTTO, C_BASE, CLASS_GR, COD_UZ, C_OPT, C_SMET, " _     
& "IND) VALUES (zamena(wrksheet.Cells(i, "B")), zamena(wrksheet.Cells(i, "C")), " _
& "zamena(wrksheet.Cells(i, "D")), wrksheet.Cells(i, "E"), zamena(wrksheet.Cells(i, "F"))," _              
& " zamena(wrksheet.Cells(i, "G")), zamena(wrksheet.Cells(i, "H")), " _
& "zamena(wrksheet.Cells(i, "I")), zamena(wrksheet.Cells(i, "J")), " _
& "zamena(wrksheet.Cells(i, "K")))"
End With
  End If
   Next
...
Sciv, таблицу нужно не просто брать и импортировать, а перешагивать определённые строки при импорте. Во вторых, от меня требуют формы в аксе, так что если подключать, то не без vba

Последний раз редактировалось Ethex; 24.05.2017 в 13:30.
Ethex вне форума Ответить с цитированием
Старый 24.05.2017, 14:23   #9
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию Файл

На всякий случай, примерно таблица выглядит так.
Вложения
Тип файла: rar Копия Пример.rar (7.1 Кб, 8 просмотров)
Ethex вне форума Ответить с цитированием
Старый 24.05.2017, 14:40   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
таблицу нужно не просто брать и импортировать, а перешагивать определённые строки при импорте.
для этого в запросе придумали WHERE
Цитата:
Во вторых, от меня требуют формы в аксе, так что если подключать, то не без vba
ни чего не мешает выборку селекта в форме отобразить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при импорте из Excel - MS Access DJDiM Microsoft Office Access 1 05.11.2015 17:32
Ошибка 1004 при обновлении данных из Access (VBA EXCEL) Kycaka Microsoft Office Excel 7 07.12.2012 10:30
Сохранение имен столбцов при импорте данных из Delphi в Excel an4ik Общие вопросы Delphi 3 07.03.2009 15:23
Не читаемые данные при Импорте внешних данных (unicode) al2 Microsoft Office Excel 2 11.02.2008 08:40