![]() |
![]() |
![]() |
|
Как отследить изменение порядка строк в табличной части? | ☑ | ||
---|---|---|---|---|
0
Косматый
14.03.08
✎
00:25
|
Задача такая.
Во-первых, неплохо было бы при отслеживании изменения реквизитов табличной части понимать, что реально поменялся номер строки, а не все ее атрибуты. Во-вторых, есть задача. Заголовок>детализация первого уровня>детализация второго уровня. При этом в детализации первого уровня предметного ключа по сути нет: только номер(ну скажем номер этапа мероприятия) и наименование. Номер уникален, а наименование пофигу. Предполагал сделать две табличные части: в одной хранить детализацию первого уровня, во второй - второго. Связку второй ТЧ сделать с первой по номеру строки в первой ТЧ. При перемещении строки в первой ТЧ у нее меняется номер и соответственно этот номер также должен поменяться во второй ТЧ. Отсюда собственно и сабж. Конечно понимаю, что можно реализовать подчиненными документами, но не хотелось бы городить. |
|||
1
Валерыч
14.03.08
✎
06:31
|
в стандартных это делается через спец. поле ИДСтроки, которое заполняется в момент добавления новой строки
|
|||
2
BAGER
14.03.08
✎
09:02
|
Тебя интересует изменения данных в ТЧ (без учета порядка строк) или вообще все изменения ТЧ (в т.ч. и порядок следования строк). Для чего это надо? Озвуч всю задачу.
|
|||
3
Косматый
14.03.08
✎
10:14
|
(1) Пожалуйста, дай ссылочку в каком документе так делается. Поискал в БП по "ИДСтроки" - ничего не нашел.
(2)Интересует именно как отследить, что строку переместили. Желание такое вытекает из двух задач: а) хранить историю изменений,в том числе и табличной части. при этом хочется различать ситуации кода меняли реквизиты у строки, и когда перемещали строку. б)необходимо связать две ТЧ в одном документе по принципу 1:N. Хочу сделать это по номеру строки, но для этого надо отслеживать момент когда у строки меняется номер - пока не нашел для этого подходящего события. |
|||
4
selenat
14.03.08
✎
10:17
|
интересный вопрос...
|
|||
5
selenat
14.03.08
✎
13:10
|
подниму веточку...
|
|||
6
selenat
14.03.08
✎
14:06
|
никому сабж не интересен?
|
|||
7
ЗлобнийМальчик
14.03.08
✎
14:09
|
(7) на ИТСе было что то про это... Надо посмотреть, я такую штуку реалзизовывал уже два раза. Но можно поинтересоваться, зачем хранить историю перемещения строк???
|
|||
8
selenat
14.03.08
✎
14:13
|
(7) история меня лично не волнует. Но факт изменения порядка строк в момент записи документа хотелось бы отслеживать. Само по себе это просто. Интересует - как это сделать максимально быстро, чтоб не было тормозов даже при большой табличной части документа...
|
|||
9
selenat
14.03.08
✎
14:24
|
+8 просто думаю в будущем сделать регситрацию всех изменений, вводимых задним числом. Как делать - в принципе ясно. Но есть сомнения в скорости работы этой фигни с ТЧ...
|
|||
10
Hitcher
14.03.08
✎
14:37
|
Сижу тоже думаю над подобной проблемой. Никак не могу отловить перед записью объекта, какая строка была добавлена или удалена.
|
|||
11
Господин ПЖ
14.03.08
✎
14:39
|
(10) сравнение ссылки с объектом не помогает?
|
|||
12
iSeRG
14.03.08
✎
15:26
|
(11) не поможет
|
|||
13
Hitcher
14.03.08
✎
15:31
|
Не помогает. Нет однозначной идентификации строки.
|
|||
14
BAGER
14.03.08
✎
15:56
|
Уточни ЗАЧЕМ отслеживать изменение порядка строк???
|
|||
15
selenat
14.03.08
✎
16:03
|
(14) ну например чтобы регистрировать существенные изменения в документе. Т.е. простое изменение порядка строк можно вовсе изменением не считать.
|
|||
16
Косматый
14.03.08
✎
17:45
|
(15) в самую точку центра
(7)(14) Да сама история перемещения записи нам допустим инее нужна.. Тут очень важная деталь в том, что в ТЧ нет КЛЮЧА, кроме номера строки. Понятно, что ПередЗаписью можно сравнить данные в объекте и в БД, но как сравнивать строки ТЧ, какую с какой? Допустим было 10 строк и перенесли первую в конец. Что тогда вы запишите в историю? - что поменялось множество реквизитов во всех строках ТЧ, а хотелось бы чтобы в истории в таком случае осталось бы только, что в строке 1 номер поменялся на 10, в строке 2 на 1, в строке 3 на 2, в строке 10 на 9 и все. Или вообще не отражать эти изменения, но никак не первый вариант, который покажет что перепахали всю табличную часть. Опять же понятно что можно сэмулировать Ключ в ТЧ, добавив туда реквизит и заполняя его на создание строки GUIDом. Как я понимаю именно это предлагает Валерыч в (1), но типовых я этого не нашел (кстати, если кто занает где такой подход применяется в типовой, укажите документик пожалуйста). А самому идея не очень понравилась, потому и хотелось бы убедиться, что в типовых так поступают. Нашел подобный подход в FAQ на итланде http://itland.ru/forum//index.php?showtopic=4368 Может с GUIDом и буду делать, так и не нашел как оперативно отловить изменение порядка строк. Да и вообще, наверное, это была плохая идея связывать две ТЧ по номеру строки в одной из них – даже если отловить перемещение то изменять строки пачками во второй ТЧ – при большом количестве строк перемещение подтормаживать начнет, а сортировка и тем паче. А вот для вычисления истории вполне рабочий вариант: 1)при открытии записываем ссылки на все строки ТЧ в массив 2)перед записью идем по порядку по строкам ТЧ из ссылки (из БД), находим соответствующую строки через массив (индекс в массиве и номе строки в ТЧ в БД – одно и тоже) и сравниваем реквизиты. (9) Думаю, быстрее варианта не придумаешь, если только еще запоминать куда нибудь все отредактированные строки по ходу их обработки пользователем, чтобы перед записью не сравнивать все строки а только выборочно. |
|||
17
selenat
14.03.08
✎
21:40
|
(16) Можно конечно заюзать всякие события ПередНачаломРедактирования, ПриОкончанииРедактирования. Таким образом ничего анализировать при записи не нужно. Вся инфа об изменениях уже есть на момент записи. Единственное, неприятно то, что это работа с модулем формы (отлавливает только интерактивную работу с формой), а вот программные изменения (то, что обычно в модуле объекта отслеживают) уже не прокатят...
|
|||
18
BAGER
17.03.08
✎
07:28
|
(15) Возможно для тебя применим следующий выриант: есть первоначальное состояние ТЧ документа и есть измененное состояние ТЧ в одной из них измени знаки значений количественных и суммовых реквизитов на противоположные и "сложи" обе ТЧ. Результатом будут только измененные строки. Для выяснения спорных вопрос и "кто виноват" этого вполне достаточно.
|
|||
19
Stepa86
17.03.08
✎
07:39
|
Может я чего то не уловил,но почему нельзя просто добавить колонку "старое значение номера строки". Перед записью сравнивать с номером строки и не совпадающие есть измененные.
|
|||
20
selenat
17.03.08
✎
09:20
|
(18) Интересный вариант. "сложи" в смысле сгруппировать? Т.е. результатом будет полный набор строк ТЧ, но нас интересуют те строки, где числовые значения ненулевые. Ты это имел в виду?
|
|||
21
BAGER
17.03.08
✎
09:28
|
(20) Да. Если ТЗ то "Свернуть", а если запросом то "Сгруппировать" и отсеч нулевые строки.
|
|||
22
selenat
17.03.08
✎
09:30
|
(21) ну да, логично. На 8.1 с временными таблицами должно нормально взлететь по идее...
|
|||
23
selenat
17.03.08
✎
09:36
|
На 8.0 с группировкой в ТЗ и поиском ненулевых значений не уверен, что тормозить не будет...
|
|||
24
BAGER
17.03.08
✎
09:50
|
(23) Самый простой вариант:
1.ПередЗаписью документа запросом вытаскиваешь ТЧ и выгружаешь в ТЗ; 2.Построчно добавляешь в выгруженную ТЗ измененную ТЧ (с измененными знаками); 3.Сворачиваешь полученную ТЗ; 4.Построчно пробегаешь полученную ТЗ без учета нулевых строк; Если тебя интересуют только интерактивные действия пользователей, то и делай подобную проверку только при интерактивной записи документа, т.е. перед записью из формы документа. |
|||
25
selenat
17.03.08
✎
09:54
|
(24) если только интерактивные действия отслеживать, то как раз лучше делать это в обработчиках событий ТЧ. Там анализировать только данные одной строки нужно и вообще не нагружаем запись документа.
|
|||
26
BAGER
17.03.08
✎
10:04
|
(25) Все зависит от цели. В моем случае мне надо было фиксировать изменения в документе для создания корректирующего документа (причем пользователь видит и обращается только к текущему состоянию документа, а корректировки создаются автоматом).
+ Пользователь может не принять сделанные изменения + в моем случае присутствует понятие версии документа (количество принятых корретировок) и откат к выбранной версии. |
|||
27
Джинн
17.03.08
✎
10:10
|
Категорически утверждаю, что такая задача возникает исключительно при бестолковом проектировании системы. Не должен алгоритм зависеть от порядка строк.
|
|||
28
Господин ПЖ
17.03.08
✎
10:12
|
(27) +1
|
|||
29
Господин ПЖ
17.03.08
✎
10:13
|
тут где то ветка была про цифровую подпись... может проще отслеживать - если сломалась - пусть сами ищут...
|
|||
30
BAGER
17.03.08
✎
10:14
|
(27) Сейчас речь уже не идет о порядке строк, а о способах отлова сделанных изменений в ТЧ.
|
|||
31
selenat
17.03.08
✎
10:24
|
(27) какой алгоритм не должен зависеть от порядка строк?
|
|||
32
asady
17.03.08
✎
10:32
|
(27)+1 согласен
был у меня такой опыт - разруливал только ключевыми колонками в обоих ТЧ. Иначе все плохо было. |
|||
33
selenat
17.03.08
✎
10:35
|
(32) что было плохо?
|
|||
34
selenat
17.03.08
✎
10:36
|
(32) и какими методами потом работаешь с этими ключевыми колонками? И насколько это быстро отрабатывает?
|
|||
35
asady
17.03.08
✎
10:37
|
(33) невозможно однозначно ассоциировать строки из первой ТЧ со строками второй ТЧ.
|
|||
36
selenat
17.03.08
✎
10:58
|
(35) способ с ключевыми колонками конечно надежен. Но ИМХО тормоза будут...
|
|||
37
asady
17.03.08
✎
11:07
|
(36) тормозов нет левый join по ключу и бери что хочешь.
|
|||
38
selenat
17.03.08
✎
11:10
|
(37) это на 8.1 для начала перейти нужно...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |