|   |   | 
| 
 | как 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С возможности вызывать ее нам не представится. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |