Имя: Пароль:
1C
1C 7.7
v7: 1с++ Прямой запрос. Передача условий в подзапрос
0 aass
 
21.11.11
11:28
|SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   |    ,SUM(Cena.Цена)*SUM($ДокОКС.Количество) as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС    
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |
   |LEFT JOIN
   |    (SELECT
   |         СпрЦены.PARENTEXT as Владелец
   |        ,date as Дата  
   |        ,cast(value as numeric(15,2)) as Цена
   |FROM
   |        1sconst as Константа  
   |INNER JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |INNER JOIN
   |        $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   |INNER JOIN
   |        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT
   |WHERE
   |        СпрКатЦен.DESCR = 'Закупочная'
   |        AND
   |        cast(value as numeric(15,2))>0
   |       AND
   |          Константа.id    = :id
   |ORDER BY
   |        date desc
   |)        
   |        as Cena ON Cena.Владелец =$ДокОКС.Товар  
   //|        AND Cena.Дата    = Журнал.Date // здесь нужно выбрать все значения переодические до даты и взять из него только последние
   |  
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,Журнал.Date
   |";

запрос выдает сумму цен (SUM(Cena.Цена)*SUM($ДокОКС.Количество)) но соотвественно выдает не то что надо, как добиться от left join что бы выбирал последнюю цену для нужного товара или есть в природе возможность передать дату и товар из первого запроса в условие для подзапроса ?
1 Mikeware
 
21.11.11
11:30
делай коррелированый запрос
2 aass
 
21.11.11
11:31
забыл - DBF
3 Кириллка
 
21.11.11
11:33
группировать по товару, агрегируя по максимуму даты
4 orefkov
 
21.11.11
11:40
$ПоследнееЗначение не?
5 aass
 
21.11.11
11:41
(4) на dbf работает.
6 aass
 
21.11.11
11:41
(5) * не работает
7 Ёпрст
 
21.11.11
11:43
(5) нет
8 aass
 
21.11.11
11:48
(1) без LEFT JOIN и через Top 1, а на dbf так отработает ?
9 Ёпрст
 
21.11.11
11:50
(8) да, только там всё равно нужен будет order by и top 1.
в FAQ на 1сpp есть пример получения периодики..
и на скайте серого, на скрипт-коддинг.ком
10 orefkov
 
21.11.11
11:51
(5)
Ну во-первых - СпрКатЦен.DESCR = 'Закупочная' моветон. Перед запросом получи идшник типа цен один раз, его и подставляй как параметр.
И будет примерно так:

|SELECT
|   Журнал.Date                          
|   ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
|   ,SUM($ДокОКС.Количество) as Количество
|   ,SUM($ДокОКС.Сумма) as Сумма
|   ,SUM($ДокОКС.Количество * (select top 1 cast(value as numeric(15,2))
|      from 1sconst inner join $Справочник.Цены as СпрЦены ON СпрЦены.ID = 1sconst.objid
|      where СпрЦены.SP3787 = :ИдОптовогоТипаЦен and СпрЦены.PARENTEXT = $ДокОКС.Товар and 1sconst.id = :id
|      order by 1sconst.date desc
|      )) as СуммаЗакуп
11 Ёпрст
 
21.11.11
11:53
Ну , моветон изначально брать цену из справочника, когда цена должна быть реквизитом документа всегда.
12 Кириллка
 
21.11.11
11:53
еси запрос через vfpoledb, то коррелированный в селект-листе будет ой (если память не изменяет).
13 aass
 
21.11.11
11:54
(10) СпрКатЦен.DESCR = 'Закупочная' это принципиально, так как запрос пишеться под "чужую базу, шаримся из родной в соседней"
14 aass
 
21.11.11
11:55
(12) да еще  - Provider=VFPOLEDB.1
15 aass
 
21.11.11
11:57
(11) тут документ продаж и цена тама продажи, а нам нужен закуп,есть вариант брать из партии цену, но в нашем случаи справочник отработает точней (нет последовательности)
16 aass
 
21.11.11
11:59
(10) наверно все таки будет правильно, бум пробывать
17 Ёпрст
 
21.11.11
12:02
(12) да не, работать будет нормально.
Токма вот для скорости один хрен нужно всё переписывать
18 orefkov
 
21.11.11
12:08
(13)
И чего?
Так же сначала делаешь запрос в соседнюю базу, получаешь id. Подставляешь его в текст запроса.
19 Кириллка
 
21.11.11
12:08
(17)ну я упираться не буду, конечно, но точно помню, что была засада какая-то, что толи TOP не разрешен был, толи ORDER BY в коррелированном подзапросе в селект-листе.
20 aass
 
21.11.11
12:09
(17) к этому варианту и пришел то что скорость на уровне около минуты движения за месяц , до этого еще два варианта было один до 30 минут второй до 8 если получиться с топ, отпишусь по времени
21 aass
 
21.11.11
12:11
(18) если в соседнию базу кидаешь несколько запросов времени уходит намного больше когда один большой запрос
22 Ёпрст
 
21.11.11
12:12
(20) дело не в топе..
читай:
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705
23 orefkov
 
21.11.11
12:18
(21)
Замер времени - истина в последней инстанции.

Кстати, еще вариант - OLE + 1sqlite в той базе.
Вобщем, мерять надо.
24 ЧеловекДуши
 
21.11.11
12:23
В DBF  лучше пиши без изысков :)
Быстрее напишешь.
25 aass
 
21.11.11
13:18
ругается
   ТекстЗапроса = "
   |SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |INNER JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |INNER JOIN
   |        $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   |INNER JOIN
   |        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT
   |WHERE
   |        СпрКатЦен.DESCR = 'Закупочная'
   |        AND
   |        cast(value as numeric(15,2))>0
   |       AND
   |          Константа.id    = :id
   |        AND
   |        СпрЦены.PARENTEXT = $ДокОКС.Товар
   //|        AND
   //|        Константа.date <= Журнал.Date
   |ORDER BY
   |        date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС    
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,Журнал.Date
   |";
   


SELECT
   Журнал.Date                          
   ,ДокОКС.sp3499 as [Товар_1c_type_Справочник_1c_dot_Номенклатура]
  ,SUM(ДокОКС.sp3500) as Количество
  ,SUM(ДокОКС.sp3504) as Сумма
   ,
(
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
       СпрКатЦен.DESCR = 'Закупочная'
       AND
       cast(value as numeric(15,2))>0
      AND
         Константа.id    = ' 2WV'
       AND
       СпрЦены.PARENTEXT = ДокОКС.sp3499
ORDER BY
       date desc
)        as СуммаЗакуп
FROM
   dt3487 as ДокОКС    
JOIN
    1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
INNER JOIN
   dh3487 as Док ON Док.IDDoc = ДокОКС.IDDoc
INNER JOIN
   1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
WHERE
   Жур.Date BETWEEN {d '2011-05-01'} AND {d '2011-05-01'} AND
   Жур.Closed = 1
GROUP BY    
   ДокОКС.sp3499
   ,Журнал.Date
тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);    
{E:\1C_DB\EXTFORMS\W_VFPOLEDB_4.ERT(336)}: FAILED! ICommandText::Execute(): SQL: Queries of this type are not supported.
26 aass
 
21.11.11
13:46
без INNER JOIN работает
27 aass
 
21.11.11
13:48
да и по времени довольно шустро
28 Кириллка
 
21.11.11
14:49
(26)в каком из запросов смотреть? Без какого INNER JOIN работает?
29 Ёпрст
 
21.11.11
14:57
А нахрена вот так делать ?!

JOIN
    1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
INNER JOIN
  1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc
30 aass
 
21.11.11
15:00
ТекстЗапроса = "
   |SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |INNER JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |WHERE
   |        Константа.objid    = :ТекЦена
   |        AND
   |        Константа.id =' 2WV'  
   //$ИсторияРеквизита.Цены.Цена
   |       AND
   |          Константа.date    <= :НачДата ~~
   //|       AND
   //|        СпрЦены.PARENTEXT = $ДокОКС.Товар
   |ORDER BY
   |        Константа.date desc
   //|FROM
   //|        1sconst as Константа  
   //|INNER JOIN
   //|        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   //|INNER JOIN
   //|        $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   //|INNER JOIN
   //|        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT
   //|WHERE
   //|        СпрКатЦен.DESCR = 'Закупочная'
   //|        AND
   //|        cast(value as numeric(15,2))>0
   //|       AND
   //|          Константа.id    = :id
   //|        AND
   //|        СпрЦены.PARENTEXT = $ДокОКС.Товар
   //|        AND
   //|        Константа.date <= Журнал.Date
   //|ORDER BY
   //|        date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС    
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date
   |";

вот так работает
31 aass
 
21.11.11
15:01
|       AND
|        СпрЦены.PARENTEXT = $ДокОКС.Товар

с этой байдой тоже не работает, надо с мыслями собрать че то запутался слегка я
32 aass
 
21.11.11
15:11
(29) дата документа нужна для цены
33 aass
 
21.11.11
15:44
|INNER JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |WHERE
   |        СпрЦены.SP3787 = :ТекЦена

вообщем эта сцепка не хочет работать
34 aass
 
21.11.11
15:44
в условие добавляещь СпрЦены.SP3787 = :ТекЦена и ругаться на чинает
35 Ёпрст
 
21.11.11
15:51
(34) используй метапарсер и $ и не пиши имена полей руками.
36 aass
 
21.11.11
17:26
(35) $СпрЦены.Владелец а так он ругается
Meta name parser error: поле таблицы не найдено "$СпрЦены.Владелец"
37 aass
 
21.11.11
19:19
вообщем не получились у меня JOIN  в подзапросе для DBF. единсвенный вариант вычислять в основном запросе параметры для 1sconst id, objid и передавать их в условие подзапроса, как нарисую , результаты, по времени выполнения, напишу.
38 Ёпрст
 
21.11.11
19:39
(36) :)))

Вообще то речь за все поля, типа SP3787 , а Владелец, это ежели чего, PARENTEXT
39 Ёпрст
 
21.11.11
19:40
(37) пиши текс запроса, который не получился, целиком.
40 aass
 
21.11.11
20:05
|SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |LEFT JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |WHERE
   |        Константа.objid    = СпрЦены.ID
   |        AND
   |        Константа.id =' 2WV'  
   |       AND
   |          Константа.date    <= :НачДата ~~
   |ORDER BY
   |        Константа.date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   |INNER JOIN
   |    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар
   |INNER JOIN
   |    $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT  
   |INNER JOIN
   |    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
     |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date


вообщем вот так работает
41 aass
 
21.11.11
20:06
(40) тока теперь подшаманить надо под задачу
42 aass
 
21.11.11
20:16
|SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |LEFT JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |WHERE
   |        Константа.objid    = СпрЦены.ID
   |        AND
   |        Константа.id =' 2WV'  
   |       AND
   |          Константа.date    <= :НачДата ~~
   |ORDER BY
   |        Константа.date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   //|INNER JOIN
   //|    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар
   //|INNER JOIN
   //|    $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT  
   //|INNER JOIN
   //|    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
     |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date    


так тоже работает
43 aass
 
21.11.11
20:17
скорость минута 23, тока цена одна и таже для всех вылазит
44 Кириллка
 
21.11.11
20:19
прикольный коррелированный запрос получился.
45 Кириллка
 
21.11.11
20:20
+44 а зачем тебе эта громоздкая конструкция в скобках? Пиши вместо скобок всегда 1234.56
46 aass
 
21.11.11
20:23
|SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |LEFT JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |LEFT JOIN
   |    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   |WHERE
   |        Константа.objid    = СпрЦены.ID
   |        AND
   |        Константа.id =:id  
   |       AND
   |          Константа.date    <= :НачДата ~~
   |       AND
   |        Константа.id = $ДокОКС.Товар
   |ORDER BY
   |        Константа.date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   //|INNER JOIN
   //|    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар
   //|INNER JOIN
   //|    $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT  
   //|INNER JOIN
   //|    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
     |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date


а вот так не работает
47 Кириллка
 
21.11.11
20:25
(46)см. выше (12)
48 aass
 
21.11.11
20:26
(46) это хрень не берите во внимание ошибочку не заметил поторопился
49 aass
 
21.11.11
20:35
|SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |LEFT JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |LEFT JOIN
   |    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   //|LEFT JOIN
   //|        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар  //тут теперь как нибудь надо связать с товаром из основной таблицы
     |WHERE
   |        Константа.objid    = СпрЦены.ID
   |        AND
   |        Константа.id =:id  
   |       AND
   |          Константа.date    <= :НачДата ~~
   |ORDER BY
   |        Константа.date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
     |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date

вот так работает, теперь не знаю как связать товар из подзапроса с товарам в основном запросе
50 aass
 
21.11.11
20:38
и по времени получается период что за один день что за месяц, выполнение запроса разница 20-30 секунд
51 Ёпрст
 
21.11.11
20:44
Еще раз, нафига вот этот бред всё время пишешь ???

   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc
52 Ёпрст
 
21.11.11
20:48
(50) Для начала, весь запрос в топку.
53 aass
 
21.11.11
20:54
База = СоздатьОбъект("OLEDBData");            
   ПутьКБазе = "E:\DB_MGZ\mgz04\";
   Соединение="Provider=VFPOLEDB.1;Data Source="+ПутьКБазе+";Mode=Share Deny None;Extended Properties="""";User ID="""";Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=RUSSIAN;DSN=""""";
   Рез = База.Соединение(Соединение);
   Запрос = База.СоздатьКоманду();
   
   НачДата=ВыбНачПериода;
   КонДата=ВыбКонПериода;
   
   ТекстЗапроса = "
   |SELECT
   |    Журнал.Date                          
   |    ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($ДокОКС.Количество) as Количество
   |   ,SUM($ДокОКС.Сумма) as Сумма
   //|    ,SUM($ДокОКС.Количество)*
   |    ,
   |(
   |SELECT    
   |        top 1
   |        cast(value as numeric(15,2))
   |FROM
   |        1sconst as Константа  
   |LEFT JOIN
   |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid
   |LEFT JOIN
   |    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
   //|LEFT JOIN
   //|        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар
     |WHERE
   |        Константа.objid    = СпрЦены.ID
   |        AND
   |        Константа.id =:id  
   |       AND
   |          Константа.date    <= :НачДата ~~
   |ORDER BY
   |        Константа.date desc
   |)        as СуммаЗакуп
   |FROM
   |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
   |JOIN
   |     1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
   |INNER JOIN
   |    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
   |INNER JOIN
   |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
   //|INNER JOIN
   //|    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар
   //|INNER JOIN
   //|    $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT  
   //|INNER JOIN
   //|    $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
     |WHERE
   |    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
   |    Жур.Closed = 1
   |GROUP BY    
   |    $ДокОКС.Товар
   |    ,
   |Журнал.Date
   |";
   
   

   МД = СоздатьОбъект("MetaDataWork");
   id = Прав(_idtostr(МД.ИДРеквизитаСправочника("Цены","Цена")),4);
   
   Запрос.Отладка(1);
   Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
   Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
   Запрос.УстановитьТекстовыйПараметр("id",id);
   
   
   
   тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);    
   тзВыбНомеклатура.Выгрузить(ТаблЗнач);
   
тут все
54 aass
 
21.11.11
20:57
(51) я с тобой согласен, ну бывает, че пристал )) поправил работает
55 aass
 
21.11.11
21:00
(53) тут получается две фишки надо сделать
1. это соедbнить товары из подзапроса с оcновным запросом
2. в подзапросе наложить фильтр на 1sconst.Date <= Журнал.Date(из основного)
56 aass
 
21.11.11
21:01
(51) я те даже скажу без этого быстрее работает ))
57 Ёпрст
 
21.11.11
21:07
(53) даже строка подключения устаревшая
58 aass
 
22.11.11
04:00
(57) ну так помоги мил человек наведи на путь истинный
59 Ёпрст
 
22.11.11
09:06
Ну, тип того, для начала:


Процедура Сформировать()
   
   Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
   ОлеДБ = СоздатьОбъект("OLEDBData");
   Рез = ОлеДБ.Соединение(Соединение);
   Запрос = ОлеДБ.СоздатьКоманду();
   Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");  
   Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
   Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");    
   Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
   
   НачДата=ВыбНачПериода;
   КонДата=ВыбКонПериода;
   
   ТекстЗапроса = "
   |select
   |    Журнал.Date                          
   |   ,$Док.Товар as [Товар $Справочник.Номенклатура]
   |   ,SUM($Док.Количество) as Количество
   |   ,SUM($Док.Сумма) as Сумма
   //|    ,SUM($Док.Количество)*

   |   ,(
   |       select  
   |          max(Периодика.value)
   |       from
   |          1sconst as Периодика
   |          inner join $Справочник.Цены as Цены on Цены.parentext = $Док.Товар
   |       where
   |           $Цены.КатегорияЦен = :ВыбКатегорияЦен
   |           and  Периодика.objid = Цены.id
   |           and  Периодика.id = $ИсторияРеквизита.Цены.Цена
   |           and Периодика.date =
   |               (select max(Конст.date)
   |                from 1sconst as Конст
   |                where Конст.objid = Периодика.objid
   |                and  Конст.id  = $ИсторияРеквизита.Цены.Цена
   |                and Конст.date<=:КонДата~~
   |                )
   |        ) as ЦенаИзСправочника
   |from
   |    $ДокументСтроки.ОтчетКассовойСмены as Док
     |inner join
   |    1sjourn Жур ON  Док.iddoc = Жур.iddoc
   |    and dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+'      '+'         '  and dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'
   |    and Жур.closed >0
   |group by    
   |    $Док.Товар
   |    ,Жур.date
   |";
   
     
  // Запрос.Отладка(1);
   Запрос.УстановитьТекстовыйПараметр("ВыбКатегорияЦен", ВыбКатегорияЦен);//ВыбКатегорияЦен - реквизит диалога на форме с нужным типом цен
   Запрос.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода);
   Запрос.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода);
   ВремяНачалоЗапроса=_GetPerformanceCounter();
   ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   Сообщить("выполнен за : "+(_GetPerformanceCounter()-ВремяНачалоЗапроса)+" мс");
   ТЗ.ВыбратьСтроку();

КонецПроцедуры
60 aass
 
22.11.11
09:49
(59) запрос отработал
тока
|    Журнал.Date - ругается, но тут понятно
теперь есть загвоздка документы у нас на разную дату и  цена тоже на разную дату
условие в даннном случаи нас не устраивает and Конст.date<=:КонДата~~
надо что типо and Конст.date<=Журнал.Date
решения два либо сюда запихивать дату документа, либо формировать на каждую дату свой запрос
есть возможность запихнуть дату ?
61 aass
 
22.11.11
09:49
+(60)
выполнен за : 20583 мс
Время выполнения: 1 мин. 6 сек.
62 Ёпрст
 
22.11.11
10:00
(60) есть
(61) запрос надо переписывать, чтоб коррелированный подзапрос тоже бегал по индексу, т.е необходимо переделать условие подзапроса на индексное выражение.
63 Ёпрст
 
22.11.11
10:03
+62 Если не хочешь составлять правильное индексное выражение для фоксового запроса, пиши запрос с помощью 1sqlite - там оно само подбирает подходящий индекс.
+синтаксис попроще.
64 aass
 
22.11.11
10:24
скорость существенно изменилась с индексами

за день
выполнен за : 20555 мс
Время выполнения: 21 сек.

за месяц
выполнен за : 21947 мс
Время выполнения: 22 сек.
65 Ёпрст
 
22.11.11
10:31
(64) это п..ц как долго.
Как будет ~2-3 мс, вот тогда "попадаешь". Смотри план выполнения запроса.
На 1cpp есть ветка как смотреть его для фоксового провайдера.
66 aass
 
22.11.11
13:55
ДатаЗначения ="
|(
|SELECT
|        max(Конст.date)
|FROM
|        1sconst as Конст
|WHERE
|        Конст.objid = Периодика.objid
|                and Конст.id  = $ИсторияРеквизита.Цены.Цена
//|              and Конст.date<=:КонДата~~
//|                 ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3)
//|                 DTOS(DATE)+TIME+IDDOC
|                 and Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+ STR(Конст.PARTNO,3) BETWEEN
|                     '    '+ '         '+dtos(:НачДатаПериод~~)+'      '+'         '+'   '  and 'ZZZZ'+ 'ZZZZZZZZZ'+dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ'
|                )
|";

про индексы тут есть кусочек истины или лажа ?
67 Ёпрст
 
22.11.11
16:27
(66) с виду норм.
68 Ёпрст
 
22.11.11
16:28
+67 а не, лажа :))
Надо не between, а просто меньше или равно даты..
69 aass
 
23.11.11
04:49
(67) че то у меня , на "просто меньше или равно даты", после сообщения - "невозможно обработать та-та-та .tmp по причине превышения допустимых объемов" винт отвалился (у меня базы на отдельном винте) это совпадение или последствия "кривых рук" ? ))
70 aass
 
24.11.11
05:07
|(
   |SELECT
   |        max(Конст.date)
   |FROM
   |        1sconst as Конст
   |WHERE
   |            Конст.ID + Конст.OBJID + dtos(Конст.date) + Конст.time + Конст.DOCID + STR(Конст.PARTNO,3) <=  
   |            $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' + dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' + '999'
   |           and
   |            Конст.objid = Периодика.objid
   //|            Конст.id  = $ИсторияРеквизита.Цены.Цена
   //|            and Конст.date<=:КонДата~~
   //|                 ID+OBJID(C9)+DTOS(DATE)+TIME(C6)+DOCID(C9)+STR(PARTNO,3)(N3)
   //|                 DTOS(DATE)+TIME+IDDOC
   |)
   |";

в общем с такой то матери( пришлось мать менять на компе на старой похоже с контролером че то не так, отваливался винт) заработало но прироста скорости обработки не увидел, и значение берет не на ту дату которою указываешь а последнюю, не могу попасть в индекс, индексы вверху посмотрите плиз, че нетак опять ?
71 Ёпрст
 
24.11.11
09:25
|WHERE
//|                 ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3)
| Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+STR(Конст.PARTNO,3) BETWEEN
|$ИсторияРеквизита.Цены.Цена + Периодика.objid +dtos(:НачДатаПериод~~)+'      '+'         '+'   '
|and $ИсторияРеквизита.Цены.Цена + Периодика.objid +dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ'
)

где НачДатаПериод = '01.01.1980'
72 aass
 
24.11.11
09:40
|WHERE
|Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+STR(Конст.PARTNO,3) BETWEEN
|$ИсторияРеквизита.Цены.Цена + '         ' +dtos(:НачДатаПериод~~)+'      '+'         '+'   '
|and $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' +dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ'
|            AND
|            Конст.objid = Периодика.objid
   
вот так отрабатывает а если Периодика.objid вставлять то ругается
FAILED! ICommandText::Execute(): SQL: Error correlating fields.
и время выполнения - выполнен за : 5 мс
так быстрее:

|            Конст.ID + Конст.OBJID + dtos(Конст.date) + Конст.time + Конст.DOCID + STR(Конст.PARTNO,3) <=  
|            $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' + dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' + '999'
|           and
|            Конст.objid = Периодика.objid

выполнен за : 2 мс
но пять что то ч этот вариант цену дает последнюю а не на заданную дату, как быть ?
73 aass
 
24.11.11
09:41
74 aass
 
24.11.11
09:42
+(73) похожая ситуация и те же проблемы
75 Ёпрст
 
24.11.11
09:44
(72) передавать дату из журнала вестимо.
Если болт в коррелированном селект листе, то делать лефт джоин с подзапросом, в котором получать нужную периодику.

или использовать 1sqlite
76 aass
 
24.11.11
09:49
|WHERE
|    Конст.id+Конст.objid+DTOS(Конст.date)+Конст.time+Конст.docid+STR(Конст.partno,3) <=  
|            $ИсторияРеквизита.Цены.Цена
|            AND
|            Конст.date<=:КонДата~~
|            AND
|            Конст.objid = Периодика.objid

выполнен за : 2 мс

вот так выдает дату которая нужна
77 aass
 
24.11.11
09:54
(75)
|            Конст.id+Конст.objid+DTOS(Конст.date)+Конст.time+Конст.docid+STR(Конст.partno,3) <=  
|            $ИсторияРеквизита.Цены.Цена
|            AND
|            Конст.date<=Жур.Date
|            AND
|            Конст.objid = Периодика.objid


FAILED! ICommandText::Execute(): SQL: Error correlating fields.
78 Ёпрст
 
24.11.11
10:01
(76) выдает мусор, ибо написано невесь что..
(77) читай (75.2)
79 aass
 
24.11.11
10:14
(78) (75.2) это понял буду пробывать
80 aass
 
24.11.11
10:41
со временем в 2мс 5мс я на хлюздел. не туда замер вставил
81 aass
 
24.11.11
12:27
вот разные запросы, разные показатели

|SELECT
|    Журнал.Date,                          
|    $ДокОКС.Товар as [Товар $Справочник.Номенклатура],
|    SUM($ДокОКС.Количество) as Количество,
|    SUM($ДокОКС.Сумма) as Сумма
|FROM
|    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
|JOIN
|    1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
|INNER JOIN
|    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
|INNER JOIN
|    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
|WHERE
|    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
|     AND
|    Жур.Closed = 1
|GROUP BY    
|    Журнал.Date,
|    $ДокОКС.Товар
|";

выполнен за : 29028 мс
Время выполнения: 29 сек.

|SELECT
|    Журнал.Date,                          
|    $ДокОКС.Товар as [Товар $Справочник.Номенклатура],
|    SUM($ДокОКС.Количество) as Количество,
|    SUM($ДокОКС.Сумма) as Сумма
|FROM
|    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
|JOIN
|    1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc
|INNER JOIN
|    $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc
|INNER JOIN
|    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
|WHERE
//|    Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
|    dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+'      '+'         '  AND dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'
|     AND
|    Жур.Closed = 1
|GROUP BY    
|    Журнал.Date,
|    $ДокОКС.Товар
|";
   

выполнен за : 4936 мс
Время выполнения: 5 сек.

есть еще варианты ускорить ?
82 Ёпрст
 
24.11.11
13:03
(81) есть.
Выкинуть соединение с табличкой шапки документа
83 aass
 
24.11.11
13:13
совсем все уже убрал

|SELECT
|    $ДокОКС.Товар as [Товар $Справочник.Номенклатура],
|    SUM($ДокОКС.Количество) as Количество,
|    SUM($ДокОКС.Сумма) as Сумма
|FROM
|    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
|INNER JOIN
|    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc  
|WHERE
|    dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+'      '+'         '  AND dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'
|GROUP BY    
|    $ДокОКС.Товар
|";

выполнен за : 4978 мс
Время выполнения: 5 сек.

это  все возможное ?
84 Ёпрст
 
24.11.11
13:58
(83)
Строка подключения из (59) ?
+  Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");  Это в коде есть ?
второй раз запускаешь на выполнение, время какое ?
85 aass
 
24.11.11
14:05
(84)
1. есть
2.
выполнен за : 5057 мс
Время выполнения: 5 сек.
выполнен за : 4956 мс
Время выполнения: 5 сек.
выполнен за : 4933 мс
Время выполнения: 5 сек.
86 aass
 
24.11.11
14:11
че то уменя какой не делаю один хрен время около примерно

|SELECT
|    TabMaxIndex.ID as [Товар $Справочник.Цены]
|    ,Цены.value as [ЦенаБазовая $Число]
|
|FROM
|  
|(SELECT
|     Спр.ID as ID,
|     MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)  ) as IndexMax
|
|FROM
|    $Справочник.Цены as Спр
|
|LEFT JOIN 1sconst as Период
|
|ON
|  Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) =
|  $ИсторияРеквизита.Цены.Цена+Спр.id  
|
| GROUP BY  Спр.ID
|
| )  TabMaxIndex
|
|LEFT JOIN 1sconst as Цены
|
|ON
|  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
|";


выполнен за : 6629 мс
Время выполнения: 7 сек.
выполнен за : 3885 мс
Время выполнения: 4 сек.
выполнен за : 3864 мс
Время выполнения: 4 сек.
87 Ёпрст
 
24.11.11
14:21
(86) какой то нелепый код..
88 aass
 
25.11.11
03:41
(87) в (86) я пытался реализовать ваши рекомендации (62) (75)
я не правильно что то понял, поправте плиз ?
89 aass
 
25.11.11
04:41
вот рабочий вариант получения закупочной цены на нужную дату, теперь бы все это сцепить с (83) при условии  дата цены на дату документы

ТекстПериодика = "
|(SELECT
|     Спр.ID as ID,
|     MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)  ) as IndexMax
|
|FROM
|    $Справочник.Цены as Спр
|LEFT JOIN
|        $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID
|
|LEFT JOIN 1sconst as Период
|
|ON
|  Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) =
|  $ИсторияРеквизита.Цены.Цена+Спр.id  
|
|WHERE  
|          Период.date    <= :ДатаЦены ~~
|        AND        
|        СпрКатЦен.DESCR = 'Закупочная'
| GROUP BY  Спр.ID
|
| )  TabMaxIndex
|";
   
   
   
ТекстЗапроса = "
|SELECT
|    TabMaxIndex.ID as [КатегорияЦены $Справочник.Цены]
|,TabMaxIndex.*
|    ,Цены.value as [ЦенаБазовая $Число]
|
|FROM
|"+ТекстПериодика+"  
|                  
|LEFT JOIN
|        1sconst as Цены  
|
|ON
|  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
|";

выполнен за : 2061 мс
Время выполнения: 2 сек.
90 Ёпрст
 
25.11.11
08:54
(89) ну, на счет рабочего я бы поспорил, в особенности в соединении ON
91 aass
 
25.11.11
09:00
(90) работает, зуб даю ))
92 aass
 
25.11.11
09:02
(90) и так тоже работет

ТекстПериодика = "
|(SELECT
|     Спр.ID as ID,
|     MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax
|
|FROM
|    $Справочник.Цены as Спр
|LEFT JOIN
|   $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID
|LEFT JOIN
|    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT
|LEFT JOIN
|    1sconst as Период
|ON
|  Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) =
|  $ИсторияРеквизита.Цены.Цена+Спр.id  
|WHERE  
|          Период.date    <= :ДатаЦены ~~
|        AND        
|        СпрКатЦен.DESCR = 'Закупочная'  
|        AND        
|        cast(Период.value as numeric(15,2))>0
| GROUP BY  Спр.ID
|
| )  TabMaxIndex
|";
   
   
   
ТекстЦены = "
|SELECT
|    СпрНоменк.ID as [Товар $Справочник.Номенклатура]
|    ,:ДатаЦены ~~
|    ,Цены.value as [ЦенаБазовая $Число]
|
|FROM
|"+ТекстПериодика+"  
|                  
|LEFT JOIN
|        1sconst as Цены  
|LEFT JOIN
|        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Цены.objid
|LEFT JOIN
|        $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
|LEFT JOIN
|        $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT
|
|ON
|  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
|";
93 aass
 
25.11.11
09:34
а вот так скорость выполнения самая масимальная из всех остальных

ТекстПериодика = "
|(SELECT
|     Спр.ID as ID,
|     MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax
|
|FROM
|    $Справочник.Цены as Спр
|LEFT JOIN
|   $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID
|LEFT JOIN
|    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT
|LEFT JOIN
|    1sconst as Период
|ON
|  Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) =
|  $ИсторияРеквизита.Цены.Цена+Спр.id  
|WHERE  
|          СпрНоменк.ID = :ВыбТовар
|        AND        
|          Период.date    <= :ДатаЦены ~~
|        AND        
|        СпрКатЦен.DESCR = 'Закупочная'  
|        AND        
|        cast(Период.value as numeric(15,2))>0
| GROUP BY  Спр.ID
|
| )  TabMaxIndex
|";
   
   
   
ТекстЦены = "
|SELECT
|    Цены.value as [ЦенаБазовая $Число]
|
|FROM
|"+ТекстПериодика+"  
|                  
|LEFT JOIN
|        1sconst as Цены  
|
|ON
|  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
|";

выполнен за : 310 мс
94 aass
 
25.11.11
09:50
щас попробую циклом формировать текст запроса на каждую дату а потом UNION соединить
95 Ёпрст
 
25.11.11
09:55
ага.. а потом плюнешь на фокс и напишешь на 1sqlite
96 Ёпрст
 
25.11.11
10:32
Тип того, примерно:

Процедура Сформировать()
   
   
   ТекстЗапроса="
   |Select
   |    Док.Номенклатура [Номенклатура :Справочник.Номенклатура]
   |   ,Док.Количество  Количество
   |    ,(
   |       select  
   |           Периодика.value
   |       from __1S_Const Периодика
   |       inner join [Справочник.Цены] as Цены on Цены.parentext = Док.Номенклатура and $Цены.ТипЦен = :ТипЦен
   |       where Периодика.objid = Цены.id and Периодика.id = :ИсторияРеквизита.Цены.Цена
   |         and ((Периодика.date < Жур.date) OR (Периодика.date = Жур.date))
   |        order by Периодика.date desc
   |        limit 1
   |    
   |    ) Цена

   |From [ДокументСтроки.ПоступлениеТМЦ] Док
   |inner join
   |    [Журнал] Жур ON  Док.iddoc = Жур.iddoc and Жур.date between :НачДата and:КонДата
   
   |";
   Попытка
       база = СоздатьОбъект("SQLiteBase");
   Исключение
       ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
       база = СоздатьОбъект("SQLiteBase");
   КонецПопытки;
   
   // Откроем пустую базу данных в памяти
   база.Открыть(":memory:");
   запрос = база.НовыйЗапрос();    
   
   Запрос.Подставлять("ТипЦен",ТипЦен);    
   Запрос.Подставлять("НачДата",НачДата);
   Запрос.Подставлять("КонДата",КонДата);
   ВремяНачалоЗапроса=_GetPerformanceCounter();

   ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
   Сообщить((_GetPerformanceCounter()-ВремяНачалоЗапроса));
   ТЗ.ВыбратьСтроку();

КонецПроцедуры
97 aass
 
25.11.11
13:43
(96) да отработало, как то все просто )) спасибо тебе милый человек что вразумил ))
98 aass
 
25.11.11
14:12
+(97) за месяц

ТЗ колво строк 30195
Время выполнения: 41 сек.
99 Ёпрст
 
25.11.11
14:30
(97) не за что, но ты фоксовый запрос тоже добей..
На операциях с group by фокс обгоняет 1sqlite в скорости
100 hatsher
 
25.11.11
14:30
сотка
101 aass
 
26.11.11
05:23
(99) да к этому тоже интерес есть , в плане обработка большого кол-ва данных из десятка баз поэтому 41 секунда меня не совсем устраивает ))
102 aass
 
28.11.11
00:30
1sqlite есть возможность для подключения к другой(не текущей) базе ?
103 orefkov
 
28.11.11
06:47
(101), (96)
Вот это что такое:
and ((Периодика.date < Жур.date) OR (Периодика.date = Жур.date))

Пишите
and (Периодика.date <= Жур.date)
иначе в индекс не попадаете.

(102)
Нет. Только подключится к другой базе по оле и там запустить 1sqlite.
104 aass
 
28.11.11
10:06
(103) 2
а нету ссылочки под рукой на примерчик, а то что то внятного не могу ни че найти.
105 aass
 
28.11.11
10:10
(103) 1
да так намного быстрей ))
106 Ёпрст
 
28.11.11
11:12
(103) это, на сколько я помню, именно твой совет делать так, а не <=
:)))
107 Ёпрст
 
28.11.11
11:23
+106 не найду так сразу ту ветку, но вот , к примеру, трабл:
http://www.1cpp.ru/forum/YaBB.pl?num=1216729138/37#37
108 aass
 
28.11.11
11:32
вот примерно код через UNION, но тут унас ограничение на длину строки
и скорость выполнения не фонтан

есть ли вариант собрать одну таблицу что бы выводил дату на каждый, типа большая такая таблица где будудт храниться цены на каждый день

   ТекстЗапрос = "";
   
   Для текРасчДата = ВыбНачПериода По ВыбКонПериода  Цикл
       Сообщить(СтрЗаменить(Строка(текРасчДата),".",""));
       текЗначение = "Дата"+СтрЗаменить(Строка(текРасчДата),".","");


       ТекстПериодика = "
       |(SELECT
       |     Спр.ID as ID,
       |     MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax
       |FROM
       |    $Справочник.Цены as Спр
       |LEFT JOIN
       |   $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID
       |LEFT JOIN
       |    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT
       |LEFT JOIN
       |    1sconst as Период
       |ON
       |  Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) =
       |  $ИсторияРеквизита.Цены.Цена+Спр.id  
       |WHERE  
       |          Период.date    <= :"+текЗначение+" ~~
       |        AND        
       |        СпрКатЦен.DESCR = 'Закупочная'  
       |        AND        
       |        cast(Период.value as numeric(15,2))>0
       | GROUP BY  Спр.ID
       | )  TabMaxIndex
       |";
       
       ТекстЦены = "
       |SELECT
       |    (DTOS(:"+ текЗначение +" ~~) + СпрЦены.PARENTEXT),
       |    Цены.value as [ЦенаБазовая $Число]
       |FROM
       |"+ТекстПериодика+"  
       |LEFT JOIN
       |        1sconst as Цены  
       |LEFT JOIN
       |        $Справочник.Цены as СпрЦены ON СпрЦены.ID = Цены.objid
       |LEFT JOIN
       |        $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID
       |ON
       |  Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) =  TabMaxIndex.IndexMax
       |";
       
       
       
       ТекстЗапрос = ТекстЗапрос + ?(СтрДлина(ТекстЗапрос) = 0, "", "
           |UNION ALL
           |");
       ТекстЗапрос = ТекстЗапрос + ТекстЦены;
       Запрос.УстановитьТекстовыйПараметр(текЗначение,текРасчДата);
   КонецЦикла;
109 Ёпрст
 
28.11.11
11:48
(108) :)))
изврат какой.
110 aass
 
28.11.11
12:03
(109) )) вот думаю как это все в человеский вид привести
111 Ёпрст
 
28.11.11
12:05
(110) Хранить цену в реквизите регистра или документа.