Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) ADOX и Excel (число прочтений - 5360 )
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
ADOX и Excel
13. Октября 2008 :: 10:46
Печать  
Народ, не подскажете в чем трабл?
Пытаюсь записать в ексель данные, но пишет вот это Печаль
Microsoft JET Database Engine: Обновление невозможно. База данных или объект доступны только для чтения.

Код
Выбрать все
ФЕШ	= СоздатьОбъект("ADODB.Connection"); //шаблон
РС	= СоздатьОбъект("ADODB.RecordSet");
Для Сч=3 По 4 Цикл
	ИмяФайла=ПутьКаталога+"r"+Сч+".xls";
	ФС.КопироватьФайл(ПутьКаталога+"r5.xls",ИмяФайла,0);
	Если ADOX=1 Тогда
		СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=No;IMEX=1""";
							// IMEX=1 tell the driver to always read "intermixed" data column as text
		ФЕШ.ConnectionString=СтрокаПодключения;
		ФЕШ.Mode=3;
		ФЕШ.Open();
		РС.ActiveConnection = ФЕШ;
		РС.CursorType=3;
		РС.LockType=3;
		ТекстЗапроса = "Select * From [Лист1$]";
		РС.Source=ТекстЗапроса;
		РС.Open();
		Сч2=0;
		Сообщить(РС.RecordCount());
		Пока РС.EOF()=0 Цикл  
			Сч2=Сч2+1;
			РКод=СокрЛП(РС.Fields(0).Value);
			Если ПустаяСтрока(РКод)=1 Тогда
				РС.MoveNext();
				Продолжить;
			КонецЕсли;
			РТМЦ=глДатьЭлемент(РКод);
			Сообщить(РКод);
			Сообщить(РТМЦ);
			рЦена=Окр(ДатьОтпускнуюЦенуТМЦ(РТМЦ,"Цена"+Сч,ТекущаяДата())*РКурс,2);
			Если глТМЦПринадлежитКатегории(РТМЦ,КатСкидка10)=1 Тогда
				рЦена=Окр(0.9*рЦена,2);
			КонецЕсли;
			РС.Fields(3-1).Value=рЦена; //Колонка с ценой
			Состояние(Сч2);
			РС.MoveNext();
		КонецЦикла;
		//ФЕШ.Update();
		РС.Close();
		ФЕШ.Close();

		//ФЕШ=0;
	КонецЕсли;
КонецЦикла; 

« Последняя редакция: 15. Октября 2008 :: 08:12 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #1 - 15. Октября 2008 :: 03:29
Печать  
народ, ну не ужеле никто не сталкивался?
извините за офф. Печаль
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #2 - 15. Октября 2008 :: 06:12
Печать  
Сделал еще такой вариант, но все равно ругается на ту же ошибку Печаль


Код
Выбрать все
	Сообщить("r5.xls :"+ТекущееВремя());
Попытка
	RecordSet	= СоздатьОбъект("ADODB.RecordSet");
	Connection	= CreateObject("ADODB.Connection");
	Command		= CreateObject("ADODB.Command");
	Connection.CursorLocation = 3;
	RecordSet.CursorType = 3;
	RecordSet.LockType = 2;
Исключение
	Сообщить(ОписаниеОшибки(), "!!!");
	СтатусВозврата(0);
	Возврат;
КонецПопытки;
//Ком	= СоздатьОбъект("ADODB.Command");
Для Сч=3 По 4 Цикл
	ИмяФайла=ПутьКаталога+"r"+Сч+".xls";
	Сообщить(ИмяФайла);
	ФС.КопироватьФайл(ПутьКаталога+"r5.xls",ИмяФайла,0);
	СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=No;IMEX=1""";
						// IMEX=1 tell the driver to always read "intermixed" data column as text
	Connection.Open(СтрокаПодключения);
	Command.ActiveConnection=Connection;
	Command.CommandText="Select * From [Лист1$]";
	RecordSet=Command.Execute;
	Сч2=0;
	Сообщить(RecordSet.RecordCount());
	Пока RecordSet.EOF()=0 Цикл  
		Сч2=Сч2+1;
		РКод=СокрЛП(RecordSet.Fields(0).Value);
		Если (ПустаяСтрока(РКод)=1) или (Сч2<=3) Тогда
			RecordSet.MoveNext();
			Продолжить;
		КонецЕсли;
		РТМЦ=глДатьЭлемент(РКод);
		Сообщить(РКод);
		Сообщить(РТМЦ);
		Сообщить(Сч2);
		рЦена=Окр(ДатьОтпускнуюЦенуТМЦ(РТМЦ,"Цена"+Сч,ТекущаяДата())*РКурс,2);
		Если глТМЦПринадлежитКатегории(РТМЦ,КатСкидка10)=1 Тогда
			рЦена=Окр(0.9*рЦена,2);
		КонецЕсли;
		RecordSet.Fields(3-1).Value=СокрЛП(рЦена); //Колонка с ценой
		Состояние(Сч2);
		RecordSet.MoveNext();
	КонецЦикла;
	//РС.UpdateBatch();
	//ФЕШ.Update();
	RecordSet.Close();
	Connection.Close();
КонецЦикла; 

  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: ADOX и Excel
Ответ #3 - 15. Октября 2008 :: 07:23
Печать  
pavlo писал(а) 15. Октября 2008 :: 06:12:
Сделал еще такой вариант, но все равно ругается на ту же ошибку Печаль

Посмотри тут
http://www.1cpp.ru/forum/YaBB.pl?num=1163586032/35#35
У меня много задач, где нужно заполнять уже готовые таблицы, одну или две-три колонки,  каждый раз новые, с новой структурой.
использую прямой запрос.
Update ну и и так далее
Есть правда ограничение, может мои глюки, может нет... не  могу пока понять. Если существует в шапке объединенные ячейки то мрак.
но получается дешевле разъединить, закинуть данные и потом снова объединить.
Через ОЛЮ долго, а так несколько сек и все. Улыбка
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #4 - 15. Октября 2008 :: 08:09
Печать  
спасибо за ответ, но по этой ссылке идет речь, если я правильно понял, про чтение.
а мне записать и при чем не добавить, а именно изменить одну колонку цифр на другую Печаль
и как это сделать при помощи этого примера не в курил Печаль
Тем более, что там уже по шаблону есть всякие ссылки и т.д. то есть это все оставить нужно, только цены сменить в колонке в которой нет не ссылок ничего страшного Улыбка
« Последняя редакция: 15. Октября 2008 :: 10:43 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: ADOX и Excel
Ответ #5 - 15. Октября 2008 :: 12:50
Печать  
pavlo писал(а) 15. Октября 2008 :: 08:09:
спасибо за ответ, но по этой ссылке идет речь, если я правильно понял, про чтение.

Использую строку подключения
      [code]_имя = СокрЛП(Каталог);
     СтрокаСоединения="DRIVER=Microsoft Excel Driver (*.xls)СмехriverId=790;DBQ=" +СокрЛП(_имя)+";ReadOnly=0;IMEX=1;HDR=No""";
     Если БД.Соединение(СтрокаСоединения)=0 Тогда
           Предупреждение("Ошибка открытия файла", 60);
           Возврат;
   конецЕсли;
     RS=СоздатьОбъект("ODBCRecordSet");
     RS.УстБД(БД)            
[code]

а дальше
     |Update [A4:h4435]
     |set F7=:pF7, F8 = :pF8
     |WHERE F1 = :pF1

установитьТекстовыйПараметр("pF1",тз.F1);
установитьТекстовыйПараметр("pF7",тз.F7);
установитьТекстовыйПараметр("pF7",тз.F7);
Ну и выполнить.
Только я писал про объединенные ячейки Печаль
Вчера как раз делал, вся работа заняла 15 мин, пока буха тряс  Очень довольный
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #6 - 15. Октября 2008 :: 13:36
Печать  
nicolas писал(а) 15. Октября 2008 :: 12:50:
pavlo писал(а) 15. Октября 2008 :: 08:09:
спасибо за ответ, но по этой ссылке идет речь, если я правильно понял, про чтение.

Использую строку подключения
      [code]_имя = СокрЛП(Каталог);
     СтрокаСоединения="DRIVER=Microsoft Excel Driver (*.xls); DriverId=790;DBQ=" +СокрЛП(_имя)+";ReadOnly=0;IMEX=1;HDR=No""";
     Если БД.Соединение(СтрокаСоединения)=0 Тогда
           Предупреждение("Ошибка открытия файла", 60);
           Возврат;
   конецЕсли;
     RS=СоздатьОбъект("ODBCRecordSet");
     RS.УстБД(БД)            
[code]

а дальше
     |Update [A4:h4435]
     |set F7=:pF7, F8 = :pF8
     |WHERE F1 = :pF1

установитьТекстовыйПараметр("pF1",тз.F1);
установитьТекстовыйПараметр("pF7",тз.F7);
установитьТекстовыйПараметр("pF7",тз.F7);
Ну и выполнить.
Только я писал про объединенные ячейки Печаль
Вчера как раз делал, вся работа заняла 15 мин, пока буха тряс  Очень довольный


Чего то туго доходит, тут ты точно знаешь названия ячеек, а я то не знаю Печаль или я туплю
« Последняя редакция: 16. Октября 2008 :: 03:04 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #7 - 16. Октября 2008 :: 03:17
Печать  
интересно то, что даже при чтении этим способом, HDR=No она наплевала и первую строку считает названием колонок Улыбка

Получил данные, поменял в таблице, а теперь как заменить из таблицы не понятно Печаль
ругается и все тут Печаль

Код
Выбрать все
RS.Подготовить("INSERT INTO [Лист1$] (3) VALUES (?)");
RS.ПостроитьПараметры();
RS.ВыполнитьSQL_ИзТЗ(ТЗ);
RS.Закрыть();
 



Произошла ошибка при выполнении запроса.                  
State 07002, native 17, message [Microsoft][Драйвер ODBC Excel]Неверное поле COUNT
« Последняя редакция: 16. Октября 2008 :: 04:44 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: ADOX и Excel
Ответ #8 - 16. Октября 2008 :: 04:43
Печать  
pavlo писал(а) 16. Октября 2008 :: 03:17:
интересно то, что даже при чтении этим способом, HDR=No она наплевала и первую строку считает названием колонок Улыбка

Технология такова:
после шапки делаешь пустую строку.
её и указываешь первой. Тогда Excel нумерует колонки F1,F2.... Fn
а дальше и работаешь с ними.
Потом строку убираешь и все.
У нас много требуют таблиц, где часть инфы, а то и большая уже заполнена, требуется исправить, дополнить, ну и т.д.
Я так и делаю, а так как таблицы   не повторяются(творчество вышестоящих, то новые колонки, то местами их поменяют, то в другом ракурсе цифры давай),  то единого механизма и нет.
Вот и применяю данную технологию.
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #9 - 16. Октября 2008 :: 04:48
Печать  
nicolas писал(а) 16. Октября 2008 :: 04:43:
pavlo писал(а) 16. Октября 2008 :: 03:17:
интересно то, что даже при чтении этим способом, HDR=No она наплевала и первую строку считает названием колонок Улыбка

Технология такова:
после шапки делаешь пустую строку.
её и указываешь первой. Тогда Excel нумерует колонки F1,F2.... Fn
а дальше и работаешь с ними.
Потом строку убираешь и все.
У нас много требуют таблиц, где часть инфы, а то и большая уже заполнена, требуется исправить, дополнить, ну и т.д.
Я так и делаю, а так как таблицы   не повторяются(творчество вышестоящих, то новые колонки, то местами их поменяют, то в другом ракурсе цифры давай),  то единого механизма и нет.
Вот и применяю данную технологию.


1. Не понял как явно указать на заголовок екселя? чтобы она его считала шапкой.В принципе заставлять делать строку людей мне пока проще, вот только не понятно почему при HDR=No или Yes толку нет, все равно берет и где пустое значение в ячейке то ставит типа F2, а где есть это название Печаль
2. выше написал кое-что но не работает Печаль
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: ADOX и Excel
Ответ #10 - 16. Октября 2008 :: 05:06
Печать  
Есть шапка таблицы с описанием колонок:
Есть само тело таблицы
между ними вставляешь ПУСТУЮ строку
ее в запросе и указываешь первой.
тогда Excel ее и начнет нумеровать F1.....Fn
В какой то колонки у тебя есть ID по которому ты и делаешь условие апдейта.

  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #11 - 16. Октября 2008 :: 05:40
Печать  
nicolas писал(а) 16. Октября 2008 :: 05:06:
Есть шапка таблицы с описанием колонок:
Есть само тело таблицы
между ними вставляешь ПУСТУЮ строку
ее в запросе и указываешь первой.
тогда Excel ее и начнет нумеровать F1.....Fn
В какой то колонки у тебя есть ID по которому ты и делаешь условие апдейта.



понятно, получил теперь нормальную таблицу с заголовками, но вот обновить не получается Печаль
Код
Выбрать все
RS.Подготовить("INSERT INTO [Лист1$] ([F3]) VALUES (?)");
RS.ПостроитьПараметры();
RS.ВыполнитьSQL_ИзТЗ(ТЗ);
RS.Закрыть();

так тоже ошибка:

RS.Подготовить("UPDATE [Лист1$] ([F3]) VALUES (?)");
RS.ПостроитьПараметры();
RS.ВыполнитьSQL_ИзТЗ(ТЗ);
RS.Закрыть();

а так работает, но так не подходит мне :(

RS.Подготовить("UPDATE [Лист1$] SET F3='555'");
RS.ПостроитьПараметры();
RS.ВыполнитьSQL_ИзТЗ(ТЗ);
RS.Закрыть();
 



выдает туже ошибку Печаль
или я не правильно делаю и правильней как-то Update сделать?
« Последняя редакция: 16. Октября 2008 :: 07:21 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: ADOX и Excel
Ответ #12 - 16. Октября 2008 :: 07:20
Печать  
Стукнись пока у меня время есть
336576497
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ADOX и Excel
Ответ #13 - 16. Октября 2008 :: 07:53
Печать  
А кто нить может сказать по методу RS.ВыполнитьSQL_ИзТЗ(ТЗ);
может он действительно не работает с Екселем?
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать