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