Всю схему махинации и её цель описывать не буду. Но сложилась следующая ситуация. Есть База "А" в ней находится основная масса данных, в ней формируются все отчеты и она общается выгрузками с внешним миром. Все отчеты переписаны на прямые запросы. Есть База "Б" в ней то же есть часть данных. база "Б" создана копированием базы "А", т.е. все реквизиты справочников и идентификаторы таблиц и документов идентины, так же у всех реквизитов есть "GUID". Задача:
В базе "А" запускаем отчет и получаем данные из двух баз. Первоначальная мысль которая пришла в голову, это сделать ПодключениеИБ
База2 = СоздатьОбъект("OLEDBData");
База2.ПрисоединитьИБ(ПутьКБазе,"
|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=""""");
ЗапросКБазе2 = База2.СоздатьКоманду();
вторым этапом я беру "прямойзапрос"
Тильда = "";
ТекстЗапроса =
"ВЫБРАТЬ Доходы.Товар,
| Доходы.ПартияПоставки,
| Доходы.КоличествоОстаток,
| Доходы.ЦенаЗакупки
| ИЗ $РегистрОстатки.ТоварыСобственные(:КонПериода"+Тильда+",
| ,
| (Товар,ЦенаЗакупки,ПартияПоставки),(Количество)) КАК Доходы
|";
Запрос = СоздатьОбъект("ПрямойЗапрос");
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьТекстовыйПараметр("КонПериода",ВыбДата);
//Запрос.РежимОтладки = 1;
Запрос.ОперативныйУчет = 1;
ВремДанные = Запрос.ПодготовитьТекстЗапроса(ТекстЗапроса);
тем самым получаю готовый (по моему мнению) текст запроса в переменную "ВремДанные"
Вариант1:
SELECT Доходы.Товар,
Доходы.ПартияПоставки,
Доходы.КоличествоОстаток,
Доходы.ЦенаЗакупки
FROM (
SELECT
Товар
,ЦенаЗакупки
,ПартияПоставки
,SUM(КоличествоОстаток) AS КоличествоОстаток
FROM
(SELECT
rg_16073.Товар AS Товар
,rg_16073.ЦенаЗакупки AS ЦенаЗакупки
,rg_16073.ПартияПоставки AS ПартияПоставки
,rg_16073.Количество AS КоличествоОстаток
FROM
РегистрИтоги_ТоварыСобственные AS rg_16073
WHERE
rg_16073.PERIOD = '20130901'
UNION ALL
SELECT
ra_16073.Товар
,ra_16073.ЦенаЗакупки
,ra_16073.ПартияПоставки
,CASE WHEN ra_16073.debkred = 0 THEN ra_16073.Количество ELSE -ra_16073.Количество END
FROM
Регистр_ТоварыСобственные AS ra_16073
WHERE (ra_16073.idx_DATE_TIME_IDDOC_LINENO_ACTNO >= '20131001 0 0 ')
AND (ra_16073.idx_DATE_TIME_IDDOC_LINENO_ACTNO < '20131009 0 0 ')
) AS vt_ra_16073
GROUP BY
Товар
,ЦенаЗакупки
,ПартияПоставки
HAVING (SUM(КоличествоОстаток) <> 0)
) AS Доходы
или если указать дату начала месяца
Вариант2:
SELECT Доходы.Товар,
Доходы.ПартияПоставки,
Доходы.КоличествоОстаток,
Доходы.ЦенаЗакупки
FROM (
SELECT
rg_16073.Товар AS Товар
,rg_16073.ЦенаЗакупки AS ЦенаЗакупки
,rg_16073.ПартияПоставки AS ПартияПоставки
,rg_16073.Количество AS КоличествоОстаток
FROM
РегистрИтоги_ТоварыСобственные AS rg_16073
WHERE
rg_16073.PERIOD = '20130901'
) AS Доходы
и третий этап
ТЗ = ЗапросКБазе2.ВыполнитьИнструкцию (ВремДанные);
В ответ получаю вот такую ошибку.
Вариант1.
ТЗ = ЗапросКБазе2.ВыполнитьИнструкцию (ВремДанные);
FAILED! ICommandText::Execute(): Syntax error.
Вариант2
ТЗ = ЗапросКБазе2.ВыполнитьИнструкцию (ВремДанные);
FAILED! ICommandText::Execute(): File 'регистритоги_товарысобственные.dbf' does not exist.
и уже мозг плавится. Требуется именно такая или близкая к такой схема работы, т.к. количество отчетов большое и переписывать все запросы на другой тип безпощядно долго.
самое соединение проходит успешно т.к.
SELECT
*
FROM
rg16073
возвращает верное количество значений.