|   |   | 
| 
 | Скалярное произведение на Запросах и СКД | ☑ | ||
|---|---|---|---|---|
| 0
    
        kittystark 29.10.22✎ 00:04 | 
        задача из практической плоскости (уже решена) 
 перешла в разряд "Академических" - а как можно сделать по-другому? так, для разминки мозга, а может кто из умных еще и новое оригинальное решение даст формально задачу можно поставить так: - есть некий регистр сведений "T1", наполненный кучей записей, с несколькими измерениями (ссылки на разные справочники) и числовыми ресурсами: A,B,C, ... ,Z (26 ресурсов, для представления полноты "тяжести проблемы") - есть другая таблица "T2"с числовыми полями c1, c2, c3, ... , c26 - для простоты считаем, что пока одна запись в таблице для выбранных записей регистра нужно в СКД посчитать c1*A + c2*B + c3*C + ... + c26*Z т.е. по сути ∑ ресурсы[i] * с[i] - это скалярное произведение двух векторов: ресурсы • c хотелось бы получить "более других", оригинальных и РАБОЧИХ решений типа как в той задаче про измерение высоты башни и барометр: насыпать гору из барометров высотой с башню, количество барометров поделить на их коэффициент сыпучести | |||
| 1
    
        kittystark 29.10.22✎ 00:04 | 
        способ 1, запросом "в лоб":
 ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, c1*A + c2*B + c3*C + ... + c26*Z КАК Скаляр ИЗ Т1,Т2 | |||
| 2
    
        kittystark 29.10.22✎ 00:05 | 
        способ 2, ресурсом СКД "в лоб":
 c1*A + c2*B + c3*C + ... + c26*Z | |||
| 3
    
        kittystark 29.10.22✎ 00:06 | 
        далее на ум приходит идея транспонировать ресурсы
 способ 3, запросами ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, 1 КАК ID, А КАК Рес ИЗ T1 ПОМЕСТИТЬ ВТ1 ОБЪЕДИНИТЬ ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, 2, B ИЗ T1 ОБЪЕДИНИТЬ ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, 3, C ИЗ T1 ... ОБЪЕДИНИТЬ ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, 26, Z ИЗ T1; ВЫБРАТЬ 1 КАК ID, C1 Как Коэфф ИЗ T2 ПОМЕСТИТЬ ВТ2 ОБЪЕДИНИТЬ ВЫБРАТЬ 2, C2 ИЗ T2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3, C3 ИЗ T2 ... ОБЪЕДИНИТЬ ВЫБРАТЬ 26, C26 ИЗ T2; ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, Сумма(ВТ1.Рес * ВТ2.Коэфф) КАК Скаляр ИЗ ВТ1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 ПО ВТ1.ID = ВТ2.ID СГРУППИРОВАТЬ ПО <ПОЛЯ ИЗМЕРЕНИЙ> | |||
| 4
    
        kittystark 29.10.22✎ 00:15 | 
        способ 4
 транспонированную ВТ1 из способа выше можно сформировать и по-другому: создать перед этим временную таблицу с натуральными числами 1..26 (запрос приводить не буду), далее ВЫБРАТЬ <ПОЛЯ ИЗМЕРЕНИЙ>, НатЧисла.НПП, выбор когда НатЧисла.НПП = 1 тогда A когда НатЧисла.НПП = 2 тогда B когда НатЧисла.НПП = 1 тогда C ... когда НатЧисла.НПП = 26 тогда Z конец как Рес ПОМЕСТИТЬ ВТ1 ИЗ НатЧисла, Т1; далее как в сп.3 | |||
| 5
    
        kittystark 29.10.22✎ 00:19 | 
        и все бы хорошо, а если ресурсов не 26 а больше???
 хочется не долбаться, вколачивая все ручками, а сделать изящно кто-то скажет: надо формировать текст запроса программно, в цикле может быть... но как-то не то... | |||
| 6
    
        kittystark 29.10.22✎ 00:24 | 
        способ 5
 выгрузить Т1 и Т2 в две ТЗ, для каждой строки в цикле пробежаться по колонкам - перемножаем, суммируем - профит но нужно соответствие - каким колонкам что сопоставлять | |||
| 7
    
        kittystark 29.10.22✎ 00:35 | 
        способ 6
 без запроса, прочитать набор записей регистра сведений, выгрузить в ТЗ обходя ее колонки - транспонирование ресурсов сделать добавлением новых строк в другую ТЗ_Два ТЗ_Три - создаем добавлением новой строки на каждую колонку Т2, т.е. тоже транспонируем потом запросом ТЗ_Два связать с ТЗ_Три по айди или даже номеру строки | |||
| 8
    
        kittystark 29.10.22✎ 00:44 | 
        хочется воспользоваться выражением СКД ВычислитьВыражениеСГруппировкойТаблицаЗначений() со всякими там Сумма(Массив(ПолучитьЧасть( ТЗ, "1"))),
 но очень смахивает на усложненный вариант способа 2 | |||
| 9
    
        kittystark 29.10.22✎ 00:51 | 
        способ 7
 знаю, что можно воспользоваться выражением СКД "ГрупповаяОбработка", прийдется функцию писать, и честно говоря, пока смутно себе представляю как ее написать | |||
| 10
    
        kittystark 29.10.22✎ 01:07 | 
        все, доклад окончен... идеи кончились... пора идти спать
 кто что сможет дельного добавить ? (транспонирование в БД через реструктуризацию таблиц - не предлагать) | |||
| 11
    
        kittystark 31.10.22✎ 10:42 | 
        апну     | |||
| 12
    
        Kassern 31.10.22✎ 10:52 | 
        (5) "и все бы хорошо, а если ресурсов не 26 а больше???
 хочется не долбаться, вколачивая все ручками, а сделать изящно " - Вы можете текст запроса составлять динамически. | |||
| 13
    
        kittystark 31.10.22✎ 10:56 | 
        (12) подробнее, пожалуйста     | |||
| 14
    
        Kassern 31.10.22✎ 11:01 | 
        (13) Да что тут подробнее?
 Посмотрите как в типовых запросы собираются, те же упаковки добавляются в текст запроса в зависимости от условий. | |||
| 15
    
        kittystark 31.10.22✎ 11:05 | 
        т.е.  Запрос.ТекстЗапроса = ... + ... и всякие там СтрЗаменить, СтрСоединить     | |||
| 16
    
        Kassern 31.10.22✎ 11:07 | 
        (15) Можете просто параметр сделать мол:
 {НужноеПоле} КАК Рес Далее просто СтрЗаменить {НужноеПоле} на собранную строку. | |||
| 17
    
        Kassern 31.10.22✎ 11:08 | 
        А сборка этого поля у вас и будет динамической в зависимости от количества ресурсов     | |||
| 18
    
        kittystark 31.10.22✎ 11:14 | 
        ну да
 или же программно поменять текст выражения ресурса СКД по такому же образу и подобию | |||
| 19
    
        mikecool 31.10.22✎ 11:17 | 
        (12) тогда уж не текст собирать, а использовать объектную схему запроса     | |||
| 20
    
        kittystark 31.10.22✎ 11:20 | 
        (19) вот сколько лет она существует (а уже, наверное под червонец будет)
 все руки никак до нее не доходят привычка что-ли дурацкая... | |||
| 21
    
        Kassern 31.10.22✎ 11:21 | 
        (19) В типовых почему-то именно так подменяют текст запроса, а не через объектную схему собирают. Гляньте ПодборТоваровСервер модуль в УТ11, наверное и в ЕРП такой же есть. Там все через шаблоны и замены сделаны по примеру из (16)     | |||
| 22
    
        kittystark 31.10.22✎ 16:28 | 
        вообщем с заменой выражения РЕСУРСА СКД как в 18 - тоже работает
 вот выдержки из рабочего кода: КоллекцияРесурсовСКД = СхемаКомпоновкиДанных.ПоляИтога; РесурсСкаляр = КоллекцияРесурсовСКД.Найти("Скаляр"); Компоненты = новый Массив; Для каждого Ресурс из КоллекцияРесурсовСКД цикл Если ПроверитьПоходящийЛиРеуср( Ресурс.ПутьКДанным ) тогда КодВторойМножитель = ПолучитьИмяВторогоМножителя( Ресурс.ПутьКДанным ); Компоненты.Добавить( " Сумма(" + Ресурс.ПутьКДанным + " * выбор когда Код = """ + КодВторойМножитель + """ тогда Стоимость иначе 0 конец) " ); КонецЕсли; КонецЦикла; РесурсСкаляр.Выражение = СтрСоединить( Компоненты, Символы.ВК + " + "); и этот дельфин одному городскому банку - наиболее симпатичен | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |