Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Помогите неофиту в запросе..... (число прочтений - 2090 )
Beria
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 10. Февраля 2009
Помогите неофиту в запросе.....
10. Февраля 2009 :: 09:30
Печать  
Вообщем  выборку надо по подстрочке наименования номенклатуры и с остатками по складу (складам) Регистр остаткиТМЦ с измерениями фирма, номенклатура и склад . База дбф

Первая часть получилась легко:

     Каталог=?(Прав(КаталогИБ(), 1)= "\", Лев(КаталогИБ(), СтрДлина(КаталогИБ())-1), КаталогИБ());
     Сообщить(Каталог);
     СтрокаСоединения="
     |Provider=VFPOLEDB.1;
     |Null = Yes;
     |Exclusive = No;
     |SourceType = DBF;
     |Data Source=" + Каталог + ";
     |Mode=ReadWrite;
     |Extended Properties="""";
     |User ID="""";
     |Password="""";
     |Mask Password=False;
     |Collating Sequence=MACHINE;   
     |DSN=""""";
     БД=СоздатьОбъект("OLEDBData");
     БД.Соединение(СтрокаСоединения);
     
     ОлеДБКоманда = БД.СоздатьКоманду();
     ОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')");
     ОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
     ОлеДБКоманда.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");                  
     ТекстЗапроса ="
     |SELECT
     |Спр.ID as [элемент $Справочник.Номенклатура],Спр.Descr as наименование,Спр.Code as код
     |
     |FROM
     |
     |$Справочник.Номенклатура as Спр
     |                  
     |WHERE
     |    Спр.IsFolder = 2 AND LOWER(Спр.Descr) LIKE '%кронштейна%' ORDER BY Спр.DESCR";   
     Выборка =ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
     Выборка.ВыбратьСтроку ();


А вот с регистрами очень запрутался.....или виснет или ошибки парсера......... Помогите, о Великие Гуру в детском вопросе...... :'( :'(
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите неофиту в запросе.....
Ответ #1 - 10. Февраля 2009 :: 12:12
Печать  
А что там такого в регистрах?
Если не на ТА либо начало месяца соединить RG с помощью union all с RA
А свое условие - вложенным запросом либо через временную таблицу
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Beria
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 10. Февраля 2009
Re: Помогите неофиту в запросе.....
Ответ #2 - 10. Февраля 2009 :: 12:20
Печать  
Я только только стал заниматься прямыми запросами и 1спп Улыбка

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

Кстати, при переходе на скл надо только строчку инициализации поменять, я так понял?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите неофиту в запросе.....
Ответ #3 - 10. Февраля 2009 :: 12:21
Печать  
Если на ТА c период месяц
добавь левое соединение
     
Код
Выбрать все
|  Left Join
| (SELECT  
|		$РегОстатков.Номенклатура as Номенклатура
|		,SUM($РегОстатков.Количество) as ОстатокНаСкладе
|		FROM
|			$РегистрИтоги.ОстаткиТМЦ as РегОстатков
|		WHERE
|			РегОстатков.PERIOD = :ДатаПериодаОстатков~~
// тут еще условия если есть, например на склад
|              GROUP BY   $РегОстатков.Товар
|  ) as ТабОстатков ON ТабОстатков.Номенклатура =Спр.ID

....
ьДатуТА()));  



А вообще в документации идет учебник по прямым запросам
  
Наверх
 
IP записан
 
Beria
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 10. Февраля 2009
Re: Помогите неофиту в запросе.....
Ответ #4 - 10. Февраля 2009 :: 14:20
Печать  
     ТекстЗапроса ="
     |SELECT
     |Спр.ID as [элемент $Справочник.Номенклатура],      
     |Спр.Descr as наименование,
     |Спр.Code as код
     |
     |FROM
     |
     |$Справочник.Номенклатура as Спр,               
     |
     |Left Join
     | (SELECT $РегОстатков.Номенклатура as Номенклатура,SUM($РегОстатков.Количество) as ОстатокНаСкладе
     |            FROM
     |                  $РегистрИтоги.ОстаткиТМЦ as РегОстатков
     |            WHERE
     |                  РегОстатков.PERIOD = :ДатаПериодаОстатков~~
     |              GROUP BY
     |$РегОстатков.Номенклатура
     |  ) as ТабОстатков ON ТабОстатков.Номенклатура =Спр.ID
     |WHERE
     |    Спр.IsFolder = 2 AND LOWER(Спр.Descr) LIKE '%кронштейна%' ORDER BY Спр.DESCR
     |";      
     ьДатуТА()));
     Выборка =ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
     Выборка.ВыбратьСтроку ();


FAILED! ICommandText::Execute(): File 'left.dbf' does not exist.
Нерешительный Нерешительный Нерешительный Нерешительный
  
Наверх
 
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Помогите неофиту в запросе.....
Ответ #5 - 10. Февраля 2009 :: 14:35
Печать  
Цитата:
   |$Справочник.Номенклатура as Спр,               
     |
     |Left Join

Запятую убери.
и вообще на Цитата:
FAILED! ICommandText::Execute()

ищи ошибку в синтаксисе
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите неофиту в запросе.....
Ответ #6 - 10. Февраля 2009 :: 14:43
Печать  
И в Select добавить Цитата:
,ТабОстатков.ОстатокНаСкладе as ОстатокНаСкладе

или еще лучше
Код
Выбрать все
ладе) as ОстатокНаСкладе 



если это вызывает затруднения то почитать по SQL, например
http://www.metaprog.uran.biz.ua/secrprog/tran_sql.html

по особеностям FoxPro
http://www.foxclub.ru/rhproject/project/
ввиде chm       http://www.1cpp.ru/forum/YaBB.pl?num=1185783552
  
Наверх
 
IP записан
 
Beria
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 10. Февраля 2009
Re: Помогите неофиту в запросе.....
Ответ #7 - 10. Февраля 2009 :: 22:48
Печать  
Всем огромное спасибо. Всё заработало. Даю полностью рабочий вариант ( может кому пригодится )  Очень довольный Иду читать вышеуказанные мануалы

Каталог=?(Прав(КаталогИБ(), 1)= "\", Лев(КаталогИБ(), СтрДлина(КаталогИБ())-1), КаталогИБ());
    СтрокаСоединения="
    |Provider=VFPOLEDB.1;
    |Null = Yes;
    |Exclusive = No;
    |SourceType = DBF;
    |Data Source=" + Каталог + ";
    |Mode=ReadWrite;
    |Extended Properties="""";
    |User ID="""";
    |Password="""";
    |Mask Password=False;
    |Collating Sequence=MACHINE;  
    |DSN=""""";
    БД=СоздатьОбъект("OLEDBData");
    БД.Соединение(СтрокаСоединения);
   
    ОлеДБКоманда = БД.СоздатьКоманду();
    ОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')");
    ОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
    ОлеДБКоманда.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");    
       ТекстЗапроса ="
    |SELECT
    |Спр.ID as [элемент $Справочник.Номенклатура],      
    |Спр.Descr as наименование,
    |Спр.Code as код,
      ладе) as ОстатокНаСкладе       |
    |FROM     |
    |$Справочник.Номенклатура as Спр                     |
    |Left Join
    | (SELECT $РегОстатков.Номенклатура as Номенклатура,SUM($РегОстатков.Количество) as ОстатокНаСкладе
    |            FROM
    |                  $РегистрИтоги.ОстаткиТМЦ as РегОстатков
    |            WHERE
    |                  РегОстатков.PERIOD = :ДатаПериодаОстатков~~
    |              GROUP BY
    |$РегОстатков.Номенклатура) as ТабОстатков ON ТабОстатков.Номенклатура =Спр.ID
    |WHERE
    |    Спр.IsFolder = 2 AND LOWER(Спр.Descr) LIKE '%кронштейна%' ORDER BY Спр.DESCR
    |";      
    ьДатуТА()));
    Выборка =ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
    Выборка.ВыбратьСтроку ();


ЗЫ: И в догонку вопрос при переходе на SQL запросы надо все переделывать или только достаточно строчку инициализации?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите неофиту в запросе.....
Ответ #8 - 11. Февраля 2009 :: 07:59
Печать  
Beria писал(а) 10. Февраля 2009 :: 22:48:
ЗЫ: И в догонку вопрос при переходе на SQL запросы надо все переделывать или только достаточно строчку инициализации?


http://www.1cpp.ru/forum/YaBB.pl?num=1148038411/25#25 пункт 17
вообщем у меня занимало меньше 5 мин на запрос (а если их много аналогичных то меньше минуты )


P.S. Но это если есть задача просто получить работающий на SQL запрос. Если хочется тонкой оптимизации,
учитывающей специфику сервера SQL, то конечно можно и день на отчет потратить
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать