|
v7: ТабличноеПоле 1С++ Свойство ТекущаяСтрока не работает | ☑ | ||
---|---|---|---|---|
0
FobusVGrunt
15.04.16
✎
13:07
|
Столкнулся с тем, что ТП не совсем корректно держит текущую строку и теряет фокус отображения на строку поднимает выше(полоса прокрутки прыгает),после метода ОбновитьСтроки. Решил поставить костыль вручную, но почему то не отрабатывает , ТП.ТекущаяСтрока = 1, остается как было, например = 2, так и остается. В провайдере в запросе:
ТекстЗапроса = "SELECT |bm.RowID as [КлючПорядка] |,bm.Code as [Код] ..... УстановитьТекстЗапроса(ТекстЗапроса,"КлючПорядка","КлючПорядка"); Провайдер Sqlite, база внешняя. Ключ порядка по RowID, так как запрос построен к вьюшке (как надо отсортированной), если другой ключ применить летят сортировки, т.к. провайдер упорядочивает по ключу порядка. Хотя пробовал и другие ключи порядка, все равно не хочет менять тЕкущую строку ТП |
|||
1
Djelf
15.04.16
✎
19:12
|
Насколько помню у вьюшек с RowID в sqlite есть проблемы.
Я когда такое использую сам делаю поле для сортировки. |
|||
2
Djelf
15.04.16
✎
19:22
|
А выглядит поле сортировки?
Может через https://www.sqlite.org/lang_datefunc.html получится и без вьюшки? |
|||
3
FobusVGrunt
15.04.16
✎
19:38
|
(2) Проблема, в том что провайдер Sqlite SQLiteDataProvider, в запросе нельзя использовать order by, и провайдер упорядочивает по возрастанию (asc), поля указанные в параметре "КлючевыеПоля", мне нужно в обратном порядке (desc), поэтому решил прикрутить вьюшку. Еще есть вариант добавить специальное поле в таблицу и заполнять его так его что упорядочивание asc, давала нужную сортировку в ТП.
|
|||
4
FobusVGrunt
15.04.16
✎
19:39
|
(2) Djelf если сделать по второму варианту, без вьюшек, проблема с ТекущейСтрокой должна исчезнуть?
|
|||
5
Djelf
16.04.16
✎
12:45
|
(4) По моему опыту:
ТекущаяСтрока должна быть 100% уникальной, она должна быть обязательно назначена, несмотря на ее необязательность, иначе 1с может вылетать. Сортировка всегда asc, хотя в коде 1sqlite вроде как бы и desc присутствует, но что-то не допилено и оно не работает. Мутное это дело... дай кусочек запроса, посмотрю что можно сделать. |
|||
6
FobusVGrunt
16.04.16
✎
14:08
|
(5) ТекстЗапроса = "SELECT
|bm.RowID as [КлючПорядка] |,bm.Code as [Код] |,bm.Subject as Тема |,bm.Date as [Дата $Дата] |,bm.Time as Время |,bm.Adress as Адрес |,bm.ThisIN as ЭтоВход |,bm.Read as Прочитан |,bm.ThisFavorit as Избранное |FROM view_BoxMail_IN as bm |"; мПостСписПисем.УстановитьТекстЗапроса(ТекстЗапроса,"КлючПорядка","КлючПорядка"); |
|||
7
FobusVGrunt
16.04.16
✎
14:58
|
(1) да кстати поменял в запросе на прямую таблицу, проблема исчезла, дело во вьюшках, из-за них глючит
|
|||
8
FobusVGrunt
16.04.16
✎
19:02
|
Djelf не подскажешь, может можно как-то еще выкрутиться создать виртуальную таблицу? как они вообще создаются в Sqlite? А то к основной таблице обращаешься, все идеально кроме сортировки, если к представлению таблицы, все в порядке но глючит текущаяСтрока в ТП. Просто беда
|
|||
9
trad
16.04.16
✎
19:18
|
(8) desc в описании КП пробовал? не помогло?
|
|||
10
FobusVGrunt
16.04.16
✎
19:55
|
(9) Пробовал в провайдере SQLITe выдает ошибку
|
|||
11
Djelf
16.04.16
✎
19:57
|
(9) Нету в парсере в dataprovider.cpp обработки desc :(
(8) На примере Номенклатуры
|
|||
12
FobusVGrunt
16.04.16
✎
20:03
|
(11) это не виртуальная таблица, это временная вьюшка (представление) на котором у меня глючит ТекущаяСтрока.
Виртуальная создается командой "CREATE VIRTUAL TABLE...", правда дальше не совсем понимаю как в нее выбрать данные на основании таблицы БД |
|||
13
Djelf
16.04.16
✎
20:11
|
(12) эээ CREATE VIRTUAL TABLE подключений обычной 1с`вская таблицы, а вьюшка то CREATE TEMP VIEW.
Хотя (11) тоже не вариант, половина таблицы номенклатура вообще куда то делась ;( Видимо варианта кроме кроме временной таблицы sqlite нет... |
|||
14
FobusVGrunt
17.04.16
✎
12:14
|
(13) SQlite поддерживает обычные таблицы БД (постоянные, временные), Представления или вьюшки (постоянные, временные) и виртуальные таблицы (постоянные, временные). Если с обычными таблицами и представлениями все понятно, то с виртуальными таблицами я еще пока не разобрался, как они создаются и какой практический смысл. И если виртуальная таблица в sqlite создается на основе таблицы 1С DBF, то должно быть возможность создать виртуальную таблицу на основе обычной таблицы в БД Sqlit? Хотя наверно виртуальные таблицы в SQlite предназначены для подключения внешних данных из других БД, это наверно отличия их от представлений (вьюшек), вьюшки к таблицам в своей базе, а вирт. Табл. к внешним таблицам иных БД. Это моё предположения, если не прав то поправьте
|
|||
15
Djelf
17.04.16
✎
21:26
|
(14) Первоисточник лучше всего: https://sqlite.org/vtab.html
Виртуальная таблица это любая не классическая таблица sqlite, а подключенная через дополнительный модуль-расширение. Все 1С`овские таблицы - виртуальные, они подключаться через модуль dbeng. Через дополнительные модули могут подключаются как внешние файлы (dbf, cdx и т.п.) так и таблицы особого формата хранящиеся в самой базе sqlite например fts http://xbb.uz/db/SQLite-FTS3-i-FTS4/. Фича виртуальных таблиц в sqlite в том что их можно смешивать в запросах с собственными таблицам sqlite. Ограничений в них 3: нельзя делать индексы средствами sqlite, нельзя вешать на них триггеры, нельзя по ним собрать статистику. Вроде все... Ну а вьюшки они https://habrahabr.ru/post/47031/ Я их иногда использую чтобы получить данные по какому то фильтру, который поставщик данных отказывается кушать. Предполагал что и сортировка получится, но ошибся ;( |
|||
16
FobusVGrunt
18.04.16
✎
09:06
|
(15) спасибо Djelf. Я из-за глюка Текущейстроки, пришлось отказаться от вьюшек, хотя с ними и круто. Т.к. мне надо сортировать записи в обратной хронологии. Создал спец. поле
с переводом даты и времени в число, типа -201604125717104, со знаком минус. И провайдер обращается к родной таблице. Пока все отлично. Единственное, такой длиный ключ порядка, на производительность сильно влияет? |
|||
17
FobusVGrunt
18.04.16
✎
11:37
|
(16) Блин, просто караул, вроде пока работает и сортирует правильно, НО в ТП КлючПорядка не те данные, что в таблице:
например -201604166958204 превращается в ТП 1597916036. Да ни долга радовался я, блин простая сортировка привратилось в кошмар. Походу ограничение на длину ключаПорядка, и должен быть не отрицательным. Djelf не сталкивался с этим??? |
|||
18
Mikeware
18.04.16
✎
11:41
|
(17) албанский пионер?
|
|||
19
FobusVGrunt
18.04.16
✎
11:42
|
(17) Все вопрос снят, поменял тип данных в самой БД с INTEGER на REAL. Все отображает код верно
|
|||
20
FobusVGrunt
18.04.16
✎
11:43
|
(18) В смысле?
|
|||
21
Mikeware
18.04.16
✎
11:46
|
(20) создаешь себе трудности, чтоб мужественно их преодолевать...
|
|||
22
trad
18.04.16
✎
11:49
|
||||
23
FobusVGrunt
18.04.16
✎
11:50
|
(21)Не я не из тех кто «мы легких путей не ищем». Но более простого варианта выхода из ситуации я не нашел, если в ТаблПоле нужную сортировку задать нельзя, а через вьюшки, ТекущаяСтрока глючит. Пришлось создавать отдельное поле под сортировку, чтобы получить данные в обратной хронологии в ТП. Есть варианты попроще?
|
|||
24
Mikeware
18.04.16
✎
11:53
|
(23) отнимать позицию от 1 января 2025 года, например. всяко будет короче и положительней, чем -201604166958204
|
|||
25
FobusVGrunt
18.04.16
✎
11:55
|
(22) Думаю ради меня одного не стоит, тем более уже думаю выкрутился, хотя может еще что и выскочит..., да и конечно сама реализация не совсем нравится, дополнительное поле для сортировки создавать, в ручную поддерживать уникальность его и это все при живом первичном ключе в самой таблице.
|
|||
26
trad
18.04.16
✎
11:56
|
(22) +собственно он и сам отписался
SQLiteDataProvider для Табличного поля 1С7.7 |
|||
27
FobusVGrunt
18.04.16
✎
11:56
|
(24) Даты могут быть одинаковые + время, нужна уникальность в КлючеПорядка, будет глючить ТекущаяСтрока
|
|||
28
FobusVGrunt
18.04.16
✎
11:57
|
(26) Было бы отлично
|
|||
29
Mikeware
18.04.16
✎
12:01
|
(27) ну так я ж написал - "позицию"
|
|||
30
FobusVGrunt
18.04.16
✎
12:06
|
(29) Дата время = 18.04.2016 13:30:25, какое должно в поле для сортировки ? методом отнимать позицию 1 января 2025 года
|
|||
31
Djelf
18.04.16
✎
13:15
|
Вычисляемое поле для сортировки нормально сработает только на небольших наборах данных, т.к. придется перечитывать вообще все данные в таблице, что совсем не хорошо.
|
|||
32
FobusVGrunt
18.04.16
✎
13:23
|
(31) Что-то не совсем понятен ответ, провайдер порциями же читает
|
|||
33
Salimbek
18.04.16
✎
13:29
|
(32) Читает порциями - оно никапли не панацея. Для того, чтобы выбрать строки с 50 по 100 что должОн сделать движок? 1) Рассчитать значение поля для всех строк; 2) Выбрать из этого строки с 50 по 100. Поэтому, кстати, на больших выборках использование неиндексированного поля в качестве ключа порядка будет тормозить 1С-ку.
|
|||
34
FobusVGrunt
18.04.16
✎
15:30
|
(33) Что значит рассчитать значение поле? если речь идет о поле которое создавалось для сортировки правельной в ТаблПоле, так в нее запись идет в момент добавления новой записи в таблицу БД, а не в момент получения данных. И индекс к ней создать без проблем.
P.S. БД внешняя на SQLite, данные отображаются в 1С из внешней базы. Кто всю ветку не читал |
|||
35
Djelf
18.04.16
✎
15:59
|
(34) Загляни в конец ветки SQLiteDataProvider для Табличного поля 1С7.7
А зачем в базе sqlite отдельные поля дата и время? Почему просто не форматировать ДатаВремя strftime('%Y%m%d',ДатаВремя) [Дата $Дата] strftime('%H:%M:%S',ДатаВремя) [Время] |
|||
36
Mikeware
18.04.16
✎
16:17
|
(31) логично. но ведь он _все_ данные не читает, он ограничивает выборку каким-то диапазоном дат.
|
|||
37
FobusVGrunt
18.04.16
✎
16:23
|
(35) Спасибо Djelf за обратныйпорядок в поставщике. По поводу отдельно поля дата и время как-то изначально создал, но в одном поле конечно было бы правильней, спасибо за рекомендацию
|
|||
38
FobusVGrunt
18.04.16
✎
16:29
|
(35) Вспомнил, чего двумя полями, чтобы в select меньше функций делать по обработке даты, т.к. Sqlite хранит дату формате 2016-04-18, а чтобы сработала типитизация, нужно без "-":20160418
Вот так в запросе вычисляю дату |REPLACE(bm.Date,'-','') as [Дата $Дата] |
|||
39
Djelf
18.04.16
✎
18:41
|
Если избыточность не пугает, можно самому не мучится, а поручить это дело триггеру
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |