|
Из множества ТЗ найти совпадающую с эталоном. | ☑ | ||
---|---|---|---|---|
0
Слабак
19.05.17
✎
10:11
|
Привет. Задача лоическая. Есть ТЗ со значениями, и есть кучка других ТЗ. Структура одинакова, отличаются только значения. Необходимо по первой ТЗ, получить из той кучи, ТЗ которые на 100% совпадают по значениям. Может кто то делал уже. Интересует логика, и наиболее оптимальный вариант выполнения...потому как таблицы большие.
|
|||
1
polosov
19.05.17
✎
10:13
|
(0) ТЗ в запрос и там ищи.
Запрос имхо динамически построенный. |
|||
2
Gamm
19.05.17
✎
10:13
|
Хеш по каждой таблице и сравнение хешей.
|
|||
3
Ёпрст
19.05.17
✎
10:15
|
||||
4
МихаилМ
19.05.17
✎
10:19
|
+ уменьшите кол-кандидатов тз
предварительным отсеиванием на колво строк, и разницу по суммам числовых колонок. |
|||
5
Buster007
19.05.17
✎
10:21
|
(2) как ее сделать?
|
|||
6
polosov
19.05.17
✎
10:23
|
(5) ХешФункция (HashFunction)
SHA1 (SHA1) Описание: Вычислять значение SHA-1. |
|||
7
МихаилМ
19.05.17
✎
10:23
|
(5)
значение в файл , на него хаш |
|||
8
polosov
19.05.17
✎
10:24
|
+(6)
ХешированиеДанных (DataHashing) Свойства: ХешСумма (HashSum) ХешФункция (HashFunction) Методы: Добавить (Append) ДобавитьФайл (AppendFile) Конструкторы: По указанной хеш-функции Описание: Реализует инкрементальный расчет хеш-суммы по добавленным данным. Способ расчета и тип вычисляемого значения определяются типом хеш-функции. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). См. также: ХешФункция |
|||
9
Asmody
19.05.17
✎
10:26
|
ЗначениеВСтрокуВрнутр() и сравнивай строки
|
|||
10
Ёпрст
19.05.17
✎
10:31
|
(9) это не верно в общем виде.
Покатит, если только обе ТЗ будут отсортированы одинаково |
|||
11
Ёпрст
19.05.17
✎
10:32
|
ну и для больших тз, это медленно
|
|||
12
Слабак
19.05.17
✎
10:33
|
Хеш я так понял тоже построчно..это медленно.
|
|||
13
Ёпрст
19.05.17
✎
10:34
|
(12) нет.
|
|||
14
Ёпрст
19.05.17
✎
10:34
|
просто сравниваешь 2 хеша и привет
|
|||
15
Слабак
19.05.17
✎
10:35
|
подскажите тогда как загнать ТЗ в ХЕШ?
|
|||
16
Вафель
19.05.17
✎
10:36
|
ТЗ1 = ТЗ2 или ТЗ1 содержит в себе ТЗ2?
|
|||
17
Ёпрст
19.05.17
✎
10:36
|
(15)самый примитв - (9)
|
|||
18
Ёпрст
19.05.17
✎
10:37
|
предварительно тока, сортируй тз одинаково
|
|||
19
Слабак
19.05.17
✎
10:38
|
ТЗ1 - эталон
ТЗ2 ТЗ3 ТЗ4 ТЗ5 Массив ТЗ нужно найти к примеру что ТЗ1=ТЗ4 |
|||
20
Слабак
19.05.17
✎
10:57
|
Я таки не понял, обьясните на пальцах как загнать в Хеш ТЗ без цикла?
|
|||
21
Рэйв
19.05.17
✎
11:03
|
Если ЗначениеВСтроку(ТЗ1)=ЗначениеВСтроку(ТЗ2) Тогда
Сообщить("Оно!"); КонецЕсли; |
|||
22
Рэйв
19.05.17
✎
11:06
|
+(21) *ЗначениеВСтрокуВнутр
|
|||
23
Слабак
19.05.17
✎
11:10
|
Не работает
|
|||
24
Ёпрст
19.05.17
✎
11:13
|
(23) руки мыл перед этим ?
|
|||
25
Слабак
19.05.17
✎
11:14
|
попробуй сам.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Ссылка, | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.Количество, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.Сумма |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", РН); ТЗ = Запрос.Выполнить().Выгрузить(); ТЗ1=ТЗ.Скопировать(); Если ЗначениеВСтрокуВнутр(ТЗ)=ЗначениеВСтрокуВнутр(ТЗ1) Тогда Сообщить("Оно!"); КонецЕсли; |
|||
26
МихаилМ
19.05.17
✎
11:22
|
(25) а ссылка то зачем. сравнивайте без ссылки
|
|||
27
МихаилМ
19.05.17
✎
11:22
|
(25) а если порядок строк изменен ?
|
|||
28
Слабак
19.05.17
✎
11:24
|
в ТЗ хранятся разные значения..и ссылочные и числовые и строковые
|
|||
29
Ёпрст
19.05.17
✎
11:24
|
(25) см.(10), много думай
|
|||
30
Слабак
19.05.17
✎
11:30
|
"(9) это не верно в общем виде.
Покатит, если только обе ТЗ будут отсортированы одинаково" что именно в твоем утвеждении правда? то что это все не верно или по поводу сортировки? так при копировании ТЗ сортировка не нарушается вроде.. |
|||
31
Рэйв
19.05.17
✎
11:30
|
(23)Все работает
https://yadi.sk/i/klsPDg9o3JKUQg |
|||
32
Ёпрст
19.05.17
✎
11:33
|
(30)
Подумай над этим: ТЗ = Запрос.Выполнить().Выгрузить(); ТЗ1=ТЗ.Скопировать(); ТЗ2=ТЗ.Скопировать(); Если ЗначениеВСтрокуВнутр(ТЗ1)=ЗначениеВСтрокуВнутр(ТЗ2) Тогда Сообщить("Оно!"); КонецЕсли; |
|||
33
Слабак
19.05.17
✎
11:36
|
(32) Да..так работает..однако причина для меня осталась загадкой...почему ТЗ1<>ТЗ ?
|
|||
34
Ёпрст
19.05.17
✎
11:37
|
Потому, что копировать неверно переносит тип колонки
|
|||
35
Слабак
19.05.17
✎
11:38
|
не знал ..спасибо.
|
|||
36
Ёпрст
19.05.17
✎
11:46
|
хотя не, посмортел строки, там только последний параметр меняется
|
|||
37
Ёпрст
19.05.17
✎
11:46
|
ну не важно, это один хрен копировать так делает
|
|||
38
Слабак
19.05.17
✎
11:57
|
В общем вариант ЗначениеВСтрокуВнутр так себе...много ньюансов...обход построчно и хеширование значений - надежнее я понимаю..
|
|||
39
FIXXXL
19.05.17
✎
12:09
|
Две ТЗ в запрос. Служебное поле с значением "1". Сворачиваем по всем полям и СУММА("1"). Выбираем "1". Результат пустой - ОК.
|
|||
40
Слабак
19.05.17
✎
12:17
|
Тот запрос я сделал для примера...в реальном случае там очень много полей с разными ссылочными значениями. Не прокатит данный вариант.
|
|||
41
Слабак
19.05.17
✎
12:19
|
(39) Понял..попробую..может прокатить. Спасибо.
|
|||
42
1dvd
19.05.17
✎
13:10
|
(39) а почему 1 в кавычках?
|
|||
43
Bigbro
19.05.17
✎
14:46
|
если таблицы реально большие то только хэш.
|
|||
44
НЕА123
19.05.17
✎
14:54
|
(39)
не надо сумма() ВЫБРАТЬ ПЕРВЫЕ 1 1 .... |
|||
45
FIXXXL
19.05.17
✎
16:53
|
(42) да хз, так текст вышел :) это не строка, число конечно
(44) а как наличие расхождения отловить без сумма? 2 - как раз показатель того, что строка нашла себе пару 1 после суммирования - строка без пары |
|||
46
Timon1405
19.05.17
✎
17:22
|
(39) лучше первой таблице в служебную колонку поставить 1, а второй -1
тогда при суммировании нули дадут совпадения, колонки где 1 - данные из первой таблицы, колонки где "-1" - данные из второй таблицы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |