|
Работа с скл из 1с | ☑ | ||
---|---|---|---|---|
0
Мисти
22.07.14
✎
18:11
|
Уже вижу саму базу - таблицы,представления,синонимы и т.д.
Пока непонятно, где я увижу данные, пока их там, наверное, еще нет. Подключение срабатывает! Соединение003 = Новый COMОбъект("ADODB.Connection"); строкаПодключения = "...."; Попытка Соединение003.Open(строкаПодключения); Исключение Сообщить( "Не смогли подключиться к sql-базе: " + ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; Cmd = Новый COMОбъект("ADODB.Command"); Cmd.ActiveConnection = Соединение003; //Cmd.CommandType = ТипКомандыАДО("adcmdtext"); // это она не понимает Cmd.CommandTimeout = 600; Возврат Cmd; Дальше не работает: Соединение = СоединитьсяСSQL(); Контрагенты = Новый COMОбъект("ADODB.Recordset"); Контрагенты.CursorType = 1; Контрагенты.LockType = 3; ТекстЗапросаAccount = "select * from Account"; Контрагенты.Open(ТекстЗапросаAccount, Соединение); Ругается: Ошибка при вызове метода контекста (Open) Контрагенты.Open(ТекстЗапросаAccount, Соединение); по причине: Произошла исключительная ситуация (ADODB.Recordset): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с др |
|||
1
Мисти
22.07.14
✎
18:11
|
Таблица есть с названием dbo.account
|
|||
2
Wobland
22.07.14
✎
18:14
|
> Возврат Cmd
куда? |
|||
3
ДенисЧ
22.07.14
✎
18:14
|
Контрагенты = Соединение.Execute("select * from account");
|
|||
4
Мисти
22.07.14
✎
18:21
|
Спасибо!
А потом Контрагенты.AddNew();? Мне бы еще проверить по реквизиту с названием UI1C, что такого элемента нет? |
|||
5
Мисти
22.07.14
✎
18:23
|
Я могу одновременно смотреть, что там в этой базе через ManagementStudio и подключаться из 1С?
|
|||
6
Мисти
22.07.14
✎
18:25
|
Контрагенты = Соединение.Execute("select * from account");
по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Не был задан текст команды для объекта команды. |
|||
7
Мисти
22.07.14
✎
18:29
|
Wobland, что скажешь?
|
|||
8
Wobland
22.07.14
✎
18:32
|
у меня так:
Connection=Новый COMОбъект("ADODB.Connection"); Connection.Open(ConnectionString); RS=Новый COMОбъект("ADODB.Recordset"); RS.Open(ТекстЗапроса, Connection); Если НЕ RS.EOF Тогда RS.MoveFirst(); КонецЕсли; Пока НЕ RS.EOF Цикл RS.MoveNext(); КонецЦикла; RS.Close(); |
|||
9
ДенисЧ
22.07.14
✎
18:34
|
Блин, я забыл, что у тебя соединение команда...
Соединение.CommandText = "select * from account"); контрагенты = соединение.Execute(); |
|||
10
Мисти
22.07.14
✎
18:35
|
Спасибо!
Что б я без вас делала! |
|||
11
ДенисЧ
22.07.14
✎
18:35
|
То же самое, что и с нами, только без нас
|
|||
12
Wobland
22.07.14
✎
18:37
|
(10) документацию бы читала. нажеюсь
|
|||
13
Wobland
22.07.14
✎
18:38
|
(11) без нас не интересно. знаешь, каков я бываю в конфигураторе...
|
|||
14
ДенисЧ
22.07.14
✎
18:40
|
(13) Даже слышать об этом не хочу, не то что знать...
|
|||
15
Fragster
гуру
22.07.14
✎
18:52
|
// магические числа
мМагияСКЛ = Новый Структура; //http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318(v=vs.85).aspx мМагияСКЛ.Вставить("adVarChar", 200); мМагияСКЛ.Вставить("adDouble", 5); мМагияСКЛ.Вставить("adDecimal", 14); мМагияСКЛ.Вставить("adInteger", 3); //http://msdn.microsoft.com/en-us/library/windows/desktop/ms676517(v=vs.85).aspx мМагияСКЛ.Вставить("adAsyncExecute", 16); // 0x10 мМагияСКЛ.Вставить("adExecuteNoRecords", 128);// 0x80 мМагияСКЛ.Вставить("adExecuteRecord", 2048);// 0x800 //http://msdn.microsoft.com/en-us/library/windows/desktop/ms677542(v=vs.85).aspx мМагияСКЛ.Вставить("adUseClient", 3);// 0x80 мМагияСКЛ.Вставить("adCmdText", 1); мМагияСКЛ.Вставить("adStateClosed", 0); мМагияСКЛ.Вставить("adStateOpen", 1); мМагияСКЛ.Вставить("adStateExecuting", 4); мМагияСКЛ.Вставить("adStateFetching", 8); |
|||
16
Fragster
гуру
22.07.14
✎
18:52
|
Функция ПолучитьПодключениеКОбменнойБазе(Сервер, База, Пользователь, Пароль) Экспорт
Connection = Новый ComОбъект("ADODB.Connection"); СтрокаПодключения = "Driver={SQL Server}; Server="+Сервер+"; DataBase="+База+"; UID="+Пользователь+"; PWD="+Пароль+";"; Connection.ConnectionString = СтрокаПодключения; Connection.CursorLocation = мМагияСКЛ.adUseClient; Connection.Open(); Возврат Connection; КонецФункции |
|||
17
Fragster
гуру
22.07.14
✎
18:53
|
Команда = Новый ComОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение; Команда.CommandType = мМагияСКЛ.adCmdText; Команда.CommandText = "SELECT TOP 1 | [SessionId] |FROM [Session] |WHERE | [STATUS] = ?"; Команда.Parameters(0).Value = Статус; RecordSet = Команда.Execute(); Если RecordSet.EOF Тогда Возврат Неопределено; Иначе Возврат RecordSet.Fields("SessionId").Value; КонецЕсли; |
|||
18
Fragster
гуру
22.07.14
✎
18:55
|
Процедура УстановитьСтатусСессииОбмена(Соединение, ИД, Статус)
Команда = Новый ComОбъект("ADODB.Command"); Команда.ActiveConnection = Соединение; Команда.CommandType = мМагияСКЛ.adCmdText; Команда.Prepared = Истина; Команда.CommandText = "UPDATE | [Session] |SET | [STATUS] = ? |WHERE | [SessionId] = ?"; Параметры = Новый COMSafeArray("VT_VARIANT", 2); Параметры.SetValue(0, Статус); Параметры.SetValue(1, ИД); Команда.Execute(, Параметры, мМагияСКЛ.adExecuteNoRecords + мМагияСКЛ.adAsyncExecute); КонецПроцедуры |
|||
19
Мисти
22.07.14
✎
19:05
|
па-па, что это бы-ло?
|
|||
20
Мисти
22.07.14
✎
19:29
|
Ну вот, приплыли:
{Форма.Форма1.Форма(57)}: Ошибка при вызове метода контекста (AddNew) Контрагенты.AddNew(); по причине: Произошла исключительная ситуация (ADODB.Recordset): Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки. |
|||
21
Мисти
22.07.14
✎
19:37
|
Wobland, я тебя вижу!
|
|||
22
Мисти
22.07.14
✎
19:41
|
Я что-то не так написала, или это база не для данных, а для красоты?
|
|||
23
ДенисЧ
22.07.14
✎
19:43
|
(20) а зачем так делать?
Кто мешает сказать insert? |
|||
24
Мисти
22.07.14
✎
20:00
|
Интересный вопрос - зачем. Затем, что этот вариант был в предыдущей подсказке.
insert - что? |
|||
25
Мисти
22.07.14
✎
20:01
|
И почему insert может сработать, а AddNew нет?
|
|||
26
ДенисЧ
22.07.14
✎
20:04
|
Так. А теперь все дружно скажем хором - Мисти , бегом читать учебник по SQL!
|
|||
27
ДенисЧ
22.07.14
✎
20:05
|
Я даже ссылочку не поленился найти
http://firststeps.ru/sql/r.php?14 |
|||
28
Мисти
22.07.14
✎
20:07
|
(27) Спасибо!
Я первую тему как раз с этого и начинала! |
|||
29
Мисти
22.07.14
✎
20:12
|
Отлично-прекрасно, мне это нравится!
INSERT INTO Customers( city, cname, cnum ) VALUES( 'Новосибирск', 'Петров', 2010 ) Всё понятно, непонятно, как это из 1С написать. Напишите мне, люди добрые, последний кусочек! Мне надо в таблице account поискать строку по полю UI1C, и если найдено - обновить, если не найдено - добавить. Ну и кучу реквизитов заполнить, это я уж справлюсь. |
|||
30
Мисти
22.07.14
✎
20:33
|
Сочинять самой??
|
|||
31
Fragster
гуру
22.07.14
✎
20:42
|
(29) совмести вместе (15)(16) и (18)... причем
Параметры.SetValue(...); ... Команда.Execute(, Параметры, ); можно в цикле |
|||
32
Мисти
22.07.14
✎
21:04
|
Соединение.CommandText = "select * from account";
контрагенты = соединение.Execute() Пока есть вот что. Дальше-то что? |
|||
33
Мисти
22.07.14
✎
22:19
|
ау?
Я уже всё остальное переделала, даже ужин приготовила. |
|||
34
Dmitry1c
22.07.14
✎
22:23
|
МОИ КРОВАВЫЕ ГЛАЗА
|
|||
35
Dmitry1c
22.07.14
✎
22:23
|
(33) покорми, а? :( хочу домашней еды...
|
|||
36
Мисти
22.07.14
✎
22:24
|
Да ну, из фарша покупного!
|
|||
37
Мисти
22.07.14
✎
22:44
|
Параметры = Новый COMSafeArray("VT_VARIANT", 2); - вот это что?
|
|||
38
Мисти
22.07.14
✎
22:54
|
http://www.cyberforum.ru/1c/thread848218.html - вот там хорошо написано, только там выгрузка из скл, а мне пока загрузить туда нужно.
|
|||
39
Мисти
22.07.14
✎
22:59
|
http://help1c.com/faq8/view/383.html - и там тоже чтение, а не запись.
|
|||
40
Мисти
22.07.14
✎
23:02
|
Тут обновление записи, а мне нужно добавление
http://nastroy-ka.ru/system1c/110--1-adodb-sql.html |
|||
41
Мисти
22.07.14
✎
23:08
|
http://www.odincplus.com/stati/primer-raboty-1s-s-internet-magazinom.html
Наверное, тут вариант мне подходящий! 2. Выбрать категорию товаров (таким образом, выборку можно сделать почем угодно): ТекстЗапроса = "SELECT category_id FROM categories WHERE name="+"'"+ КатегорияНаименование+"'"; ВыборкаКатегории = Соединение.Execute(ТекстЗапроса); Пока ВыборкаКатегории.EOF()=0 Цикл //получаем все поля Код= ВыборкаКатегории.Fields("category_id").Value; ВыборкаКатегории.MoveNext(); КонецЦикла; 3. Обновить цену: ТексЗапроса = "UPDATE products SET price="+"'"+Цена+"'"+ "WHERE model="+"'"+ТоварыНаименование+"'"+ " and category_id="+"'"+Категория+"'"+ " and brand_id="+"'"+Бренд+"'"; Соединение.Execute(ТексЗапроса); Соединение.Close(); 4. Добавить товар: ТексЗапроса = "INSERT INTO products SET model="+"'"+Товар+"',"+"price="+"'"+Цена+"',"+"enabled="+"'"+АктивныйДаНет+"',"+"category_id="+"'"+Категория+"',"+"brand_id="+"'"+Бренд+"'"; Соединение.Execute(ТексЗапроса); Соединение.Close(); |
|||
42
Мисти
22.07.14
✎
23:21
|
Для Каждого СтрКонтр из ТабКонтр Цикл
ОбработкаПрерыванияПользователя(); ТекстЗапроса = "SELECT * FROM account WHERE UI1C="+"'"+ КатегорияНаименование+"'"; А как туда переменную вставить? СтрКонтр.UI1C - я должна искать по этому реквизиту Выборка = Соединение.Execute(ТексЗапроса); Если Выборка.EOF()=0 //- нет такой строки, надо добавить ... Иначе // есть строка, надо обновить Выборка.Fields("AccountId").Value = СтрКонтр.AccountId; КонецЕсли; КонецЦикла; Ну как?? |
|||
43
Мисти
23.07.14
✎
08:42
|
"SELECT * FROM account WHERE UI1C= ..... - как туда параметр вставить?
|
|||
44
Fragster
гуру
23.07.14
✎
08:47
|
(41), (42) http://xkcd.com/327/
|
|||
45
Fragster
гуру
23.07.14
✎
08:48
|
(43)-›(17)
|
|||
46
Мисти
23.07.14
✎
08:59
|
ТексЗапроса = "SELECT * FROM account WHERE [UI1C=] = ?";
Соединение.Parameters(0).Value = СтрКонтр.UI1C; КонтрагентыСКЛ = Соединение.Execute(); Если КонтрагентыСКЛ.EOF()=0 //- нет такой строки, надо добавить - Как???? ... Иначе // есть строка, надо обновить КонтрагентыСКЛ.Fields("AccountId").Value = СтрКонтр.AccountId; .... КонецЕсли; Потом надо это как-то зафиксировать или можно переходить к следующей строке? Соединение.Close(); Так? И как вставить строку вопрос остался. |
|||
47
Fragster
гуру
23.07.14
✎
09:00
|
(46) если ты хочешь изменять данные рекордсетом, то источником для него должна быть таблица, а не запрос.
|
|||
48
Мисти
23.07.14
✎
09:07
|
рекордсетом - непонятно вообще, а по поводу источника - как бы слова понятны, но как получить таблицу, а не запрос, и почему у меня - запрос, а не таблица... Непонятно!
|
|||
49
Мисти
23.07.14
✎
09:17
|
Что не так-то?
|
|||
50
ДенисЧ
23.07.14
✎
09:20
|
Ты наотрез отказываешься читать документацию.
В ответ я применяю к тебе санкции - отказываюсь отвечать на твои вопросы до тех пор, пока ты не докажешь, что оную документацию ты прочитала. |
|||
51
Repey
23.07.14
✎
09:21
|
Я вот так по диагонали поглядел - и не понял. Не понял - что ты хочешь делать с теми данными, которые получаешь из скуля.
Расскажи, пожалуйста. Простыми словами. |
|||
52
Мисти
23.07.14
✎
09:25
|
(50) По ссылке в 27 я всё прочитала, но там же - просто скл, без 1с!
(51) Я должна в таблице account поискать строку с известным мне значением в столбце UI1C, и если найду, то обновить там поля (20 штук), а если нет, до добавить строку и заполнить эти поля. Всё! Потом этот же фокус мне нужно будет повторить еще раз 10 с разными таблицами, для заполнения этих данных я написала уже 1500 строк на 1С. |
|||
53
Repey
23.07.14
✎
09:31
|
(52) А если вдруг найдешь несколько строк?
Скуль запросы на добавление и обновление уже сочинила? Покажи. |
|||
54
Мисти
23.07.14
✎
09:32
|
Там может быть только одна такая строка.
в (46) всё, что я сочинила, используя всякие образцы. |
|||
55
Мисти
23.07.14
✎
09:46
|
Вот этот образец из (41) мне подойдет?
4. Добавить товар: ТексЗапроса = "INSERT INTO products SET model="+"'"+Товар+"',"+"price="+"'"+Цена+"',"+"enabled="+"'"+АктивныйДаНет+"',"+"category_id="+"'"+Категория+"',"+"brand_id="+"'"+Бренд+"'"; Соединение.Execute(ТексЗапроса); Соединение.Close(); Только мне бы - добавить сначала пустую строчку, а потом заполнить поля поштучно КонтрагентыСКЛ.Fields("AccountId").Value = СтрКонтр.AccountId; чтоб наглядно было. |
|||
56
Repey
23.07.14
✎
09:49
|
(54) Конечно всего одна строка! Но если все-таки найдешь несколько?
Отработай сначала изменение и вставку строки без 1С. Примеры тут вижу. (55) Надо полагать, когда выезжаете на шашлычок - ты сперва прожариваешь пустые шампуры, а потом (по одному!) нанизываешь и жаришь кусочки мяса. |
|||
57
Мисти
23.07.14
✎
09:56
|
(56) мне нужно, чтобы хотя бы написано было раздельно, а не в одну строчку, иначе я концов не найду.
Я не могу отработать без 1С, я через 1С подключаюсь и данные у меня все в 1С. |
|||
58
Мисти
23.07.14
✎
10:03
|
А так- пожалуйста -
INSERT INTO account WHERE [UI1C=] = ? ( поле1,поле2,...,поле20 ) VALUES( 'поле1', 'поле2',..., поле20 ) |
|||
59
Мисти
23.07.14
✎
10:12
|
Похоже?
|
|||
60
Fragster
гуру
23.07.14
✎
10:12
|
(59) нет
|
|||
61
Мисти
23.07.14
✎
10:13
|
Ну а как надо? Мне больше ничего в голову не приходит.
|
|||
62
Мисти
23.07.14
✎
10:22
|
(60) Что неправильно?
Люди, мне завтра всю выгрузку сдавать! (1 таблицы пока) |
|||
63
Staffa
23.07.14
✎
10:24
|
(0) странно, что никто не дал ссылку
http://msdn.microsoft.com/ru-ru/library/bb510741.aspx (61) на вышеданном ресурсе: http://msdn.microsoft.com/ru-ru/library/ms174335.aspx есть пример: INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode, ModifiedDate) VALUES ('Square Yards', 'Y2', GETDATE()) там же описано применение условий WHERE |
|||
64
Мисти
23.07.14
✎
10:33
|
(63) Спасибо! Там всё подробно и довольно понятно. Сейчас попробую применить. Но только всё равно ж - просто скл, а не из 1С!
|
|||
65
Мисти
23.07.14
✎
10:52
|
Не-а, не понимаю. Нет там моего примера.
Все 3 части - SELECT, WHERE и INSERT описаны отдельно, а мне их нужно как-то объединить. |
|||
66
МихаилМ
23.07.14
✎
10:59
|
(63)
культурней использовать ado; oledb и метод AddNew |
|||
67
Мисти
23.07.14
✎
11:10
|
Я б заплатила за работоспособный примерчик.
А вот простой вопрос - все таблицы в базе называются (я их видела) dbo.Account и тд , везде dbo. (объект базы данных?), а даже сам программист этой базы мне в качестве примера написал SELECT * FROM Account Так надо писать dbo. или нет? А то в очередном примере вижу - INSERT dbo.Products |
|||
68
SSSSS_AAAAA
23.07.14
✎
11:16
|
(65) И как вы себе представляете объединение трех совершенно разных команд?
(67) dbo - название схемы. Если эта схема стоит по умолчанию, то ее можно не указывать. |
|||
69
Мисти
23.07.14
✎
11:27
|
(68) Ну откуда я знаю?
По-русски - всё просто - SELECT из Account WHERE ид = пар1; Если найден, то UPDATE; Иначе INSERT И задать всн поля. |
|||
70
SSSSS_AAAAA
23.07.14
✎
11:35
|
(69) Ну хотите то вы, а не кто-нибудь?
if exist(select из Account) Update ... else Insert into ... Какая буква непонятна? |
|||
71
Мисти
23.07.14
✎
12:01
|
Как написать поля заполнения раздельно, а не в 1 строчку все?
|
|||
72
ДенисЧ
23.07.14
✎
12:03
|
(71) в (18) смотри
|
|||
73
SSSSS_AAAAA
23.07.14
✎
12:20
|
(71) Вы не знаете как собрать в 1С текстовую строку произвольной длины? Такой текст никогда не видели?
Текст = | Выбрать | Поле1, | Поле2 | Из |; |
|||
74
Мисти
23.07.14
✎
12:33
|
(72) Я не вижу там похожего примера
(73) Ну и будет список из 20 плей, а потом список из 20 значений - они даже на один экран не влезут, это неудобно. Как-то так нельзя? Контрагенты.Fields("ID").Value = Контрагенты1С.ИдентификаторBPM; //Идентификатор BPM |
|||
75
ДенисЧ
23.07.14
✎
12:35
|
(74)
Команда.CommandText = "UPDATE | [Session] |SET | [STATUS] = ? |WHERE | [SessionId] = ?"; Параметры = Новый COMSafeArray("VT_VARIANT", 2); Параметры.SetValue(0, Статус); Параметры.SetValue(1, ИД); Команда.Execute(, Параметры, мМагияСКЛ.adExecuteNoRecords + мМагияСКЛ.adAsyncExecute); А это что, извините за выражение? За**па конская??? |
|||
76
SSSSS_AAAAA
23.07.14
✎
12:37
|
(74) Серверу нужна строка команды и ваши предпочтения по рисованию текста его совершенно не интересуют. Это запрос. Вы же 1с-освские запросы рисуете на несколько экранов и не переламываетесь? Вот и тут точно так же нарисуйте.
|
|||
77
Мисти
23.07.14
✎
13:02
|
(75) Из этого примера!
Set rs = CreateObject("ADODB.Recordset") rs.CursorType = 1 rs.LockType = 3 rs.Open "select * from dbo.customers", cn rs.AddNew rs.Fields("CompanyName") = "Test rs company" rs.Fields("Country") = "Germany" rs.Fields("CustomerId") = "TESTR" rs.Update |
|||
78
SSSSS_AAAAA
23.07.14
✎
13:09
|
(77) Если Вам нужны тормоза работы только через АДО, то читайте доку по этому самому АДО и не морочьте людям голову.
Нравится вам этот пример? Это пример использования нотации АДО вместо нативного Update. Что в нем непонятно? |
|||
79
Мисти
23.07.14
✎
13:17
|
Сыр-бор начался с того, что AddNew не сработало.
Так что мне вся эта методика наверное, не подходит. |
|||
80
Мисти
23.07.14
✎
14:12
|
if exist(select из Account) - прямо так можно в 1С писать?
Или Для Каждого СтрКонтр из ТабКонтр Цикл ОбработкаПрерыванияПользователя(); ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?"; Соединение.Parameters(0).Value = СтрКонтр.UI1C; Выборка = Соединение.Execute(ТексЗапроса); Если Выборка.EOF()=0 //- нет такой строки, надо добавить ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;" Соединение.Parameters(0).Value = СтрКонтр.UI1C; Соединение.Parameters(1).Value = СтрКонтр.Name; Соединение.Parameters(2).Value = СтрКонтр.AccountOwnerShipId; Соединение.Execute(ТексЗапроса); Соединение.Close(); ... Иначе // есть строка, надо обновить ТекстЗапроса = "UPDATE INTO account SET Name=?,AccountOwnerShipId= ? WHERE [UI1C] = ?"; Соединение.Parameters(2).Value = СтрКонтр.UI1C; Соединение.Parameters(0).Value = СтрКонтр.Name; Соединение.Parameters(1).Value = СтрКонтр.AccountOwnerShipId; Соединение.Execute(ТексЗапроса); Соединение.Close(); КонецЕсли; КонецЦикла |
|||
81
Мисти
23.07.14
✎
14:17
|
Выловила синтаксические ошибки.
Похоже? Для Каждого СтрКонтр из ТабКонтр Цикл ОбработкаПрерыванияПользователя(); ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?"; Соединение.Parameters(0).Value = СтрКонтр.UI1C; Выборка = Соединение.Execute(ТекстЗапроса); Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;"; Соединение.Parameters(0).Value = СтрКонтр.UI1C; Соединение.Parameters(1).Value = СтрКонтр.Name; Соединение.Parameters(2).Value = СтрКонтр.AccountOwnerShipId; Соединение.Execute(ТекстЗапроса); Соединение.Close(); Иначе // есть строка, надо обновить ТекстЗапроса = "UPDATE INTO account SET Name=?,AccountOwnerShipId= ? WHERE [UI1C] = ?"; Соединение.Parameters(2).Value = СтрКонтр.UI1C; Соединение.Parameters(0).Value = СтрКонтр.Name; Соединение.Parameters(1).Value = СтрКонтр.AccountOwnerShipId; Соединение.Execute(ТекстЗапроса); Соединение.Close(); КонецЕсли; КонецЦикла; |
|||
82
SSSSS_AAAAA
23.07.14
✎
14:38
|
(81)
1. Вместо SELECT * напишите SELECT 1, ибо весь набор полей совершенно тут не нужен. 2. Откуда взялось UPDATE INTO ? Точнее INTO после UPDATE? |
|||
83
Мисти
23.07.14
✎
14:50
|
INTO - выкинуть!
SELECT 1 - логично, поправлю. |
|||
84
Мисти
23.07.14
✎
14:55
|
{Форма.Форма1.Форма(74)}: Ошибка при вызове метода контекста (Parameters)
Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; по причине: Произошла исключительная ситуация (ADODB.Command): В коллекции не удается найти элемент, соответствующий требуемому имени или порядковому номеру. Есть такая таблица, есть такое поле, правда записи нет ни одной пока и перед названием таблицы dbo. Куды бечь? |
|||
85
SSSSS_AAAAA
23.07.14
✎
15:05
|
(84) Проверять коллекцию параметров. Ибо речь ведь про неё, не так ли? Искать, куда делся Соединение.Parameters(0)
|
|||
86
Мисти
23.07.14
✎
15:08
|
В базе я его вижу, имя совпадает. Как еще искать?
|
|||
87
Jaap Vduul
23.07.14
✎
15:09
|
(84)
Каша какая-то. >> Выборка = Соединение.Execute(ТекстЗапроса); Так можно в случае, когда в переменной Соединение находится объект типа ADODB.Connection А судя по ошибке у тебя там ADODB.Command, поэтому надо так: Соединение.Commandtext = ТекстЗапроса; // только из цикла надо это вынести Выборка = Соединение.Execute(); |
|||
88
SSSSS_AAAAA
23.07.14
✎
15:15
|
(86) А при чем тут база? Речь о самой коллекции параметров, а не о их значениях.
|
|||
89
Мисти
23.07.14
✎
15:16
|
Почему из цикла вынести, если мне нужно найти все строчки в цикле?
|
|||
90
Мисти
23.07.14
✎
15:17
|
Конечно, каша! Я ж куски тащу из разных примеров, мне ж никто не может стройно 4 строчки написать!"!!
|
|||
91
SSSSS_AAAAA
23.07.14
✎
15:18
|
(90) Их никто и не напишет.
|
|||
92
Jaap Vduul
23.07.14
✎
15:19
|
(89)
Присвоение текста запроса вынести, он ведь не меняется в цикле, только значения параметров. |
|||
93
Мисти
23.07.14
✎
15:19
|
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = Соединение003; Так как переписать этот кусок? Для Каждого СтрКонтр из ТабКонтр Цикл ОбработкаПрерыванияПользователя(); СтрКонтрСКЛ = Контрагенты1С.Добавить(); ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр); ТекстЗапроса = "SELECT 1 FROM account WHERE [UI1C] = ?"; Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Выборка = Соединение.Execute(ТекстЗапроса); Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;"; Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Соединение.Parameters(1).Value = СтрКонтрСКЛ.Name; Соединение.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId; Соединение.Execute(ТекстЗапроса); Соединение.Close(); Иначе // есть строка, надо обновить ТекстЗапроса = "UPDATE account SET Name=?,AccountOwnerShipId= ? WHERE [UI1C] = ?"; Соединение.Parameters(2).Value = СтрКонтрСКЛ.UI1C; Соединение.Parameters(0).Value = СтрКонтрСКЛ.Name; Соединение.Parameters(1).Value = СтрКонтрСКЛ.AccountOwnerShipId; Соединение.Execute(ТекстЗапроса); Соединение.Close(); КонецЕсли; КонецЦикла; |
|||
94
Wobland
23.07.14
✎
15:21
|
>Соединение.Parameters(0).Value
вот откуда в этом месте нулевой параметр? может (страшно говорить) MSDN? |
|||
95
Мисти
23.07.14
✎
15:24
|
(94) Вот отсюда украла.
Команда.CommandText = "SELECT TOP 1 | [SessionId] |FROM [Session] |WHERE | [STATUS] = ?"; Команда.Parameters(0).Value = Статус; Что не так? |
|||
96
SSSSS_AAAAA
23.07.14
✎
15:26
|
(95) Полное отсутствие понимания что и как в этом куске работает.
|
|||
97
Мисти
23.07.14
✎
15:27
|
Ну так объясните!
|
|||
98
Wobland
23.07.14
✎
15:28
|
||||
99
SSSSS_AAAAA
23.07.14
✎
15:28
|
(95) Сравните с этим:
ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?"; Соединение.Parameters(0).Value = СтрКонтр.UI1C; Даю наводку: Чем отличаются ТекстЗапроса и Команда.CommandText? |
|||
100
Wobland
23.07.14
✎
15:28
|
100
|
|||
101
Jaap Vduul
23.07.14
✎
15:33
|
(93)
Как-то так: Cmd = Новый COMОбъект("ADODB.Command"); Cmd.ActiveConnection = Соединение003; Cmd.CommandText = "if exists(select * from account where UI1C = ?) update account set Name = ?, AccountOwnerShipId = ? where UI1C = ? |else insert into account (UI1C, Name, AccountOwnerShipId) values (?, ?, ?)"; Cmd.Refresh(); Для Каждого СтрКонтр из ТабКонтр Цикл ОбработкаПрерыванияПользователя(); СтрКонтрСКЛ = Контрагенты1С.Добавить(); ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр); Cmd.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Cmd.Parameters(1).Value = СтрКонтрСКЛ.Name; Cmd.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId; Cmd.Parameters(3).Value = СтрКонтрСКЛ.UI1C; Cmd.Parameters(4).Value = СтрКонтрСКЛ.UI1C; Cmd.Parameters(5).Value = СтрКонтрСКЛ.Name; Cmd.Parameters(6).Value = СтрКонтрСКЛ.AccountOwnerShipId; Cmd.Execute(); КонецЦикла; |
|||
102
Мисти
23.07.14
✎
15:33
|
(98) Я плохо на иностранном языке понимаю.
(99) Ну как чем? Скорее - вообще ничего общего! Ну, т.е. Команда.CommandText = ТекстЗапроса |
|||
103
Wobland
23.07.14
✎
15:35
|
а я так надеялся на (12)...
|
|||
104
SSSSS_AAAAA
23.07.14
✎
15:36
|
(102) Ну так и присваивайте текст запроса соответствующему свойству соединения, а не произвольной переменной. Именно поэтому и коллекция параметров пустая и потому в ней невозможно найти параметр с индексом 0.
|
|||
105
Мисти
23.07.14
✎
15:38
|
(101) Форма.Форма1.Форма(67)}: Метод объекта не обнаружен (Refresh)
Cmd.Refresh(); |
|||
106
Мисти
23.07.14
✎
15:40
|
А! Так у меня там всё нормально.
У меня функция Соединение = СоединитьсяСSQL(), а там внутри был этот Cmd, который возвращается. Т.е. это одно и то же. |
|||
107
Jaap Vduul
23.07.14
✎
15:41
|
(105)
Cmd.Parameters.Refresh(); |
|||
108
Мисти
23.07.14
✎
15:43
|
{Форма.Форма1.Форма(67)}: Ошибка при вызове метода контекста (Refresh)
Cmd.Parameters.Refresh(); по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Ошибка синтаксиса или нарушение прав доступа |
|||
109
SSSSS_AAAAA
23.07.14
✎
15:44
|
(106) Это кому и о чем?
|
|||
110
Мисти
23.07.14
✎
15:45
|
Cmd = СоединитьсяСSQL(); - теперь у меня так.
(109) - 106 - это к 104 |
|||
111
SSSSS_AAAAA
23.07.14
✎
15:46
|
(110) У вас ТекстЗапроса - переменная, никоим образом не связанная с Connttion. Так что совершенно не одно и то же.
|
|||
112
Мисти
23.07.14
✎
15:51
|
Так текст запроса - это строка, как она должна быть связана??
|
|||
113
Wobland
23.07.14
✎
15:53
|
(112) предполагается, что эта строка должна быть в соответствующем свойстве команды, а не в какой-то подозрительной переменной
|
|||
114
Мисти
23.07.14
✎
15:53
|
"Ну так и присваивайте текст запроса соответствующему свойству соединения, а не произвольной переменной. Именно поэтому и коллекция параметров пустая и потому в ней невозможно найти параметр с индексом"
Cmd.CommandText = ТекстЗапроса. Что не так? |
|||
115
Wobland
23.07.14
✎
15:53
|
(114) сойдёт. у тебя там код меняется ежеминутно, мы у себя не успеваем обновлять
|
|||
116
Jaap Vduul
23.07.14
✎
15:54
|
(108)Проверяй имена таблиц/полей и права доступа в БД
|
|||
117
Мисти
23.07.14
✎
15:56
|
(115) Соединение.CommandText = ТекстЗапроса.
Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Выборка = Соединение.Execute(); Так? (116) Имя таблицы - там еще dbo. Может, добавить? Права не знаю, как проверить. |
|||
118
SSSSS_AAAAA
23.07.14
✎
15:57
|
(114)
1. В обсуждаемом коде нет Cmd.CommandText = ТекстЗапроса. 2. В обсуждаемом коде есть ТекстЗапроса = "SELECT * FROM account WHERE [UI1C] = ?"; Соединение.Parameters(0).Value = СтрКонтр.UI1C; и тут нет никакой привязки к объекту Соединение. И тут нет генерации коллекции параметров. И потому не находится Соединение.Parameters(0) |
|||
119
Мисти
23.07.14
✎
16:00
|
Для Каждого СтрКонтр из ТабКонтр Цикл
ОбработкаПрерыванияПользователя(); СтрКонтрСКЛ = Контрагенты1С.Добавить(); ЗаписатьКонтр(СтрКонтрСКЛ,СтрКонтр); ТекстЗапроса = "SELECT 1 FROM account WHERE [UI1C] = ?"; Соединение.CommandText = ТекстЗапроса; Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Выборка = Соединение.Execute(); Если Выборка.EOF()=0 Тогда //- нет такой строки, надо добавить ТекстЗапроса = "INSERT INTO account SET UI1C= ?, Name=?,AccountOwnerShipId= ?;"; Соединение.CommandText = ТекстЗапроса; Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; Соединение.Parameters(1).Value = СтрКонтрСКЛ.Name; Соединение.Parameters(2).Value = СтрКонтрСКЛ.AccountOwnerShipId; Соединение.Execute(); Соединение.Close(); Иначе // есть строка, надо обновить ТекстЗапроса = "UPDATE account SET Name=?,AccountOwnerShipId= ? WHERE [UI1C] = ?"; Соединение.CommandText = ТекстЗапроса; Соединение.Parameters(2).Value = СтрКонтрСКЛ.UI1C; Соединение.Parameters(0).Value = СтрКонтрСКЛ.Name; Соединение.Parameters(1).Value = СтрКонтрСКЛ.AccountOwnerShipId; Соединение.Execute(); Соединение.Close(); КонецЕсли; КонецЦикла; |
|||
120
SSSSS_AAAAA
23.07.14
✎
16:01
|
(119) ВЫ издеваетесь?
|
|||
121
Wobland
23.07.14
✎
16:01
|
про ЕОФ ещё не сказали, что это енд оф файл
|
|||
122
Мисти
23.07.14
✎
16:01
|
{Форма.Форма1.Форма(87)}: Ошибка при установке значения атрибута контекста (Value)
Соединение.Parameters(0).Value = СтрКонтрСКЛ.UI1C; по причине: Произошла исключительная ситуация (ADODB.Parameter): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом. |
|||
123
Мисти
23.07.14
✎
16:02
|
(119) В каком месте опять не так?
|
|||
124
Wobland
23.07.14
✎
16:02
|
(122) акценитрую внимание только на полезной информации: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
|
|||
125
Мисти
23.07.14
✎
16:03
|
(121) и что из этого следует?
|
|||
126
Мисти
23.07.14
✎
16:03
|
Так дело именно в аргументах, или опять всё не так?
|
|||
127
SSSSS_AAAAA
23.07.14
✎
16:04
|
(123) В нескольких. Особенно в вашей голове.
|
|||
128
Wobland
23.07.14
✎
16:04
|
(125) вроде он булев и сообщает в твоём случае, что результат запроса пуст
|
|||
129
SSSSS_AAAAA
23.07.14
✎
16:04
|
(126) Не в аргументах, а в вашей с ними работе.
|
|||
130
Wobland
23.07.14
✎
16:04
|
(126) истина
|
|||
131
SSSSS_AAAAA
23.07.14
✎
16:04
|
Ошибки в вашей логике
|
|||
132
Мисти
23.07.14
✎
16:05
|
644b3da3-5f49-4c38-bd54-6a0dc68df32f, тип уникальный идентификатор, а мне нужен строка, так что ли?
|
|||
133
SSSSS_AAAAA
23.07.14
✎
16:05
|
Вы так и не поняли откуда и как появляются и заполняются параметры.
|
|||
134
Wobland
23.07.14
✎
16:05
|
весёлый, конечно, отладчик в текстовом режиме здесь. но, может, шайтан вьюер и покончим с этой вакханалией?
|
|||
135
Мисти
23.07.14
✎
16:08
|
Если Выборка.EOF()=0 Тогда - вот это теперь вранье.
А! Или про это уже было в 121? |
|||
136
SSSSS_AAAAA
23.07.14
✎
16:08
|
(119) Вам написали готовый код. Который вы не смогли запустить только из-за ошибки выскакивающей на Refresh(). Может таки довести этот код до ума или будете метаться со своим г-кодом?
|
|||
137
Мисти
23.07.14
✎
16:09
|
(136) Так а я не знаю, как ту ошибку исправить!
|
|||
138
Wobland
23.07.14
✎
16:10
|
(137) это ты мало читала (107). нужно не менее трёх раз
|
|||
139
Мисти
23.07.14
✎
16:13
|
(138) В смысле, что там грамматическая ошибка?
|
|||
140
Мисти
23.07.14
✎
16:14
|
Нет, нет ошибки.
|
|||
141
Wobland
23.07.14
✎
16:14
|
(138) сторно. ну да. там дальше ошибка синтаксиса
|
|||
142
Мисти
23.07.14
✎
16:15
|
Cmd.Parameters.Refresh();
Я думала, может Parametres, но нет. Какая ошибка? |
|||
143
Мисти
23.07.14
✎
16:38
|
Вроде, моя история сработала, но там теперь другая засада - описание таблицы, которую мне выслали заранее не совпадает с таблицей, которую они сделали.
|
|||
144
Мисти
23.07.14
✎
19:49
|
Спасибо большое кой-кому!
Осталась еще проблема. Если строки нет, то ТекстЗапроса = "INSERT INTO gtw_AccountExport VALUES |(NULL, - и т.д., работает А если строка есть, то ТекстЗапроса = "UPDATE gtw_AccountExport VALUES |(NULL, Не работает! Там надо по-другому писать? |
|||
145
ДенисЧ
23.07.14
✎
19:51
|
Какая жаль, что а) у меня нет пулемёта, и б) ты не в прямой видимости...
|
|||
146
Wobland
23.07.14
✎
19:55
|
(144) упдейт несколько не похож на инсерт
http://www.w3schools.com/sql/sql_update.asp |
|||
147
Wobland
23.07.14
✎
19:56
|
+(146) -> (101)
|
|||
148
Мисти
23.07.14
✎
20:07
|
ТекстЗапроса = "INSERT INTO gtw_AccountExport VALUES
|(NULL, - вот это было написано без перечисления столбцов, в предположении, что они все задаются по порядку, для UPDATE - тоже ведь так можно? |
|||
149
Мисти
23.07.14
✎
20:07
|
(145) А дети-сИроты?
|
|||
150
ДенисЧ
23.07.14
✎
20:08
|
(149) Я поставлю свечку в цервки за их процветание.
|
|||
151
ДенисЧ
23.07.14
✎
20:09
|
(148) нет. нельзя.
Я давал ссылку на простейший учебник. Мой племянник в 14 лет его понял. |
|||
152
Wobland
23.07.14
✎
20:11
|
UPDATE gtw_AccountExport SET Name = ?, AccountOwnerShipId = ? WHERE [UI1C] = ?
ну или что там меняется |
|||
153
ДенисЧ
23.07.14
✎
20:12
|
(152) Вот благодаря таким, как ты, она никогда не сможет сама писать код....
|
|||
154
Wobland
23.07.14
✎
20:16
|
(153) я жажду прекращения ветки ;)
|
|||
155
Мисти
23.07.14
✎
20:17
|
(153) Мне первый и последний раз потребовался скл!
Я закончу и через 2 недели забуду абсолютно - читала я учебник, не читала... Зато у меня дочка толковая - красный диплом, во все аспирантуры берут, а она выбирает. |
|||
156
Мисти
23.07.14
✎
20:17
|
Будет новая завтра, обещаю!
|
|||
157
ДенисЧ
23.07.14
✎
20:20
|
НЕТ!!!!! Я этого не переживу!!!
|
|||
158
Мисти
23.07.14
✎
20:24
|
А ничего нельзя поделать с тем, что UI1C в 1 случае - первый параметр, а во втором - последний? Это ж 2 раза писать все списки! или отдельную процедуру для их заполнения писать! ( у меня еще таблиц штук 10 должно быть)
|
|||
159
Wobland
23.07.14
✎
20:26
|
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway'); UPDATE Customers SET ContactName='Alfred Schmidt', City='Hamburg' WHERE CustomerName='Alfreds Futterkiste'; |
|||
160
Мисти
23.07.14
✎
20:43
|
Перечислять все столбцы явно?
Ладно, обойдусь! |
|||
161
Мисти
23.07.14
✎
20:46
|
ТекстЗапроса = "update account set DoDelete = ?, Name = ?, FullName = ?, ParentAccountId = ?,PhoneNumber = ?,RegionUI1C = ?,CityUi1C = ?,ZIP = ?,Address = ?, WHERE [UI1C] = ?";
Cmd.CommandText = ТекстЗапроса; Cmd.Parameters(0).Value = СтрКонтрСКЛ.DoDelete; Не работает! Говорит - Cmd.Parameters(0) - нет там никаких параметров. |
|||
162
Wobland
23.07.14
✎
20:57
|
(161) у тебе этот код (установка параметра после установки текста) уже тыщу раз здесь работал. всё верно
|
|||
163
Мисти
23.07.14
✎
21:01
|
А что ж тогда не так?
|
|||
164
шаэс
23.07.14
✎
21:01
|
(ого, вот это выдержка у молодых людей. и стойкое желание помочь. прям из-за таких веток хочется что-нибудь новое поизучать)
|
|||
165
Мисти
23.07.14
✎
21:02
|
пароль 1292
|
|||
166
Hans
23.07.14
✎
21:05
|
выдайте дочь за богатого и забудте 1С как кошмарный сон.
|
|||
167
ДенисЧ
23.07.14
✎
21:06
|
Кстати, фото дочки в студию...
Может, тогда сниму ээээ ... санкции.... |
|||
168
МихаилМ
23.07.14
✎
21:07
|
||||
169
Hans
23.07.14
✎
21:08
|
В крайнем случае можно выдать дочь за Одинесника. На форуме полно неженатых.
|
|||
170
МихаилМ
23.07.14
✎
21:10
|
||||
171
Мисти
23.07.14
✎
21:18
|
(168) Я не вру! Я абсолютно об этом забыла, и даже почитав ветку не вспомнила - доделала ли я это и зачем это было.
|
|||
172
Мисти
23.07.14
✎
21:23
|
Очевидно, что (170) - это то же, что и (168), но, похоже, что я без этого обошлась в конце-концов.
|
|||
173
Мисти
23.07.14
✎
21:24
|
(167) Это будет на крайний случай. Она еще и красавица.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |