|
Сравнение строк двух таблиц на идентичность | ☑ | ||
---|---|---|---|---|
0
Nikosss
13.03.13
✎
18:44
|
Необходимо сравнить данные в двух таблицах (Структура ТаблицЗначений идентична) на предмет изменений. Пытался сделать 2 варианта с Циклом по одной из таблиц с СравнениеЗначений, но все равно возвращает 0(Строки идентичны), хотя различия в зачениях есть. Не хочется делать цикл по колонкам и сравнивать значений так...
Думал хотя бы ЗначениеВСтрокуВнутр решит проблему, но нет, А и Б одинаковые! НайденнаяСтрока = ТаблицаОбщая.Найти (СтрокаSQL.ГУИД,"ГУИД"); Сравнение = Новый СравнениеЗначений; ЕстьИзменения = 0<>Сравнение.Сравнить(НайденнаяСтрока ,СтрокаSQL); А = ЗначениеВСтрокуВнутр(НайденныйСотр); Б = ЗначениеВСтрокуВнутр(СтрокаSQL); ЕстьИзменения2 = 0<>Сравнение.Сравнить(А,Б); |
|||
1
Fragster
гуру
13.03.13
✎
18:47
|
запрос помещаешь первую ВТ, добавляешь колонку со значением 1, объединение со второй таблицей со значением -1 в этой колонке. группировка по всем полям и суммой этого доп. поля, отбор где доп поле <> 0
|
|||
2
SherifSP
13.03.13
✎
19:01
|
(0) А через найти строки?
|
|||
3
Nikosss
13.03.13
✎
19:08
|
(1) Не хотелось добавлять новые колонки, но сейчас попробую! (2) А что искать? По какому принципу? это в отбор вставлять все поля и значения
|
|||
4
NcSteel
13.03.13
✎
19:10
|
сгруппировать по всем колонкам.
|
|||
5
Nikosss
13.03.13
✎
19:12
|
(4) Это имеешь ввиду вариант из (1) ?
|
|||
6
fisher
13.03.13
✎
19:14
|
Не ипать мозги и сравнивать циклом по колонкам. Будет быстро.
ЗЫ. Загонять ТЗ на север БД только для того, чтобы сравнить строки - это слишком уж по одинэсовски. |
|||
7
pumbaEO
13.03.13
✎
19:26
|
kdiff, diff - вывод в консоль, парсинг файла.
|
|||
8
Nikosss
13.03.13
✎
19:28
|
(6) Ну вот оставался единственный вариант, его похоже и придется использовать.
(1) Так как колонок 25 то придется описывать каждую в запросе,а это чекнишься, иначе не получится сгруппировать |
|||
9
zladenuw
13.03.13
✎
19:32
|
так если написать так должно искать по всем колонкам
НайденнаяСтрока = ТаблицаОбщая.Найти(СтрокаSQL.ГУИД); |
|||
10
Nikosss
13.03.13
✎
19:48
|
(9) Так проблема не найти строку, а сравнить ее с другой. Колонок 25 и вариант Fragster ,возможно, подошел если бы не количество колонок - их надо в ВТ описывать в двух таблицах. А это 50 раз, иначе не получится сгруппировать в запросе по всем колонкам, кроме последней
|
|||
11
Fragster
гуру
13.03.13
✎
19:52
|
(10) ты ленивый? тогда без запроса = делаешь новую таблицу (скопироватьКолонки), добавляешь колонку с числом, перегоняешь в нее все данные через заполнитьЗначенияСвойств и заполняешь доп колонку 1 и -1 соответственно. сворачиваешь (вот тут надо будет циклом сформировать строку с колонками), удаляешь все строки с 0. остается только искомое.
|
|||
12
Nikosss
14.03.13
✎
10:42
|
(11) Не ленивый, просто хочется найти самый оптимальный способ. Твой пока самый оптимальный))
|
|||
13
ale-sarin
14.03.13
✎
10:48
|
(0) Я конечно извиняюсь,но в типовых (КА точно) есть функция
НастройкаПравДоступа.СравнитьТаблицыНаборовЗаписей(ТаблицаЗначений1, ТаблицаЗначений2) |
|||
14
Classic
14.03.13
✎
10:57
|
(8)
Динамически рисуй запрос. Тогда будет пофиг 5 или 25 |
|||
15
Reset
14.03.13
✎
11:00
|
(6) +1
|
|||
16
Zero on a dice
14.03.13
✎
11:06
|
я бы так сделал:
через повторное использование получал бы список колонок в строку и затем сворачивал бы промежуточную таблицу из этих двух строк. количество строк промежуточной и даст ответ. насколько медленнее сравнения в цикле - неясно. |
|||
17
Полотенчик
14.03.13
✎
11:08
|
Функция СравнитьТЗ(ТЗ_1, ТЗ_2, ПоляСравнения)
Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ_1 ИЗ &ТЗ_1 КАК ТЗ_1; |ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ_2 ИЗ &ТЗ_2 КАК ТЗ_2"; Запрос.УстановитьПараметр("ТЗ_1", ТЗ_1); Запрос.УстановитьПараметр("ТЗ_2", ТЗ_2); Запрос.Выполнить(); Текст = "ВЫБРАТЬ"; Для Каждого ПолеСравнения из ПоляСравнения Цикл Текст = Текст + " | Итоговая." + ПолеСравнения + ","; КонецЦикла; Текст = Текст + " | СУММА(Итоговая.Счетчик) КАК Счетчик |ИЗ | (ВЫБРАТЬ"; Для Каждого ПолеСравнения из ПоляСравнения Цикл Текст = Текст + " | ТЗ_1." + ПолеСравнения + ","; КонецЦикла; Текст = Текст + " | 0.5 КАК Счетчик | ИЗ | ТЗ_1 КАК ТЗ_1 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ"; Для Каждого ПолеСравнения из ПоляСравнения Цикл Текст = Текст + " | ТЗ_2." + ПолеСравнения + ","; КонецЦикла; Текст = Текст + " | 0.5 КАК Счетчик | ИЗ | ТЗ_2 КАК ТЗ_2) КАК Итоговая | |СГРУППИРОВАТЬ ПО"; НужнаЗапятая = Ложь; Для Каждого ПолеСравнения из ПоляСравнения Цикл Если НужнаЗапятая Тогда Текст = Текст + ","; КонецЕсли; Текст = Текст + " | Итоговая." + ПолеСравнения; НужнаЗапятая = Истина; КонецЦикла; Текст = Текст + " |ИТОГИ | МИНИМУМ(Счетчик) |ПО | ОБЩИЕ" ; Запрос.Текст = Текст; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ТЧРавны = Выборка.Счетчик = 1; Иначе ТЧРавны = Ложь; КонецЕсли; Возврат ТЧРавны; КонецФункции |
|||
18
Полотенчик
14.03.13
✎
11:09
|
+(17) причесать только еще немного
|
|||
19
fisher
14.03.13
✎
11:17
|
Конкурс в номинации "Почетный 1С-Извращенец" набирал обороты...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |