![]() |
![]() |
![]() |
|
v7: Прямой запрос во внешнюю базу. | ☑ | ||
---|---|---|---|---|
0
Heaz3
17.07.18
✎
13:35
|
Ситуация такая: есть самописная сервисная конфигурация, осуществляющая перемещение данных через ОЛЕ из типовой конфы в текстовый файл для конфы руководителей подразделений. Собираюсь ускорить процесс выгрузки данных из типовой, посредством добавления прямых запросов. База DBF. Использую следующий код:
ОлеДБ = СоздатьОбъект("OLEDBData"); а="ПУТЬ_К_ВНЕШНЕЙ_БАЗЕ\"; б="Provider=VFPOLEDB.1;Data Source= ""ПУТЬ_К_ВНЕШНЕЙ_БАЗЕ\""; User ID=""АДМИН""; Password=""ПАРОЛЬ_АДМИНА"";Mode=Read;Collating Sequence=MACHINE"; ОлеДБ.ПрисоединитьИБ(а,б); Запрос = ОлеДБ.СоздатьКоманду(); Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')"); Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')"); Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')"); Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')"); НачДата='01.01.2018'; КонДата=Дат; мд = СоздатьОбъект("MetaDataWork"); НачПериод = мд.ПолучитьНачПериода(НачДата); ПредПериод = мд.ПолучитьНачПериода(НачПериод-1); КонПериод = мд.ПолучитьКонПериода(КонДата); ТекстЗапроса = " |SELECT | Рег.БСО as Бланк | ,Рег.Номер as Номер | ,Рег.МестоХранения as [МестоХранения $Спраочник.МестаХранения] | ,Рег.Материал as [Материал $Справочник.Материалы] | ,Рег.Справочник as [Справочник $Справочник.ТипыБланков] | ,SUM(Рег.НачОст+Рег.Приход-Рег.Расход) КонОст |FROM | ( | SELECT | $Итоги.БСО БСО | ,$Итоги.Номер Номер | ,$Итоги.МестоХранения МестоХранения | ,$Итоги.Материал Материал | ,$Итоги.Справочник Справочник | ,$Итоги.Наличие НачОст | ,0 Приход | ,0 Расход | ,0 | FROM | $РегистрИтоги.БСО Итоги | WHERE | DTOS(Итоги.period)+$Итоги.БСО | LIKE (DTOS(:ПредПериод~~)+'_________') | UNION ALL | | SELECT | $Движения.БСО | ,$Движения.Номер | ,$Движения.МестоХранения | ,$Движения.Материал | ,$Движения.Справочник | ,$Движения.Наличие * (1 - Движения.debkred * 2) | ,0 | ,0 | ,0 | FROM | $Регистр.БСО Движения | WHERE | DTOS(Движения.date)+Движения.time+Движения.iddoc+STR(Движения.lineno,4)+STR(Движения.actno,6) BETWEEN | DTOS(:НачПериод~~)+' '+' '+' '+' ' | And DTOS(:КонПериод~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ' | | UNION ALL | | SELECT | $Оборот.БСО | ,$Оборот.Номер | ,$Оборот.МестоХранения | ,$Оборот.Материал | ,$Оборот.Справочник | ,0 | ,$Оборот.Наличие*(1-Оборот.Debkred) | ,$Оборот.Наличие*Оборот.Debkred | ,0 | FROM | $Регистр.БСО Оборот | WHERE | DTOS(Оборот.date)+Оборот.time+Оборот.iddoc+STR(Оборот.lineno,4)+STR(Оборот.actno,6) BETWEEN | DTOS(:НачДата~~)+' '+' '+' '+' ' | And DTOS(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ' | ) Рег |WHERE | Рег.НачОст+Рег.Приход-Рег.Расход=1 |Group by Бланк,Номер,МестоХранения,Материал,Справочник |"; Запрос.УстановитьТекстовыйПараметр("ПредПериод",ПредПериод); Запрос.УстановитьТекстовыйПараметр("НачПериод",НачПериод); Запрос.УстановитьТекстовыйПараметр("КонПериод",НачДата-1); Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата); Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.Выгрузить(Таблица1); Колонки БСО, Номер и Наличие в регистре у меня текст-символы, там все хорошо выдает, проблемы начинаются с объектами Материал, Справочник, МестоХранения. Я так понимаю когда я обращаюсь к $Итоги.Материал как Материал, я получаю ссылку в виде строки, а если я обращусь к $Итоги.Материал как [Материал, $Справочник.Материалы] то мне должно вернуть элемент справочника. Когда я делал запрос из типовой конфы в ее же остатки, все выдавало верно. Но когда я начинаю подключатся из сервисной, то я получаю пустую строку. Суть вопроса: как мне сделать так, что бы мне хотя бы выдавало код или название справочников, или подключить метаданные из той базы. Есть ли альтернативы "ПрисоеденитьИБ" VFPOLEDB для DBF. |
|||
1
АНДР
17.07.18
✎
16:10
|
ОфТоп
Посмотри http://www.1cpp.ru/forum/YaBB.pl?num=1214205575 |
|||
2
fedoss
17.07.18
✎
16:16
|
А в чем проблема сджоинить эту таблицу с нужными справочниками и взять оттуда любые реквизиты?
|
|||
3
Salimbek
17.07.18
✎
19:50
|
(1) 1SQLite работает только из "своей" базы.
(0) У тебя не Элемент справочника возвращается, а его Id. Просто когда пишешь [Материал, $Справочник.Материалы] - 1С++ понимает, что ты на самом деле хочешь тут получить элемент этого справочника, и сам из ID получает элемент. Таким образом, если у тебя есть Id и тебе надо получить, например, Код, то делаешь, как и советовал (2): select Материалы.Code as КодМатериала, ... From $РегистрИтоги.БСО Итоги left join $Справочник.Материалы Материалы on $Итоги.Материал=Материалы.ID |
|||
4
Heaz3
18.07.18
✎
08:10
|
(2) , (3) Спасибо, изначально ход мыслей пошел не в ту степь, теперь все работает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |