Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка чтение данных из двух идентичных баз. (число прочтений - 3384 )
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Ошибка чтение данных из двух идентичных баз.
30. Октября 2013 :: 13:49
Печать  
Всю схему махинации и её цель описывать не буду. Но сложилась следующая ситуация. Есть База "А" в ней находится основная масса данных, в ней формируются все отчеты и она общается выгрузками с внешним миром. Все отчеты переписаны на прямые запросы. Есть База "Б" в ней то же есть часть данных. база "Б" создана копированием базы "А", т.е. все реквизиты справочников и идентификаторы таблиц и документов идентины, так же у всех реквизитов есть "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
 


возвращает верное количество значений.
  
Наверх
ICQ  
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #1 - 30. Октября 2013 :: 13:57
Печать  
Дополнение База "DBF"
1CPP.dll версия 3.2.4.0
1sqlite.dll версия 1.0.2.0
vfpodbc.dll версия 1.0.2.0
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #2 - 30. Октября 2013 :: 17:23
Печать  
Вроде бы это: idx_DATE_TIME_IDDOC_LINENO_ACTNO добавляет только 1SQLite на основе Индекса. И, соответственно, его знает класс ПрямойЗапрос, OLEDB такого поля не знает и ругается.
Это: РегистрИтоги_ТоварыСобственные AS rg_16073 тоже ПрямойЗапрос переварит, а OLEDB нет.
Надо просто обращаться: rg_16073
  
Наверх
ICQ  
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #3 - 30. Октября 2013 :: 18:35
Печать  
Спасибо.
Вообщем моя затея не удалась.  Печаль
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #4 - 31. Октября 2013 :: 06:15
Печать  
Такой запрос пишется неспеша без всяких классов.
А у тебя даже типизация будет работать, раз удаленная база - потомок текущей базы.


ЗЫ:+ твой класс никак не ориентирован на работу с фоксовским провайдером - никак не учитывает индекс, вообще.
Да и текст запроса у тебя от 1sqlite написан.
В общем, пишем запрос рученьками, радуемся.
  
Наверх
 
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #5 - 31. Октября 2013 :: 12:10
Печать  
Постепенно начну переписывать, База 4 года на прямых запроса, а клон неделю как родился Улыбка
вот и надеялся, что как-то можно 1sqlite объяснить что сейчас нужно брать данные из другой базы.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #6 - 31. Октября 2013 :: 12:21
Печать  
1sqlite не умеет делать запрос к сторонней базе.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #7 - 31. Октября 2013 :: 18:26
Печать  
Можно попробовать просто Прямым запросом воспользоваться. в частности:
Цитата:
ПрисоединитьБазуДанных
Синтаксис: ПрисоединитьБазуДанных(ИмяБазыДанных, ПутьКБазеДанных, ПутьКЛогФайлу)
Параметры:
ИмяБазыДанных – идентификатор базы данных для дальнейшего использования в тексте запросов.
ПутьКБазеДанных – путь к файлу с базой данных. При этом для DBF формата БД файлами базы данных выступают файлы БД SQLite (*.db), для SQL формата БД файлами базы данных выступают файлы БД SQL Server (*.mdf).
ПутьКЛогФайлу – путь к файлу для записи лог файла. Для DBF формата БД данный реквизит не указывается. Для SQL формата БД – это путь к файлу лога SQL Server по данной БД (*.ldf).
Возвращаемое значение: отсутствует.
Описание: метод осуществляет присоединение базы данных в рамках текущей сессии работы КОП. Подключение файлов БД от формата не соответствующего текущей сессии недопустимо. Т.о. использование файлов db для SQL, ровно как и mdf для DBF невозможно.
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #8 - 31. Октября 2013 :: 18:36
Печать  
Еще такую ссылку нашел: http://www.1cpp.ru/forum/YaBB.pl?num=1182497837/19#19
  
Наверх
ICQ  
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #9 - 31. Октября 2013 :: 23:01
Печать  
ПрисоединитьБазуДанных
Этот вариант не прокатывает он реально пытается присоединить db базу данных и конечно её не находит.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ошибка чтение данных из двух идентичных баз.
Ответ #10 - 01. Ноября 2013 :: 05:37
Печать  
На вот, занимайся..
Останки и обороты в двух базах
  

__________________________________Id.ert ( 105 KB | Загрузки )
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать