|
Выгрузка в аксесе | ☑ | ||
---|---|---|---|---|
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. я на Васике обычно с АДО "знакомлюсь" - там оно поддатливее, да и ошибки реже бывают. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |