Имя: Пароль:
1C
1C 7.7
v7: JOIN в прямом запросе, не могу понять один момент...
0 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
+ твой реквизит Док, это реквизит чего ? Шапки ? Табличной части ? Тип какой ? <Документ> без вида ?
4 Tihon_aka_kot
 
24.06.20
15:35
Может тебе не join нужен а UNION ALL
Тогда в результат попадут все строки
5 IgorA100
 
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 .....)
7 IgorA100
 
24.06.20
22:22
(6) Т.е вообще без использования "ЖурналДокументов" и без джойнов во внутреннем SELECT?
И возвращаемое внутренним селектом "ГрафаОтбора.CHILDID" будет документом?
8 Ёпрст
 
24.06.20
22:25
(7) если период не нужен, то да, журнал не нужен
9 tgu82
 
24.06.20
22:29
(8) Это запрос только под SQL или под ДБФ тоже можно использовать?
10 Ёпрст
 
24.06.20
22:33
(9) в дбф тоже будет работать, только системные таблички без _, ну и для фокса или скульлайт синтаксис чутка разный
11 Ёпрст
 
24.06.20
22:34
и в журнале, полей дате_тайм_иддок в дбф нема, там дата в отдельном поле и иддок и время
12 IgorA100
 
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)}

Запрос нифига не возвращает :(
13 IgorA100
 
24.06.20
22:59
(8) $ДокументСканыДоков.Док - это типа: "17Y B5PS098"
А ГрафаОтбора.CHILDID - это типа: "B6LV098", т.е. без вида документа, да?
И естественно запрос ничего не вернет :(
14 IgorA100
 
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
17 IgorA100
 
24.06.20
23:33
(16) Для отбора по ВыбКонтрагент.
18 IgorA100
 
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
24 IgorA100
 
24.06.20
23:53
(23) Спасибо ОГРОМНОЕ!!!
Да, вспомнил, читал, забыл.... :(
(19) В общем да, так короче и понятней, чем использовать метод "ДобавитьУсловие" из класса "ЗапросSQL"
25 IgorA100
 
25.06.20
00:04
(19) Только не

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

а

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

Да, когда больше 10лет ничего не писал, все забывается :(
Еще раз огромное спасибо за помощь!
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший