![]() |
![]() |
![]() |
|
как oledb с xls пропустить вторую строку в select ? | ☑ | ||
---|---|---|---|---|
0
DES
02.09.16
✎
19:57
|
есть строка подключения
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + "HDR=YES;"+ "IMEX=1;"""; есть файл xls с данными, первая строка - заголовки вторая - общий итог остальные - данные ТекстЗапроса = "select * from [лист1$]"; Как игнорировать вторую строку в запросе? |
|||
1
trad
02.09.16
✎
20:10
|
Фио <> 'Итого'
|
|||
2
Изобретатель Велосип
02.09.16
✎
20:10
|
SKIP 2 - наверное.
|
|||
3
Изобретатель Велосип
02.09.16
✎
20:11
|
Или как в Ms Sql "OFFSET 2"
|
|||
4
NorthWind
02.09.16
✎
20:29
|
НаборЗаписей = Соединение.Execute("SELECT * FROM [" + СокрЛП (ИмяЛиста) + "$A" + Строка (СтрокаНачало) + ":CZ" + Строка (СтрокаКонец) + "] ");
|
|||
5
NorthWind
02.09.16
✎
20:31
|
это точно рабочий синтаксис, у меня так фурычило. Т.е. делаем выборку из диапазона ячеек на указанном листе
|
|||
6
DES
02.09.16
✎
20:45
|
строка конец неизвестно
|
|||
7
NorthWind
02.09.16
✎
21:00
|
(6) можно поставить достаточно большое число, 65535 к примеру. Реально выборка все равно будет сделана до последней строки где есть значения. У меня в приведенном примере столбцы тоже не до CZ, а их всего штук 10 там.
|
|||
8
Fedor-1971
02.09.16
✎
21:02
|
(6) Известно, Например, так:
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; |
|||
9
NorthWind
02.09.16
✎
21:05
|
(8) в реальности, судя по всему, джетовский провайдер все это делает неявно. Потому что выбираются всегда слева направо сверху вниз столбцы (в виде ADO fields) и строки до последних, в которых есть данные. Последующее пустое пространство не выбирается.
|
|||
10
NorthWind
02.09.16
✎
21:06
|
возможно, такое поведение задается свойствами соединения. Но у меня получалось именно так
|
|||
11
DES
02.09.16
✎
21:08
|
а как выбрать с текущего листа ?
"select * from [$data]"; чето не хочет |
|||
12
NorthWind
02.09.16
✎
21:11
|
(11) В терминах БД вообще-то нет такого понятия как таблица по умолчанию. Так что, может, и никак.
|
|||
13
NorthWind
02.09.16
✎
21:14
|
хотя вот тут http://www.itland.ru/forum/index.php?showtopic=15469 пишут что работает вот такой синтаксис: ТекстЗапроса = "Select [Дата/время] from [A:E]";
возможно, это как раз с текущего листа, попробуйте |
|||
14
NorthWind
02.09.16
✎
21:15
|
т.е. просто в скобках не указывать лист и все
|
|||
15
DES
02.09.16
✎
21:16
|
да, так журчит
|
|||
16
DES
02.09.16
✎
21:48
|
а как Select [Дата/время] from [A:E] where сделать по A:A" ?
|
|||
17
Fragster
гуру
02.09.16
✎
23:34
|
(8) лучше через OpenShema, там можно получить список листов, колонок и т.п. http://catalog.mista.ru/public/193857/
|
|||
18
Изобретатель Велосип
02.09.16
✎
23:48
|
(16) Чего по A:A ? Одну колонку что-ли ?
|
|||
19
NorthWind
03.09.16
✎
09:14
|
(16) а как пробовали?
from [A] from [A1:A65535] нет? |
|||
20
DES
03.09.16
✎
09:15
|
(18) Where сделать по одной колонке.
|
|||
21
NorthWind
03.09.16
✎
09:31
|
(20) что значит where по колонке? Какое именно должно быть условие - что некое значение содержится в колонке?
|
|||
22
Рэйв
03.09.16
✎
09:32
|
(0)Ты же по любому гдето набор строк будешь обрабатывать. Вот там и игнорируй.
|
|||
23
DES
03.09.16
✎
09:37
|
(21) where [A1] <> "-"
т.е. только те строки у которых в первой колонке пусто. |
|||
24
NorthWind
03.09.16
✎
09:40
|
(23) насколько я помню, поля оно именует F1, F2, F3... соответственно если ваша колонка это первое по счету поле, то можно попробовать where F1<>"-".
|
|||
25
NorthWind
03.09.16
✎
09:43
|
но если строк достаточно много, скажем десятки тысяч, то я рекомендую принять во внимание (22). Почему - потому как это все-таки не БД, индексов нет, и усложнением SQL все это дело можно и в задумчивость отправить.
|
|||
26
NorthWind
03.09.16
✎
09:47
|
+ (24) да, по правилам SQL грамотнее '', а не "", хотя, кажется, JetSQL поддерживает обе нотации для строк.
|
|||
27
DES
03.09.16
✎
09:52
|
а как будет SQL F1=<Пусто> ?
|
|||
28
Рэйв
03.09.16
✎
09:55
|
(27) NULL
|
|||
29
DES
03.09.16
✎
10:02
|
select * from [A:M] where F1=NULL
не катит |
|||
30
NorthWind
03.09.16
✎
10:02
|
(27) where F1 is NULL можно попробовать
|
|||
31
NorthWind
03.09.16
✎
10:03
|
=NULL принято писать только в конструкции UPDATE SET. В сравнениях пишут IS NULL
|
|||
32
DES
03.09.16
✎
10:16
|
select * from [A:M] where F1 is NULL
не катило сразу |
|||
33
NorthWind
03.09.16
✎
10:31
|
возможно, нет полноценной поддержки NULL провайдером Jet для Excel. Пробуйте тогда where F1<>'', TRIM(F1)<>''...
|
|||
34
NorthWind
03.09.16
✎
10:33
|
кстати, очень интересный вопрос, который я не проверял - какого типа поля провайдер Jet создает автоматически для разных форматов ячеек Excel. Чтобы понять что происходит, надо бы это дело исследовать.
|
|||
35
DES
03.09.16
✎
11:14
|
COLUMN_PROPID DATA_TYPE DATETIME_PRECISION
"" "130" "" "" "7" "0" "" "7" "0" "" "5" "" "" "5" "" "" "130" "" "" "130" "" "" "130" "" "" "130" "" "" "130" "" "" "5" "" "" "130" "" "" "130" "" |
|||
36
NorthWind
03.09.16
✎
12:53
|
ну что ж, поля создает типизированные. 7 это DateTime, 5 double, 130 один из вариантов unicode строки. Если не удается сравнивать с нуллом, значит, скорее всего пустая ячейка трактуется не как нулл, а именно как строка длиной 0 символов (''). Либо же, если это строка фиксированной длины, то может трактоваться как строка определенной длины, забитая пробелами (' '). Тогда можно попробовать TRIM сделать в SQL. Я бы попробовал сделать селект без условия, вывести куда-нибудь данные и посмотреть на них.
|
|||
37
Бородатый Админ
04.09.16
✎
16:21
|
(36) Насколько я помню, Null получается, если есть объединённые ячейки, и там действительно он.
Для пустой ячейки, по идее, есть тип Empty. |
|||
38
NorthWind
04.09.16
✎
20:43
|
(37) возможно, только остается вопрос, как проверить поле в JetSQL на то, что оно Empty.
|
|||
39
Бородатый Админ
04.09.16
✎
21:05
|
(38) Сделать CAST к строке и сравнить с пустой строкой.
Предварительно, проверить, что есть Null и понять, что это ошибка. |
|||
40
NorthWind
04.09.16
✎
21:11
|
(39) ну, положим, каста в JetSQL нет, есть VBAшная функция Str (). А так сравнить с пустой строкой уже предлагалось...
|
|||
41
Бородатый Админ
04.09.16
✎
21:18
|
(40) Если проверять поле после запроса, то мы смело можем использовать VarType(Value)=vbEmpty без всякого приведения.
|
|||
42
Бородатый Админ
04.09.16
✎
21:19
|
Я просто одно время морочился чтением через Jet, но потом понял, что если всю активную часть страницы Excel скопировать в двумерный массив, то его можно переносить между процессами через OLE без всякого дополнительного преобразования.
А в 1С SafeArray прекрасно обрабатывается. |
|||
43
NorthWind
04.09.16
✎
21:20
|
(41) я обычно в случае с Excel так и делаю, потому что изгаляться с SQL там может оказаться себе дороже. Но автору зачем-то захотелось на SQL.
|
|||
44
NorthWind
04.09.16
✎
21:24
|
(42) "если всю активную часть страницы Excel скопировать в двумерный массив"
это требует использования средств автоматизации Excel. А что делать, если оного на машине юзера нет? |
|||
45
Бородатый Админ
04.09.16
✎
21:25
|
(43) SQL работает без необходимости установки Excel на компьютер.
Сейчас, когда чтение Excel реализовано на JavaScript, Php и других языках - способ чтения через SQL не очень актуален. Особенно из-за того, что он очень плохо относится к различным типам в разных строках одного и того же столбца. |
|||
46
Бородатый Админ
04.09.16
✎
21:25
|
(44) Качать Node Js и изучать.
Потому как Php изучать сложнее. |
|||
47
NorthWind
04.09.16
✎
21:54
|
(45) речь про то что ему понадобилось фильтрацию на SQL делать. Хотя в принципе можно было бы написать select вообще без where и обработать полученный рекордсет уже в 1С.
|
|||
48
Бородатый Админ
04.09.16
✎
22:58
|
(47) Некошерно.
|
|||
49
Бородатый Админ
04.09.16
✎
23:03
|
Вот, кстати, описание про то, что Null получается из-за смешанных значений.
Сказано, что анализируются только первые 8 рядов, чтобы составить мнение о всей таблице. https://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx |
|||
50
Бородатый Админ
04.09.16
✎
23:08
|
А пропуск ряда народ предлагает делать вложенным запросов, используя функцию Row_Number()
http://stackoverflow.com/questions/4929217/openrowset-for-excel-can-we-skip-several-rows |
|||
51
NorthWind
05.09.16
✎
07:58
|
(50) ну здесь-то ему вначале строки требуется пропустить. А если нужны ограничения сверху, снизу, справа или слева - то можно сделать выборку из диапазона, см. (4). Это гораздо проще.
|
|||
52
NorthWind
05.09.16
✎
08:06
|
(50) Интересный топик, кстати, но тут есть нюанс. Если внимательно посмотреть код, то функция Row_Number вызывается из Transact-SQL:
SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rownum FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 'SELECT * FROM [sheet1$]') т.е. такая возможность есть только в том случае, если мы работаем непосредственно с MS SQL. В случае же с 1С возможности вызывать ее нам не представится. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |