|
Сравнение таблиц значений. | ☑ | ||
---|---|---|---|---|
0
Vovka_Jetta
21.09.11
✎
16:09
|
Доброго времени суток!
Помогите победить проблему :( Есть две таблицы значений. ТЗ#1, колонки: Код, Код1, Товар заполняется из эксель-файла ТЗ#2, колонки: Код, Товар заполняется из результата запроса. Необходимо сравнить их по колонке "Код" и вывести два результата: 1. что есть в ТЗ#1, чего нет в ТЗ#2 2. что есть в ТЗ#2, чего нет в ТЗ#1 "Код1" появился только что. До этого колонки были одинаковы и я сделал это сравнение через массивы и их сравнение в циклах. Долго, но работает :) Сейчас пытаюсь сравнить таблицы значений, но пока что ни к чему толковому не пришел :( |
|||
1
Axel2009
21.09.11
✎
16:10
|
отсортируй по коду и пройдись по счетчику количеству строк
|
|||
2
cViper
21.09.11
✎
16:20
|
Можно сделать запросом, с помощью временных таблиц. Получишь 2 результата выборки, в одном будет те что только в левой ТЗ , в другом - в правой ТЗ
|
|||
3
Vovka_Jetta
21.09.11
✎
16:22
|
Именно так и делал в случае с массивами.
|
|||
4
Vovka_Jetta
21.09.11
✎
16:22
|
Блин.... Как тут ответить выбранному пользователю?
Про Запросы я читал, но я не умею такие составлять :(( |
|||
5
cViper
21.09.11
✎
16:23
|
(4)Скобочки () и номер сообщения.
|
|||
6
Axel2009
21.09.11
✎
16:23
|
(3) не так сделал. если циклов куча.
|
|||
7
Vovka_Jetta
21.09.11
✎
16:24
|
Тест
З.Ы. (5) Спасибо :) |
|||
8
cViper
21.09.11
✎
16:24
|
(4) Вот так ты можешь передать данные из ТЗ в запрос.
ВЫБРАТЬ ВТ.* ПОМЕСТИТЬ втДанные ИЗ &Вт КАК ВТ; ///////// ВЫБРАТЬ * ИЗ втДанные |
|||
9
cViper
21.09.11
✎
16:25
|
+(8) Только необходимо вместо звезды прописывать названия колонок.
|
|||
10
Vovka_Jetta
21.09.11
✎
16:26
|
(3) Вот какой был код:
Для Каждого КодСайта из КодыСт Цикл КодСайта = СокрЛП(КодСайта); ТекущийИндекс = КодыПр.ВГраница(); Пока ТекущийИндекс >= 0 Цикл КодПрайса = СокрЛП(КодыПр[ТекущийИндекс]); Если КодПрайса = КодСайта Тогда КодыПр.Удалить(ТекущийИндекс); Прервать; КонецЕсли; ТекущийИндекс = ТекущийИндекс - 1; КонецЦикла; КонецЦикла; |
|||
11
Vovka_Jetta
21.09.11
✎
16:26
|
Код - ответ для (6)
|
|||
12
Vovka_Jetta
21.09.11
✎
16:27
|
(8) Попробую сейчас переварить
|
|||
13
cViper
21.09.11
✎
16:29
|
(12) Делаешь в одном запросе 2 таких куска (для обеих ТЗ). Потом джоинишь их по разному, как надо тебе. И при выполнении запроса выполняешь пакетный запрос. В результате имеешь 2 выборки с разными элементами.
|
|||
14
Axel2009
21.09.11
✎
16:29
|
(11) плохой код. тут 2 вложенных цикла. обходов n*m. нужно делать через 1 цикл, ну или не обходить кучу раз все массивы
|
|||
15
aple313
21.09.11
✎
16:30
|
(12)Только не забудь что в ТЗ колонки должны быть типизированы.
|
|||
16
Axel2009
21.09.11
✎
16:32
|
(12) сколько записей то в табличках?
|
|||
17
Vovka_Jetta
21.09.11
✎
16:37
|
(16) Таблицы постоянно меняются, но в целом:
ТЗ#1 не вылезает за 700 записей ТЗ#2 не вылезает за 1000 записей |
|||
18
Vovka_Jetta
21.09.11
✎
16:41
|
(13) Что-то похожее на (13) из v8: пересечение массивов - алгоритм ?
|
|||
19
Vovka_Jetta
22.09.11
✎
13:40
|
В итоге, общими усилиями, получилось следующее:
Процедура Сравнить2ТЗ(); ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(200)); СтТЗ = Новый ТаблицаЗначений; ПрТЗ = Новый ТаблицаЗначений; РцТЗ = Новый ТаблицаЗначений; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СтТЗ.КодУТ, | СтТЗ.КодКт, | СтТЗ.Номенклатура |ПОМЕСТИТЬ ВТ_СтТЗ |ИЗ | &СтТЗ КАК СтТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПрТЗ.КодУТ, | ПрТЗ.Номенклатура |ПОМЕСТИТЬ ВТ_ПрТЗ |ИЗ | &ПрТЗ КАК ПрТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВЫБОР | КОГДА ВТ_ПрТЗ.КодУТ ЕСТЬ NULL | ТОГДА ""СтТЗ"" | ИНАЧЕ ""ПрТЗ"" | КОНЕЦ КАК ИмяТаблицы, | ВТ_СтТЗ.КодКт КАК КодКт, | ЕСТЬNULL(ВТ_СтТЗ.КодУТ, ВТ_ПрТЗ.КодУТ) КАК КодУТ, | ЕСТЬNULL(ВТ_СтТЗ.Номенклатура, ВТ_ПрТЗ.Номенклатура) КАК Номенклатура |ИЗ | ВТ_СтТЗ КАК ВТ_СтТЗ | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ПрТЗ КАК ВТ_ПрТЗ | ПО ВТ_СтТЗ.КодУТ = ВТ_ПрТЗ.КодУТ |ГДЕ | (ВТ_СтТЗ.КодУТ ЕСТЬ NULL | ИЛИ ВТ_ПрТЗ.КодУТ ЕСТЬ NULL ) |ИТОГИ ПО | ИмяТаблицы"; Запрос.УстановитьПараметр("СтТЗ", СтТЗ); Запрос.УстановитьПараметр("ПрТЗ", ПрТЗ); Результат = Запрос.Выполнить(); ВыборкаТаблица = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаТаблица.Следующий() Цикл Сообщить("Таблица "+ВыборкаТаблица.ИмяТаблицы); ВыборкаСтроки = ВыборкаТаблица.Выбрать(); Пока ВыборкаСтроки.Следующий() Цикл Если ВыборкаТаблица.ИмяТаблицы = "ПрТЗ" Тогда Сообщить(Символ(9) + ВыборкаСтроки.КодУТ + Символ(9) + ВыборкаСтроки.Номенклатура); ИначеЕсли ВыборкаТаблица.ИмяТаблицы = "СтТЗ" Тогда Сообщить(Символ(9) + ВыборкаСтроки.КодКт + Символ(9) + ВыборкаСтроки.КодУТ + Символ(9) + ВыборкаСтроки.Номенклатура); КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры Всем спасибо! |
|||
20
Serginio1
22.09.11
✎
15:28
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |