Имя: Пароль:
1C
1C 7.7
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) На примере Номенклатуры

CREATE TEMP VIEW vt AS
SELECT rowid as rowid_old,id,descr as descr FROM [Справочник.Номенклатура] ORDER BY DESCR DESC

SELECT rowid,rowid_old,descr FROM vt

УстановитьТекстЗапроса(ТекстЗапроса,"rowid","rowid_old");

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
(19) я думаю тебе нужно договорится с Djelf о доработке определения КП с возможностью обратного порядка.
orefkov сказал, что это не должно быть сложным в реализации
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
Если избыточность не пугает, можно самому не мучится, а поручить это дело триггеру

CREATE TRIGGER t1
AFTER UPDATE OF ДатаВремя
ON Таблица
BEGIN
UPDATE Таблица SET Дата=strftime('%Y%m%d',ДатаВремя)
WHERE  rowid = new.rowid;
END;
AdBlock убивает бесплатный контент. 1Сергей