![]() |
![]() |
![]() |
|
v7: подключение к 1с DBF базе через OLEDB foxpro (РЕШЕНО) Fish, yurikmellon2, JohnGilbert, Калиостро, Жеглофф, Злопчинский, nick86, X Leshiy, Hawk_1c, uno-group, Волшебник, elka302, skafandr, dyevgeniy, kubik_live, vbus, vis, ADirks, bigdenis22, MWWRuza, Franchiser, trad, Builder, trdm, DimR_71, maxab72, formista2000, Vstur, abfm, Дмитрий, Chameleon1980, Prog_man, alexela, Crusher, DimVad, Гость из Мариуполя, Caesar, Климов Сергей, liap_ok, BSV, СвинТуз, bwi3, DiMel_77, Krendel, AlexKimp, phabeZ, maxar, El_Duke, evorle145, Толич, Джордж1, youalex, mmg, Олдж, mishaPH, ReaLg, Наивный
| ☑ | ||
---|---|---|---|---|
0
bigdenis22
11.07.25
✎
12:11
|
пытаюсь подключится по сети к базе:
ПутьИБ = "\\192.168.60.10\ProdInKom$\"; тПользователь = "Робот"; тПароль = "робот"; БД = СоздатьОбъект("OLEDBData"); Соединение = "Provider=VFPOLEDB.1;Data Source=" + ПутьИБ + ";Mode=ReadWrite;Deleted=Yes;" + "Collating Sequence=RUSSIAN;" + "User ID=" + тПользователь + ";Password=" + тПароль; Рез = БД.Соединение(Соединение); БД.ПрисоединитьИБ(ПутьИБ, Соединение); Запрос = БД.СоздатьКоманду(); на строке БД.ПрисоединитьИБ(ПутьИБ, Соединение) - выдает ошибку: {Обработка.РеестрОтгрузок.Форма.Модуль(136)}: FAILED! IDataInitialize::GetDataSource(): Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена. пробовал как в букваре: БД.ПрисоединитьИБ(ПутьИБ, "Provider=VFPOLEDB.1;Deleted=Yes;Mode=ReadWrite;Collating Sequence=MACHINE;Data Source=%1"); - такая же ошибка. что я не так делаю? вообще, по ПрисоединитьИБ() для ДБФ информации как то не удалось найти, может кто-то поделится рабочими примерами? ЗЫ: для SQL базы у меня подобная связка работает на-ура(естественно параметры отличаются) |
|||
1
СвинТуз
11.07.25
✎
09:07
|
ДБФ = СоздатьОбъект("XBASE");
ДБФ.КодоваяСтраница(0); // Windows ДБФ.ОткрытьФайл("c:\export.dbf"); Если ДБФ.Открыта()=0 Тогда Сообщить("Файл DBF не открыт !","!"); Возврат; КонецЕсли; КолСтр = ДБФ.КоличествоЗаписей(); н= 0; ДБФ.Первая(); ПризнакГруппы = ДБФ.IsGroup; ТекУровень = ДБФ.Level; ТекКодРодителя = ДБФ.ParentCode; ТекКод = ДБФ.Code; ТекНаименоване = ДБФ.Descr; н = н+1; Состояние("В файле прочитано записей "+н+" из "+КолСтр); Пока ДБФ.Следующая()=1 Цикл ПризнакГруппы = ДБФ.IsGroup; ТекУровень = ДБФ.Level; ТекКодРодителя = ДБФ.ParentCode; ТекКод = ДБФ.Code; ТекНаименоване = ДБФ.Descr; н = н+1; Состояние("В файле прочитано записей "+н+" из "+КолСтр); КонецЦикла; ДБФ.ЗакрытьФайл(); |
|||
2
uno-group
11.07.25
✎
09:09
|
Попытка
ЗагрузитьВнешнююКомпоненту("1cpp.dll"); Сообщить("Компонента 1С++ загружена!"); Исключение Сообщить("Пытались, но не загрузили компоненту 1С++ :("); КонецПопытки; Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Exclusive=Yes;Mode=ReadWrite;Collating Sequence=MACHINE"; ДБ = СоздатьОбъект("OLEDBData"); Рез = ДБ.Соединение(Соединение); |
|||
3
Chameleon1980
11.07.25
✎
09:09
|
(1) что к чему?
|
|||
4
uno-group
11.07.25
✎
09:11
|
+(2) Не в монопольном режиме само собой.
|
|||
5
СвинТуз
11.07.25
✎
09:13
|
(3)
Есть встроенный в платформу функционал. Пример использования. |
|||
6
СвинТуз
11.07.25
✎
09:14
|
ДБФ простой формат.
Можно открыть как текст и читать. Если знать как. |
|||
7
СвинТуз
11.07.25
✎
09:16
|
Насколько помню встроенный функционал позволяет использовать индексы.
|
|||
8
Chameleon1980
11.07.25
✎
09:18
|
(5) человеку нужно понять почему VFPOLEDB не алё.
а не иди лучше минеральной воды возьми. |
|||
9
СвинТуз
11.07.25
✎
09:22
|
(8)
Там должно быть просто. ясно. Помучатся значит. https://help.foxclub.ru/html/7d6c2f1e-1426-4072-bacd-e834d800a366.htm Дрова, доступ. Само подключение примитивно. |
|||
10
СвинТуз
11.07.25
✎
09:23
|
Видимо есть причина при наличии встроенного функционала
строить сложные выражения самостоятельно. Тогда должен уметь искать ошибки. |
|||
11
СвинТуз
11.07.25
✎
09:24
|
Дрова обнови.
|
|||
12
СвинТуз
11.07.25
✎
09:24
|
Подключение из Excel тоже глючит?
|
|||
13
bigdenis22
11.07.25
✎
09:26
|
(1) спасибо конечно, но мне нужно выполнять запросы из одной семерки в другой...
(2) эта часть и у меня работает, мне нужно ПрисоединитьИБ() - подключиться к метаданным, чтоб работала типизация в запросах...(не силен я в переводе имен 1с в истинные имена таблиц и полей) |
|||
14
СвинТуз
11.07.25
✎
09:29
|
описание таблиц идет в отдельном файле
раньше шло |
|||
15
Chameleon1980
11.07.25
✎
09:30
|
(13) на строке БД.ПрисоединитьИБ(ПутьИБ, Соединение) - выдает ошибку:
а еще у нас это не работает вы начали с одного и переехали на типизация в запросах какая проблема в итоге? 1cpp |
|||
16
bigdenis22
11.07.25
✎
09:35
|
(9) на сколько я понимаю, метод ПрисоединитьИБ() - это из 1С++, метод класса OLEDBData выполняет подключение к метаданным именно в контексте 1с. К самому FoxPro мало имеет отношения.
ну и попутно вопрос: есть какие-то "удобные" методы переводить мета-имена 1с в реальные имена таблиц и полей? и обратно? или только поиск по DD файлу? |
|||
17
bigdenis22
11.07.25
✎
09:40
|
(15) мне нужно подключиться к БД и запросами получать данные.
если убрать БД.ПрисоединитьИБ() - выполнение доходит до запроса и ругается на имена данных. Запросы я пишу именами 1С, вида: |SELECT Журнал.DOCNO Документ_ном | , Журнал.DATE as Дата | , ТМЦ.DESCR Товар | , $ТМЦ.КодТрейд КодТрейд | , $РасходнаяНакладнаяСтроки.Кво Количество | , ROUND($РасходнаяНакладнаяСтроки.ЦенаБезНДС/5*6, 2) Цена | , $РасходнаяНакладнаяСтроки.СуммаСНДС Сумма | , РасходнаяНакладная.IDDOC DOC |FROM 1SJOURN AS Журнал | INNER JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная ON Журнал.IDDOC = РасходнаяНакладная.IDDOC | INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки ON Журнал.IDDOC = РасходнаяНакладнаяСтроки.IDDOC | INNER JOIN $Справочник.ТМЦ AS ТМЦ ON $РасходнаяНакладнаяСтроки.ТМЦ = ТМЦ.ID |WHERE (" + Условие + ") |"; |
|||
18
bigdenis22
11.07.25
✎
09:43
|
(17) + этот запрос отлажен и работает в БД источнике данных через консоль запросов (ну естественно условие иначе выглядит : WHERE (Журнал.$ОбщийРеквизит.Примечание LIKE :Док1 OR Журнал.$ОбщийРеквизит.Примечание LIKE :Док2))
|
|||
19
Chameleon1980
11.07.25
✎
10:02
|
||||
20
Chameleon1980
11.07.25
✎
10:02
|
||||
21
trad
11.07.25
✎
10:05
|
Для начала соединение к БД проверь
БД = СоздатьОбъект("OLEDBData"); Рез = БД.Соединение("Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + ПутьИБ + ";Mode=ReadWrite;Mask Password=False;Collating Sequence=MACHINE;"); Сообщить(Рез); |
|||
22
uno-group
11.07.25
✎
10:20
|
(13) дык в 1с++ вроде как и не надо. чтото вроде
Для к=1 По КР Цикл ИмяРесурса = Метаданные.Регистр(Имя).Ресурс(к).Идентификатор; ТекстЗапроса = ТекстЗапроса+" |$РегистрИтоги."+Имя+"."+ИмяРесурса+" =0 and |"; КонецЦикла; |
|||
23
bigdenis22
11.07.25
✎
13:08
|
(21) Рез=1
(22) не понял, к чему это? - У меня код выполняется в БД "получатель данных" (где свои метаимена, таблицы и поля), запрос через драйвер отправляется(и должен выполнится) к другой БД "источник данных" (где уже ДРУГИЕ метаимена, таблицы, и поля)! Метаданные инициатора как помогут в определении полей источника? |
|||
24
Chameleon1980
11.07.25
✎
13:07
|
значит нужно знать, зачем ты приехал в Тулу со своим пряником
|
|||
25
bigdenis22
11.07.25
✎
11:35
|
БД.ПрисоединитьИБ() для ДБФ - вопрос открытый и не решенный
Нашел выход из ситуации, вроде работает: глМД = СоздатьОбъект("MetaDataWork"); глМД.ПрисоединитьМД(ПутьИБ+"1Cv7.md"); НовТекст = глМД.ОбрМетаСКЛ(ТекстЗап); Запрос.ВыполнитьИнструкцию(НовТекст,ТЗ); глМД.ОбрМетаСКЛ(ТекстЗап) - преобразует метаимена в тексте запроса в вид: SELECT Журнал.DOCNO Документ_ном , Журнал.DATE as Дата , ТМЦ.DESCR Товар , ТМЦ.sp14604 КодТрейд , Журнал.sp960 , РасходнаяНакладнаяСтроки.sp1033 Количество , ROUND(РасходнаяНакладнаяСтроки.sp1036/5*6, 2) Цена , РасходнаяНакладнаяСтроки.sp1040 Сумма , РасходнаяНакладная.IDDOC DOC FROM 1SJOURN AS Журнал INNER JOIN dh1011 AS РасходнаяНакладная ON Журнал.IDDOC = РасходнаяНакладная.IDDOC INNER JOIN dt1011 AS РасходнаяНакладнаяСтроки ON Журнал.IDDOC = РасходнаяНакладнаяСтроки.IDDOC INNER JOIN sc148 AS ТМЦ ON РасходнаяНакладнаяСтроки.sp1031 = ТМЦ.ID WHERE (Журнал.sp960 LIKE '%РасходнаяНакладная № 15294 от 03.07.25%') запрос работает и возвращает данные. ЗЫ: только как-то медленно - 2-3 секунды... в аналогичной ситуации запрос с подключение к SQL - доли секунды. ЗЫЗЫ: может кому будет полезно, для ODBC SQL строку в условие "LIKE %РасходнаяНакладная № 15294 от 03.07.25%" надо передавать без одинарных кавычек, а для OLEDB DBF - с одинарными кавычками "LIKE '%РасходнаяНакладная № 15294 от 03.07.25%'" |
|||
26
trad
11.07.25
✎
11:40
|
(25)
БД = СоздатьОбъект("OLEDBData"); БД.ПрисоединитьИБ(ПутьИБ); так тоже ошибка? Внутри ПрисоединитьИБ(ПутьИБ) - это: ПрисоединитьМД(ПутьИБ+"1Cv7.md") + (21) |
|||
27
bigdenis22
11.07.25
✎
12:10
|
(26) посыпаю голову пеплом...
БД = СоздатьОбъект("OLEDBData"); БД.ПрисоединитьИБ(ПутьИБ, Соединение); - работает... выскакивала ошибка синтаксиса(из-за отсутствия одинарных кавычек у параметров) - вчера из-за усталости и аналогии с подключением ODBC SQL(где нужно и Соединение() и ПрисоединитьИБ()) - решил что также не подключает ИБ... это сейчас уже после (25) поправил синтаксис параметров - и взлетело... а по началу упорно пыталься: СоздатьОбъект - Соединить - ПрисоединитьИБ наверно, вопрос можно считать решенным и закрытым. Спасибо всем за участие. |
|||
28
uno-group
11.07.25
✎
13:08
|
(23) дык что мешает сформировать этот запрос в удаленной базе получить текст запроса уже с полями и таблицами и т.п. и вставить этот текст в нужную базу.
|
|||
29
uno-group
11.07.25
✎
14:01
|
(25) Если бы SQL не давал прироста скорости, то не было бы смысла его использовать. Работай с дбф другим инструментом, но чудес не бывает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |