Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Виртуальная таблица (число прочтений - 3705 )
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Виртуальная таблица
25. Сентября 2008 :: 08:31
Печать  
Цель: Получить Подчинные документы для списка подчинных документов выбранному в реквизит ПлановыйЗаказ.
Делаю так:
           База = СоздатьОбъект("OLEDBData");
           Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
           Рез = База.Соединение(Соединение);
           Запрос = База.СоздатьКоманду();
           
           ТекстЗапроса = "
           |SELECT
           |      Жур.IDDoc as [Док $Документ.СписаниеПланов]
           |FROM
           |      1SJourn as Жур
           |INNER JOIN
           |      $Документ.СписаниеПланов as Док ON Док.IDDoc = Жур.IDDoc
           |WHERE
           |      Док.$ОбщийРеквизит.Документоснование = :Заказ~ AND
           |      Жур.ISMark = ''";
           
           Запрос.Отладка(1);
           
           Запрос.УстановитьТекстовыйПараметр("Заказ", ПлановыйЗаказ);
           ТзДокументов=Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
           спДокумент=СоздатьОбъект("СписокЗначений");
           ТзДокументов.Выгрузить(спДокумент,,,"Док");
           
           ИмяТаблицы="";
           Запрос.УложитьСписокОбъектов(спДокумент,ИмяТаблицы);
           Запрос. УстановитьТекстовыйПараметр ("Группа", ИмяТаблицы);
           
           ТекстЗапроса = "
           |SELECT
           |      Жур.IDDoc as [Док $Документ.ЗаказНаПроизводство],
           |FROM
           |      1SJourn as Жур
           |INNER JOIN
           |      $Документ.ЗаказНаПроизводство as Док ON Док.IDDoc = Жур.IDDoc
           |WHERE
           |      Док.$ОбщийРеквизит.Документоснование IN (SELECT Val FROM :Группа) AND
           |      Жур.Closed = 1 ";
           
           ТзДокументов=Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
           ТзДокументов.ВыбратьСтроку();

В первой выборке доки есть , а во второй нет, а должны быть. Не могу понять что не так!?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Виртуальная таблица
Ответ #1 - 25. Сентября 2008 :: 08:51
Печать  
А почему не хочешь во второй запрос вместо
Код
Выбрать все
SELECT Val FROM :Группа 

вставить первый запрос? Получишь нужные тебе данные одним запросом и без врем. таблиц.

и ещё: у тебя точно в поле Closed стоят значения = 1? У меня, например, (есть бух. компонента) проведенные имеют флаг = 5.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Виртуальная таблица
Ответ #2 - 25. Сентября 2008 :: 09:20
Печать  
Жур.Closed & 1 = 1
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Виртуальная таблица
Ответ #3 - 25. Сентября 2008 :: 09:46
Печать  
Вадимко писал(а) 25. Сентября 2008 :: 09:20:
Жур.Closed & 1 = 1

Не прокатит, у него Цитата:
Provider=VFPOLEDB.1
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: Виртуальная таблица
Ответ #4 - 25. Сентября 2008 :: 09:53
Печать  
Подскажи как? не знаком с SQL) на примерах знакомлюсь
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Виртуальная таблица
Ответ #5 - 25. Сентября 2008 :: 09:59
Печать  
Документоснование - документ любого типа?

У докум любого типа размер 13, у конкретного 9
А вообще подчиненные вынимают из 1SCRDOC
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: Виртуальная таблица
Ответ #6 - 25. Сентября 2008 :: 10:13
Печать  
про размер не понял
  
Наверх
 
IP записан
 
GEORG
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Зарегистрирован: 15. Мая 2008
Re: Виртуальная таблица
Ответ #7 - 25. Сентября 2008 :: 10:32
Печать  
// Выбрали подчиненные документы
ТекстЗапроса = "
|SELECT
|iddoc as [Док $Документ] , IDDocDef as Док_вид
|FROM
|_1SJOURN JOURN(NOLOCK), _1SCRDOC CRDOC(NOLOCK)
|WHERE
|JOURN.DATE_TIME_IDDOC=CRDOC.CHILD_DATE_TIME_IDDOC
|and CRDOC.MDID=0
|and CRDOC.PARENTVAL = :ВыбДокумент*
|ORDER BY
|CRDOC.MDID,
|CRDOC.PARENTVAL,
|CRDOC.CHILD_DATE_TIME_IDDOC
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Виртуальная таблица
Ответ #8 - 25. Сентября 2008 :: 10:56
Печать  
OnCheck писал(а) 25. Сентября 2008 :: 10:13:
про размер не понял


А я не понял тип спр реквизита  Улыбка
Строку
Док.$ОбщийРеквизит.Документоснование IN (SELECT Val FROM :Группа)
Заменить на
Код
Выбрать все
Right(Док.$ОбщийРеквизит.Документоснование,9) IN (SELECT Val FROM :Группа)  



P.S>
В подключении
Collating Sequence=RUSSIAN
на
Collating Sequence=MACHINE
см FAQ по прямым запросам

P.S 2> И два названия Док это круто в одном запросе (без подзапросов)
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Виртуальная таблица
Ответ #9 - 25. Сентября 2008 :: 12:15
Печать  
Оптимизированный по индексу(ДБФ) запрос выборки подчиненных документов для списка спДокумент
     ОлеДБ = СоздатьОбъект("OLEDBData");
     Рез=ОлеДБ.Соединение("
     |Provider=VFPOLEDB.1;
     //      |Deleted=Yes;
     |Null = Yes;
     |Exclusive = No;
     |SourceType = DBF;
     |Data Source=" + КаталогИБ() + ";
     |Mode=ReadWrite;
     |Extended Properties="""";
     |User ID="""";
     |Password="""";
     |Mask Password=False;
     |Collating Sequence=MACHINE;
     |DSN=""""");
     
     ОлеДБКоманда = ОлеДБ.СоздатьКоманду();
     ОлеДБКоманда.ВыполнитьИнструкцию("SET ANSI OFF");
     
     ИмяТаблицы="";
     ОлеДБКоманда.УложитьСписокОбъектов(спДокумент,ИмяТаблицы);
ОлеДБКоманда. УстановитьТекстовыйПараметр ("Группа",ИмяТаблицы);
     
     
     
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	| Жур.iddoc as [Док $Документ] ,
	| Жур.IDDocDef as Док_вид  
	|
	|FROM
	| 1SCRDOC as Отбор
	|
	|INNER JOIN :Группа as ГруппаОтбора
	|         ON Отбор.mdid+Отбор.parentval+DTOS(Отбор.childdate)+Отбор.childtime+Отбор.childid
	|        ='   0'+'O1'+$ВидДокумента.СписаниеПланов+ГруппаОтбора.val
	|
	|LEFT JOIN  1SJOURN as Жур ON Жур.IDDOC=Отбор.CHILDID
	|
	|";    

	тзЗапроса = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
	тзЗапроса.ВыбратьСтроку();  


протестирован
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: Виртуальная таблица
Ответ #10 - 29. Сентября 2008 :: 12:21
Печать  
kiruha писал(а) 25. Сентября 2008 :: 12:15:
Оптимизированный по индексу(ДБФ) запрос выборки подчиненных документов для списка спДокумент
     ОлеДБ = СоздатьОбъект("OLEDBData");
     Рез=ОлеДБ.Соединение("
     |Provider=VFPOLEDB.1;
     //      |Deleted=Yes;
     |Null = Yes;
     |Exclusive = No;
     |SourceType = DBF;
     |Data Source=" + КаталогИБ() + ";
     |Mode=ReadWrite;
     |Extended Properties="""";
     |User ID="""";
     |Password="""";
     |Mask Password=False;
     |Collating Sequence=MACHINE;
     |DSN=""""");
     
     ОлеДБКоманда = ОлеДБ.СоздатьКоманду();
     ОлеДБКоманда.ВыполнитьИнструкцию("SET ANSI OFF");
     
     ИмяТаблицы="";
     ОлеДБКоманда.УложитьСписокОбъектов(спДокумент,ИмяТаблицы);
ОлеДБКоманда. УстановитьТекстовыйПараметр ("Группа",ИмяТаблицы);
     
     
     
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	| Жур.iddoc as [Док $Документ] ,
	| Жур.IDDocDef as Док_вид  
	|
	|FROM
	| 1SCRDOC as Отбор
	|
	|INNER JOIN :Группа as ГруппаОтбора
	|         ON Отбор.mdid+Отбор.parentval+DTOS(Отбор.childdate)+Отбор.childtime+Отбор.childid
	|        ='   0'+'O1'+$ВидДокумента.СписаниеПланов+ГруппаОтбора.val
	|
	|LEFT JOIN  1SJOURN as Жур ON Жур.IDDOC=Отбор.CHILDID
	|
	|";    

	тзЗапроса = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
	тзЗапроса.ВыбратьСтроку();  


протестирован


Запустил торпеду в шлюпку. И как я все это распутаю?
За решение задачи огромное спасибо!
Но моя цель не тупое решение, а приобретение знаний.
Может поможешь как-нибудь доступнее реализовать решение или, что еще лучше, закомментить пример? Например не понятно что за дополнительные параметры в строке подключения а ВОТ ЭТО :
|INNER JOIN :Группа as ГруппаОтбора
|         ON Отбор.mdid+Отбор.parentval+DTOS(Отбор.childdate)+Отбор.childtime+Отбор.childid
|        ='   0'+'O1'+$ВидДокумента.СписаниеПланов+ГруппаОтбора.val?

вообще для меня что-то нечто.
У меня пока не много опыта работа в 1С, а в SQL вообще нет. Прошу помощи?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Виртуальная таблица
Ответ #11 - 29. Сентября 2008 :: 13:02
Печать  
OnCheck писал(а) 29. Сентября 2008 :: 12:21:
строке подключения а ВОТ ЭТО :
|INNER JOIN :Группа as ГруппаОтбора
|         ON Отбор.mdid+Отбор.parentval+DTOS(Отбор.childdate)+Отбор.childtime+Отбор.childid
|        ='   0'+'O1'+$ВидДокумента.СписаниеПланов+ГруппаОтбора.val?

вообще для меня что-то нечто.
У меня пока не много опыта работа в 1С, а в SQL вообще нет. Прошу помощи?


Тогда забей  - делай как делал.
Исправь в первой строке Док на ДокЗаказ, чтобы не было повторов,
Строку
Док.$ОбщийРеквизит.Документоснование IN (SELECT Val FROM :Группа)
Заменить на
Код:
Right(Док.$ОбщийРеквизит.Документоснование,9) IN (SELECT Val FROM :Группа)  

  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: Виртуальная таблица
Ответ #12 - 30. Сентября 2008 :: 04:43
Печать  
kiruha писал(а) 29. Сентября 2008 :: 13:02:
OnCheck писал(а) 29. Сентября 2008 :: 12:21:
строке подключения а ВОТ ЭТО :
|INNER JOIN :Группа as ГруппаОтбора
|         ON Отбор.mdid+Отбор.parentval+DTOS(Отбор.childdate)+Отбор.childtime+Отбор.childid
|        ='   0'+'O1'+$ВидДокумента.СписаниеПланов+ГруппаОтбора.val?

вообще для меня что-то нечто.
У меня пока не много опыта работа в 1С, а в SQL вообще нет. Прошу помощи?


Тогда забей  - делай как делал.
Исправь в первой строке Док на ДокЗаказ, чтобы не было повторов,
Строку
Док.$ОбщийРеквизит.Документоснование IN (SELECT Val FROM :Группа)
Заменить на
Код:
Right(Док.$ОбщийРеквизит.Документоснование,9) IN (SELECT Val FROM :Группа)  



спасибо, так доступней и про размер сразу понял) но комменты по 1-му примеру принял бы с благодарностью  Подмигивание  Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Виртуальная таблица
Ответ #13 - 30. Сентября 2008 :: 06:29
Печать  
OnCheck писал(а) 30. Сентября 2008 :: 04:43:
спасибо, так доступней и про размер сразу понял) но комменты по 1-му примеру принял бы с благодарностью  Подмигивание  Улыбка

Здесь описание таблицы
Описание общих таблиц 1С V77
http://metaprog.co.ua/secrprog/opisanietabl.html#_1

Здесь FAQ по специфике ДБФ FoxPro
http://www.1cpp.ru/forum/YaBB.pl?num=1148038411/25#25
В частности
6.      Могу ли я использовать индексы в запросе ?
Я использую прямой запрос, но родной 1С метод СводныйОстаток() выполняется быстрее, что я делаю не так?
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705/30#31

Дело в том, что твой запрос полностью сканирует таблицу журнала а 1С-метод использует индекс, в результате
твой запрос может оказаться медленнее
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать