| 
    
        
     
     | 
    
  | 
v7: SQLiteDataProvider для Табличного поля 1С7.7 | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        FobusVGrunt    
     13.04.16 
            ✎
    18:28 
 | 
         
        Хочу подключить к табличному полю 1С++,  данные из внешней БД на Sqlite, согласно документации к SQLiteDataProvider  упорядочивание использовать нельзя (order by).  Упорядочивание происходит по полям заданным  в «КлючевыеПоля» как я понимаю.
 
        В примерах запросов к 1С видел «idx_IDDOCDEF_DATE_TIME_IDDOC as [КлючПорядка]» думаю, что это индекс с полями(IDDOCDEF, DATE, TIME, IDDOC), если это ни так поправьте меня что значит это запись. Вопрос в том , что в своей БД создал индекс ind_ DateTime, по двум колонкам (Date, Time) с упорядочиванием desc. В запросе: «Select ind_ DateTime as [КлючПорядка]…….» Пишет нет колонки ind_ DateTime. Что я делаю ни так?  | 
|||
| 
    1
    
        Это_mike    
     13.04.16 
            ✎
    19:16 
 | 
         
        Так оно колонку хочет.. 
 
        Точнее, ты сам выбираешь колонку, которой нет.  | 
|||
| 
    2
    
        Djelf    
     13.04.16 
            ✎
    21:42 
 | 
         
        Поле должно быть описано не как 
 
        idx_IDDOCDEF_DATE_TIME_IDDOC as [КлючПорядка] а как idx_IDDOCDEF_DATE_TIME_IDDOC [КлючПорядка] если это внешняя база sqlite то добавь в запрос RowID [RowID] и в УстановитьТекстЗапроса(ТекстЗапроса, КлючПорядка, RowID) 3й параметр не обязателен, но без него могут происходить вылеты  | 
|||
| 
    3
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:02 
 | 
         
        (1) Так, а разве есть такое поле idx_IDDOCDEF_DATE_TIME_IDDOC в таблицах 1С?     
         | 
|||
| 
    4
    
        Mikeware    
     14.04.16 
            ✎
    10:05 
 | 
         
        Нету. ну ты ж сам запрос формируешь - вот и сделай в запросе колонку, которую надо. хот составную...     
         | 
|||
| 
    5
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:06 
 | 
         
        (2) Опишу проблему по другому, во внешней БД (не 1С) в таблице есть поля Date,Time - куда хронологически добавляются записи. Можно как-то в провайдере отобразить записи по убыванию? если в тексте запроса для провайдера нельзя использовать order by?     
         | 
|||
| 
    6
    
        Ёпрст    
     гуру 
    14.04.16 
            ✎
    10:06 
 | 
         
        (3) есть     
         | 
|||
| 
    7
    
        Ёпрст    
     гуру 
    14.04.16 
            ✎
    10:06 
 | 
         
        по-умолчанию задается такой индекс в 1sqlite     
         | 
|||
| 
    8
    
        Mikeware    
     14.04.16 
            ✎
    10:07 
 | 
         
        Ну так добавь колонку типа Стр(Дата)+стр(время) - и получишь     
         | 
|||
| 
    9
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:08 
 | 
         
        (7) idx_IDDOCDEF_DATE_TIME_IDDOC - это индекс, правильно?     
         | 
|||
| 
    10
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:10 
 | 
         
        (9) Если это индекс, то и в своей БД я создал индекс с именем "ind_ DateTime", но в запросе пишет нет такой колонки     
         | 
|||
| 
    11
    
        Mikeware    
     14.04.16 
            ✎
    10:18 
 | 
         
        (10) ну так ты _имеешь_индекс_ ,а просишь - _колонку_     
         | 
|||
| 
    12
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:32 
 | 
         
        (11) idx_IDDOCDEF_DATE_TIME_IDDOC - это индекс или колонка?     
         | 
|||
| 
    13
    
        Mikeware    
     14.04.16 
            ✎
    10:36 
 | 
         
        (12) Ёп говорит, что индекс.     
         | 
|||
| 
    14
    
        FobusVGrunt    
     14.04.16 
            ✎
    10:41 
 | 
         
        (13) Ну почему в запросах к таблицам 1С в Select он отрабатывает, это же не колонка, а индекс.     
         | 
|||
| 
    15
    
        Zhuravlik    
     14.04.16 
            ✎
    11:21 
 | 
         
        (0) Для примера, я как-то давно морочился... Может поможет :) http://catalog.mista.ru/public/193870/     
         | 
|||
| 
    16
    
        Mikeware    
     14.04.16 
            ✎
    11:23 
 | 
         
        (15) чо за чушь?     
         | 
|||
| 
    17
    
        Zhuravlik    
     14.04.16 
            ✎
    11:24 
 | 
         
        (16) Просмотрщик картинок, там обработка "_ГалереяИзображений" - пример табличного поля с использованием поставщика SQLiteDataProvider.     
         | 
|||
| 
    18
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:28 
 | 
         
        (17) С SQLiteDataProvider - понятно как работать, вопрос как упорядочить по полю в тексте запроса в провайдере     
         | 
|||
| 
    19
    
        Mikeware    
     14.04.16 
            ✎
    11:28 
 | 
         
        (17) понятно. а зачем? просто неинтересно без гамака, лыж и ОЗК? :-)     
         | 
|||
| 
    20
    
        Mikeware    
     14.04.16 
            ✎
    11:28 
 | 
         
        (18) ну так сделай требуемое поле в запросе     
         | 
|||
| 
    21
    
        Zhuravlik    
     14.04.16 
            ✎
    11:30 
 | 
         
        (19) Да это просто тренился :) Плюс в рабочей базе активно SQLlite использовал, заюзал заодно. Красиво-же)     
         | 
|||
| 
    22
    
        Mikeware    
     14.04.16 
            ✎
    11:31 
 | 
         
        (21) ясно... Ну, всяко лучше, чем то, что делает кот...     
         | 
|||
| 
    23
    
        trad    
     14.04.16 
            ✎
    11:33 
 | 
         
        (22) сатрап ты     
         | 
|||
| 
    24
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:35 
 | 
         
        (20) из документации к SQLiteDataProvider:
 
        Всвязи с таким принципом работы поставщика, возникают следующие требования к тексту запроса: Запрос должен быть запросом на выборку (select'ом), без указания упорядочивания запроса (без order by). Все поля в списке полей запроса должны быть указаны явно, указывать поля как * нельзя. Если для какого-то поля задается алиас, то алиас должен быть заключен в [] В запросе можно применять только именованные SQL-параметры (вида @ИмяПараметра), указывать SQL-параметры как '?' нельзя.  | 
|||
| 
    25
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:35 
 | 
         
        (24) без order by     
         | 
|||
| 
    26
    
        Mikeware    
     14.04.16 
            ✎
    11:36 
 | 
         
        (23) Сатрап (др.-перс. x?a?rap?van — хранитель царства; пехл. ?atrap, новоперс. ???????) — глава сатрапии, правитель в Древней Персии. Назначался царём и обычно принадлежал к его родне или высшей знати. На своей территории ведал сбором налогов, содержанием армии, был верховным судьёй и имел право чеканить монету.
 
        Я налоги не собираю. Хотя не против бы... "негосударственная налоговая инспекция" - классно же....  | 
|||
| 
    27
    
        Mikeware    
     14.04.16 
            ✎
    11:37 
 | 
         
        (24) ну так и сделай _поле_, обеспечивающее тебе требуемый порядок.
 
        И его и указывай как ключ порядка.  | 
|||
| 
    28
    
        Mikeware    
     14.04.16 
            ✎
    11:38 
 | 
         
        +(27) например, разницу между моментом документа, и неким будущим моментом     
         | 
|||
| 
    29
    
        trad    
     14.04.16 
            ✎
    11:40 
 | 
         
        (26) см. переносное значение, для прямого - много чести )     
         | 
|||
| 
    30
    
        Mikeware    
     14.04.16 
            ✎
    11:42 
 | 
         
        (29) почему много? как раз норма!     
         | 
|||
| 
    31
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:42 
 | 
         
        самое интересное, создал индекс к полю Date с упорядочеванием desc. делаю запрос на выборку из менеджер баз данных SQLite (sqlite expert personal) выбирает в обратном порядке, т.е. использует индекс. Делаю точно такой же запрос из 1С (SQLiteBase) выбирает записи, так как они лежат в базе, а в провайдере к ТП (SQLiteDataProvider) отображает записи по возрастанию (asc). Я так понимаю вообще компонента к 1С sqlite индексы не использует, а в провайдере, по умолчанию сортирует по ASC поля указанные в параметре "КлючевыйПоля"     
         | 
|||
| 
    32
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:48 
 | 
         
        (31) это видно в откладке, к запросу в провайдере добавляется:
 
        <мой запрос> order by bm.Date asc, bm.Code asc limit @sqlite_data_provider_rowcount УстановитьТекстЗапроса(ТекстЗапроса,"КлючПорядка,Код","Код"); Date и Code указаны как ключевые поля ("КлючПорядка,Код")  | 
|||
| 
    33
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:49 
 | 
         
        Еще раз спрошу, кто-нибудь знает как отсортировать записи в провайдере по убыванию (desc), а не asc ?     
         | 
|||
| 
    34
    
        Mikeware    
     14.04.16 
            ✎
    11:54 
 | 
         
        (33) что насчет (27)+(28)     
         | 
|||
| 
    35
    
        FobusVGrunt    
     14.04.16 
            ✎
    11:59 
 | 
         
        (34)Об этом я думал как крайней вариант,если других вариантов предложено не будет, буду так и делать! Спс. Но интересно что же тогда idx_IDDOCDEF_DATE_TIME_IDDOC  в запросах к таблицам 1С. каков его принцип работы     
         | 
|||
| 
    36
    
        Mikeware    
     14.04.16 
            ✎
    12:05 
 | 
         
        (35) ну посмотри в базе, что это     
         | 
|||
| 
    37
    
        Mikeware    
     14.04.16 
            ✎
    12:05 
 | 
         
        я не удивлюсь, если это колонка     
         | 
|||
| 
    38
    
        FobusVGrunt    
     14.04.16 
            ✎
    12:14 
 | 
         
        (37) это все таки колонка  Sqlite подключает таблицу журнала 1С создает это колонку, наверно как то так     
         | 
|||
| 
    39
    
        FobusVGrunt    
     14.04.16 
            ✎
    12:28 
 | 
         
        Всем спасибо, буду выходить с положения путем создание спец. колонки в самой базе для упорядочивания по убыванию, по другому ни как не получится)     
         | 
|||
| 
    40
    
        trad    
     14.04.16 
            ✎
    12:31 
 | 
         
        (33) не знаю как в поставщике SQLite, но в поставщике SQL можно задавать в строке ключа, примерно так:
 
        УстановитьТекстЗапроса(ТекстЗапроса,"Поле1Ключа desc, Поле2Ключа desc","Код");  | 
|||
| 
    41
    
        Mikeware    
     14.04.16 
            ✎
    12:33 
 | 
         
        (40) а ты с Ванлдаловским ПрямымЗапросом не работал?     
         | 
|||
| 
    42
    
        FobusVGrunt    
     14.04.16 
            ✎
    12:38 
 | 
         
        (40) Попробовал, выдает ошибку!     
         | 
|||
| 
    43
    
        Djelf    
     14.04.16 
            ✎
    12:56 
 | 
         
        (33) Я знаю ;) 
 
        Делаешь вьюшку и избавляешься от ограничений парсера, а провайдером цепляешься уже к вьюшке.  | 
|||
| 
    44
    
        Mikeware    
     14.04.16 
            ✎
    12:57 
 | 
         
        (43) а в  SQLite они делаются?     
         | 
|||
| 
    45
    
        Djelf    
     14.04.16 
            ✎
    13:01 
 | 
         
        Да, и триггеры тоже.     
         | 
|||
| 
    46
    
        Mikeware    
     14.04.16 
            ✎
    13:03 
 | 
         
        (45) хм. эти б знания, да лет на 10 раньше...     
         | 
|||
| 
    47
    
        Ёпрст    
     гуру 
    14.04.16 
            ✎
    13:06 
 | 
         
        (45) триггеры, именно на 1с-ные таблички ? Или на свою базу в скульлайте ?     
         | 
|||
| 
    48
    
        Djelf    
     14.04.16 
            ✎
    13:25 
 | 
         
        (47) На 1с`овские увы нельзя. Все таки это виртуальные таблицы, ну и гарантийно получить от них событие изменения нереально.     
         | 
|||
| 
    49
    
        trad    
     14.04.16 
            ✎
    13:38 
 | 
         
        (41) нет     
         | 
|||
| 
    50
    
        trad    
     14.04.16 
            ✎
    13:41 
 | 
         
        гонять ТП не по индексам - не комильфо     
         | 
|||
| 
    51
    
        orefkov    
     14.04.16 
            ✎
    13:50 
 | 
         
        (0)
 
        Ветку не читал, отвечу как есть. При запросе через 1sqlite к дбф-таблицам базы данных 1С, создаются "виртуальные" поля, соответствующие дбф-индексам этих таблиц, для возможности создания оптимальных запросов для поставщика данных. При обращении к таблицам в sqlite базе никаких виртуальных полей не создаётся. Дело в том, что оптимизатор sqlite хорошо попадает в индекс при использовании сравнения по одной колонке, при использовании индекса по нескольким полям сложно составить запрос, попадающий в индекс.  | 
|||
| 
    52
    
        FobusVGrunt    
     14.04.16 
            ✎
    13:58 
 | 
         
        (43) Точно, спасибо, хорошая идея     
         | 
|||
| 
    53
    
        orefkov    
     18.04.16 
            ✎
    10:14 
 | 
         
        Djelf - может доработаешь 1sqlite для поддержки обратного порядка? Там не очень сложно, я подскажу где.     
         | 
|||
| 
    54
    
        Злопчинский    
     18.04.16 
            ✎
    12:41 
 | 
         
        (51) а что будет с запросом на чтение если в этот момент таблицы, попадающие в такой запрос, заблокированы другой штатной транзакцией на изменение данных..?     
         | 
|||
| 
    55
    
        Ёпрст    
     гуру 
    18.04.16 
            ✎
    12:44 
 | 
         
        (54) ничего не будет, прочитает данные и всё     
         | 
|||
| 
    56
    
        Злопчинский    
     18.04.16 
            ✎
    12:58 
 | 
         
        (55) Плохо. Что делать в таком случае?     
         | 
|||
| 
    57
    
        Djelf    
     18.04.16 
            ✎
    12:58 
 | 
         
        (53) Могу, настройка сборки у меня не сломана.
 
        Покопался слегка но что-то подзапутался в dataprovider`е. Ну и отложил пока, а то сломаю там что-то, а не хочется ;)  | 
|||
| 
    58
    
        Djelf    
     18.04.16 
            ✎
    13:01 
 | 
         
        (55) https://www.sqlite.org/isolation.html
 
        Включаем PRAGMA read_uncommitted = fase; и ждем окончания транзакции.  | 
|||
| 
    59
    
        Ёпрст    
     гуру 
    18.04.16 
            ✎
    13:01 
 | 
         
        (56) а чего хочется, при этом ?..     
         | 
|||
| 
    60
    
        Ёпрст    
     гуру 
    18.04.16 
            ✎
    13:02 
 | 
         
        (58) вот только не ясно, нафига это делать ? :)     
         | 
|||
| 
    61
    
        Злопчинский    
     18.04.16 
            ✎
    13:05 
 | 
         
        (59) Отлуп/ошибка/бяковыйкодвозврата - то что можно отловить.     
         | 
|||
| 
    62
    
        Злопчинский    
     18.04.16 
            ✎
    13:06 
 | 
         
        (58) в принципе пойдет, ибо транзакции достаточно короткие...     
         | 
|||
| 
    63
    
        orefkov    
     18.04.16 
            ✎
    13:42 
 | 
         
        (57)
 
        В dataprovider.h в SQLiteDataProvider добавить член BOOL m_bReverseOrder; и BL_PROP_RW(ReverseOrder, "ОбратныйПорядок") { value = m_bReverseOrder; return TRUE; } BL_PROP_WRITE(ReverseOrder) { m_bReverseOrder = (long)value.GetNumeric() != 0; return TRUE; } В dataprovider.cpp В конструкторе SQLiteDataProvider::SQLiteDataProvider() m_bReverseOrder = FALSE; в SQLiteDataProvider::getQuery(qTypes type) CString direction(m_bReverseOrder ? (qUp == type || qBottom == type ? " asc" : " desc") : (qUp == type || qBottom == type ? " desc" : " asc"));  | 
|||
| 
    64
    
        Djelf    
     18.04.16 
            ✎
    15:03 
 | 
         
        (63) Спасибо! А я то хотел desc и asc добавить, вот и копался, вдруг кому-то такое захочется ;)
 
        В CString direction не подошло - все корежится и ведет себя весьма странно. Поменял в SQLiteDataProvider::QueryRows 
1sqlite на движке 3.8.11.1 с ТабличноеПоле.ПоставщикДанных.ОбратныйПорядок https://cloud.mail.ru/public/BRyV/g4MiSvgqz Если кому надо на 1.0.2.6 могу и на нем собрать.  | 
|||
| 
    65
    
        orefkov    
     18.04.16 
            ✎
    15:18 
 | 
         
        (64)
 
        Супер!  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |