Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Как обойти ошибку (1С + ADO + SQL) / 5 сообщений из 5, страница 1 из 1
05.05.2011, 16:15
    #37247791
Как обойти ошибку (1С + ADO + SQL)
Осваиваю 1С + ADO для выгрузки данных на SQL-сервер.

При выгрузки числового значения из 1С в табл. SQL с типом данных money возникает ошибка:

"Disallowed implicit conversion from data type varchar to data type money, table 'Infanalit.dbo.Goods1C', column 'Price'. Use the CONVERT function to run this query."

Как её избежать?
Заранее благодарен

ПРИМЕР:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
    ИмяСервера = "nasa";
	ИмяБазы = "infanalit";
	ИмяПользователя = "sa";
	Пароль = "";
	
	
	стрПодключения    = "Provider=SQLOLEDB.1;
	|Pwd="+Пароль+";
	|User ID="+ИмяПользователя+";
	|Data Source=" + ИмяСервера + ";
	|Initial Catalog=" + ИмяБазы + "";
	
	АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
	АДОДБКоннект.ConnectionTimeOut = 300 ; 
	//АДОДБКоннект.CursorLocation =  3 ;    //adUseClient
	АДОДБКоннект.CursorLocation =  2 ;    //adUseServer


    Попытка
		АДОДБКоннект.Open(стрПодключения);
		Сообщить("Соединение с SQL-сервером " + ИмяСервера + " осуществлено в "+ТекущаяДата());
	Исключение 
		Предупреждение("Невозможно установить соединение с SQL-сервером " + ИмяСервера); 
		АДОДБКоннект.Close();
		Возврат;
	КонецПопытки; 

	Сообщить("Выполняем запрос 1С");

	ЗапросВ = Новый Запрос;
	ЗапросВ.УстановитьПараметр("ТекДата",КонецДня(ТекущаяДата()));
	ЗапросВ.Текст = "ВЫБРАТЬ
	                |	ЦеныНоменклатурыСрезПоследних.Период КАК ДатаЦены,
	                |	ЦеныНоменклатурыСрезПоследних.Номенклатура.Код как Код,
	                |	ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование как Наименование,
	                |	ЦеныНоменклатурыСрезПоследних.Цена как Цена
	                |ИЗ
	                |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекДата, ) КАК ЦеныНоменклатурыСрезПоследних";
	
	Результат = ЗапросВ.Выполнить().Выгрузить();
	Сообщить("Запрос 1С выполнен");
	
	
    Попытка
		АДОДБКоннект.Execute("IF OBJECT_ID(N'Goods1C','U') IS not NULL drop table Goods1C");
		АДОДБКоннект.Execute("CREATE TABLE Goods1C (" 
											+ "Date_Price datetime, "
											+ "COODS_CODE varchar(20), "
											+ "GOODS_NAME varchar(255), "
											+ "Price money)"
							);
	Исключение 
		Сообщить("Ошибка создания табл. в SQL: " + ОписаниеОшибки());
		АДОДБКоннект.Close();
		Возврат;
	КонецПопытки; 
	
	АДОДБКоннект.Execute("BEGIN TRANSACTION");
	АДОДБКоннект.Execute("set implicit_transactions off");

	Сообщить("Запрос 1С выгружаем в табл. SQL");
	Для Каждого СтрокаРез из Результат Цикл
		
		GOODS_NAME = СтрЗаменить(СтрокаРез.Наименование,"'","''");
		
	    Попытка
			АДОДБКоннект.Execute("Insert INTO Goods1C values ('"
										+ СтрокаРез.ДатаЦены + "','"
										+ СтрокаРез.Код + "','"
										+ GOODS_NAME + "','"
										+ СтрокаРез.Цена + "')"
								);
		Исключение 
			Сообщить("Ошибка вставки данных в SQL: " + ОписаниеОшибки());
			АДОДБКоннект.Execute("Commit");
			АДОДБКоннект.Execute("set implicit_transactions on");
			АДОДБКоннект.Close();
			Возврат;
		КонецПопытки; 
		
                                    
		
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	АДОДБКоннект.Execute("Commit");
	АДОДБКоннект.Execute("set implicit_transactions on");
	АДОДБКоннект.Close();
	Сообщить("Запрос 1С выгружен в табл. SQL в " +ТекущаяДата());
...
Рейтинг: 0 / 0
05.05.2011, 17:08
    #37247981
Как обойти ошибку (1С + ADO + SQL)
Попробовал применить 'convert'

В случае
GOODS_PRICE = "convert(money, '123,12')";
работатет


АДОДБКоннект.Execute("Insert INTO Goods1C values ('"
+ СтрокаРез.ДатаЦены + "','"
+ СтрокаРез.Код + "','"
+ GOODS_NAME + "',"
+ GOODS_PRICE + ")"
);
Но использовать переменную вместо '123,12' не получается,
GOODS_PRICE = "convert(money, '" + СтрокаРез.Цена + "')";

ошибка
"Cannot convert a char value to money. The char value has incorrect syntax."
...
Рейтинг: 0 / 0
05.05.2011, 17:34
    #37248062
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку (1С + ADO + SQL)
Дмирий Романовский
ошибка
"Cannot convert a char value to money. The char value has incorrect syntax."

возможно, мешается "неразрывный пробел" - разделитель триад в строковом представлении. Для значений, больших 999 это будет проявляться.
Попробуйте так:
GOODS_PRICE = "convert(money, '" + СтрЗаменить(СтрокаРез.Цена,символы.НПП,"") + "')";
...
Рейтинг: 0 / 0
06.05.2011, 10:12
    #37248985
Как обойти ошибку (1С + ADO + SQL)
pailДмирий Романовскийошибка
"Cannot convert a char value to money. The char value has incorrect syntax."

возможно, мешается "неразрывный пробел" - разделитель триад в строковом представлении. Для значений, больших 999 это будет проявляться.
Попробуйте так:
GOODS_PRICE = "convert(money, '" + СтрЗаменить(СтрокаРез.Цена,символы.НПП,"") + "')";

Спасибо!
Еще не хватало заменить "," на "."
...
Рейтинг: 0 / 0
23.06.2011, 11:15
    #37321382
Как обойти ошибку (1С + ADO + SQL)
По факту надо использовать функцию Формат, ибо она приводит числа к нужному формату для передачи в табл. SQL
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Как обойти ошибку (1С + ADO + SQL) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]