Имя: Пароль:
1C
1C 7.7
v7: ADODB.Recordset. Читаю с Листа, затем удаляю (чищу) поле, в RS.Delete() - ошибка
,
0 aka AMIGO
 
31.07.15
12:31
Есть файл Excel .xlsm, читается, но записать не могу ни в какую ячейку.

Код:

    RS = СоздатьОбъект("ADODB.Recordset");
    
        ТекстЗапроса =
    "SELECT
    |    Лист.*
    |FROM
    |    ["+СписокЛистов.ПолучитьЗначение(2)+"] as Лист";
    
    
    попытка
        RS.Open(ТекстЗапроса, Connection);
    исключение
        Сообщить ("Проблемы с выполнением запроса к "+СписокЛистов.ПолучитьЗначение(2));
        Возврат;
    КонецПопытки;
    
    Пока RS.EOF() = 0 Цикл
        
        Для Счетчик = 1 По RS.Fields.Count Цикл
            
            Поле = RS.Fields.Item(Счетчик - 1);
            Знч = Поле.Value;
            RS.Delete();
        КонецЦикла;
        
        // Обработка других полей
        RS.MoveNext();
        
    КонецЦикла;

Ошибка:
RS.Delete();
{C:\1C\TMP\EXTFORMS\НОВЫЙСТО.ERT(190)}: ADODB.Recordset: Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.

Файл Excel позволяет редактировать, в ячейку спокойно пишется всё, что угодно.

Пошарил по инету, вроде не нашел прямого указания причины..
1 aka AMIGO
 
31.07.15
12:34
у Recordset ведь нет параметров..

а сам вход в ОЛЕДБ такой:

        СтрокаСоединения ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " +СокрЛП(ЕхФайл) +" ;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
    
    Connection = СоздатьОбъект("ADODB.Connection");
    Connection.ConnectionString =  СтрокаСоединения;
2 Serginio1
 
31.07.15
12:42
3 aka AMIGO
 
31.07.15
12:43
ааа.. сообразил-таки..
Скорей всего в этом дело:
"SELECT    Лист.*  FROM .." - это ведь Выбрать!

(2) спасибо, сейчас посмотрю..
4 Ёпрст
 
31.07.15
12:49
(3) нет
5 Мыш
 
31.07.15
12:55
LockType
6 aka AMIGO
 
31.07.15
13:04
(4) ну, вот тут об этом-же.. почти.. :)
http://forum.sources.ru/index.php?showtopic=22179

(5) так пойдет? rs.LockType=adLockBatchOptimistic

(слямзил из http://www.w3schools.com/ASp/prop_rs_locktype.asp )
сейчас попробую этот оптимистик :)
7 Ёпрст
 
31.07.15
13:05
(6)
rs.LockType=1;
8 aka AMIGO
 
31.07.15
13:06
(7) сенк..
9 aka AMIGO
 
31.07.15
13:11
RS.LockType = 1;
        RS.Open(ТекстЗапроса, Connection);

...

RS.Delete();

//увы, ошибка осталась, та-же самая..
10 Ёпрст
 
31.07.15
13:20
а так ?

    rs.CursorType = 3;
    rs.LockType = 1;
11 Ёпрст
 
31.07.15
13:20
+ попробовать с такой строкой:

    Connection=CreateObject("ADODB.Connection");
    Connection.ConnectionString =  "Provider=Microsoft.Jet.OLEDB.4.0;
                                    |Data Source="+ПолноеИмяФайла+";
                                    |Mode=ReadWrite;
                                    |Extended Properties=""Excel 8.0;
                                    |HDR=No;
                                    |FirstRowHasNames=0;
                                    |IMEX=1;""";
12 aka AMIGO
 
31.07.15
13:29
+9 подставлял RS.LockType = 1, 2 и 3 - не проходит..

оставил RS.LockType = 3
rs.CursorType = 3; - подставил, характер ошибки изменился, ругань уже оптимистичная:

Знч = Поле.Value;
{C:\1C\TMP\EXTFORMS\НОВЫЙСТО.ERT(188)}: Microsoft Cursor Engine: Дескриптор строки указывал на удаленную строку или строку, помеченную для удаления.

(11) сейчас попробую.. минуточку..
13 Serginio1
 
31.07.15
13:38
(12) Странная у тебя логика.
В цикле по полям ты удаляешь запись. Что хотел сделать то
14 Ёпрст
 
31.07.15
13:39
И.. проще написать запрос на delete сразу
15 aka AMIGO
 
31.07.15
13:44
(11) Немного видоизменил параметры, иначе на открытие не работает:

    Connection.ConnectionString =  "Provider=Microsoft.ACE.OLEDB.12.0;
                                    |Data Source="+СокрЛП(ЕхФайл)+";
                                    |Mode=ReadWrite;
                                    |Extended Properties=""Excel 12.0;
                                    |HDR=No;
                                    |FirstRowHasNames=0;
                                    |IMEX=1;""";


Меня носом уже тыкали в несоответствие параметров..
http://www.forum.mista.ru/topic.php?upd&id=749434
Чтение проходит нормально, а запись - нет..

Но это уже кое-что..

(13) возможно, странная.. не возражаю ничуть, т.к. пару дней назад вообще вслепую шарил..

А идея такая - у меня в файле Excel 2 Листа, на первом - данные, я их читаю в ТЗ, на втором - я должен переработать ТЗ и записать новые данные..
Так вот второй лист - не пустой, мне его надо вначале почистить.
Удалить лист и создать заново - это для меня пока сложно..
Вот я и чистил данные на имеющемся 2-м Листе..
Я надеюсь, понятно объяснил?.. извините за многословность..

(14) мало знаний у меня, способ-то должен всплыть в мозгах :)
16 aka AMIGO
 
31.07.15
13:53
+15 вот такая картинка:
http://pics.rsh.ru/img/LOC_8zha9slh.jpg

Первый Лист - "Таблица расчетов", 2-й "Печать", туда я и норовлю записывать, пока даже стереть не получается..
17 aka AMIGO
 
31.07.15
13:59
Вот у меня вопрос вертится, давно уже..
этот RS.Delete(); - он что удаляет? ячейку? строку? колонку? Или таки всё на Листе?
18 Serginio1
 
31.07.15
14:01
Вместо Select

Функция ВыполнитьКомандуАДО(Имя,Con,ТекстЗапроса) Экспорт
    Cmd=новый COMОбъект("ADODB.Command");
    Cmd.ActiveConnection=Con;
    Cmd.CommandText = Имя;
    Cmd.CommandType = 1;
Command.CommandText=ТекстЗапроса;
Command.Execute();

КонецФункции

ТекстЗапроса =
    "Delete
    |FROM
    |    ["+СписокЛистов.ПолучитьЗначение(2)+"] as Лист";
19 Serginio1
 
31.07.15
14:02
(17) Удаляет строку. Смотри документацию.
Смотри 2 там много чего написано
20 aka AMIGO
 
31.07.15
14:04
(18) (19) мм.. понятно..
21 vdv77
 
31.07.15
14:11
Приношу извинения, что влез в тему, но задам вопрос связанный с механизмом ADODB.
Можно ли как то прочитать и загрузить в 1с рисунок(фото) с листа Экселя с помощью СоздатьОбъект("ADODB.
Ранее мне ответили что такое возможно только с помощью OLE механизма.
22 aka AMIGO
 
31.07.15
14:43
(21) попросил выслать мне материалы

http://www.askit.ru/custom/progr_admin/progr_admin_plan.htm

жду..
без мануала плохо :)
23 aka AMIGO
 
31.07.15
14:46
(22) к (19) :)