v7: 1с++ Прямой запрос. Передача условий в подзапрос #580949


#0 by aass
запрос выдает сумму цен (SUM(Cena.Цена)*SUM($ДокОКС.Количество)) но соотвественно выдает не то что надо, как добиться от left join что бы выбирал последнюю цену для нужного товара или есть в природе возможность передать дату и товар из первого запроса в условие для подзапроса ?
#0 by aass
запрос выдает сумму цен (SUM(Cena.Цена)*SUM($ДокОКС.Количество)) но соотвественно выдает не то что надо, как добиться от left join что бы выбирал последнюю цену для нужного товара или есть в природе возможность передать дату и товар из первого запроса в условие для подзапроса ?
#1 by Mikeware
делай коррелированый запрос
#2 by aass
забыл - DBF
#3 by Кириллка
группировать по товару, агрегируя по максимуму даты
#4 by orefkov
$ПоследнееЗначение не?
#5 by aass
на dbf работает.
#6 by aass
* не работает
#7 by Ёпрст
нет
#8 by aass
без LEFT JOIN и через Top 1, а на dbf так отработает ?
#9 by Ёпрст
да, только там всё равно нужен будет order by и top 1. в FAQ на 1сpp есть пример получения периодики.. и на скайте серого, на скрипт-коддинг.ком
#10 by orefkov
Ну во-первых - СпрКатЦен.DESCR = 'Закупочная' моветон. Перед запросом получи идшник типа цен один раз, его и подставляй как параметр. И будет примерно так:
#11 by Ёпрст
Ну , моветон изначально брать цену из справочника, когда цена должна быть реквизитом документа всегда.
#12 by Кириллка
еси запрос через vfpoledb, то коррелированный в селект-листе будет ой (если память не изменяет).
#13 by aass
СпрКатЦен.DESCR = 'Закупочная' это принципиально, так как запрос пишеться под "чужую базу, шаримся из родной в соседней"
#14 by aass
да еще  - Provider=VFPOLEDB.1
#15 by aass
тут документ продаж и цена тама продажи, а нам нужен закуп,есть вариант брать из партии цену, но в нашем случаи справочник отработает точней (нет последовательности)
#16 by aass
наверно все таки будет правильно, бум пробывать
#17 by Ёпрст
да не, работать будет нормально. Токма вот для скорости один хрен нужно всё переписывать
#18 by orefkov
И чего? Так же сначала делаешь запрос в соседнюю базу, получаешь id. Подставляешь его в текст запроса.
#19 by Кириллка
ну я упираться не буду, конечно, но точно помню, что была засада какая-то, что толи TOP не разрешен был, толи ORDER BY в коррелированном подзапросе в селект-листе.
#20 by aass
к этому варианту и пришел то что скорость на уровне около минуты движения за месяц , до этого еще два варианта было один до 30 минут второй до 8 если получиться с топ, отпишусь по времени
#21 by aass
если в соседнию базу кидаешь несколько запросов времени уходит намного больше когда один большой запрос
#22 by Ёпрст
дело не в топе.. читай:
#23 by orefkov
Замер времени - истина в последней инстанции. Кстати, еще вариант - OLE + 1sqlite в той базе. Вобщем, мерять надо.
#24 by ЧеловекДуши
В DBF  лучше пиши без изысков :) Быстрее напишешь.
#25 by aass
ругается    , ( SELECT            top 1        cast(value as numeric(15,2)) FROM        1sconst as Константа   INNER JOIN        sc3772 as СпрЦены ON СпрЦены.ID = Константа.objid INNER JOIN        sc3769 as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID INNER JOIN        sc33 as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT WHERE        AND        cast(value as numeric(15,2))>0 FROM    dt3487 as ДокОКС     JOIN     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc INNER JOIN    dh3487 as Док ON Док.IDDoc = ДокОКС.IDDoc INNER JOIN    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc   WHERE тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);     {E:1C_DBEXTFORMSW_VFPOLEDB_4.ERT}: FAILED! ICommandText::Execute: SQL: Queries of this type are not supported.
#26 by aass
без INNER JOIN работает
#27 by aass
да и по времени довольно шустро
#28 by Кириллка
в каком из запросов смотреть? Без какого INNER JOIN работает?
#29 by Ёпрст
А нахрена вот так делать ?! JOIN     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc INNER JOIN   1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc
#30 by aass
вот так работает
#31 by aass
с этой байдой тоже не работает, надо с мыслями собрать че то запутался слегка я
#32 by aass
дата документа нужна для цены
#33 by aass
вообщем эта сцепка не хочет работать
#34 by aass
в условие добавляещь СпрЦены.SP3787 = :ТекЦена и ругаться на чинает
#35 by Ёпрст
используй метапарсер и $ и не пиши имена полей руками.
#36 by aass
$СпрЦены.Владелец а так он ругается Meta name parser error: поле таблицы не найдено "$СпрЦены.Владелец"
#37 by aass
вообщем не получились у меня JOIN  в подзапросе для DBF. единсвенный вариант вычислять в основном запросе параметры для 1sconst id, objid и передавать их в условие подзапроса, как нарисую , результаты, по времени выполнения, напишу.
#38 by Ёпрст
:))) Вообще то речь за все поля, типа SP3787 , а Владелец, это ежели чего, PARENTEXT
#39 by Ёпрст
пиши текс запроса, который не получился, целиком.
#40 by aass
вообщем вот так работает
#41 by aass
тока теперь подшаманить надо под задачу
#42 by aass
так тоже работает
#43 by aass
скорость минута 23, тока цена одна и таже для всех вылазит
#44 by Кириллка
прикольный коррелированный запрос получился.
#45 by Кириллка
+44 а зачем тебе эта громоздкая конструкция в скобках? Пиши вместо скобок всегда 1234.56
#46 by aass
а вот так не работает
#47 by Кириллка
см. выше
#48 by aass
это хрень не берите во внимание ошибочку не заметил поторопился
#49 by aass
вот так работает, теперь не знаю как связать товар из подзапроса с товарам в основном запросе
#50 by aass
и по времени получается период что за один день что за месяц, выполнение запроса разница 20-30 секунд
#51 by Ёпрст
Еще раз, нафига вот этот бред всё время пишешь ???
#52 by Ёпрст
Для начала, весь запрос в топку.
#54 by aass
я с тобой согласен, ну бывает, че пристал )) поправил работает
#55 by aass
тут получается две фишки надо сделать 1. это соедbнить товары из подзапроса с оcновным запросом 2. в подзапросе наложить фильтр на 1sconst.Date <= Журнал.Date(из основного)
#56 by aass
я те даже скажу без этого быстрее работает ))
#57 by Ёпрст
даже строка подключения устаревшая
#58 by aass
ну так помоги мил человек наведи на путь истинный
#59 by Ёпрст
Ну, тип того, для начала:
#60 by aass
запрос отработал тока |    Журнал.Date - ругается, но тут понятно теперь есть загвоздка документы у нас на разную дату и  цена тоже на разную дату условие в даннном случаи нас не устраивает and Конст.date<=:КонДата~~ надо что типо and Конст.date<=Журнал.Date решения два либо сюда запихивать дату документа, либо формировать на каждую дату свой запрос есть возможность запихнуть дату ?
#61 by aass
+ выполнен за : 20583 мс Время выполнения: 1 мин. 6 сек.
#62 by Ёпрст
есть запрос надо переписывать, чтоб коррелированный подзапрос тоже бегал по индексу, т.е необходимо переделать условие подзапроса на индексное выражение.
#63 by Ёпрст
+62 Если не хочешь составлять правильное индексное выражение для фоксового запроса, пиши запрос с помощью 1sqlite - там оно само подбирает подходящий индекс. +синтаксис попроще.
#64 by aass
скорость существенно изменилась с индексами за день выполнен за : 20555 мс Время выполнения: 21 сек. за месяц выполнен за : 21947 мс Время выполнения: 22 сек.
#65 by Ёпрст
это п..ц как долго. Как будет ~2-3 мс, вот тогда "попадаешь". Смотри план выполнения запроса. На 1cpp есть ветка как смотреть его для фоксового провайдера.
#66 by aass
про индексы тут есть кусочек истины или лажа ?
#67 by Ёпрст
с виду норм.
#68 by Ёпрст
+67 а не, лажа :)) Надо не between, а просто меньше или равно даты..
#69 by aass
че то у меня , на "просто меньше или равно даты", после сообщения - "невозможно обработать та-та-та .tmp по причине превышения допустимых объемов" винт отвалился (у меня базы на отдельном винте) это совпадение или последствия "кривых рук" ? ))
#70 by aass
в общем с такой то матери( пришлось мать менять на компе на старой похоже с контролером че то не так, отваливался винт) заработало но прироста скорости обработки не увидел, и значение берет не на ту дату которою указываешь а последнюю, не могу попасть в индекс, индексы вверху посмотрите плиз, че нетак опять ?
#71 by Ёпрст
) где НачДатаПериод = '01.01.1980'
#72 by aass
вот так отрабатывает а если Периодика.objid вставлять то ругается FAILED! ICommandText::Execute: SQL: Error correlating fields. и время выполнения - выполнен за : 5 мс так быстрее: |            Конст.ID + Конст.OBJID + dtos(Конст.date) + Конст.time + Конст.DOCID + STR(Конст.PARTNO,3) <=   выполнен за : 2 мс но пять что то ч этот вариант цену дает последнюю а не на заданную дату, как быть ?
#73 by aass
вот мой случай
#74 by aass
+ похожая ситуация и те же проблемы
#75 by Ёпрст
передавать дату из журнала вестимо. Если болт в коррелированном селект листе, то делать лефт джоин с подзапросом, в котором получать нужную периодику. или использовать 1sqlite
#76 by aass
выполнен за : 2 мс вот так выдает дату которая нужна
#77 by aass
|            Конст.id+Конст.objid+DTOS(Конст.date)+Конст.time+Конст.docid+STR(Конст.partno,3) <=   FAILED! ICommandText::Execute: SQL: Error correlating fields.
#78 by Ёпрст
выдает мусор, ибо написано невесь что.. читай (75.2)
#79 by aass
(75.2) это понял буду пробывать
#80 by aass
со временем в 2мс 5мс я на хлюздел. не туда замер вставил
#81 by aass
вот разные запросы, разные показатели |SELECT |    Журнал.Date,                           выполнен за : 29028 мс Время выполнения: 29 сек. |SELECT |    Журнал.Date,                           выполнен за : 4936 мс Время выполнения: 5 сек. есть еще варианты ускорить ?
#82 by Ёпрст
есть. Выкинуть соединение с табличкой шапки документа
#83 by aass
совсем все уже убрал |SELECT |    $ДокОКС.Товар as [Товар $Справочник.Номенклатура], выполнен за : 4978 мс Время выполнения: 5 сек. это  все возможное ?
#84 by Ёпрст
Строка подключения из ? +  Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");  Это в коде есть ? второй раз запускаешь на выполнение, время какое ?
#85 by aass
1. есть 2. выполнен за : 5057 мс Время выполнения: 5 сек. выполнен за : 4956 мс Время выполнения: 5 сек. выполнен за : 4933 мс Время выполнения: 5 сек.
#86 by aass
че то уменя какой не делаю один хрен время около примерно выполнен за : 6629 мс Время выполнения: 7 сек. выполнен за : 3885 мс Время выполнения: 4 сек. выполнен за : 3864 мс Время выполнения: 4 сек.
#87 by Ёпрст
какой то нелепый код..
#88 by aass
в я пытался реализовать ваши рекомендации я не правильно что то понял, поправте плиз ?
#89 by aass
вот рабочий вариант получения закупочной цены на нужную дату, теперь бы все это сцепить с при условии  дата цены на дату документы выполнен за : 2061 мс Время выполнения: 2 сек.
#90 by Ёпрст
ну, на счет рабочего я бы поспорил, в особенности в соединении ON
#91 by aass
работает, зуб даю ))
#92 by aass
и так тоже работет ТекстПериодика = " |(SELECT
#93 by aass
а вот так скорость выполнения самая масимальная из всех остальных выполнен за : 310 мс
#94 by aass
щас попробую циклом формировать текст запроса на каждую дату а потом UNION соединить
#95 by Ёпрст
ага.. а потом плюнешь на фокс и напишешь на 1sqlite
#96 by Ёпрст
Тип того, примерно:
#97 by aass
да отработало, как то все просто )) спасибо тебе милый человек что вразумил ))
#98 by aass
ТЗ колво строк 30195 Время выполнения: 41 сек.
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С