Код выполнить пробовали или просто посчитали, что я от нечего делать такую строку If Not pRset.EOF Then pRset.MoveNext вставил? Без него Recordset ничего не даёт по pRset(0).Value, кроме ошибки.
Код выполнить пробовали или просто посчитали, что я от нечего делать такую строку If Not pRset.EOF Then pRset.MoveNext вставил? Без него Recordset ничего не даёт по pRset(0).Value, кроме ошибки.anvg
Сообщение отредактировал anvg - Вторник, 23.04.2019, 20:50
А можно привести пример и, хотя бы минимально объяснить, как было получено такое поведение?
Я как раз вчера вытаскивал из экселевского листа данные без открытия книги в recordset и долго разбирался почему же у меня не хватает первой строки из диапазона. Оказалось, что он ее воспринимает как заголовок столбцов и засовывает в Fields.
А можно привести пример и, хотя бы минимально объяснить, как было получено такое поведение?
Я как раз вчера вытаскивал из экселевского листа данные без открытия книги в recordset и долго разбирался почему же у меня не хватает первой строки из диапазона. Оказалось, что он ее воспринимает как заголовок столбцов и засовывает в Fields.Bamboo
Оказалось, что он ее воспринимает как заголовок столбцов
Это смотря каким провайдером пользоваться. Если OleDb, то можно в Extended Properties указать HDR=NO - и будут условные f1, f2... названиями полей в Recordset. Если же ODBC, то тогда да, принудительно используется первая строка диапазона. Только в моём случае - это не доказательство. У меня как и должно быть имена полей Id, part - как задумывалось, а не 1 и b, как вы попытались утверждать. Аналогия в данном случае не уместна и доказательством не является.
Оказалось, что он ее воспринимает как заголовок столбцов
Это смотря каким провайдером пользоваться. Если OleDb, то можно в Extended Properties указать HDR=NO - и будут условные f1, f2... названиями полей в Recordset. Если же ODBC, то тогда да, принудительно используется первая строка диапазона. Только в моём случае - это не доказательство. У меня как и должно быть имена полей Id, part - как задумывалось, а не 1 и b, как вы попытались утверждать. Аналогия в данном случае не уместна и доказательством не является.anvg
Сообщение отредактировал anvg - Вторник, 23.04.2019, 21:15
Код выполнить пробовали или просто посчитали, что я от нечего делать такую строку If Not pRset.EOF Then pRset.MoveNext вставил? Без него Recordset ничего не даёт по pRset(0).Value, кроме ошибки.
я не посчитал, я знаю попробуйте [vba]
Код
If Not pRset.EOF Then 'проверяем есть ли вообще записи в рекордсете Debug.Print pRset.Fields(0).Value 'печатаем первую запись pRset.MoveNext 'переходим к следующей Debug.Print pRset.Fields(0).Value 'печатаем вторую End If
[/vba]
Bamboo, Касаемо заголовков... если вы используете подключение к таблице Excel, то у вас есть два варианта считывания данных: первый, С заголовками, второй БЕЗ - заголовки идут в первую запись рекордсета я использую вот такую функцию:
[vba]
Код
Function ExcelConnect(ByVal PatchFile$, Optional TableHeader As Boolean = False) As Object '' Author: boa '' Written: '' Edited: 15.08.2018 ' Description: Создает подключение к файлу Excel для Recordset ' TableHeader - Отметить True, если есть заголовки у таблицы и надо к столбцам обращаться по имени, ' иначе к столбцам можно обращаться F1, F2, F3 и т.д. ' Dim VersionFile$ Dim strCon$ Select Case Split(PatchFile, ".")(UBound(Split(PatchFile, "."))) Case "xls": VersionFile = "Excel 8.0" Case "xlsb": VersionFile = "Excel 12.0" Case "xlsm": VersionFile = "Excel 12.0 Macro" Case "xlsx": VersionFile = "Excel 12.0 Xml" End Select strCon = "Provider=" & IIf(val(Application.Version) > 11, "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0") & ";" & _ "Data Source=""" & PatchFile & """;" & _ "Extended Properties=""" & VersionFile & ";HDR=" & IIf(TableHeader, "YES", "NO") & """;" Set ExcelConnect = CreateObject("ADODB.Connection") ExcelConnect.Open strCon End Function
[/vba]
С Oracle, насколько я знаю, заголовки в рекордсет не засовываются самостоятельно, это не Excel, поэтому при обращении к серверу Oracle, вы получите заголовки только из названия полей, т.е. fields.name
Код выполнить пробовали или просто посчитали, что я от нечего делать такую строку If Not pRset.EOF Then pRset.MoveNext вставил? Без него Recordset ничего не даёт по pRset(0).Value, кроме ошибки.
я не посчитал, я знаю попробуйте [vba]
Код
If Not pRset.EOF Then 'проверяем есть ли вообще записи в рекордсете Debug.Print pRset.Fields(0).Value 'печатаем первую запись pRset.MoveNext 'переходим к следующей Debug.Print pRset.Fields(0).Value 'печатаем вторую End If
[/vba]
Bamboo, Касаемо заголовков... если вы используете подключение к таблице Excel, то у вас есть два варианта считывания данных: первый, С заголовками, второй БЕЗ - заголовки идут в первую запись рекордсета я использую вот такую функцию:
[vba]
Код
Function ExcelConnect(ByVal PatchFile$, Optional TableHeader As Boolean = False) As Object '' Author: boa '' Written: '' Edited: 15.08.2018 ' Description: Создает подключение к файлу Excel для Recordset ' TableHeader - Отметить True, если есть заголовки у таблицы и надо к столбцам обращаться по имени, ' иначе к столбцам можно обращаться F1, F2, F3 и т.д. ' Dim VersionFile$ Dim strCon$ Select Case Split(PatchFile, ".")(UBound(Split(PatchFile, "."))) Case "xls": VersionFile = "Excel 8.0" Case "xlsb": VersionFile = "Excel 12.0" Case "xlsm": VersionFile = "Excel 12.0 Macro" Case "xlsx": VersionFile = "Excel 12.0 Xml" End Select strCon = "Provider=" & IIf(val(Application.Version) > 11, "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0") & ";" & _ "Data Source=""" & PatchFile & """;" & _ "Extended Properties=""" & VersionFile & ";HDR=" & IIf(TableHeader, "YES", "NO") & """;" Set ExcelConnect = CreateObject("ADODB.Connection") ExcelConnect.Open strCon End Function
[/vba]
С Oracle, насколько я знаю, заголовки в рекордсет не засовываются самостоятельно, это не Excel, поэтому при обращении к серверу Oracle, вы получите заголовки только из названия полей, т.е. fields.nameboa
Сообщение отредактировал boa - Вторник, 23.04.2019, 22:53
И это будет с oracle, sql server, mysql, access подключением? Так тут-то смысл копья ломать? Там работает без проблем. Вы по теме попробуйте - через adodb получить данные запроса Power Query. Готовый пример в #8
И это будет с oracle, sql server, mysql, access подключением? Так тут-то смысл копья ломать? Там работает без проблем. Вы по теме попробуйте - через adodb получить данные запроса Power Query. Готовый пример в #8anvg
Попробовал в файле anvg (из №8) растянуть таблицу-источник на 110 строк. В Immediate отображаются только первые 100 записей - пишет, мол, "EOF=True и все такое". У меня записалось: open, a2, a3 ... a100. В чем причина, есть мысли? На всякий случай вот файлик, в котором экспериментировал.
Попробовал в файле anvg (из №8) растянуть таблицу-источник на 110 строк. В Immediate отображаются только первые 100 записей - пишет, мол, "EOF=True и все такое". У меня записалось: open, a2, a3 ... a100. В чем причина, есть мысли? На всякий случай вот файлик, в котором экспериментировал.nilem
У меня даже мысли такой никогда не возникало. какое-то масло маслянное... Power Query - не самый мой любимый инструмент в Excel'е. Лично я использую ее только когда мне надо объединить и обработать данные из разных источников(SQL server, Access, Excel, CSV) и то, это уже финальная обработка данных, результат которой выгружается на лист. Но получать данные в PQ для того, что бы их от-туда потом считывать и опять обрабатывать... это за пределами моей фантазии. Ранее я уже написал
и предложил использовать Recordset и дальнейшее мое обсуждение касалось рекордсета подключенного к первоисточнику данных(Oracle). Тут Recordset ведет себя адекватно, т.к. можно CursorLocation присвоить adUseClient и дальше перемещаться по нему в начало, в конец, передавать в массив и т.п.
Андрей, после вашего обращения моего внимания на сообщение №8, я заинтересовался и потестил ваш файлик. Более того, погуглил, но даже на буржуйских форумах не нашел решения, хотя были упоминания датирующиеся еще 14-м годом, где было сказано, что проблема есть и она не решаема. Все, что предлагалось, это выгрузить PQ на лист, потом считать данные с листа в Recordset, а потом лист убить. Можно, конечно заголовки в PQ спустить в первую строку и обращаться к столбцам по номерам, но зачем.
Николай, Ваш файлик так же обрабатывает все записи, вот только на 101-й и 1093-й(я еще добавил строчек), как и в 1-й записи, => "Either BOF or EOF is True or the current record has been deleted."
У меня даже мысли такой никогда не возникало. какое-то масло маслянное... Power Query - не самый мой любимый инструмент в Excel'е. Лично я использую ее только когда мне надо объединить и обработать данные из разных источников(SQL server, Access, Excel, CSV) и то, это уже финальная обработка данных, результат которой выгружается на лист. Но получать данные в PQ для того, что бы их от-туда потом считывать и опять обрабатывать... это за пределами моей фантазии. Ранее я уже написал
и предложил использовать Recordset и дальнейшее мое обсуждение касалось рекордсета подключенного к первоисточнику данных(Oracle). Тут Recordset ведет себя адекватно, т.к. можно CursorLocation присвоить adUseClient и дальше перемещаться по нему в начало, в конец, передавать в массив и т.п.
Андрей, после вашего обращения моего внимания на сообщение №8, я заинтересовался и потестил ваш файлик. Более того, погуглил, но даже на буржуйских форумах не нашел решения, хотя были упоминания датирующиеся еще 14-м годом, где было сказано, что проблема есть и она не решаема. Все, что предлагалось, это выгрузить PQ на лист, потом считать данные с листа в Recordset, а потом лист убить. Можно, конечно заголовки в PQ спустить в первую строку и обращаться к столбцам по номерам, но зачем.
Николай, Ваш файлик так же обрабатывает все записи, вот только на 101-й и 1093-й(я еще добавил строчек), как и в 1-й записи, => "Either BOF or EOF is True or the current record has been deleted." boa