Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема v7 dbf Два запрос в один (число прочтений - 1557 )
aass
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 25. Ноября 2011
v7 dbf Два запрос в один
25. Ноября 2011 :: 02:05
Печать  
есть два запроса один выдергивает цены на заданную дату, второй запрос выдергивает продажи из табличной части документы и дату продажи, помогите их собрать в один что бы выдергивать цену на товар из первого запроса с условием что цена будет на дату продажи

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


второй

ТекстЖурнал= "
|SELECT
|    Жур.Date,                          
|    $ДокОКС.Товар 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'
|       AND
|    Жур.Closed = 1
|GROUP BY    
|    Жур.Date,
|    $ДокОКС.Товар
|";
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: v7 dbf Два запрос в один
Ответ #1 - 25. Ноября 2011 :: 08:26
Печать  
Код
Выбрать все
Процедура Сформировать()
    
    
    ТекстЗапроса="
    |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()-ВремяНачалоЗапроса));
    ТЗ.ВыбратьСтроку();

КонецПроцедуры 

  
Наверх
 
IP записан
 
aass
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 25. Ноября 2011
Re: v7 dbf Два запрос в один
Ответ #2 - 28. Ноября 2011 :: 03:53
Печать  
)) вот теперь бы еще как нить 1SQLite подключить к не родной базе ??!!
  
Наверх
 
IP записан
 
aass
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 25. Ноября 2011
Re: v7 dbf Два запрос в один
Ответ #3 - 28. Ноября 2011 :: 04:00
Печать  
   Соединение = "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')");
   
   НачДата=ВыбНачПериода;
   КонДата=ВыбКонПериода;
     
     
     МД = СоздатьОбъект("MetaDataWork");
     id = Прав(_idtostr(МД.ИДРеквизитаСправочника("Цены","Цена")),4);


     
     
     ТекстПериодика = "
     |(SELECT
     |     Спр.ID as ID,
     |     .partno,3)) as IndexMax
     |
     |FROM
     |      $Справочник.Цены as Спр
     |LEFT JOIN
     |   $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID
     |LEFT JOIN
     |    $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT
     |LEFT JOIN
     |      1sconst as Период
     |ON
     | rtno,3) =
     |  $ИсторияРеквизита.Цены.Цена+Спр.id  
     |WHERE  
     |            Период.date      <= :ДатаЦены ~~
     |            AND            
     |            СпрКатЦен.DESCR = 'Закупочная'  
     |            AND            
     |            cast(Период.value as numeric(15,2))>0
     | GROUP BY  Спр.ID
     |
     | )  TabMaxIndex
     
     |";
     
     
     
     ТекстЦены = "
     |SELECT
     //|      (DTOS(:ДатаЦены ~~) + СпрЦены.PARENTEXT)
     |      СпрЦены.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
     |";
     
   
     
     ТекстЖурнал= "
     |SELECT
     |    Жур.Date,
     |       ,Р2.DESCR,iif(Р1.id<>$ПустойИД,Р1.DESCR,'')))) as [Группа],
     |       $ДокОКС.Товар as PARENTEXT,
   |    $ДокОКС.Товар as [Товар $Справочник.Номенклатура],
     |    $ДокОКС.Количество as Количество,
     |    $ДокОКС.Сумма as Сумма
     |       ,(DTOS(Жур.Date) + $ДокОКС.Товар)
     |FROM
     |    $ДокументСтроки.ОтчетКассовойСмены as ДокОКС
     |INNER JOIN
     |    1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc
     |LEFT JOIN  
     |      $Справочник.Номенклатура as Р1 on $ДокОКС.Товар = Р1.id
     |LEFT JOIN  
     |      $Справочник.Номенклатура as Р2 on Р1.parentid = Р2.id
     |LEFT JOIN  
     |      $Справочник.Номенклатура as Р3 on Р2.parentid = Р3.id      
     |LEFT JOIN  
     |      $Справочник.Номенклатура as Р4 on Р3.parentid = Р4.id      
       |WHERE
     |    dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+'      '+'         '  AND dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'
     |       AND
     |    Жур.Closed = 1
     |";


     
     
     
     
     //Запрос.УстановитьТекстовыйПараметр("ВыбТовар",ВыбТовар);
     
     //Запрос.УстановитьТекстовыйПараметр("id",id);
     
     
     
     
     Запрос.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода);
     Запрос.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода);
     ВремяНачалоЗапроса=_GetPerformanceCounter();
     тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЖурнал);
     //Сообщить("выполнен за : "+(_GetPerformanceCounter()-ВремяНачалоЗапроса)+" мс");
     тзВыбНомеклатура.Выгрузить(ТаблЗнач);

     
     //*****************************************************************
     //
     
     тзВыбНомеклатура.НоваяКолонка("СуммаЗакуп","Число",30,2);
     тзВыбНомеклатура.Сортировать("Date");
     тзВыбНомеклатура.ВыбратьСтроки();
     флгДата = "";
     Пока тзВыбНомеклатура.ПолучитьСтроку()=1 Цикл
           //**************************************************************
           //  
           
           выбТовар      = тзВыбНомеклатура.Товар;
           Если НЕ(флгДата = тзВыбНомеклатура.Date) Тогда
                 флгДата      = тзВыбНомеклатура.Date;
                 Запрос.УстановитьТекстовыйПараметр("ДатаЦены",флгДата);
                 тзВыбЦены = Запрос.ВыполнитьИнструкцию(ТекстЦены);    
           КонецЕсли;
         текСтрока="";
           тзВыбЦены.НайтиЗначение(тзВыбНомеклатура.PARENTEXT,текСтрока,"PARENTEXT");
           тзВыбНомеклатура.СуммаЗакуп =
           Состояние(СокрЛП(Строка(выбТовар)));
           
           //****************************************************************
     КонецЦикла;          
     
     тзВыбНомеклатура.Свернуть("Группа,Товар","Количество,Сумма,СуммаЗакуп");
     тзВыбНомеклатура.Сортировать("Товар");
     
     тзВыбНомеклатура.Выгрузить(ТаблЗнач);


тока не пинать, это все что пока я смог придумать.
вот такой вариант у меня рулит, обработка данных за месяц
Время выполнения: 4 мин. 53 сек.
стандартными средствами
Время выполнения: 4 мин. 48 сек.

1SQLite делает тоже самое

Время выполнения: 1 мин. 24 сек.

но это работа с текущей базой
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: v7 dbf Два запрос в один
Ответ #4 - 28. Ноября 2011 :: 06:55
Печать  
        AND            
    |            СпрКатЦен.DESCR = 'Закупочная'  

вот это для начала в топку вместе с соединением по этому справочнику - достаточно просто реквизит на форму с нужным типом справочника и в тексте запроса условие на этот реквизит

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

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать