Имя: Пароль:
1C
1C 7.7
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

    //SQLiteQuery* pQuery = getQuery(nRowsCount > 0 ? (pRowFrom ? qDown : qTop) : (pRowFrom ? qUp : qBottom));

    SQLiteQuery* pQuery;

    if (!m_bReverseOrder)
        pQuery = getQuery(nRowsCount > 0 ? (pRowFrom ? qDown : qTop) : (pRowFrom ? qUp : qBottom)); // по возрастанию
    else
        pQuery = getQuery(nRowsCount > 0 ? (pRowFrom ? qUp : qBottom) : (pRowFrom ? qDown : qTop)); // по убыванию


1sqlite на движке 3.8.11.1 с
ТабличноеПоле.ПоставщикДанных.ОбратныйПорядок

https://cloud.mail.ru/public/BRyV/g4MiSvgqz
Если кому надо на 1.0.2.6 могу и на нем собрать.
65 orefkov
 
18.04.16
15:18
(64)
Супер!
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.