Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: JOIN в прямом запросе, не могу понять один момент...

v7: JOIN в прямом запросе, не могу понять один момент...
Я
   IgorA100
 
24.06.20 - 13:21
Суть: Есть документ вида "__СканыДоков__", у которого имеется реквизит "Док" (документ). Нужно отобрать все документы, у которых в реквизите "Док" реквизит "Контрагент" = ВыбКонтрагент. Вроде плевое дело, но запутался...
Все документы по "ВыбКонтрагент" отбираю запросом используя графы отбора.
Все документы вида "__СканыДоков__" тоже отбираю.
А вот как эти два запроса сджойнить не могу понять :(
Вот оба запроса:
    ТекстЗапроса = "
        |SELECT * FROM
            |(SELECT
            |    $ДокументСканыДоков.Док as [Док $Документ]
            |    ,$ДокументСканыДоковТЧ.Имя as Имя
            |    ,$ДокументСканыДоковТЧ.Путь as Путь
            |FROM
            |    $Документ.__СканыДоков__ as ДокументСканыДоков
            |LEFT
            |    JOIN $ДокументСтроки.__СканыДоков__ as ДокументСканыДоковТЧ ON ДокументСканыДоковТЧ.IDDoc = ДокументСканыДоков.IDDoc
            |) as Докум
            |";
    
    
    ТекстЗапроса1 = "
        |SELECT
        |    ЖурналДокументов.IDDOCDEF as Док_вид,
        |    ЖурналДокументов.CLOSED as СостояниеДокумента,
        |    ЖурналДокументов.IsMark as ПометкаУдаления,
        |    ЖурналДокументов.IDDOC     as [Док $Документ], 
        |    ЖурналДокументов.DOCNO as Док_Номер
        |,ГрафаОтбора.PARENTVAL as PARENTVAL
        |FROM
        |    _1SJOURN as ЖурналДокументов
        |INNER
        |    JOIN _1SCRDOC as ГрафаОтбора ON ЖурналДокументов.IDDOC = ГрафаОтбора.CHILDID
        |WHERE
        |    ЖурналДокументов.DATE_TIME_IDDOC BETWEEN :ДатаНачала AND :ДатаКонца~
        |    "+стрУсловие+"
        |";

Может первый SELECT * в первом запросе и лишний...
   Ёпрст
 
1 - 24.06.20 - 15:25
(0)
1.зачем тебе графа отбора ? Есть графа отборка Клиентос ?
2.Не видно вообще условия на клиентоса нигде
   Ёпрст
 
2 - 24.06.20 - 15:26
И нужно отобрать в финале _Сканы_Док ? или что ?
   Ёпрст
 
3 - 24.06.20 - 15:27
+ твой реквизит Док, это реквизит чего ? Шапки ? Табличной части ? Тип какой ? <Документ> без вида ?
   Tihon_aka_kot
 
4 - 24.06.20 - 15:35
Может тебе не join нужен а UNION ALL
Тогда в результат попадут все строки
   IgorA100
 
5 - 24.06.20 - 16:02
(1)
1. Да, графа отбора Контрагент есть. Для этого и использовал графы отбора.
2. Использую класс "ЗапросSQL". Вот добавление условия:
    стрУсловие = "";
    стрУсловие=стрУсловие+" AND (ГрафаОтбора.MDID = $ГрафаОтбора.Контрагент)";
    рс.ДобавитьУсловие("ГрафаОтбора", "PARENTVAL", "~", ВыбКонтрагент, "PARENTVAL", "", "", "");
    стрУсловие=стрУсловие+" AND %ГрафаОтбора.PARENTVAL";


Данное условие рабочее.
3. Да, реквизит "Док" в шапке. Документ неопределенного вида, может быть любой.
4. В финале нужно отобрать все документы у которых Контрагент = ВыбКонтрагент И которые встречаются в реквизитах "Док" документов вида __СканыДоков__ и при этом еще получить еще из реквизита ТЧ документа __СканыДоков__ значения "Имя" и "Путь".
(4) Фиг его знает. По факту, мне надо что бы в итоге получилось так, что:
Если документ из второго запроса (ЖурналДокументов.IDDOC     as [Док $Документ]) есть в первом запросе ($ДокументСканыДоков.Док as [Док $Документ]) то он попадал бы в выборку, если нет - не попадал бы в выборку.

Т.е. Нас интересует все по клиенту "Вася Пупкин" 
Есть документ __СканыДоков__, в нем реквизит "Док" = "Вася Пупкин", тогда нам нужен сам "Док" (который может быть любого вида) и из документа __СканыДоков__ значения реквизитов из ТЧ "Имя" и Путь".
Если в документе __СканыДоков__, реквизит "Док" = "Гриша Пупкин" - такой документ не нужен нам.
   Ёпрст
 
6 - 24.06.20 - 18:34
(5) запрос (1) + where  $ДокументСканыДоков.Док in (select ГрафаОтбора.CHILDID from .....)
   IgorA100
 
7 - 24.06.20 - 22:22
(6) Т.е вообще без использования "ЖурналДокументов" и без джойнов во внутреннем SELECT?
И возвращаемое внутренним селектом "ГрафаОтбора.CHILDID" будет документом?
   Ёпрст
 
8 - 24.06.20 - 22:25
(7) если период не нужен, то да, журнал не нужен
   tgu82
 
9 - 24.06.20 - 22:29
(8) Это запрос только под SQL или под ДБФ тоже можно использовать?
   Ёпрст
 
10 - 24.06.20 - 22:33
(9) в дбф тоже будет работать, только системные таблички без _, ну и для фокса или скульлайт синтаксис чутка разный
   Ёпрст
 
11 - 24.06.20 - 22:34
и в журнале, полей дате_тайм_иддок в дбф нема, там дата в отдельном поле и иддок и время
   IgorA100
 
12 - 24.06.20 - 22:47
(8) Скомбинировал запрос:
САМ ТЕКСТ:
SELECT
    $ДокументСканыДоков.Док as [Док $Документ]
    ,$ДокументСканыДоковТЧ.Имя as Имя
    ,$ДокументСканыДоковТЧ.Путь as Путь
FROM
    $Документ.__СканыДоков__ as ДокументСканыДоков
LEFT
    JOIN $ДокументСтроки.__СканыДоков__ as ДокументСканыДоковТЧ ON ДокументСканыДоковТЧ.IDDoc = ДокументСканыДоков.IDDoc

WHERE $ДокументСканыДоков.Док in (
SELECT
    ГрафаОтбора.CHILDID
FROM
    _1SCRDOC as ГрафаОтбора
WHERE
     (ГрафаОтбора.MDID = $ГрафаОтбора.Контрагент) AND %ГрафаОтбора.PARENTVAL
)

ОТЛАДКА:
{call sp_executesql(N'
SELECT
    ДокументСканыДоков.sp40969 as [Док $Документ]
    ,ДокументСканыДоковТЧ.sp40970 as Имя
    ,ДокументСканыДоковТЧ.sp40971 as Путь
FROM
    dh40973 as ДокументСканыДоков
LEFT
    JOIN dt40973 as ДокументСканыДоковТЧ ON ДокументСканыДоковТЧ.IDDoc = ДокументСканыДоков.IDDoc

WHERE ДокументСканыДоков.sp40969 in (
SELECT
    ГрафаОтбора.CHILDID
FROM
    _1SCRDOC as ГрафаОтбора
WHERE
     (ГрафаОтбора.MDID = @_CP_1) AND (ГрафаОтбора.PARENTVAL = @PARENTVALD)
);', N'@PARENTVALD char(23),@_CP_1 int'
,'B1  4S   CXI098        ',862)}

Запрос нифига не возвращает :(
   IgorA100
 
13 - 24.06.20 - 22:59
(8) $ДокументСканыДоков.Док - это типа: "17Y B5PS098"
А ГрафаОтбора.CHILDID - это типа: "B6LV098", т.е. без вида документа, да?
И естественно запрос ничего не вернет :(
   IgorA100
 
14 - 24.06.20 - 23:22
Получается надо что бы внутренний SELECT вернул как-то значение "Вид+ГрафаОтбора.CHILDID"
   Ёпрст
 
15 - 24.06.20 - 23:29
(13) where right($ДокументСканыДоков.Док,9) in
   Ёпрст
 
16 - 24.06.20 - 23:31
И вот это че ?
AND %ГрафаОтбора.PARENTVAL
   IgorA100
 
17 - 24.06.20 - 23:33
(16) Для отбора по ВыбКонтрагент.
   IgorA100
 
18 - 24.06.20 - 23:39
(15) О!!!!!!
Заработало!!!!!!!
А почему обрезаем справа 9 символов?
   Ёпрст
 
19 - 24.06.20 - 23:41
(17) Так пиши хотя бы
AND ГрафаОтбора.PARENTVAL = :ВыбКонтрагент*

если нужно еще и за период то так еще
and ГрафаОтбора.Child_DATE_TIME BETWEEN :ДатаНачала AND :ДатаКонца~
   Ёпрст
 
20 - 24.06.20 - 23:42
(18) Потому, что реквизиты неопределенного вида хранятся как id(13)  - вид+iddoc
   Ёпрст
 
21 - 24.06.20 - 23:42
+20 4+9=13
   Ёпрст
 
22 - 24.06.20 - 23:42
На вот, ознакомься
http://www.script-coding.com/v77tables.html
   Ёпрст
 
23 - 24.06.20 - 23:44
   IgorA100
 
24 - 24.06.20 - 23:53
(23) Спасибо ОГРОМНОЕ!!!
Да, вспомнил, читал, забыл.... :(
(19) В общем да, так короче и понятней, чем использовать метод "ДобавитьУсловие" из класса "ЗапросSQL"
   IgorA100
 
25 - 25.06.20 - 00:04
(19) Только не
and ГрафаОтбора.Child_DATE_TIME BETWEEN :ДатаНачала AND :ДатаКонца~

а
and ГрафаОтбора.CHILD_DATE_TIME_IDDOC BETWEEN :ДатаНачала AND :ДатаКонца~

Да, когда больше 10лет ничего не писал, все забывается :(
Еще раз огромное спасибо за помощь!


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.