|
Сравнение двух таблиц значений | ☑ | ||
---|---|---|---|---|
0
sovsemnovichek
21.10.13
✎
15:15
|
Пытаюсь сравнить две таблицы.
Товар Материалы Полуфабрикат Товар Услуги |
|||
1
Wobland
21.10.13
✎
15:15
|
начало интригующее
|
|||
2
shamannk
21.10.13
✎
15:16
|
Так держать!
|
|||
3
Laerys
21.10.13
✎
15:16
|
молодец
|
|||
4
Толич
21.10.13
✎
15:17
|
Товар повторяется.
|
|||
5
sovsemnovichek
21.10.13
✎
15:17
|
Товар Материалы
Полуфабрикат Товар Услуги Продукция Надо чтобы правая табличка получила недостающие поля из левой Делаю так: Запрос.Текст = "ВЫБРАТЬ | Таблица.ВидНоменклатуры |ПОМЕСТИТЬ ТабИсп |ИЗ | &Таблица КАК Таблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ТабИсп.ВидНоменклатуры, ВидыНоменклатуры.Наименование) КАК Организация, | ВидыНоменклатуры.Наименование КАК Наименование |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ ТабИсп КАК ТабИсп | ПО ВидыНоменклатуры.Наименование = ТабИсп.ВидНоменклатуры"; Запрос.УстановитьПараметр("Таблица", ТАблица); Выборка = Запрос.Выполнить().Выбрать(); Может из этого что-то получиться или не то совсем, подскажите пожалуйста |
|||
6
Wobland
21.10.13
✎
15:18
|
1. объединить
2. сгруппировать |
|||
7
МойКодУныл
21.10.13
✎
15:18
|
(6) Ты в шоу экстрасенсов не участвовал?
|
|||
8
sovsemnovichek
21.10.13
✎
15:19
|
(6)Сейчас сделаю
|
|||
9
Wobland
21.10.13
✎
15:19
|
(7) я их консультировал ;)
|
|||
10
Wobland
21.10.13
✎
15:20
|
>Пытаюсь сравнить ... Надо чтобы правая табличка получила
какое-то неправильное сравнение |
|||
11
Толич
21.10.13
✎
15:28
|
ТЗ1
ТЗ2 Для Каждого СтрокаТЗ1 Из ТЗ1 Цикл СтрокаТЗ = ТЗ2.Найти(СтрокаТЗ1.Номенклатура, "Номенклатура"); Если СтрокаТЗ = Неопределено Тогда НовСтрокаТЗ2 = ТЗ2.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрокаТЗ2 , СтрокаТЗ); КонецЕсли; КонецЦикла; |
|||
12
sovsemnovichek
21.10.13
✎
15:49
|
Сделал так, просто мне метод (11) как-то понятнее
Запрос.Текст = "ВЫБРАТЬ | ВидыНоменклатуры.Наименование Как НаименованиеВида |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ; Выборка = Запрос.Выполнить(); Таблица = Выборка.Выгрузить(); Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры); Если СтрокаТаблицы = Неопределено Тогда НовСтрока = ТаблицаВидНом.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы); КонецЕсли; КонецЦикла; |
|||
13
sovsemnovichek
21.10.13
✎
15:49
|
все равно не работает =D
|
|||
14
hhhh
21.10.13
✎
15:53
|
(13) вот так пробуйте
ТаблицаВидНом = Запрос.Выполнить().Выгрузить(); |
|||
15
Толич
21.10.13
✎
15:54
|
>>СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры);
Надо СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида"); |
|||
16
Толич
21.10.13
✎
15:56
|
СтрокаТаблицы Задвоил
Эз ты... |
|||
17
sovsemnovichek
21.10.13
✎
15:59
|
сейчас сделаю)
|
|||
18
sovsemnovichek
21.10.13
✎
16:02
|
параметры неправильно задаю... Как надо?
{Форма.ФормаНастроек.Форма(24)}: Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств) ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы); по причине: Недопустимое значение параметра (параметр номер '2') |
|||
19
Толич
21.10.13
✎
16:02
|
Давай полный код
|
|||
20
sovsemnovichek
21.10.13
✎
16:06
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | ВидыНоменклатуры.Наименование Как НаименованиеВида |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ; Выборка = Запрос.Выполнить(); Таблица = Выборка.Выгрузить(); Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида"); Если СтрокаТаблицы = Неопределено Тогда НовСтрока = ТаблицаВидНом.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы); КонецЕсли; КонецЦикла; |
|||
21
sovsemnovichek
21.10.13
✎
16:06
|
он полный
|
|||
22
Толич
21.10.13
✎
16:10
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | ВидыНоменклатуры.Наименование Как НаименованиеВида |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ; Выборка = Запрос.Выполнить(); Таблица = Выборка.Выгрузить(); Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл СтрокаТаблицы11 = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида"); Если СтрокаТаблицы11 = Неопределено Тогда НовСтрока = ТаблицаВидНом.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы); КонецЕсли; КонецЦикла; Я ж писал, что ты задвоил переменную. |
|||
23
Толич
21.10.13
✎
16:12
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | ВидыНоменклатуры.Наименование Как НаименованиеВида |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ; Выборка = Запрос.Выполнить(); Таблица = Выборка.Выгрузить(); Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл СтрокаТаблицы11 = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида"); Если СтрокаТаблицы11 = Неопределено Тогда НовСтрока = Таблица.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы); КонецЕсли; КонецЦикла; |
|||
24
r_p
21.10.13
✎
16:14
|
А чего бы не через ПОЛНОЕ СОЕДИНЕНИЕ сделать?
|
|||
25
vde69
модератор
21.10.13
✎
16:15
|
Функция ЕстьРазличияВТаблицах (СтарыеДанные, НовыеДанные, КолонкиСравнения)
Результат = Ложь; мКолонки = СтрЗаменить(КолонкиСравнения, ",", Символы.ПС); КоличествоКолонок = СтрЧислоСтрок(мКолонки); Если ТипЗнч(СтарыеДанные) <> Тип("ТаблицаЗначений") ИЛИ ТипЗнч(НовыеДанные) <> Тип("ТаблицаЗначений") Тогда ИначеЕсли КоличествоКолонок = 0 Тогда ИначеЕсли НовыеДанные.Количество() <> СтарыеДанные.Количество() Тогда Результат = Истина; Иначе ВыборНовыеДанные = ""; ВыборСтарыеДанные = ""; Условие = ""; Для е = 1 по КоличествоКолонок Цикл ИмяКолонки = СокрЛП(СтрПолучитьСтроку(мКолонки,е)); ВыборНовыеДанные = ВыборНовыеДанные + " | НовыеДанные." + ИмяКолонки + ","; ВыборСтарыеДанные = ВыборСтарыеДанные + " | СтарыеДанные." + ИмяКолонки + ","; Условие = Условие + " | И НовыеДанные." + ИмяКолонки + " = СтарыеДанные." + ИмяКолонки; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ " + Лев(ВыборНовыеДанные, СтрДлина(ВыборНовыеДанные)-1) + " |ПОМЕСТИТЬ НовыеДанные |ИЗ | &НовыеДанные КАК НовыеДанные |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ " + Лев(ВыборСтарыеДанные, СтрДлина(ВыборСтарыеДанные)-1) + " |ПОМЕСТИТЬ СтарыеДанные |ИЗ | &СтарыеДанные КАК СтарыеДанные |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | 1 Как Поле1 |ИЗ | НовыеДанные КАК НовыеДанные | ВНУТРЕННЕЕ СОЕДИНЕНИЕ СтарыеДанные КАК СтарыеДанные | ПО Истина " + Условие + " |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ НовыеДанные |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ СтарыеДанные"); Запрос.УстановитьПараметр("НовыеДанные", НовыеДанные); Запрос.УстановитьПараметр("СтарыеДанные", СтарыеДанные); мТЗ = Запрос.Выполнить().Выгрузить(); Если мТЗ.Количество() <> СтарыеДанные.Количество() Тогда Результат = Истина; КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
|||
26
sovsemnovichek
21.10.13
✎
16:18
|
эээ... Он зациклился(
|
|||
27
hhhh
21.10.13
✎
16:20
|
(23)(25) логику-то включайте. Вот же
ТаблицаВидНом = Таблица; или ТаблицаВидНом = Таблица.Скопировать(); в Таблица вообще все виды номенклатуры находятся. |
|||
28
sovsemnovichek
21.10.13
✎
16:22
|
(27) я так пробовал, он не дает новые значения вводить... Ты их как бы вводишь, но они не отображаются, а при дальнейших действиях вообще остаются пустыми
|
|||
29
sovsemnovichek
22.10.13
✎
11:06
|
Блин, ребят, запутался уже... Подскажите чуток
Таблица = ТаблицаВидНом; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Таблица.ВидНоменклатуры |ПОМЕСТИТЬ ТаблицаНаФорме |ИЗ | &Таблица КАК Таблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВидыНоменклатуры.Наименование КАК Наименование, | ТаблицаНаФорме.ВидНоменклатуры КАК ВидНоменклатуры |ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНаФорме КАК ТаблицаНаФорме | ПО ВидыНоменклатуры.Наименование = ТаблицаНаФорме.ВидНоменклатуры |ГДЕ ТаблицаНаФорме.ВидНоменклатуры ЕСТЬ NULL |СГРУППИРОВАТЬ ПО | ВидыНоменклатуры.Наименование, | ТаблицаНаФорме.ВидНоменклатуры"; Запрос.УстановитьПараметр("Таблица",Таблица); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Пока РезультатЗапроса.Следующий()Цикл Сообщить(РезультатЗапроса.ВидНоменклатуры); КонецЦикла; РезультатЗапроса.ВидНоменклатуры всегда равен NULL, как его выбрать правильно? Чтобы он попадал в РезультатЗапроса ? |
|||
30
sovsemnovichek
22.10.13
✎
11:11
|
Очень нужна помощь( не хочется надоедать, но все же
|
|||
31
vhl
22.10.13
✎
11:13
|
Зачем ты вообще привязываешься к наименованию? По ссылкам связывай
|
|||
32
sovsemnovichek
22.10.13
✎
11:14
|
Таблица = ТаблицаВидНом; Где уж тут ссылку возьмешь, это таблица, которая висит на форме
|
|||
33
vhl
22.10.13
✎
11:58
|
(32) В чем проблема в таблице на форме использовать ссылки?
|
|||
34
sovsemnovichek
22.10.13
✎
12:06
|
подскажите как... опыта нет(
|
|||
35
1dvd
22.10.13
✎
12:08
|
(34) Это что?
ГДЕ ТаблицаНаФорме.ВидНоменклатуры ЕСТЬ NULL |
|||
36
sovsemnovichek
22.10.13
✎
17:38
|
Задача состояла в том, чтобы взять на форме ТЗ и дополнить её недостающими значениям. Я взял ее, засунул в запрос, дополнил, только вот теперь не могу додуматься как вернуть ее обратно на форму целехонькую.
Вот мой запрос: Таблица = ТаблицаВидНом; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | Таблица.ВидНоменклатуры, | Таблица.Коэффициент1 |ПОМЕСТИТЬ ТаблицаНаФорме |ИЗ | &Таблица КАК Таблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ТаблицаНаФорме.ВидНоменклатуры, ВложенныйЗапрос.Ссылка) КАК ВидНоменклатуры, | ВложенныйЗапрос.Ссылка КАК ВидНом |ИЗ | (ВЫБРАТЬ | ВидыНоменклатуры.Ссылка КАК Ссылка | ИЗ | Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНаФорме КАК ТаблицаНаФорме | ПО ВложенныйЗапрос.Ссылка = ТаблицаНаФорме.ВидНоменклатуры"; Запрос.УстановитьПараметр("Таблица",Таблица); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); |
|||
37
GANR
22.10.13
✎
17:49
|
(0) Интересно, а что если попробовать вот так:
Если ЗначениеВСтрокуВнутр(ТЗ_1) = ЗначениеВСтрокуВнутр(ТЗ_2) Тогда Сообщить("ТЗ одинаковые"); Иначе Сообщить("ТЗ разные"); КонецЕсли; |
|||
38
sovsemnovichek
22.10.13
✎
17:50
|
(37) А количество строк в таблицах имеет здесь значение?
|
|||
39
GANR
22.10.13
✎
17:55
|
(0) А если не выходить из рамок запроса - то это см. выше.
(38) Если количество строк / колонок в ТЗ разнятся, то и функция ЗначениеВСтрокуВнутр должна вернуть разное значение. А вообще проще взять и посмотреть через отладчик - отличаются они, или нет. |
|||
40
kiruha
22.10.13
✎
18:13
|
(5)
Пару раз получал деньги за исправление подобного кода. Как что так все пихают в запрос. Пиши исчо ! |
|||
41
GANR
22.10.13
✎
18:14
|
(38) Экспериметальным путем установил, что при таком сравнении играет роль еще и порядок строк в ТЗ, то есть если порядок не одинаковый, то даже если данные одинаковые - все равно они не будут равны. http://files.mail.ru/831B962D927241BF805A5EFDEF556651
То есть, если уж так сравнивать, то надо предварительно упорядочить ТЗ по ВСЕМ колонкам. Но вообще это ЗначениеИзСтрокиВнутр(ТЗ_1) плохой код - лучше в запросе все сразу сравнить. |
|||
42
GANR
22.10.13
✎
18:16
|
+(41) >все равно они будут равны
все равно они будут РАЗЛИЧНЫ - ошибся. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |