Переключение на Главную Страницу Страницы: 1 ... 43 44 [45] 46 47 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 243525 )
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #660 - 24. Октября 2014 :: 09:18
Печать  
В
Код
Выбрать все
:ДатаНач~ 


убери
Код
Выбрать все
~ 

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


1C++ rocks!

Сообщений: 57
Зарегистрирован: 03. Мая 2011
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #661 - 24. Октября 2014 :: 09:37
Печать  
Спасибо за совет.
Проблема решилась переиндексацией.

Как показывает практика, вт БИ "более" чувствительна к индексам, чем объект БухгалтерскиеИтоги.

Хотя может я не умею ее готовить?
  
Наверх
 
IP записан
 
Fisco
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Зарегистрирован: 26. Июня 2014
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #662 - 01. Ноября 2014 :: 13:25
Печать  
Делаю выборку остатков, количество это измерение регистра, а вот цену хочу вытащить из соответствующей строки документа. Вроде и ошибок не выдает, но и цены тоже нет... В чем подвох?

     ТекстЗапроса = "
     |ВЫБРАТЬ
     |      ОстаткиПоставщикам.Клиент КАК [Поставщик $Справочник.Клиенты]
     |      ,ОстаткиПоставщикам.Товар КАК [Товар $Справочник.Товары]
     |      ,ОстаткиПоставщикам.Заказ КАК [Заказ $Справочник.Заказы]
     |      ,ОстаткиПоставщикам.ЗаказПоставщику  КАК [Документ $Документ]
     |      ,ЗаказТЧ.Цена КАК [Цена :Число.10.3]
     |      ,ОстаткиПоставщикам.КоличествоОстаток КАК [Остаток :Число.10.3]
     |ИЗ
     |      ство)) AS ОстаткиПоставщикам
     |
     |ЛЕВОЕ СОЕДИНЕНИЕ
     |      ДокументСтроки.ЗаказПоставщику КАК ЗаказТЧ $NOLOCK
     |      ПО (ОстаткиПоставщикам.ЗаказПоставщику = $ЗаказТЧ.ТекущийДокумент)
     |      И (ОстаткиПоставщикам.Заказ = $ЗаказТЧ.Заказ)
     |
     |СГРУППИРОВАТЬ
     |      ОстаткиПоставщикам.Клиент,ОстаткиПоставщикам.ЗаказПоставщику, ОстаткиПоставщикам.Товар,ОстаткиПоставщикам.Заказ
     |";
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #663 - 18. Декабря 2014 :: 01:59
Печать  
предложение по внесению доработок в метод виртуального значения

было:    $ПоследнееЗначение.<ВидОбъекта>.<Идентификатор>(Элемент,Дата)

теперь:  $ПоследнееЗначение.<ВидОбъекта>.<Идентификатор>(Элемент,Дата[,ВозвращаемоеЗначение])

пример:

Код
Выбрать все
select ....
, иция,ЗначениеПоПозиции),:ПустойИД) как СледующиеНормы
....
 


Что реализовано (во вложении) + причины:

1. для случая когда в качестве параметра "Дата" передается выражение SQL
   есть ограничения:
   - только тип "Дата" (это не удобно)
   - значение всегда возвращается на начало дня (считаю это ошибкой!)

   Стандартное поведение 1С77
   всегда возвращает ПОСЛЕДНЕЕ значение
   на КОНЕЦ дня (или на позицию документа):

Код
Выбрать все
Рез = СпрЭлемент.Реквизит.Получить(ПеременнаяТипаДатаИлиДок); 



   По этому поводу уже задавался (много раз) вопрос
   "Как получить значение на конец дня ?"
   
   Как пример, здесь http://www.1cpp.ru/forum/YaBB.pl?num=1285352210/635#635

2. Метод не позволяет получить ничего, кроме "Значение" на позицию или дату

   Хочу иметь аналогию

Код
Выбрать все
    Пер = СоздатьОбъект(Периодический);
    ...
    Пер.ДатаЗнач
    Пер.Значение
    Пер.ТекущийДокумент()
    Пер.ТекущийРеквизит()
    ....и т.д
 


   уже было предложено решение этой задачи
   здесь http://www.1cpp.ru/forum/YaBB.pl?num=1285352210/519#519
   но оно не попало в стандартный класс

3. Хочу в качестве параметра "Дата" передавать
   не только параметр ":ВыбДатаХХХ" или "ВыражениеSQL"
   но также и литерал типа 'Дата' или 'ПозицияДокументаБД23'



РЕАЛИЗОВАЛ ЭТИ ХОТЕЛКИ. ТЕПЕРЬ МЕТОД ВЫГЛЯДИТ ТАК:

Код
Выбрать все
$ПоследнееЗначение.<ВидОбъекта>.<Идентификатор>(Элемент,Дата[,ВозвращаемоеЗначение])

где:

'Дата' 	= (стандартно) параметр вида ':ВыбДата[Модиф]'
	= (стандартно) выражение SQL типа 'Дата'
	= (дополнение) выражение SQL типа 'ПозицияДокументаБД23'
	= (дополнение) литерал вида 'ГГГГММДД' или 'ПозицияДокументаБД23'

'ВозвращаемоеЗначение' = одно из

	'<пусто>|Значение' = стандартное поведение
	+ для случая литерал вида 'ГГГГММДД' или 'ПозицияДокументаБД23'

	'ЗначениеПоПозиции' = когда передается выражение SQL типа 'ПозицияДокументаБД23'

	дополнительно (по аналогии с объектом "Периодический")
	начения'

	По-умолчанию = <пусто>, что соотвествует значению 'Значение'

 




Чтобы это работало, нужно заменить в классе соответствующую функцию

Код
Выбрать все
Функция ПарсингВТПоследнееЗначение(ТекстДляОбработки)
... 



текст функции - во вложении
« Последняя редакция: 18. Декабря 2014 :: 07:44 - kos »  

_________________.7z ( 3 KB | Загрузки )
Наверх
 
IP записан
 
AntiBuh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 26
Зарегистрирован: 28. Июля 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #664 - 07. Апреля 2015 :: 07:08
Печать  
Подскажите как построить запрос
Есть два справочника А и Б
у справочника А есть реквизит Неопределенный справочник, может принимать значения из справочника Б
Требуется получить табличку значение А и реквизиты из Б
Вроде просится Соединение, но никак не соображу как
получается что типы не совпадают, а как уравнять не знаю
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #665 - 07. Апреля 2015 :: 08:19
Печать  
Код
Выбрать все
select
   $Б.Реквизит
from $Справочник.А А
left join $Справочник.Б Б on А.Реквизит = $ВидСправочника.Б+Б.id 

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


1C++ rocks!

Сообщений: 26
Зарегистрирован: 28. Июля 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #666 - 07. Апреля 2015 :: 09:52
Печать  
Спасибо, всё получилось
  
Наверх
 
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #667 - 18. Апреля 2015 :: 05:33
Печать  
вспоможите плиз. в чем косяк понять не могу...

Код
Выбрать все
ТекстЗапроса="
 	|ВЫБРАТЬ
    |   $ДокНакладная.ТекущийДокумент КАК [Документ $Документ.РасходнаяНакладная],
    |   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура]
    |ИЗ
    |   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   ЖурналДокументов КАК Жур $nolock
    |ПО
    |   Стр.Документ = $Жур.ТекущийДокумент
    |ГДЕ
    |   $Жур.Проведен = 1
    //|   И $ДокСтроки.Номенклатура = :ВыбНоменклатура~~
    |   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
    |УПОРЯДОЧИТЬ
    |   Стр.Документ";

	ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp.dll");
	Запрос = СоздатьОбъект("ПрямойЗапрос");

	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьТекстовыйПараметр("ДатаНач",Дата1);
	Запрос.УстановитьТекстовыйПараметр("ДатаКон",Дата2);
	Запрос.РежимОтладки = 1;

	ИТЗ = Запрос.Выполнить();
	ИТЗ.ВыбратьСтроку();  



получаю ошибку:
ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : Meta name parser error: неизвестное метаимя или алиас "$ДокНакладная"
ЗапросODBC.ВыполнитьИнструкцию(ТекстЗапроса,ПолучательЗапроса,1);

мне всего лишь надо отобрать товары и накладные проведенные в диапазоне дат, сумму бы с количеством прикрутить еще бы не помешало. но хотябы это для начала понять. дэр инструкшн прочитан, ясности не добавло, метод научного тыка тоже результатов не приносит....
  
Наверх
 
IP записан
 
AntiBuh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 26
Зарегистрирован: 28. Июля 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #668 - 18. Апреля 2015 :: 08:58
Печать  
rom35 писал(а) 18. Апреля 2015 :: 05:33:
вспоможите плиз. в чем косяк понять не могу...


Ну дык таблицы ДокНакладная нет, есть ДокСтроки, Документ и Жур
  
Наверх
 
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #669 - 19. Апреля 2015 :: 06:07
Печать  
Спасибо огромное. переделал. с этим разобрался.
Код
Выбрать все
ВЫБРАТЬ
    |   $Документ.ТекущийДокумент КАК [Документ $Документ.РасходнаяНакладная],
    |   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
	|   $ДокСтроки.Всего КАК [Всего $Число],
	|   $ДокСтроки.Количество КАК [Кол $Число]
    |ИЗ
    |   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   ЖурналДокументов КАК Жур $nolock
    |ПО
    |   Стр.Документ = $Жур.ТекущийДокумент
    |ГДЕ
    |   $Жур.Проведен = 1,
    |   И $ДокСтроки.Товар = :ВыбНоменклатура,
    |   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
    |УПОРЯДОЧИТЬ
    |   Стр.Документ"; 



теперь вываливает:
ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'WHERE'.

режим отладки показывает:
Код
Выбрать все
SELECT
   Документ.IDDOC AS [Документ $Документ.РасходнаяНакладная],
   ДокСтроки.SP2993 AS [Товар $Справочник.Номенклатура],
   ДокСтроки.SP2996 AS [Всего $Число],
   ДокСтроки.SP2994 AS [Кол $Число]
FROM
   DT2988 AS ДокСтроки (nolock)
LEFT JOIN
   DH2988 AS Документ
LEFT JOIN
   _1SJOURN AS Жур (nolock)
ON
   Стр.Документ = Жур.IDDOC
WHERE
   Жур.CLOSED&1 = 1,
   AND ДокСтроки.SP2993 = '   373В  ',
   AND (LEFT(Жур.DATE_TIME_IDDOC,8) BETWEEN '20150419' AND '20150419')
ORDER BY
   Стр.Документ 



я так понимаю чтото с условиями... пробовал тупо оставлять по одному условию, ошибка таже. совсем без WHERE тоже не работает, ругается: Incorrect syntax near the keyword 'ORDER'.
если и его убрать вываливает: Incorrect syntax near 'IDDOC'.
короче ступор....
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #670 - 19. Апреля 2015 :: 06:29
Печать  
rom35 писал(а) 19. Апреля 2015 :: 06:07:
Код
Выбрать все
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   ЖурналДокументов КАК Жур $nolock
    |ПО
    |   Стр.Документ = $Жур.ТекущийДокумент 



А у первого соединения куда ПО дел?
  
Наверх
ICQ  
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #671 - 19. Апреля 2015 :: 07:01
Печать  
вроде и логика простая но както тяжко дается сей предмет Улыбка
Код
Выбрать все
ТекстЗапроса="
 	|ВЫБРАТЬ
    |   $Документ.ТекущийДокумент КАК [Документ $Документ.РасходнаяНакладная],
    |   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
	|   $ДокСтроки.Всего КАК [Всего $Число],
	|   $ДокСтроки.Количество КАК [Кол $Число]
    |ИЗ
	|   ЖурналДокументов КАК Жур $nolock
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ $nolock ПО Документ = $Жур.ТекущийДокумент
	|ЛЕВОЕ СОЕДИНЕНИЕ
    |   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО ДокСтроки = $Жур.ТекущийДокумент
    |ГДЕ
    |   $Жур.Проведен = 1
    |   И $ДокСтроки.Товар = :ВыбНоменклатура
    |   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
    |УПОРЯДОЧИТЬ
    |   Документ"; 



State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Документ'.

засада какая то... честно прочел все 150 страниц мануала, но логику начинаю понимать только сейчас, и то пока только в общих чертах  Нерешительный
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #672 - 19. Апреля 2015 :: 10:21
Печать  
[quote author=rom35 link=1285352210/660#671 date=1429426888]
Код
Выбрать все
    |ИЗ
	|   ЖурналДокументов КАК Жур $nolock
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ $nolock ПО Документ = $Жур.ТекущийДокумент
	|ЛЕВОЕ СОЕДИНЕНИЕ
    |   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО ДокСтроки = $Жур.ТекущийДокумент
 



Видимо должно быть вот так:

Код
Выбрать все
    |ИЗ
	|   ЖурналДокументов КАК Жур $nolock
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|   Документ.РасходнаяНакладная КАК Документ $nolock ПО $Документ.ТекущийДокумент = $Жур.ТекущийДокумент
	|ЛЕВОЕ СОЕДИНЕНИЕ
    |   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО $ДокСтроки.ТекущийДокумент = $Жур.ТекущийДокумент
 



Так как Просто Документ и ДокСтроки это как бы таблички вообще а $Документ.ТекущийДокумент это конкретны поля с ИД документа в данном случае.
  
Наверх
 
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #673 - 28. Апреля 2015 :: 16:24
Печать  
Никто не пробовал? теоретически возможно сделать отбор по ссылке с двойным вложением?

т.е. есть в документа реквизит табл. части ТорговыйАгент у него в свою очередь есть реквизит Супервайзер.

вытаюсь сделать чтото подобное:

Код
Выбрать все
|ВЫБРАТЬ";
|$Документ.ТоргТочка КАК [ТТ $Справочник.ТорговыеТочки],
|$ДокСтроки.ТорговыйАгент.Супервайзер КАК [СВ $Справочник.Сотрудники] 



ругается: The column prefix 'ДокСтроки.SP15585' does not match with a table name or alias name used in the query.

где SP15585 - это какразтаки "ТорговыйАгент"
есть конечно вариант выгрузить все это как:
Код
Выбрать все
|ВЫБРАТЬ";
|$Документ.ТоргТочка КАК [ТТ $Справочник.ТорговыеТочки],
|$ДокСтроки.ТорговыйАгент КАК [СВ $Справочник.Сотрудники] 



а потом перебрать всю ТЗ и заменить реквизит СВ на СВ.Супервайзер. если по другому никак придется так и делать...

p.s. чует мое сердце надо чтото с левыми соединениями мутить....
вот весь запрос
Код
Выбрать все
ВЫБРАТЬ
   $Документ.ТоргТочка КАК [ТТ $Справочник.ТорговыеТочки],
   $ДокСтроки.ТорговыйАгент.Супервайзер КАК [СВ $Справочник.Сотрудники],
   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
   $ДокСтроки.Количество КАК [Кол $Число]
ИЗ
   ЖурналДокументов КАК Жур $nolock
ЛЕВОЕ СОЕДИНЕНИЕ
   Документ.РасходнаяНакладная КАК Документ $nolock ПО $Документ.ТекущийДокумент = $Жур.ТекущийДокумент
ЛЕВОЕ СОЕДИНЕНИЕ
   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО $ДокСтроки.ТекущийДокумент = $Жур.ТекущийДокумент
ГДЕ
   $Жур.Проведен = 1
   И $Документ.ДокОбмен = :ПустойИД13
   И $ДокСтроки.Товар IN (SELECT Val FROM #СписТовара)
   И $Документ.МестоХранения IN (SELECT Val FROM #ВыбМХы)
   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
УПОРЯДОЧИТЬ
   $ДокСтроки.Товар,
   $Документ.ТоргТочка
 

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #674 - 28. Апреля 2015 :: 17:14
Печать  
Именно соединениями.
Левое - если может быть ситуация, что поле будет пустое или незаполненое. Если поле гарантированно заполнено, то лучше использовать Внутреннее соединение.
Что касается твоего вопроса - то надо представлять - как устроено хранение данных в таблицах 1С-ки.
Для этого лучше всего использовать тестовый запрос вида
Код
Выбрать все
ВЫБРАТЬ ПЕРВЫЕ 1 $ДокСтроки.ТорговыйАгент from ДокументСтроки.РасходнаяНакладная 


Так ты увидишь содержимое базы без всяких прикрас и поймешь, что красивое "$ДокСтроки.ТорговыйАгент" всего лишь поле типа spXXX в котором находится ИД-шник вида "    1A ".
А сам Торговый агент находится в таблице "$Справочник.Сотрудники", т.е. чтобы получить реквизит Супервайзер надо присоединить к строке документа справочник "Сотрудники" и уже у этой присоединенной таблицы взять поле. (Если оно не периодическое, конечно).
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 43 44 [45] 46 47 ... 51
ОтправитьПечать