Имя: Пароль:
1C
 
Обмен с Access через ADO при поиске выдёт ошибку HELP! времени в обрез
0 LanLion
 
29.07.06
16:34
Метод "seek", на 1с8.0, примеров я не нашел, как на 7.7 не получается:

Табл.Seek("=", КодАО, КодПодр, КодИК, НомОб);

в таблице 4 ключевых поля
пишет, что
"Ошибка при вызове метода контекста (Seek): Неверное число параметров"

Кто знает подстажите приз какой у него синтаксис?
1 х86
 
29.07.06
16:47
давай подробнее что и где ищешь
2 ШтушаКутуша
 
29.07.06
16:47
(0) нужно указать имя поля:
Табл.seek("FieldName="+<Значение>....
и если поле текстовое,то не забудь одинарную кавычку "'"
3 ШтушаКутуша
 
29.07.06
16:49
+2 и ваще,пользуйся Filter("ИмяПоля1=<Значение> AND ИмяПоля2=<Значение> AND...."
4 LanLion
 
29.07.06
16:50
Ищу  запись по 4 члючевым полям
5 LanLion
 
29.07.06
16:52
Табл.Seek("=", КодАО, КодПодр, КодИК, НомОб);

Табл.Filter("reg_nom_vi"=КодАО and .... ); - так надо?
6 ШтушаКутуша
 
29.07.06
16:55
Seek требует ключей,насколько я помню,Filter-нет.
Поэтому лучше юзать его...на первых порах....
Табл.Filter("reg_nom_vi='КодАО' and .... ");
если КодАО строковый,а если нет то без одинарной кавычки
7 LanLion
 
29.07.06
16:57
КодАо -это реквизит
8 ШтушаКутуша
 
29.07.06
16:57
+ то есть Табл.Filter("reg_nom_vi='"+СокрЛП(КодАО)+"' AND...."); если строк. тип,иначе: Табл.Filter("reg_nom_vi="+Строка(КодАО)+" AND....");
9 ШтушаКутуша
 
29.07.06
16:59
(7) :)))) Неужели? тогда читай:"если тип реквизита строковый или другой"
10 LanLion
 
29.07.06
17:00
Ясно спасибо большое, буду пробовать, целый день на 4 форумах никто и слова не сказал. ешё раз спасибо
11 ШтушаКутуша
 
29.07.06
17:03
(10) а в след раз,зайди MS Access и там....все-все есть и с примерами!
Ну дерзай :) да благо те будет! :))))
12 LanLion
 
29.07.06
17:05
Упс.

Ошибка при вызове метода контекста (Filter): Неверное число параметров
               edit.Filter("reg_nom_vi"=5028 and "id_predpr"= поиск.ИмяПД and "id_ik"= поиск.ИмяИК and "id_zdan"=поиск.ИмяСчетчика);

У таблицы 4 ключевых поля:
NOM_REG_VI  число
id_predpr   число
id_ik       число
id_zdan     Счетчик
13 ШтушаКутуша
 
29.07.06
17:14
попробуй,для начала:
edit.Filter("reg_nom_vi=5028");

работает?
14 ШтушаКутуша
 
29.07.06
17:15
поле reg_nom_vi во внешней БД строковое?
15 LanLion
 
29.07.06
17:15
edit=new COMobject("ADODB.RecordSet");    
   connectstring="Driver={Microsoft Access Driver (*.mdb)};Dbq="+"D:\Не фин капитал\5028_АО\nfin_АО5028.mdb" +";";
   edit.Open("zdania",connectstring,1,3);
   edit.Filter("reg_nom_vi"=5028 and "id_predpr"= поиск.ИмяПД and "id_ik"= поиск.ИмяИК and "id_zdan"=поиск.ИмяСчетчика);

//Вся картина
16 LanLion
 
29.07.06
17:16
сейчас попробую
17 ШтушаКутуша
 
29.07.06
17:16
если строковое,тогда:
edit.Filter("reg_nom_vi='5028'");
18 ШтушаКутуша
 
29.07.06
17:17
обрати внимание на одинарную кавычку слева и справа!!!
19 LanLion
 
29.07.06
17:18
{Форма.Форма(741)}: Преобразование значения к типу Булево не может быть выполнено
               edit.Filter("reg_nom_vi=5028" and "id_predpr=поиск.ИмяПД" and "id_ik= поиск.ИмяИК" and "id_zdan=поиск.ИмяСчетчика");
20 ШтушаКутуша
 
29.07.06
17:24
Начни с одного поля,
а в and "id_predpr=поиск.ИмяПД" and "id_ik= поиск.ИмяИК"  БРЕД!!
Буть внимательней! как это может быть? вот как надо,примерно:
"id_predpr="+поиск.ИмяПД+" AND "id_ik="+ поиск.ИмяИК);

ЕСЛИ ПОЛЯ в БД!!! СТРОКОВЫЕ не забудь одинарные кавычки после знака равенства и
после подстановки значения!
"id_predpr='"+поиск.ИмяПД+"' AND "id_ik='"+ поиск.ИмяИК+"'");
21 ШтушаКутуша
 
29.07.06
17:25
ну и про приведение к типу не забудь,если поля числовые,то приведи их к строковому значению!
22 Neco
 
29.07.06
17:33
А если попробовать через Seek:

М = Новый Массив;
М.Добавить(КодАО);
М.Добавить(КодПодр);
М.Добавить(КодИК);
М.Добавить(НомОб);
Табл.Seek(М,1);

Судя по: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthseek.asp
23 LanLion
 
29.07.06
17:36
1) edit.Filter("reg_nom_vi="+строка(5028));
2) edit.Filter("reg_nom_vi=5028");
3) edit.Filter("reg_nom_vi="+строка(5028)+" and "+"id_predpr="+поиск.ИмяПД+" and "+"id_ik="+ поиск.ИмяИК+" and "+"id_zdan="+поиск.ИмяСчетчика);
   

Все реквизиты числовые

на все варианты один ответ "Ошибка при вызове метода контекста (Filter): Неверное число параметров"
Может дело в другом?
24 LanLion
 
29.07.06
17:39
Ошибка при вызове метода контекста (Seek): Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает необходимый интерфейс для функции Index.
edit.Seek(М,1);
25 LanLion
 
29.07.06
17:41
Ошибка при установке значения атрибута контекста (Index): Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает необходимый интерфейс для функции Index.
edit.Index = "PrimaryKey";
при Установке индекса ,  что за "Проводник"
26 ШтушаКутуша
 
29.07.06
17:42
попробуй строку инициализации св-ва Connect "DSN=<ODBC_NAME>;UID=<пользователь>;PWD=<пароль>;"
если пользователя и пароля нет,то "DSN=<ODBC_NAME>;UID=;PWD=;"
27 ШтушаКутуша
 
29.07.06
17:43
покажи код открытия коннекта к БД и код открытия таблицы и убери
edit.Index = "PrimaryKey"!
28 LanLion
 
29.07.06
17:44
edit=new COMobject("ADODB.RecordSet");    
   connectstring="Driver={Microsoft Access Driver (*.mdb)};Dbq="+"D:\Не фин капитал\5028_АО\nfin_АО5028.mdb" +";";
   edit.Open("zdania",connectstring,1,3);
29 LanLion
 
29.07.06
17:47
edit.Open("zdania",connectstring,1,3);

а что означают 3 и 4 параметр? (значения 1,3 взял из примера)
30 Neco
 
29.07.06
17:50
31 LanLion
 
29.07.06
17:50
<ODBC_NAME>  - какое писать
32 Neco
 
29.07.06
17:51
33 ШтушаКутуша
 
29.07.06
17:53
Index устанавливать не здесь а при открытии таблицы в свойстве CursorType,
например:
cur_name_table="SELECT * FROM <ИмяТаблицы>";
CursorType=adOpenDynamic; //или adOpenStatic или adOpenKeySet
LockType=adLockOptimistic;

cur_cnn=new COMobject("ADODB.Connection");
cur_rs=new COMobject("ADODB.Recordset");

cur_cnn.Open("DSN=<ODBC_NAME>;UID=;PWD=;");

cur_cnn.Open(cur_name_table, cur_cnn, CursorType, LockType);
//или cur_cnn.Open(cur_name_table, cur_cnn);

cur_rs.MoveLast
cur_rs.MoveFirst

cur_rs.Filter......
34 LanLion
 
29.07.06
17:55
connectstring="Driver={Microsoft Access Driver (*.mdb)};DSN=ADODB;UID=;PWD=;Dbq="+"D:\Не фин капитал\5028_АО\nfin_АО5028.mdb" +";";

Если Filter, то:
Ошибка при вызове метода контекста (Filter): Неверное число параметров

Если Seek, то:
{Форма.Форма(587)}: Ошибка при вызове метода контекста (Seek): Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает необходимый интерфейс для функции Index.
edit.Seek(М,1);
35 ШтушаКутуша
 
29.07.06
17:55
+33 пардон: после строки cur_cnn.Open,
след строку читать,как cur_rs
36 Neco
 
29.07.06
18:03
А точно поля проиндексированы?
37 LanLion
 
29.07.06
18:05
А как это определить?, ну простите вы чайника
38 LanLion
 
29.07.06
18:07
(33) а чему равны adOpenDynamic и adLockOptimistic?

CursorType и базы строковый параметр.
39 LanLion
 
29.07.06
18:07
(33) а чему равны adOpenDynamic и adLockOptimistic?

CursorType у базы строковый параметр.
40 ШтушаКутуша
 
29.07.06
18:07
да не надо те думать о том:"какие поля проиндексированы?"
41 ШтушаКутуша
 
29.07.06
18:08
опусти их! попробуй: cur_rs.Open(cur_name_table, cur_cnn);
42 ШтушаКутуша
 
29.07.06
18:09
и не забудь после работы:
cur_rs.Close;
cur_cnn.Close;
43 LanLion
 
29.07.06
18:14
connectstring="Driver={Microsoft Access Driver (*.mdb)};DSN=<ODBC_NAME>;UID=;PWD=;Dbq="+"D:\Не фин капитал\5028_АО\nfin_АО5028.mdb" +";";
cur_name_table="SELECT * FROM zdania";
cur_cnn=new COMobject("ADODB.Connection");
cur_rs=new COMobject("ADODB.Recordset");
cur_cnn.Open(connectstring);//   "DSN=<ODBC_NAME>;UID=;PWD=;"
cur_rs.Open("zdania", cur_cnn);
cur_rs.Filter("reg_nom_vi=5028");
   
Я правильно написал?

Ошибка при вызове метода контекста (Filter): Неверное число параметров
cur_rs.Filter("reg_nom_vi=5028");
44 LanLion
 
29.07.06
18:15
DSN=<ODBC_NAME>;UID=;PWD=; я его вто место впихнул?
45 LanLion
 
29.07.06
18:18
Хоть врубай перебором и оставляй наночь
46 ШтушаКутуша
 
29.07.06
18:18
сформируй ODBC_NAME: Панель управления,Администрирование,ODBC источники данных...задай новый источник:укажи его имя и выбери БД.mdb
connectstring="DSN=<ODBC_NAME>;UID=;PWD=;"
47 ШтушаКутуша
 
29.07.06
18:21
например ODBC_NAME ты задал mdb_source,тогда

connectstring="DSN=mdb_source;UID=;PWD=;"

cur_name_table="SELECT * FROM zdania";
cur_cnn=new COMobject("ADODB.Connection");

cur_rs=new COMobject("ADODB.Recordset");
cur_cnn.Open(connectstring);//   "DSN=<ODBC_NAME>;UID=;PWD=;"

cur_rs.Open(cur_name_table, cur_cnn); //<-----!!!!!!!!!!!!!!!!!!!!!!!!!!!!
cur_rs.Filter("reg_nom_vi=5028");

cur_rs.Close;
cur_cnn.Close;
48 LanLion
 
29.07.06
18:27
Теже ошибки и с seek и с Filter, DSN привязал к моему файлику и пользовательский и системный
49 ШтушаКутуша
 
29.07.06
18:29
(48) перезагрузись
50 ШтушаКутуша
 
29.07.06
18:30
и на куа системный? достаточно было указать пользовательский DNS
51 ШтушаКутуша
 
29.07.06
18:31
cur_rs.Open(cur_name_table, cur_cnn);

у тебя так?
52 LanLion
 
29.07.06
18:33
cur_name_table="SELECT * FROM zdania";
cur_cnn       =new COMobject("ADODB.Connection");
cur_rs        =new COMobject("ADODB.Recordset");
cur_cnn       .Open("DSN=new;UID=;PWD=;");
cur_rs        .Open(cur_name_table, cur_cnn);
cur_rs        .Filter("reg_nom_vi=5028");
53 LanLion
 
29.07.06
18:40
Ладно Александр, пора домой вечером буду долбаться да и прощай воскресенье, что нибудь да придумаю, большое спасибо хоть буду знать в какой яме рыться.
Извини за надоедливость.
54 ШтушаКутуша
 
29.07.06
18:52
(53) да,ладно!
а вот точки,как понимать:
cur_cnn       .Open("DSN=new;UID=;PWD=;");
cur_rs        .Open(cur_name_table, cur_cnn);
cur_rs        .Filter("reg_nom_vi=5028");
55 shuhard
 
29.07.06
19:58
Отфильтровать по ключам можно и посредством Where:
MyCon = Новый COMОбъект ("ADODB.Connection");
           MyCon.Open ("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\1c_common\Реальный_сектор\TEL_BASE2006.MDB");
           MyRst = Новый COMОбъект ("ADODB.Recordset");
           MyStr = "select * from zdania where NOM_REG_VI=1 and id_predpr=1 and id_ik=1 and id_zdan=1";
           MyRst.Open (MyStr, MyCon, 3, 1);
           MyStr = "select * from zdania where NOM_REG_VI=1 and id_predpr=1 and id_ik=1 and id_zdan=1";
           Пока НЕ MyRst.EOF Цикл
                   Сообщить(Строка(MyRst.Fields("NOM_REG_VI").Value) + "->" + Строка(MyRst.Fields("id_predpr").Value));    
                   MyRst.MoveNext();
           КонецЦикла;
56 romix
 
модератор
29.07.06
20:08
Какой еще seek - SELECT в языке запросов SQL надо юзать...
Через ADO он рулит для всех источников данных (меняется только строка подключения).

Книга знаний: Пример работы с файлами DBF по интерфейсу ADO
57 romix
 
модератор
29.07.06
20:09
(55) Да, вот именно!
58 ШтушаКутуша
 
30.07.06
12:06
(56) Парень бы не потянул. А ваще бывает нужда в seek и filter
59 LanLion
 
31.07.06
08:15
Вся штучка в том что найти не проблема (с запросами у меня проблем нет) нужно потом изменить эту запись. Если есть способ аналогичный 1с8(получитьобъект()) в acceess подскажите.

Или нечто вроде: из найденной записи узнать её номер в таблице, а потом в отдельном объекте OLE, сказать нечто вроде "получить(Номстр)".
60 vde69
 
31.07.06
08:52
(59) тогда делай примерно так (только под 8.0 заточи чуток):


Функция ОтправитьДК(Connection) // возвращает список дат проводок
   Command = СоздатьОбъект("ADODB.Command");
   Command.ActiveConnection = Connection;
   
   
   Рег=СоздатьОбъект("Регистры");
   сп=СоздатьОбъект("Справочник.ДисконтныеКарты1");  
   сп.ВыбратьЭлементы();                        
   е1=0;
   Пока сп.ПолучитьЭлемент() = 1 Цикл  
       е1=е1+1;
   КонецЦикла;
   сп.ВыбратьЭлементы();                        
                                   
   е=0;
   Пока сп.ПолучитьЭлемент() = 1 Цикл  
       е=е+1;
       Состояние("Идет отправка ДК "  + глИндикатор(е,е1));                                                                                                                                  
       Код        = СокрЛП(сп.Код);
       Сумма    = Число(Рег.ДисконтныеКарты.Остаток(сп.ТекущийЭлемент(),"Сумма"));
       Процент    = Число(глПолучитьСкидкуПоДисконтнойКарте(0,сп.ТекущийЭлемент()));
       Если сп.СуммаОтправленная<>сумма Тогда
           Command.CommandType=1;  
           Command.CommandText="SELECT * FROM s_dk_ WHERE dk='"+ код + "'";
       
           Try
               Set=Command.Execute();
           Except
               Предупреждение(ОписаниеОшибки());
               Возврат -1;
           EndTry;  
       
           Если Set.EOF()<>-1 тогда
               Command.CommandText="UPDATE s_dk_ SET
               | dk='" + код + "',
               | price='" + Сумма + "',
               | pr='" + Процент + "'  
               | WHERE dk='"+ код + "'";
           Иначе
               Command.CommandText="INSERT s_dk_ (dk, price, pr) VALUES (
               | '" + код + "',
               | '" + сумма + "',
               | '" + Процент + "' ) ";
           КонецЕсли;  
           
           Try
               Set=Command.Execute();
               сп.СуммаОтправленная=сумма;
               сп.Записать();
           Except
               Предупреждение(ОписаниеОшибки());
               Возврат -1;
           EndTry;
       КонецЕсли;
       
   КонецЦикла;    
   

   Возврат 1;
КонецФункции
61 774816
 
31.07.06
09:27
(59) что бы найти и обнавить запись лучше использовать command
с запросом типа Update table set tb1=1 where tb1=2
2. номер записи может зависить от сортировки или от  ее отсутсвия. если есть колонка номер записи то можно попробовать данные одного рекорсета присвоить новому и уже по новому фильтровать
MyRst = Новый COMОбъект ("ADODB.Recordset");
MyRst1 = Новый COMОбъект ("ADODB.Recordset");

после выборки по первому прописать

MyRst1=MyRst.Clone


MyRst1.Filter итд..
62 shuhard
 
31.07.06
10:07
Изменять запись можно и через RecordSet, метод Update, поле Resultat:
           MyCon = Новый COMОбъект ("ADODB.Connection");
           MyCon.Open ("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\1c_common\Реальный_сектор\TEL_BASE2006.MDB");
           MyRst = Новый COMОбъект ("ADODB.Recordset");
           MyStr = "select * from zdania where NOM_REG_VI=1 and id_predpr=1 and id_ik=1 and id_zdan=1";
           MyRst.Open (MyStr, MyCon, 2, 3);//adOpenDynamic, adLockOptimistic
           Сообщить("До->"+Строка(MyRst.Fields("Resultat").Value));
           MyRst.Fields("Resultat").Value="Киргуду"; // Присвоение
           MyRst.Update(); //Запись
           Сообщить("После->"+Строка(MyRst.Fields("Resultat").Value));
           MyRst.Close();
           MyCon.Close();