Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: УложитьСписокОбъектов() к сторонней базе

Я
   LisaAlisa
 
08.11.17 - 16:39
В базе формирую список значений, состоящий из артикулов, СписокМПЗ. Подключаюсь к другой базе и создаю таблицу
рс.УложитьСписокОбъектов(СписокМПЗ, "СписокМПЗ"); (решетки пока не указываю).
Далее проверяю значения созданной таблицы
select * from списокМПЗ
но в результате всего одна строка с пуcтым значением val и isfolder=2.

Как правильно передать список артикулов во временную таблицу? В дальнейшем надо получить значение себестоимости по указанному списку
 
 
   Ёпрст
 
1 - 08.11.17 - 16:47
(0) ну как тебе сказать помягче то ?
   Ёпрст
 
2 - 08.11.17 - 16:48
УложитьСписокОбъектов приводит всё к id9
   LisaAlisa
 
3 - 08.11.17 - 17:07
(2) и что делать?)
   Ёпрст
 
4 - 08.11.17 - 17:12
(3) изначально, список своих артикулов как получаешь ?
   Ёпрст
 
5 - 08.11.17 - 17:13
на форме выбираешь, или что ?
Делай в одном запросе, обращение к этой базе и к сторонней + синхронизация по твоему артикулу
   LisaAlisa
 
6 - 09.11.17 - 12:42
(5) из текущей базы запросом получаю список нужных артикулов, вторым запросом планировалось из второй базы получить сведения по ним, базы разные. Попробую сделать в одном запросе обращение к разным базам
   LisaAlisa
 
7 - 09.11.17 - 12:58
(5) а можно набросать простой приер, как присоеинять вторую базу sql и писать единый запрос. Например, вывести наименования МПЗ из обеих баз, соединив таблицы по артикулу
   Ёпрст
 
8 - 09.11.17 - 13:03
(7) ща
   Ёпрст
 
9 - 09.11.17 - 13:19
Процедура Сформировать()
    
    
    рс=создатьОбъект("ODBCRecordSet");
    
     ТекстЗапроса = "
    |SELECT
    |    СпрНаш.DESCR as КлиентосВЭтойбазе  -- наименование клиентоса в  этой базе, можно и не присоединять справочник, а просто типизировать
    |    ,Спр.DESCR as КлиентосВУдаленнойБазе --наименование клиентоса в удаленной базе
    |FROM $Справочник.Контрагенты СпрНаш
    |left join dataBase2.dbo.@Справочник.Контрагенты Спр on СпрНаш.Code = Спр.Code
    |";    
    глМД = СоздатьОбъект("MetaDataWork");
    ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
    глМД2 = СоздатьОбъект("MetaDataWork");
    ПутьКБазе2 = "D:\полный путьк базе данных\";
    глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");
    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
    ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);
    
    Т = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    Т.ВыбратьСтроку();

КонецПроцедуры
   Ёпрст
 
10 - 09.11.17 - 13:26
+9 это, ежели вторая база на этом же серваке, либо сервер прилинкован
 
 Рекламное место пустует
   LisaAlisa
 
11 - 09.11.17 - 14:36
(10) базы на разных.
что значит "сервер прилинкован"?
   Ёпрст
 
12 - 09.11.17 - 14:45
   LisaAlisa
 
13 - 09.11.17 - 14:46
Выполняю Запрос в базах, расположенных на одном сервере
    |SELECT
    |    СпрНаш.DESCR as КлиентосВЭтойбазе  -- наименование клиентоса в  этой базе, можно и не присоединять справочник, а просто типизировать
    |    ,Спр.DESCR as КлиентосВУдаленнойБазе --наименование клиентоса в удаленной базе
    |FROM $Справочник.Контрагенты СпрНаш
    |left join dataBase2.dbo.@Справочник.Контрагенты Спр on СпрНаш.Code = Спр.Code
    |";
выдает ошибку : State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'dataBase2.dbo.sc46'.
   Ёпрст
 
14 - 09.11.17 - 14:49
(13) :)
подставь имя своей базы данных, заместо dataBase2

ЗЫ: если сервер прилинкован, то указывается сначала имя сервера точка имя схемы точка имя базы точка имя таблицы ..
   LisaAlisa
 
15 - 09.11.17 - 15:25
Почему запрос работает в виде
|SELECT
    |    Спр.Descr as Наименование,
    |    Спр2.Descr as Наименование2
    |FROM
    |    $Справочник.МПЗ as Спр
    |
    |LEFT JOIN    GM_teach.dbo.@Справочник.МПЗ as Спр2  ON ltrim(rtrim(Спр2.Code))=ltrim(rtrim(Спр.Code))
    |";

Но если хочу еще получить поля Спр.КодСистемы и Спр2.КодСистемы, то выдает ошибку Invalid column name "КодСистемы".
   LisaAlisa
 
16 - 09.11.17 - 15:26
(15) с последним разобралась
   LisaAlisa
 
17 - 09.11.17 - 16:35
теперь проблема с параметрами. В запросе, выполняемом в текущей базе, МПЗ фильтруются, параметры указываются на форме. При присоединении второй базы выдает ошибку
Meta name parser error: не указан параметр ":ВыбТипНакладной"
Ошибка пропадает, если передать конкретное значение, а не параметр
   Ёпрст
 
18 - 09.11.17 - 16:53
(17) больше текста, отсюда не видно, че ты там передаешь и чего лепишь
   LisaAlisa
 
19 - 09.11.17 - 16:57
рс = СоздатьОбъект("ODBCRecordset");
    ТекстЗапроса = "-- qryMaker:Отчет1.2017.11.08.14.44.30
        |SELECT 
        |     Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) РН_дата
        |    , $РасходнаяНакладнаяСтроки.Комитент [Комитент $Справочник.Контрагенты]
        |    , Журнал.$ОбщийРеквизит.ЮридическоеЛицо [ЮридическоеЛицо $Справочник.Контрагенты]
        |    , Журнал.DOCNO РН_номер
        |    , $РасходнаяНакладная.Контрагент [Контрагент $Справочник.Контрагенты]
        |    , $МПЗ1.КодСистемы Артикул
        |    , $МПЗ1.ЕдиницаИзмерения ЕдиницаИзмерения
        |    , $РасходнаяНакладнаяСтроки.Количество Количество
        |    , $РасходнаяНакладнаяСтроки.Цена Цена
        |FROM $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK)
        |    INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
        |    INNER JOIN $_1SJOURN AS Журнал With (NOLOCK) ON РасходнаяНакладная.IDDOC = Журнал.IDDOC
        |    INNER JOIN $Справочник.МПЗ AS МПЗ1 With (NOLOCK) ON $РасходнаяНакладнаяСтроки.МПЗ = МПЗ1.ID
        |    INNER JOIN GM_teach.dbo.@Справочник.МПЗ as МПЗ  ON ltrim(rtrim(@МПЗ.КодСистемы))=ltrim(rtrim($МПЗ1.КодСистемы))
        |WHERE (Cast(Left($Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :НачДата)
        |    AND (Cast(Left($Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :КонДата)
        |    AND ($РасходнаяНакладная.ТипНакладной = :ВыбТипНакладной)
        |    AND ($Журнал.$ОбщийРеквизит.ЮридическоеЛицо = :ВыбЮЛ)
        |    AND ($РасходнаяНакладная.Контрагент = :ВыбКонтрагент)
        |    AND ($РасходнаяНакладнаяСтроки.Комитент = :ВыбКомитент)
        |GROUP BY Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) 
        |    , Журнал.DOCNO
        |    , $МПЗ1.КодСистемы
        |    , $МПЗ1.ЕдиницаИзмерения
        |    , $РасходнаяНакладнаяСтроки.Количество
        |    , $РасходнаяНакладнаяСтроки.Комитент
        |    , Журнал.$ОбщийРеквизит.ЮридическоеЛицо
        |    , $РасходнаяНакладная.Контрагент
        |    , $РасходнаяНакладнаяСтроки.Цена
        |ORDER BY Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)
        |    , Журнал.DOCNO
        |    , $РасходнаяНакладнаяСтроки.Комитент
        |";

    рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
    рс.УстановитьТекстовыйПараметр("ВыбТипНакладной", ВыбТипНакладной);
    рс.УстановитьТекстовыйПараметр("ВыбЮЛ", ВыбЮЛ);
    рс.УстановитьТекстовыйПараметр("ВыбКонтрагент", ВыбКонтрагент);
    рс.УстановитьТекстовыйПараметр("ВыбКомитент", ВыбКомитент);
        
    рс.Отладка(1);
    
    глМД = СоздатьОбъект("MetaDataWork");
    ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
    глМД2 = СоздатьОбъект("MetaDataWork");
    ПутьКБазе2 = "\\,,,";
    глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");
    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
    ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);
    
    тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    тз.ВыбратьСтроку();
   LisaAlisa
 
20 - 09.11.17 - 16:57
Если запрос выполнить без присоединения запроса из второй базы, то на параметры ругани нет
   Ёпрст
 
21 - 09.11.17 - 18:08
(20) ааа.. еще раз устанавливай параметры :)
   Ёпрст
 
22 - 09.11.17 - 18:09
или делай составной текст запроса, в котором параметры потом установишь
   Ёпрст
 
23 - 09.11.17 - 18:11
можешь, так например

|--условия

далее 
ТекстЗапроса = СтрЗаменить(ТестЗапроса,"--условия",
"        |    AND ($РасходнаяНакладная.ТипНакладной = :ВыбТипНакладной)
        |    AND ($Журнал.$ОбщийРеквизит.ЮридическоеЛицо = :ВыбЮЛ)
        |    AND ($РасходнаяНакладная.Контрагент = :ВыбКонтрагент)
        |    AND ($РасходнаяНакладнаяСтроки.Комитент = :ВыбКомитент)");
   Ёпрст
 
24 - 09.11.17 - 18:11
ну и установить текстовый параметр в конце.
   Franchiser
 
25 - 09.11.17 - 19:22
УложитьСписокОбъектов()  работает только со ссылками. Можно было попробовать сделать ВыполнитьSQLИзТЗ().
   Franchiser
 
26 - 09.11.17 - 19:28
+(9) что значит в запросе "@Справочник", и почему "@" затем подменяется?
   Franchiser
 
27 - 09.11.17 - 19:29
(26) все понял, хитро)
   Franchiser
 
28 - 09.11.17 - 19:37
(19) ВыбТипНакладной, ВыбЮЛ, ВыбКонтрагент, ВыбКомитент - это ссылки из текущей базы, нет смысла фильтровать в удаленной базы по ним, т.к. тебе не известно как там выглядят эти ссылки. Можно фильтровать только по примитивным типам или же сначала найти ссылки по примитивными типам, затем установить фильтр на ссылки.
   Ёпрст
 
29 - 10.11.17 - 09:39
(28) смотри внимательнее, фильтруются объекты родной базы.
   Eiffil123
 
30 - 10.11.17 - 10:02
я вообще ничего не понял
   Ёпрст
 
31 - 10.11.17 - 10:20
Хотя не, как в (23) уже не покатит.
лень смотреть, что там возвращается после обрметаsql, подсовывает ли он сразу ссылку на справочник, али нет
   Ёпрст
 
32 - 10.11.17 - 10:36
короче. посмотри, какой запрос идёт опосля обрметаскл, и если там твои условия не "превращаются" в ид, то тупо получи ид элементов через метадатаворк и подставь ручонками в текст запроса.
   LisaAlisa
 
33 - 10.11.17 - 23:37
(32) ошибка выводится как раз на строке ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
 
 
   Ёпрст
 
34 - 11.11.17 - 13:56
(33) Получай ид объектов через метадатаворк и подставляй в текст запроса в свои условия.
   LisaAlisa
 
35 - 11.11.17 - 21:06
(34) делаю так
        глМД = СоздатьОбъект("MetaDataWork");
        IDНачДата = глМД.ЗначениеВСамуюДлиннуюСтрокуБД(НачДата);
        IDКонДата = глМД.ЗначениеВСамуюДлиннуюСтрокуБД(КонДата);
        IDВыбТипНакладной = глМД.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбТипНакладной);
        
    рс.УстановитьТекстовыйПараметр("НачДата", IDНачДата);
    рс.УстановитьТекстовыйПараметр("КонДата", IDКонДата);
    рс.УстановитьТекстовыйПараметр("ВыбТипНакладной", IDВыбТипНакладной);

Значения в отладчике
IDНачДата = "D20171001              "
IDКонДата = "D20171001              "
IDВыбТипНакладной = "E1  TC    TD           "

ошибка та же Meta name parser error: не указан параметр ":НачДата"
   LisaAlisa
 
36 - 11.11.17 - 21:20
(34) теперь поняла, что без параметров надо сделать.
   LisaAlisa
 
37 - 11.11.17 - 22:11
(34) Ёпрст, Спасибо огромное!!!
   LisaAlisa
 
38 - 11.11.17 - 22:40
Еще вопрос остался, надеюсь, последний)
из сторонней базы мне нужно получить периодический реквизит. Запрос выглядит так
    ТекстЗапроса = "-- qryMaker:Отчет1.2017.11.08.14.44.30
        |SELECT 
        //|    $РасходнаяНакладная.IDDOC РНСсылка

        |     Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) РН_дата
        |    , $РасходнаяНакладнаяСтроки.Комитент [Комитент $Справочник.Контрагенты]
        |    , Журнал.$ОбщийРеквизит.ЮридическоеЛицо [ЮридическоеЛицо $Справочник.Контрагенты]
        |    , Журнал.DOCNO РН_номер
        |    , $РасходнаяНакладная.Контрагент [Контрагент $Справочник.Контрагенты]
        |    , $МПЗ1.КодСистемы Артикул
        |    , $МПЗ1.ЕдиницаИзмерения ЕдиницаИзмерения
        |    , $РасходнаяНакладнаяСтроки.Количество Количество
        |    , $РасходнаяНакладнаяСтроки.Цена Цена
        |    , @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"') УправленческаяСебестоимость
        |FROM $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK)
        |    INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
        |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON РасходнаяНакладная.IDDOC = Журнал.IDDOC
        |    INNER JOIN $Справочник.МПЗ AS МПЗ1 With (NOLOCK) ON $РасходнаяНакладнаяСтроки.МПЗ = МПЗ1.ID
        |    INNER JOIN GM_teach.dbo.@Справочник.МПЗ as МПЗ  ON ltrim(rtrim(@МПЗ.КодСистемы))=ltrim(rtrim($МПЗ1.КодСистемы))
        |WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= '"+IDНачДата+"')
        |    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= '"+IDКонДата+"')
        | --УсловиеТипНакладной
        | --УсловиеЮЛ
        | --УсловиеКонтрагент
        | --УсловиеКомитент
        |GROUP BY Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) 
        |    , Журнал.DOCNO
        |    , $МПЗ1.КодСистемы
        |    , $МПЗ1.ЕдиницаИзмерения
        |    , $РасходнаяНакладнаяСтроки.Количество
        |    , $РасходнаяНакладнаяСтроки.Комитент
        |    , Журнал.$ОбщийРеквизит.ЮридическоеЛицо
        |    , $РасходнаяНакладная.Контрагент
        |    , $РасходнаяНакладнаяСтроки.Цена
        |    , @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"')
        |ORDER BY Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)
        |    , Журнал.DOCNO
        |    , $РасходнаяНакладнаяСтроки.Комитент
        |";

как мне полученное поле "УправленческаяСебестоимость" указать в группировке? В текущем виде запрос не работает
   Franchiser
 
39 - 12.11.17 - 14:05
Самый простой вариант: Оберни во вложенный запрос, или помести во временную таблицу через Into, потом выбери из нее данные с группировкой
   Franchiser
 
40 - 12.11.17 - 14:10
(35) idшники ты неправильно получаешь, запрос ничего не вернет
   Franchiser
 
41 - 12.11.17 - 14:12
И к datetime преобразовывать в условие не надо
   LisaAlisa
 
42 - 12.11.17 - 21:33
(40) запрос работает.
Айди получаю 
    глМД = СоздатьОбъект("MetaDataWork");
    IDНачДата = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(НачДата),2,9);
    IDКонДата = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(КонДата),2,9);
    IDВыбТипНакладной = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбТипНакладной),7,9);
    IDВыбЮЛ = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбЮЛ),7,9);
    IDВыбКонтрагент = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбКонтрагент),7,9);
    IDВыбКомитент = Сред(глМД.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбКомитент),7,9);
   LisaAlisa
 
43 - 12.11.17 - 21:44
(41) Запрос возвращает корректно данные, полученные из текущей базы, а вот а вот из сторонней возвращает значение NULL
Т.е. , @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"') УправленческаяСебестоимость
в sql это выглядит так 
SELECT 
     Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) РН_дата
    , РасходнаяНакладнаяСтроки.sp488 [Комитент $Справочник.Контрагенты]
    , Журнал.sp697 [ЮридическоеЛицо $Справочник.Контрагенты]
    , Журнал.DOCNO РН_номер
    , РасходнаяНакладная.sp104 [Контрагент $Справочник.Контрагенты]
    , МПЗ1.sp178 Артикул
    , МПЗ1.sp139 ЕдиницаИзмерения
    , РасходнаяНакладнаяСтроки.sp120 Количество
    , РасходнаяНакладнаяСтроки.sp121 Цена
    , (
select top 1
cast(c1281_vv.value as numeric(18, 4))
from
_1sconst as c1281_vv (nolock)
where
c1281_vv.id = 1281 and
c1281_vv.objid = МПЗ.ID and
(c1281_vv.date <= '20171001')
order by c1281_vv.date desc, c1281_vv.time desc, c1281_vv.docid desc, c1281_vv.row_id desc
) УправленческаяСебестоимость
FROM dh130 AS РасходнаяНакладная With (NOLOCK)
    INNER JOIN dt130 AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON РасходнаяНакладная.IDDOC = Журнал.IDDOC
    INNER JOIN sc155 AS МПЗ1 With (NOLOCK) ON РасходнаяНакладнаяСтроки.sp119 = МПЗ1.ID
    INNER JOIN GM_teach.dbo.sc72 as МПЗ  ON ltrim(rtrim(МПЗ.sp66))=ltrim(rtrim(МПЗ1.sp178))
WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= '20171001')
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= '20171001')
 AND (РасходнаяНакладная.sp1062 = '    TD   ')
 AND (Журнал.sp697 = '     7   ')
 AND (РасходнаяНакладная.sp104 = '  EM7C   ')
 AND (РасходнаяНакладнаяСтроки.sp488 = '     B   ')
   LisaAlisa
 
44 - 12.11.17 - 21:48
(43) при этом если получать из сторонней базы не периодические реквизиты, они возвращаются. Проблема именно с периодическим
   Franchiser
 
45 - 12.11.17 - 22:39
(44) логично, не используй ПоследнееЗначение, он тебе выдаст неверный результат, т.к. парсер ничего не знает о том что нужно сгенерировать запрос к таблицам другой базы. Например _1sconst по твоему запросу будет взята из текущей базы. Нужно написать gm_teach.dbo._1sconst остальные поля пиши с @, чтобы указать парсеру, что они из другой базы
   Franchiser
 
46 - 12.11.17 - 22:41
Кстати  я не уверен что в ПоследнееЗначение нужно передать идентификатор даты, там д.б. тип дата
   LisaAlisa
 
47 - 13.11.17 - 07:35
(46) с датой прокатывает. Проверяла подобный запрос, используя стороннюю базу как текущую для проверки
   LisaAlisa
 
48 - 13.11.17 - 07:40
(45) @ можно вставлять непосредственно в sql?
такой вариант не прокатывает
    , (
select top 1
cast(@c1281_vv.value as numeric(18, 4))
from
gm_teach.dbo._1sconst as c1281_vv (nolock)
where
@c1281_vv.id = 1281 and
@c1281_vv.objid = МПЗ.ID 
and (@c1281_vv.date <= '20171001')
order by @c1281_vv.date desc, @c1281_vv.time desc, @c1281_vv.docid desc, @c1281_vv.row_id desc
) УправленческаяСебестоимость

Must declare the variable '@c1281_vv'.
   LisaAlisa
 
49 - 13.11.17 - 07:47
(45) почти получилось. В sql пишу не _1sconst , а gm_teach.dbo._1sconst 

но ведь это уже отпарсенный запрос. Но как это описать в виде @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"') УправленческаяСебестоимость 

или вообще никак?
 
 Рекламное место пустует
   Ёпрст
 
50 - 13.11.17 - 09:29
(49) Покажи текст запрса, который сейчас не работает.
ЗЫ: используй не ЗначениеВСамуюДлиннуюСтрокуБД,а просто
ЗначениеВСтрокуБД - не надо будет всякие сред делать.
   Franchiser
 
51 - 13.11.17 - 10:47
@c1281_vv замени на c1281_vv
   LisaAlisa
 
52 - 13.11.17 - 12:11
(50) Запрос из- 1с
        |SELECT 
        |     Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) РН_дата
        |    , $РасходнаяНакладнаяСтроки.Комитент [Комитент $Справочник.Контрагенты]
        |    , Журнал.$ОбщийРеквизит.ЮридическоеЛицо [ЮридическоеЛицо $Справочник.Контрагенты]
        |    , Журнал.DOCNO РН_номер
        |    , $РасходнаяНакладная.Контрагент [Контрагент $Справочник.Контрагенты]
        |    , $МПЗ1.КодСистемы Артикул
        |    , $МПЗ1.ЕдиницаИзмерения ЕдиницаИзмерения
        |    , $РасходнаяНакладнаяСтроки.Количество Количество
        |    , $РасходнаяНакладнаяСтроки.Цена Цена
        |    , @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"') УправленческаяСебестоимость
        |FROM $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK)
        |    INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
        |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON РасходнаяНакладная.IDDOC = Журнал.IDDOC
        |    INNER JOIN $Справочник.МПЗ AS МПЗ1 With (NOLOCK) ON $РасходнаяНакладнаяСтроки.МПЗ = МПЗ1.ID
        |    INNER JOIN GM_teach.dbo.@Справочник.МПЗ as МПЗ  ON ltrim(rtrim(@МПЗ.КодСистемы))=ltrim(rtrim($МПЗ1.КодСистемы))
        |WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= '"+IDНачДата+"')
        |    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= '"+IDКонДата+"')
        | --УсловиеТипНакладной
        | --УсловиеЮЛ
        | --УсловиеКонтрагент
        | --УсловиеКомитент
   LisaAlisa
 
53 - 13.11.17 - 12:12
Запрос возвращает NULL в поле, получаемом из сторонней базы УправленческаяСебестоимость
В sql он выглядит так:
SELECT 
     Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) РН_дата
    , РасходнаяНакладнаяСтроки.sp488 [Комитент $Справочник.Контрагенты]
    , Журнал.sp697 [ЮридическоеЛицо $Справочник.Контрагенты]
    , Журнал.DOCNO РН_номер
    , РасходнаяНакладная.sp104 [Контрагент $Справочник.Контрагенты]
    , МПЗ1.sp178 Артикул
    , МПЗ1.sp139 ЕдиницаИзмерения
    , РасходнаяНакладнаяСтроки.sp120 Количество
    , РасходнаяНакладнаяСтроки.sp121 Цена
    , (
select top 1
cast(c1281_vv.value as numeric(18, 4))
from
_1sconst as c1281_vv (nolock)
where
c1281_vv.id = 1281 and
c1281_vv.objid = МПЗ.ID and
(c1281_vv.date <= '20171001')
order by c1281_vv.date desc, c1281_vv.time desc, c1281_vv.docid desc, c1281_vv.row_id desc
) УправленческаяСебестоимость
FROM dh130 AS РасходнаяНакладная With (NOLOCK)
    INNER JOIN dt130 AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON РасходнаяНакладная.IDDOC = Журнал.IDDOC
    INNER JOIN sc155 AS МПЗ1 With (NOLOCK) ON РасходнаяНакладнаяСтроки.sp119 = МПЗ1.ID
    INNER JOIN GM_teach.dbo.sc72 as МПЗ  ON ltrim(rtrim(МПЗ.sp66))=ltrim(rtrim(МПЗ1.sp178))
WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= '20171001')
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= '20171001')
 AND (РасходнаяНакладная.sp1062 = '    TD   ')
 AND (Журнал.sp697 = '     7   ')
 AND (РасходнаяНакладная.sp104 = '  EM7C   ')
 AND (РасходнаяНакладнаяСтроки.sp488 = '     B   ')
   LisaAlisa
 
54 - 13.11.17 - 12:15
Если вручную подшаманить sql запрос, то результат возвращается верный
Для этого в подзапросе ставим @ перед _1sconst
(
select top 1
cast(c1281_vv.value as numeric(18, 4))
from
@_1sconst as c1281_vv (nolock)
where
c1281_vv.id = 1281 and
c1281_vv.objid = МПЗ.ID and
(c1281_vv.date <= '20171001')
order by c1281_vv.date desc, c1281_vv.time desc, c1281_vv.docid desc, c1281_vv.row_id desc
) УправленческаяСебестоимость
вопрос в том, как указать эту манипуляцию в выражении @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"') УправленческаяСебестоимость
   Ёпрст
 
55 - 13.11.17 - 12:30
(54) элементарно.

| --УправленческаяСебестоимость
и после первого ОбрМетаскуэль подменяй на 
 @ПоследнееЗначение.МПЗ.УправленческаяСебестоимость(МПЗ.ID, '"+IDНачДата+"')
   Ёпрст
 
56 - 13.11.17 - 12:32
ну или, не используй последнееЗначение, а пиши запрос на периодику руками, пример у тебя есть в развёрнутом виде.
Там, заместо _1sconst пиши @_1sconst и всё.
   Ёпрст
 
57 - 13.11.17 - 12:32
в дбф, например, нет ПоследнееЗначение и ничего, всё пишется ручонками :)_
   LisaAlisa
 
58 - 13.11.17 - 12:52
Ёпрст,    Franchiser

спасибо вам!!! теперь всё работает и, что еще круче, я стала понимать, что происходит))



Список тем форума
Рекламное место пустует Рекламное место пустует
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует