Имя: Пароль:
1C
1C 7.7
v7: 1с77 и ADO
0 maestro-72
 
17.11.17
16:15
Не получается выполнить Update с помощью адо, делаю так:
DBConn = CreateObject("ADODB.Connection");
    DBConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" +
        "Data Source=" + СокрЛП(ВыбКаталог) + база + ";" +
        "Extended Properties=""DBASE IV;"";");

DBConn.Execute("UPDATE [tabl#DBF] SET FIO='Петров Василий Пупкин' WHERE KOD=131559");

При исполнении кода запись не обновляется пишет:
Microsoft JET Database Engine: Ключ поиска не найден ни в одной записи.

Если дело в индексе, как без индекса можно обновить, дело в том что индексный файл есть, но я не знаю его структуру, как посмотреть как поля называются в этом индексе.

Таблицы создвались не мной, я их только использую.

Пытался открывать базу встроенными средствами, но не открывает для записи, база уже открыта для чтения. В общем это был бы самый приемлемый вариант, но не работает. Если убрать условие от обновляет все записи, не смотря на то что база у других пользователей открыта.
В общем хотелось бы как нибудь эту проблему решить, может и не через адо.
1 Ёпрст
 
17.11.17
16:19
есть уверенность, что код - числовое поле ?
2 Ёпрст
 
17.11.17
16:20
ну и vfpoledb как-то привычнее
3 Ёпрст
 
17.11.17
16:20
чем Jet.OLEDB
4 maestro-72
 
17.11.17
16:29
(2) Ну вот с ним не пробовал, надо попробовать. Дело в том при простом переборе записей select доходя до конца опять таки дает ошибку, как буд то условие на конец набора не отрабатывает. Надо попробовать с vfpoledb
5 Ёпрст
 
17.11.17
16:34
на а поле KOD - числовое у тебя ?
6 maestro-72
 
17.11.17
19:35
Код - число
7 maestro-72
 
18.11.17
14:29
не получается, Провайдера скачал и установил. Система windows10 при попытке создать объект:

DBConn = СоздатьОбъект("OLEDBData");
{C:\3\1\ВК\ПРОБА!!!.ERT(29)}: Неудачная попытка создания объекта (OLEDBData)

куда копать?
8 maestro-72
 
18.11.17
14:36
Кстати, эксперементировал с
DBConn = CreateObject("ADODB.Connection");
    DBConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" +
        "Data Source=" + СокрЛП(ВыбКаталог) + база + ";" +

        "Extended Properties=""DBASE IV;"";");

Набор = DBConn.Execute("Select * From [tabl#DBF] WHERE KOD=131559");

пока  Набор.EOF=0 Цикл    
    КОД=    Набор.Fields("KOD").value;
    ФИО=  Набор.Fields("FIO").value;
    
    
    Сообщить("Код="+КОД+" ФИО="+ФИО);
    
    Набор.MoveNext();
КонецЦикла;

Выводит нужную запись но на MoveNext() падает!

Что такое, непонятно...
9 maestro-72
 
18.11.17
22:28
(7) разобрался
10 maestro-72
 
20.11.17
14:18
(0) не работает только на одной таблице DBF, как назло на самой нужной. На других проверял - все работает.
При команде Select с условием тормозится на этой строке:

РС.MoveNext(); //Переходим к след. записи DBF
{C:\3\1\ВК\ПРОБА!!!.ERT(89)}: Microsoft JET Database Engine: Ключ поиска не найден ни в одной записи.

На других таблицах все нормально отрабатывает. Почему? где смотреть? Открывал таблицу в Фоксе, все нормально открывается.
11 Сияющий в темноте
 
20.11.17
14:33
пересоздать индексы?
13 maestro-72
 
20.11.17
14:36
(12) Что это даст!
14 aka AMIGO
 
20.11.17
14:37
Ничего.. :(
Разобрался..
15 maestro-72
 
20.11.17
14:37
(11) Индексы как то влияют?
Я беру любую другую таблицу без индекса, на ней все прекрасно работает, на этой не хочет.
16 Сияющий в темноте
 
21.11.17
10:20
еще попробуй на vbscript,у меня подключение к парадокс из 1с так и не заработало,хотя из vbscript тот же код работал
просто,1с изначально задает параметры доступа к данным и при загрузке ado dll,они эти рараметры получпют и работают по другому,нежкли без инициализации
17 Ёпрст
 
21.11.17
10:24
на вот, должно помочь
https://cloud.mail.ru/public/HwQs/gJuwjL5Vj
18 maestro-72
 
23.11.17
10:46
(17) Вот спасибо! Сейчас попробую, отпишусь. Пока меня небыло на форуме... На своем компе, локально, записал все эти DBF. установил провайдер VPF, подключился через ADO и о счастье, все заработало! Ну проблему numerec это есть подсказки, все решил. Переношу все на рабочий комп, ставлю, опять таки провайдер, подключаюсь - не работает! Строка подключения не нравится из за параметра Deleted. убрал, Адо коннектится но при выполнении команды Select выдает что какая то переменная не определена. В общем танцы с бубнами да и только. Сейчас буду пробовать с 1C++, и задача то простая. Есть в дбф поля которые надо обновить. При этом приходится просить всех выйти из базы, войти монопольно и тогда! можно чтото с этим сделать. А как же разделенный доступ? Про штатные средства... там видимо никак. Вот и приходится изыскивать варианты с АДО
19 Ёпрст
 
23.11.17
10:51
(18) проще не использовать дбф.
Проще базу в 1sqlite например, создать
20 Ёпрст
 
23.11.17
10:51
там нужно тогда всего лишь загрузить 1 вк 1sqlite.dll и всё.
21 Ёпрст
 
23.11.17
10:52
ну и дальше ужо - инсерт/апдеейт/делете + транзакции.
22 Сияющий в темноте
 
23.11.17
11:00
если из 1с не работает,напишите тоже самое на VbScript и запускайте из командной строки
23 maestro-72
 
23.11.17
11:03
(17) Попробовал на локалке, запрос проходит. Сейчас перенесу на рабочий комп, там попробую.
Кстати Я смотрел 1sqlite не разобрался как делать запрос к произвольному DBF. Везде примеры доступа к DBF 1c. А так вкусная штуковина. Если есть пример с этой DLL буду очень благодарен. У меня не 1с база, в том то и дело. Я не могу менять структуру таблиц. Мне надо только организовать взаимодействие с ней пользователей на приемлемом уровне в разделенном режиме. Поскольку я работаю с 1с77 уже довольно давно, то пробую эту платформу использовать. Так быстрее всего получается, но вот завис на проблеме.
24 maestro-72
 
23.11.17
11:06
(22) Учту, это может быть выходом!
25 maestro-72
 
23.11.17
11:19
(17) На рабочем компе вот так ругается:
FAILED! ICommandText::Execute(): Variable 'CFG_SBFIO' is not found.
26 maestro-72
 
23.11.17
11:20
Не пойму в чем дело, видимо придется через VbScript
27 maestro-72
 
23.11.17
11:21
У меня и переменной такой нет нигде
28 Ёпрст
 
23.11.17
11:22
(23) к произвольному дбф - никак. Да и не зачем. Нужно всего лишь создать базу на sqlite, в ней нужные таблички и уже с ними работать.
29 Ёпрст
 
23.11.17
11:24
ну а перегнать данные из дбф в базу на sqllite - пару секунд
30 maestro-72
 
23.11.17
11:30
(29) А обратно? Мне нельзя трогать структуру таблиц, База переодически выгружается в стороннюю организацию. Это старый досовский CLIPPER. Да и новый интерфейс написать без опыта работы с этими данными сложновато. Проблема основная в отсутствии выборок нужных, вот тут 1с и подходит, но кроме в этих выборках удобно менять какие либо данные и сразу записывать в таблицы.
31 Ёпрст
 
23.11.17
12:07
(30) и обратно так-же, пара сек.
32 Torquader
 
23.11.17
12:24
А вообще, если программа открывает Dbf-файл, то она ставит блокировки, вполне возможно, что ADO их видит и не хочет писать в файл, который уже кем-то открыт, тогда как в свободный файл оно пишет без проблем.
33 maestro-72
 
23.11.17
12:25
(32) Даже просто таблицу не открывает! никто в ней не работает
34 Ёпрст
 
23.11.17
12:25
через vfp и 1с++ можно отключить блокировки к дбф и писать/читать одновременно
35 maestro-72
 
23.11.17
12:27
(34) В данном случае пробовал присланный пример не хочет читать НД (25)
36 Ёпрст
 
23.11.17
12:28
(35) помести в каталог без русских букв в названии
37 Ёпрст
 
23.11.17
12:28
чтоб полный путь к файлу был полностью английским
38 maestro-72
 
23.11.17
12:39
(37) цифры и английские буквы. Переделал подключение на VBS ошибка таже. Я так думаю чтото на этом компе не то... Если у меня работает, а на этом компе не работает. Провайдер переустанавливал, еще тут стоит вижуал фокс 9.0. что не так? не пойму.
39 Ёпрст
 
23.11.17
12:41
та поделка, что выше, при обращении к другому дбф файлу, выдаёт ошибки ?
40 Torquader
 
23.11.17
12:42
(38) Vbs запускать через SysWow64, чтобы работало в 32-битах.
41 maestro-72
 
23.11.17
12:56
(40) Система 32 битная
42 maestro-72
 
23.11.17
12:57
(39) На других файлах пробовал, там все работает без проблем. И через адо и через пример. и vbscript
Что может быть не то с этим файлом?
43 Torquader
 
23.11.17
12:58
Файл секретный или выложить можешь ?
44 maestro-72
 
23.11.17
12:59
Выложить не могу, к сожалению :-(
45 Torquader
 
23.11.17
13:01
Тогда проверь заголовок побайтно на соответствие стандарту dbf и проверь, что записи этому стандарту соответствуют.
Возможно, что число с плавающей точкой записано неправильно.
У меня, например, парсер на php успешно жрал кривые dbf-файлы, выгружаемые кем-то на Си, хотя в записи числа с плавающей точкой запятая была не там где нужно, и только Excel его не хотела открывать.
46 maestro-72
 
23.11.17
13:06
(45) Вот, Excel его гдето на половине обрывает, записи не все выходят в таблицу. А фокс читает весь. Сейчас буду смотреть его вертеть.
47 Torquader
 
23.11.17
13:12
(46) Тогда точно, что ошибка в плавающей точке.
Если очень хочется посмотреть, можно накатать программу для чтения Dbf-файла через чтение двоичных данных и проверить форматы.
Файл у тебя битый - однозначно - проверь формат и исправь - всё будет работать.
48 Torquader
 
23.11.17
13:13
Кстати, фокс читает содержимое полей в текстовом виде и выводит на экран, для него $ в цифрах не приводит к ошибке, как для Excel.
49 Ёпрст
 
23.11.17
13:14
достаточно в дбф редакторе открыть и сохранить.
50 Torquader
 
23.11.17
13:15
(49) При этом, часто, неправильно записанные данные теряются.
51 maestro-72
 
23.11.17
23:10
Таблицу исправил, без индекса все работает. С индексом не хочет. Sql пытается использовать индекс. Я посмотрел в индексном файле выражения по которым он строится и выяснил, что одно из выражений индекса зависит от внутренней переменной программы - CFG_SBFIO. Можно как то выполнить SQL выражение без использования индекса? т.к. если индекс удалить, то все работает.
52 maestro-72
 
23.11.17
23:11
Кстати с индексом не открывает ни фокс ни xBASE
53 Сияющий в темноте
 
24.11.17
10:03
Если ты файл подправил,а индекс-нет,то что ждать
к сожалению,формат индексов у разных программ разный,и,возможно,что адо просто не знает,что за индекс используется
54 maestro-72
 
24.11.17
14:31
(53) Индексы создает программа базы. Я не могу его исправить.
ADO пытается открыть таблицу с индексом сразу. А можно ее как то настроить, чтобы она таблицу открывала без использования индекса? Есть у нее такие параметры?
55 Сияющий в темноте
 
24.11.17
20:02
(54)а что это тебе даст-прочитать сможешь,но для этогл можно просто скопировать файл в другое место,а записать-только поля,не используемые в индексе,иначе может случиться чудо,и данные в файле сильно пострадают
56 maestro-72
 
24.11.17
22:24
(55) На данный момент так и приходится делать. Копирую файл, командой апдейт меняю нужные мне поля, копирую файл обратно. В программе делаю реиндекс. Вот хотелось отказаться от переноса файла, его изменения. Все это сопровождается просьбами пока освободить программу на момент этих манипуляций. Было желание отказаться от этих манипуляций, т.к. те поля что меняются не влияют на индекс. Но тут то индекс и подвел. С индексом таблица не открывается. А как без индекса открыть не знаю.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.