|   |   | 
| 
 | Сравнение двух таблиц значений | ☑ | ||
|---|---|---|---|---|
| 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) >все равно они будут равны
 все равно они будут РАЗЛИЧНЫ - ошибся. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |