Имя: Пароль:
1C
1С v8
Выгрузка в аксесе
0 Fr1eNd
 
08.04.12
12:18
Добрый день. Делаю выгрузку в access. Возник затык с одной функцией
а именно привожу код
   docum = Новый COMОбъект("ADODB.RecordSet");
   docum.Open("SELECT * FROM DOCUM;",Connection,2,3,);
   Попытка
     Попытка
       docum.Movelast();
   Исключение
       Сообщить("добавляем ПЕРВУЮ запись! :))");
   КонецПопытки;
           docum.AddNew();
           NewDocNum = docum.Fields("ID").Value;
           docum.Fields("ID").Value  = NewDocNum;
           docum.Fields("Created").Value = ""+СсылкаППИ.Дата;
           //    Docum.IND = Перечисление.Булево.Нет;
           docum.Fields("DOCTYPE").Value = "PAY_DOC";
           docum.Fields("ACKSTAT").Value = "U";
           docum.Fields("SUMMARY").Value= "Платежное поручение №"+СокрЛП(СсылкаППИ.Номер)+" от "+СсылкаППИ.Дата+" на сумму "+СсылкаППИ.СуммаДокумента+" получатель "+СсылкаППИ.Контрагент.Наименование;
           docum.Update();
       Исключение
           Сообщить("Не удается добавить документ: №"+СокрЛП(СсылкаППИ.Номер)+" проблемы с записью в таблицу DOCUM");
       КонецПопытки;

Сваливается на AddNew() выдавая следующее Ошибка при вызове метода контекста (AddNew): Произошла исключительная ситуация (Microsoft JET Database Engine): Поле '#PAY_DOC.#KOD' не допускает ввод пустых строк.

По идеи в AddNew надо передать заполнение этого параметра, но как это правильно сделать не пойму.

Может кто сталкивался?
1 Fr1eNd
 
08.04.12
12:29
ap
2 Torquader
 
08.04.12
12:35
А попробовать сначала заполнить реквизиты, а потом добавить ?
Да и вообще - для добавления лучше открывать таблицу (вместо запроса указать имя таблицы).
3 Fr1eNd
 
08.04.12
12:36
(2) Можно образец кода, что бы зря не тыкаться
4 Fr1eNd
 
08.04.12
12:40
(2) заполнения реквезита не помогло
5 Torquader
 
08.04.12
12:41
И ещё - вот это что ?
NewDocNum = docum.Fields("ID").Value;
То есть ты считаешь, что за тебя кто-то ИД сгенерит - а в описании таблицы сказано, что поле автоинкремент или нет ?
6 Fr1eNd
 
08.04.12
12:42
(5) да
7 Torquader
 
08.04.12
12:42
А добавление записи делается через INSERT - тогда, возможно, автоинкремент и сработает, но в случае создания записи через RecordSet insert будет отрабатывать уже после того, как всё заполнено - вот он и ругается.
8 Torquader
 
08.04.12
12:44
Насколько я помню, сначала пишется инструкция INSERT, где указывается, какие поля будут параметрами, потом делается PREPARE (подготовка), потом заполняются параметры, а потом EXECUTE (то есть исполнение) - тогда автоинкремент отработает.
9 Fr1eNd
 
08.04.12
12:45
про инсерт я уже видел, нужен образец кода, что-то нагуглить не могу ничего,
10 Fr1eNd
 
08.04.12
12:46
достатчно сделать Insert, а потом EXECUTE в случае c access
11 Fr1eNd
 
08.04.12
12:50
(8) так ругается не на ID
12 Torquader
 
08.04.12
12:51
Я, конечно, по памяти пишу так, что переписывать надо, но.

Cmd=Новый СОМОбъект("ADODB.Command");
Cmd.Connection=Connection;
Cmd.CommandText="INSERT INTO DOCUM(Created,DOCTYPE,ACKSTAT,SUMMARY)VALUES(?,?,?,?);
// здесь заметим, что ID мы не указываем, так как оно будет автоматически создаваться

// здесь сразу скажу, что как работать с коллекцией параметров я не помню
// последний раз работал в JavaScript - но там просто ж... с ними
Cmd.Parameters.Item(0).Value=String(СсылкаППИ.Дата);
Cmd.Parameters.Item(1).Value="PAY_DOC";
// и так далее для остальных

Cmd.Execute();// выполняем
// далее, читаем через что возвращается последний сгенерённый ид
// насколько я помню - это можно
// конечно, если он нам где-то ещё нужен
13 Fr1eNd
 
08.04.12
12:52
(12) Огромное спасибо буду пробовать
14 Torquader
 
08.04.12
12:53
(11) Так, а что за магическое поле PAY_DOC.КОД ? - что-то есть подозрение, что оно должно быть заполнено, а про него в запросе просто забыли - и автоинкремент там как раз и не работает.
P.S. кажется, мы копаем в другом месте.
15 Fr1eNd
 
08.04.12
12:53
Если кто ещё чего знает кидайте. Потом статью на инфостарте запилю))))
16 Torquader
 
08.04.12
12:53
(13) Погоди пробовать - смотри 14, так как есть мнение, что не указали обязательное поле.
17 Fr1eNd
 
08.04.12
12:54
(11) да оно должно быть заполнено, но сваливается на addnew() до заполнения не доходит
18 Torquader
 
08.04.12
12:58
(17) Тогда смотри 12 и не забудь про КОД - хотя там ошибка при EXECUTE будет, и система правильно скажет, что что-то забыли.
P.S. Заглянул в NDSN:
AddNew - добавление записи:

AddNew Method (ADO)
Creates a new record for an updatable Recordset object.
Syntax
recordset.AddNew FieldList, Values

Так что оно правильно тебя послало - полей не передано - добавлять нечего, вот и ошибка.
19 Torquader
 
08.04.12
12:59
Только оно MSDN называется - кстати, в сети есть и на русском - там вообще должно быть всё понятно (если переводчик понимал, что переводит).
20 Fr1eNd
 
08.04.12
13:00
в MSDN смотрел
пытался
AddNew("#PAY_DOC", "1");

все равно не работает
21 Torquader
 
08.04.12
13:03
(20) FieldList - это список полей, а Values - список значений, то есть массивы.
Создать два массива - не проблема.
В VbScript просто бы написал
Rec.AddNew Array(FieldName1,...,FieldNameN),Array(FieldValue1,...,FieldValueN)
А в 1С придётся массивы создавать (чего-то я как-то не припомню, как можно сделать динамический массив).
22 Torquader
 
08.04.12
13:05
В семёрке я динамические массивы делал через MSScriptControl, из которого в 1С доставал объекты - всё прекрасно работало, а вот в восьмёрке делать такое как-то не хочется - там своего функционала навалом.
23 Fr1eNd
 
08.04.12
13:08
через DLO-36 или как там называется не ado протокол аксесный все норм работает, пытаюсь на ADO переписать вывалиевает такую ошибку
24 КМ155
 
08.04.12
13:12
(23)[Поле '#PAY_DOC.#KOD']
ежику же понятно, что  PAY_DOC является внешним ключом, а ты в него стринг пытаешься впендюрить
25 Fr1eNd
 
08.04.12
13:16
описался я делал
AddNew("#KOD", 1);
26 МихаилМ
 
08.04.12
13:19
советую Вам найти спрапвку от access97

она намного удобней чем последующие. непомню есть ли рускоязычная.
27 КМ155
 
08.04.12
13:21
(25) ещё раз реальный код 1С и реальную ошибку Adodb
28 Torquader
 
08.04.12
14:36
(25) А разве нужно только код установить - скорей всего, нужно задать все поля, а не только одно.
29 Fr1eNd
 
08.04.12
18:57
(27) Написана реальная ошибка
30 Fr1eNd
 
08.04.12
18:57
которая по ОписаниеОшибки() выводит
31 Fr1eNd
 
09.04.12
01:43
Победил Insert так и не смог нормально написать чтобы все поля заполнял, вставил только ключ, создал потом запросом получил и заполнил все остальное
32 Fr1eNd
 
09.04.12
13:48
все таки как правильно создать addnew с заполняемыми полями
33 774816
 
09.04.12
14:14
Рекордсет= Новый COMОбъект("ADODB.RecordSet");
Рекордсет.ActiveConnection=Connection;
Рекордсет.CursorLocation = 3 ;
Рекордсет.LockType = 4;
Рекордсет.CursorType = 2;
Рекордсет.Open ("SELECT * FROM DOCUM") ;

Рекордсет.AddNew();    
Рекордсет.Fields("COL_NAME").Value  = "ЗНАЧЕНИЕ";
Рекордсет.UpdateBatch();
34 Fr1eNd
 
09.04.12
16:28
На addnew() вылетает, я это уже выше писал
35 Dmitry77
 
09.04.12
16:39
Ниже кусок работающего кода

СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ПутьКБазе;
СоединениеСБазой = Новый COMОбъект("ADODB.Connection");

//Соединяемся
СоединениеСБазой.Open(СтрокаПодключения);    

НаборЗаписей = Новый COMОбъект("ADODB.Recordset");  
НаборЗаписей.Open("SELECT * FROM ZAO_UCB;",СоединениеСБазой,0,2);

НаборЗаписей.AddNew();
НаборЗаписей.Fields("FNAME").Value = строка(рез.Фамилия);


НаборЗаписей.update();
36 Dmitry77
 
09.04.12
16:40
СтандартнаяОбработка = Ложь;
   
   Режим = РежимДиалогаВыбораФайла.Открытие;
   Диалог = Новый ДиалогВыбораФайла (Режим);
   Диалог.ПолноеИмяФайла = "";
   Фильтр = "mdb(*.mdb)|*.mdb";
   
   Диалог.Фильтр = Фильтр;
   Диалог.МножественныйВыбор = Ложь;
   Диалог.Заголовок = "Выберите файл";
   
   Если Диалог.Выбрать() Тогда
       ПутьКБазе = Диалог.ПолноеИмяФайла;
   КонецЕсли;
37 774816
 
09.04.12
17:04
(34) код который я выложил рабочий,
параметры AddNew( FieldList,Values )- необязательные, возможно проблема во внешнем ключе который привязан к другой таблице
38 Torquader
 
09.04.12
20:07
(37) Ещё у RecordSet можно проверить состояние и режим редактирования - часто бывает, что система запрещает открывать выборки в режиме редактирования.
Так что, перед AddNew можно глянуть EditMode, чтобы быть уверенным, что кто-то ожидает от нас добавления.
P.S. я на Васике обычно с АДО "знакомлюсь" - там оно поддатливее, да и ошибки реже бывают.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.