Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Прямой запрос к документу (шапка и ТЧ) (число прочтений - 4646 )
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Прямой запрос к документу (шапка и ТЧ)
02. Марта 2018 :: 11:01
Печать  
Добрый день. Что то я запутался.
Требуется запросом получить следующие данные
1. Значение одного реквизита шапки документа ("ДатаИсполнения")
2. Значения трех реквизитов табличной части ("Продукция", "Заказ", "Количество")
Есть условия в запросе - диапазон "ДатаДок" и диапазон "ДатаИсполнения".
Знаю что нужен Inner Join, но не могу понять как соединить два запроса в один так чтобы в результирующей таблице значений были колонки "ДатаИсполнения", "Продукция", "Заказ", "Количество". Сам документ называется "НарядНаПроизводство". Пока получилось почти то что хотел но без колонки "ДатаИсполнения".
Может все просто а я брожу в трех соснах? Чуствую что должно быть просто, но не могу врубиться как.

заранее спасибо.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 278
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #1 - 02. Марта 2018 :: 11:27
Печать  
Текст запроса покажите
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #2 - 02. Марта 2018 :: 11:37
Печать  
ТекстЗапроса = "
|SELECT
|      $ДокС.Продукция as [Товар $Справочник.Товары],
|      SUM($ДокС.Количество) as Количество,
|      $ДокС.Заказ as [Заказ $Документ],
|FROM
|      $ДокументСтроки.НарядНаПроизводство as ДокС
|INNER JOIN
|      $Документ.НарядНаПроизводство as Док
|INNER JOIN
|      1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
|                         Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
|                         Жур.Closed = 1";


вот как сюда добавить нечто вроде

$Док.ДатаИсполнения as [ДатаИсполнения $Дата] в SELECT
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 278
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #3 - 02. Марта 2018 :: 12:19
Печать  
Ну дык просто добавляем в Select, разве не работает?
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #4 - 02. Марта 2018 :: 13:32
Печать  
Вот реальный запрос

ТекстЗапроса="
           |SELECT      
           | Жур.IDDoc as [Док $Документ.НарядНаПродукцию],
           | $ДокС.ГотоваяПродукция as [ГотоваяПродукция $Справочник.Номенклатура],
           | $ДокС.Количество as [Количество],               
           | $ДокС.Заказ as [Заказ $Документ],
           | $Док.ДатаИсполнения as [ДатаИсполнения $Дата]
           |FROM
           | $ДокументСтроки.НарядНаПродукцию as ДокС
           |INNER JOIN
           | $Документ.НарядНаПродукцию as Док
           |INNER JOIN
           | 1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
           | Жур.Date BETWEEN :ДатаЗап1~~ AND :ДатаЗап2~~
           | AND $Док.ДатаИсполнения BETWEEN :УсловиеПоДатеИсполнения1~~ AND :УсловиеПоДатеИсполнения2~~";

Ошибка

FAILED! ICommandText::Execute(): Syntax error.

Вот отладка

SELECT      
Жур.IDDoc as [Док_1c_type_Документ_1c_dot_НарядНаПродукцию],
ДокС.sp564 as [ГотоваяПродукция_1c_type_Справочник_1c_dot_Номенклатура],
ДокС.sp559 as [Количество],               
ДокС.sp688 as [Заказ_1c_type_Документ],
Док.sp687 as [ДатаИсполнения_1c_type_Дата]
FROM
dt227 as ДокС
INNER JOIN
dh227 as Док
INNER JOIN
1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
Жур.Date BETWEEN {d '2018-02-20'} AND {d '2018-03-02'}
AND Док.sp687 BETWEEN {d '2018-03-02'} AND {d '2018-03-02'}
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 278
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #5 - 02. Марта 2018 :: 13:40
Печать  
INNER JOIN $Документ.НарядНаПродукцию as Док on Док.iddoc = ДокС.iddoc

INNER JOIN 1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
           AND Жур.Date BETWEEN :ДатаЗап1~~ AND :ДатаЗап2~~
           AND $Док.ДатаИсполнения BETWEEN :УсловиеПоДатеИсполнения1~~ AND :УсловиеПоДатеИсполнения2~~";
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #6 - 02. Марта 2018 :: 13:44
Печать  
Спасибо! все работает. "AND" пробовал - все равно ошибку выдавало (в документации кстати без AND). А вот про связку табличной части с документом не подумал.

Еще раз - огромное спасибо Улыбка
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #7 - 02. Марта 2018 :: 15:18
Печать  
Стрелок писал(а) 02. Марта 2018 :: 13:32:
Вот реальный запрос

           |FROM
           | $ДокументСтроки.НарядНаПродукцию as ДокС
           |INNER JOIN
           | $Документ.НарядНаПродукцию as Док
           |INNER JOIN
           | 1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc
           | Жур.Date BETWEEN :ДатаЗап1~~ AND :ДатаЗап2~~
           | AND $Док.ДатаИсполнения BETWEEN


Молись с таким запросом на оптимизатор sql!!!

Он может выполнить именно в таком порядке как написано в запросе.
Т.е. выбрать вообще все строки из ДокументСтроки.НарядНаПродукцию, это много и не быстро.
Потом сверить их на соответствие из за INNER с Документ.НарядНаПродукцию. А это вообще бессмысленно т.к. они все равно совпадут. Мало того, если оптимизатор решит что ДатаИсполнения нужно проверить именно на этом этапе то он прочитает и еще и всю таблицу Документ.НарядНаПродукцию.
И только потом может проверить попадает ли все это в условия на 1SJourn (если до этого дойдет, а не упадет по памяти или таймауту)

Лучше все наоборот...

           |FROM
           | 1SJourn as Жур
           |LEFT JOIN
           | $Документ.НарядНаПродукцию as Док
           |    ON Жур.IDDoc = Док.IDDoc
           |LEFT JOIN
           | $ДокументСтроки.НарядНаПродукцию as ДокС
           |    ON Жур.IDDoc = ДокС.IDDoc
                |WHERE
           | Жур.Date BETWEEN :ДатаЗап1~~ AND :ДатаЗап2~~
                | AND Жур.DOCTYPE = $ВидДокумента.НарядНаПродукцию
           | AND $Док.ДатаИсполнения BETWEEN что то там

или
           |FROM
           | 1SJourn as Жур
           |INNER JOIN
           | $Документ.НарядНаПродукцию as Док
           |    ON Жур.IDDoc = Док.IDDoc
           |   AND $Док.ДатаИсполнения BETWEEN что то там

 
Насчет написания $ВидДокумента.НарядНаПродукцию в этом диалекте сомневаюсь. Но должно быть что-то похожее.

  
Наверх
www  
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #8 - 22. Марта 2018 :: 21:07
Печать  
Прийдется продолжить тему. Увы сам запутался окончательно. Вроде задача простая, но....

Справочник. Штрих-код тип "число". Нужен фильтр по этому реквизиту. Не простой (а может и простой, но я торможу). Аналог LIKE для строковых реквизитов. Чтобы задав "кусок" штрих-кода (например последние пять цифр) получить все элементы у которых в поле "штрих-код" встречается такая комбинация. Как я уже не пробовал. Ругается на несоответствие типов. Хелп

Вот как у меня

Текст=Текст+"
                 |AND LOWER($Спр.ШтрихКод) LIKE '"+СокрЛП(РазбиваемаяСтрокаПоШтрихКоду)+"'";

FAILED! ICommandText::Execute(): Function argument value, type, or count is invalid.
  
Наверх
 
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #9 - 23. Марта 2018 :: 05:49
Печать  
Используй Cast для преобразования и потом обычный поиск через CHARINDEX
Код (SQL)
Выбрать все
WHERE CHARINDEX(:РазбиваемаяСтрокаПоШтрихКоду, Cast($Спр.ШтрихКод as CHAR(20))) > 0
 

  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #10 - 23. Марта 2018 :: 06:06
Печать  
FAILED! ICommandText::Execute(): File 'charindex.prg' does not exist.

Текст=Текст+"
                 |AND CHARINDEX('"+СокрЛП(СтрокаФильтраПоШтрихКоду)+"', Cast($Спр.ШтрихКод as CHAR(20))) > 0";
  
Наверх
 
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #11 - 23. Марта 2018 :: 07:51
Печать  
Какая у вас СУБД? MS SQL?
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #12 - 23. Марта 2018 :: 08:04
Печать  
Сори, протормозил. База ДБФ
  
Наверх
 
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #13 - 23. Марта 2018 :: 08:12
Печать  
Не уверен, но думаю как то так:
AT(:РазбиваемаяСтрокаПоШтрихКоду,STR($Спр.ШтрихКод)) > 0
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #14 - 23. Марта 2018 :: 09:45
Печать  
Не работает. Пустой отбор получается. Результат запроса - пустой список

Результат отладки

SELECT
code AS Код,
id AS [Товар_1c_type_Справочник_1c_dot_Номенклатура],
ParentID as Parent
FROM sc135 as Спр WHERE isfolder=2
AND AT('481',STR(Спр.sp162))>0
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #15 - 26. Марта 2018 :: 13:10
Печать  
Ура! Я домучил фильтр по части числового реквизита!
Не смейтесь, кому то просто конечно, но я реально блукал в трех соснах. Вот рабочий код

|AND CAST($Спр.ШтрихКод as CHAR(20)) LIKE '"+СтрокаФильтраПоШтрихКоду+"'";
  
Наверх
 
IP записан
 
DartVader
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 13. Марта 2015
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #16 - 26. Марта 2018 :: 14:55
Печать  
А чего не as CHAR(13)?
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #17 - 26. Марта 2018 :: 21:15
Печать  
Можно и 13 конечно. Это я типа "перестраховался". На самом деле там длина поля 13. да не важно. важен принцип. Взял паузу на два дня и не думал об этой задаче. а сегодня стукнуло чего то. совсем другим занимался... попробовал - получилось Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Прямой запрос к документу (шапка и ТЧ)
Ответ #18 - 03. Мая 2018 :: 09:41
Печать  
Медленный запрос, читай про использование индексов в дбф запросе в FAQ
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать