Помогите с прямым запросом #507289


#0 by Sk0rp
Задача: Получить товары из документа, который этим документом списались "под остаток". Вот такой получился текст: ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); {XXX.ERT}: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 29: Incorrect syntax near '.'. Вот так запрос распарсился: FROM  dt410 as Док INNER JOIN    sc33 as СпрН ON СпрН.ID = Док.sp423 AND    ( select rr99_vt.sp3603 as Фирма, rr99_vt.sp101 as Товар, rr99_vt.sp100 as Склад, from ( select rg99_vt.sp3603, rg99_vt.sp101, rg99_vt.sp100, rg99_vt.sp102 from rg99 as rg99_vt (nolock) INNER JOIN (SELECT DISTINCT Д1.sp423 as rg99_vt.sp101, FROM dt410 as Д1 WHERE Д1.IDDOC = '  4TXV   ') as Д ON rg99_vt.sp101 = Д.Товар (rg99_vt.sp101) select ra99_vt.sp3603, ra99_vt.sp101, ra99_vt.sp100, case ra99_vt.debkred when 0 then ra99_vt.sp102 else -ra99_vt.sp102 end from ra99 as ra99_vt (nolock) inner join _1sjourn as j99_vt (nolock) on j99_vt.iddoc = ra99_vt.iddoc INNER JOIN (SELECT DISTINCT Д1.sp423 as ra99_vt.sp101, FROM dt410 as Д1 WHERE Д1.IDDOC = '  4TXV   ') as Д ON ra99_vt.sp101 = Д.Товар (ra99_vt.sp101) where j99_vt.date_time_iddoc > '20100901' and j99_vt.date_time_iddoc < '2010091889B0N4  4TXV   ' rr99_vt.sp3603, rr99_vt.sp101, rr99_vt.sp100 QA дает: Server: Msg 170, Level 15, State 1, Line 28 Line 28: Incorrect syntax near '.'. Server: Msg 170, Level 15, State 1, Line 43 Line 43: Incorrect syntax near '.'. 28-я строка это: Д1.sp423 as rg99_vt.sp101, 43-я: Д1.sp423 as ra99_vt.sp101, Не могу понять, что делаю не так и что надо исправлять.
#1 by МихаилМ
ну так вставте тескт запроса в квари аналайзер, ентерпрайз манагер, ссмс исполните. и они вам укажут на ошибку. форум Вам не отладчик.
#2 by Sk0rp
Прочитайте теперь вторую часть сообщения :)
#3 by Ёпрст
SELECT DISTINCT     $Д1.Товар as Товар, --вот тут лишняя зпт
#4 by МихаилМ
rg99_vt.sp101 очень странная конструкция. не уверен, что мс скл такую поддерживает
#5 by Ёпрст
+3 + зпт не хватает перед (Товар)
#6 by Sk0rp
Согласен, лишняя, спасибо. Убирание на выполнение не повлияло. С запятой перед (Товар) вообще не компилируется: {ХХХ.ERT}: Meta name parser error: недопустимое значение параметра "$РегистрОстатки.ОстаткиТоваров"
#7 by Ёпрст
там еще одной зпт не хватает, перед (товар)
#8 by Ёпрст
$РегистрОстатки.<ИмяРегистра>([<ГраницаРасчета>][,        <Соединение>][,
#9 by МихаилМ
тут ?
#10 by Ёпрст
да, там должно быть 2 зпт после этого.
#11 by Sk0rp
Да, точно, спасибо. Сам в это место смотрю. Получается:    |    $РегистрОстатки.ОстаткиТоваров(:ДатаРасчета~,    |                           INNER JOIN К сожалению, ошибка в QA та же. В SQL запросе поменялось только место:
#12 by Ёпрст
|WHERE        |    Док.IDDOC = :ВыбДок AND -- вот тут and лишний.
#13 by Ёпрст
RS.УстБД1С; - это тоже лишнее.
#14 by Злопчинский
..наблюдаю...
#15 by Ёпрст
as Д1) -- тут скобка лишняя.
#16 by Ёпрст
халявщик.
#17 by Sk0rp
Блин, как она там появилась? :) Не было же изначально, вот прямо сейчас зачем-то добавил. Спасибо. теперь новая ошибка компиляции: {XXX.ERT}: Meta name parser error: недопустимое значение параметра "$РегистрОстатки.ОстаткиТоваров"
#18 by Ёпрст
нам не видно кода отсюда.. да и..ОстаткиТоваров, что есть такой регистр с таким именем ?
#19 by Sk0rp
Заменил: (Количество) на (ОстатокТовара) - у меня так ресурс называется. Теперь все компилируется, но при исполнении ошибка та же: {XXX.ERT}: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 25: Incorrect syntax near '.'. В QA это Server: Msg 170, Level 15, State 1, Line 24 Line 24: Incorrect syntax near '.'. Server: Msg 170, Level 15, State 1, Line 36 Line 36: Incorrect syntax near '.'. где по прежнему: 24-я строка это: Д1.sp423 as rg99_vt.sp101, 36-я: Д1.sp423 as ra99_vt.sp101,
#20 by Ёпрст
+18 да и хинтов (nolock) не видно в тексте запроса..
#21 by Sk0rp
Вот текущее состояние 1C++ запроса: FROM  $ДокументСтроки.РасходнаяНакладная as Док INNER JOIN    $Справочник.Номенклатура as СпрН ON СпрН.ID = $Док.Товар AND                               $Д1.Товар as Товар                             FROM                               $ДокументСтроки.РасходнаяНакладная as Д1                             WHERE Д1.IDDOC = :ВыбДок) as Д ON                             Товар = Д.Товар, ,(Товар), (ОстатокТовара)) as Рег   ON
#22 by Sk0rp
Вот SQL: SELECT   FROM  dt410 as Док INNER JOIN    sc33 as СпрН ON СпрН.ID = Док.sp423 AND    ( select rr99_vt.sp101 as Товар, select rg99_vt.sp101, rg99_vt.sp102 from rg99 as rg99_vt (nolock) INNER JOIN (SELECT DISTINCT Д1.sp423 as rg99_vt.sp101 FROM dt410 as Д1 WHERE Д1.IDDOC = '  4TXV   ') as Д ON rg99_vt.sp101 = Д.Товар select ra99_vt.sp101, case ra99_vt.debkred when 0 then ra99_vt.sp102 else -ra99_vt.sp102 end from ra99 as ra99_vt (nolock) inner join _1sjourn as j99_vt (nolock) on j99_vt.iddoc = ra99_vt.iddoc INNER JOIN (SELECT DISTINCT Д1.sp423 as ra99_vt.sp101 FROM dt410 as Д1 WHERE Д1.IDDOC = '  4TXV   ') as Д ON ra99_vt.sp101 = Д.Товар where j99_vt.date_time_iddoc > '20100901' and j99_vt.date_time_iddoc < '2010091889B0N4  4TXV   ' rr99_vt.sp101
#23 by Ёпрст
--MIN(Рег.ОстатокТовара) MIN(Рег.ОстатокТовараОстаток)
#24 by Sk0rp
Регистр "Остатки товаров" предназначен для количественного учета остатков товаров на складах. Остатки товаров учитываются в базовых единицах измерения. В регистре ведется и управленческий, и финансовый учет остатков товаров. СТРУКТУРА РЕГИСТРА "ОСТАТКИ ТОВАРОВ" ИЗМЕРЕНИЯ Фирма При управленческом учете в это измерение записывается пустое значение (это является фактически признаком управленческого учета). При финансовом учете здесь проставляется значение фирмы проводимого документа. Для финансового учета значение данного измерения означает принадлежность данной партии товара конкретной фирме. Товар Здесь проставляется значение товара. Склад Здесь проставляется значение склада. РЕСУРС ОстатокТовара На этом ресурсе ведется учет остатка данного товара на складе в базовых единицах измерения. РЕКВИЗИТЫ ФлагУчета Данный реквизит фиксирует род движения товара: внутренний или внешний .
#25 by Ёпрст
см .. замени везде.
#26 by Sk0rp
А вот это не понял как использовать? Если в прямом запросе заменить на: Рег.ОстатокТовараОстаток, то ошибка сохраняется, но я не вижу, что бы такой алиас появлялся ранее. Это уже придумка транслятора в SQL вроде как.
#27 by Sk0rp
Везде в тексте прямого запроса? Это же название ресурса, я попробовал - не компилируется.
#28 by МихаилМ
еще не увязочка если тч  будет 2(3...) одинаковых товара то сумма удвоится (утроится ..)
#29 by Ёпрст
ладно, мне некогда.. почитай доку на досуге..
#30 by Sk0rp
Возьмется суммарное количество, что и требуется для решения.
#31 by МихаилМ
+ перепутал - количество в остатках
#32 by Sk0rp
Спасибо за помощь. Читаю там пол дня уже :( Изначально с . пришел.
#33 by Sk0rp
Можно чуть подробнее? Я не смог понять, что именно перепутал.
#34 by МихаилМ
я бы разделил этот запрос на 2 части и запрос по доку вынес вынес в временную таблицу, свернутую и поней делал отбор в подзапросе. иначе он путанный и плохочитаемый.
#35 by Sk0rp
Потеряет в скорости. Да и не особо он путанный: получить остатки по списку из документа и сравнить с количеством из документа - чего уж тут путанного?!ю
#36 by Sk0rp
Половину победил: Нельзя было второй раз алиас Товар использовать. вот так почти работает:
#37 by Sk0rp
Теперь новая ошибка: {ХХХ.ERT}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'ОстатокТовара'. а в QA это: ... Server: Msg 207, Level 16, State 3, Line 1 Invalid column name 'ОстатокТовара'. Server: Msg 207, Level 16, State 1, Line 1 Invalid column name 'ОстатокТовара'.
#38 by МихаилМ
я знаю точно, что "MIN(Рег.ОстатокТовара) as КолОст" - это плохо соответственно свертку по товару вынести в подзапрос. ( select документ ) join остатки_до_проведения_по_товарам_в_доке where остатки <> (нужное подчеркнуть) колву в доке.
#39 by Sk0rp
Все, с помощью Ёпрст3 победил, вот так работает: Что из ОстатокТовара внутри парсера получается алиас ОстатокТовараОстаток - фиг где описано.
#40 by МихаилМ
то читайте "Описание виртуальных таблиц" из
#41 by Sk0rp
Да, есть в описании. Если знать, что искать - найти можно :)
#42 by МихаилМ
согласен. "хотел бы я быть таким умным, как мояжена после"
#43 by YHVVH
а что означает хинт no lock?
#44 by ДенисЧ
грязное чтение, то есть чтение данных незавершённых транзакций и заблокированных таблиц
#45 by YHVVH
а для дбф имеет значение?
#46 by ДенисЧ
ахз. Я с динозаврическими форматами не работаю, это ниже моего достоинства :-)
#47 by Ёпрст
нет. для фокса - свой хинт есть, например.
#48 by YHVVH
сказал а говори б
#49 by Ёпрст
Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
#50 by YHVVH
это мы в курсе.
#51 by YHVVH
переменная окружения отключает блокировки заголовок таблиц если я правильно понял.
#52 by Ёпрст
так и есть
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

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