Имя: Пароль:
1C
 
Как прочитать из dbf-таблицы 1С сразу и числа, и русские буквы?
0 Звездочёт
 
23.07.07
12:23
Как прочитать из dbf-таблицы 1С сразу и числа, и русские буквы?
По материалам форума:
http://1c.proclub.ru/modules/newbb/viewtopic.php?topic_id=274998&forum=2&viewmode=flat&order=ASC&start=0
Повторить удалось:
1) С помощью строки соединения "Driver={Microsoft Visual FoxPro Driver};Exclusive=Yes;Null=No;SourceType=DBF;SourceDB=C:/MyTables" удалось прочитать русские буквы, но при чттении полей integer выдаёт ошибку.
2) С помощью строки соединения "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq="+ПутьДоФайла+";" удалось прочитать числа, но русских букв таким способом точно не получить (подробности пока опускаю).
Есть способ сразу и числа, и русские буквы?
Может кто в теме?
1 ТелепатБот
 
гуру
23.07.07
12:23
2 Звездочёт
 
23.07.07
16:30
Ап
3 Torquader
 
23.07.07
19:02
А в какой программе читается ?
Потому как DBF можно открыть как двоичный файл и прочитать оттуда всё, что хочется, ну и записать тоже.
Только надо ли оно ?
4 smaharbA
 
23.07.07
19:04
дай код, может че скумекаем
5 smaharbA
 
23.07.07
19:04
+(4) только без фокспрошного драйвера, нах он нужен, его скорее может и не быть, чем быть, даже если ссылка в одбс есть
6 Звездочёт
 
23.07.07
20:08
(4) дам, только поздно вечером - он у меня дома.
(5) дравер FoxPro я специально обновлял (в моем случае я готов где надо его поставить). У меня он даже с прошлого года остался, когда я с русскими буквами разбирался. Без него, как мне кажется, прочесть русский текст в dbf-файле из 1С не получится.
Я тогда перепробовал разные драйвера, пришел к выводу, что там код некоторых русских букв возвращается, как код ASCII до 127, что есть абсурд.
7 Звездочёт
 
23.07.07
20:09
(3) читать dbf-файл, как двоичный файл, на мой взгляд, накладно. Надо в его реализации копаться, а это время, т.е. деньги.
8 Звездочёт
 
24.07.07
09:41
(4) вот код:
   Путь = КаталогПользователя();
   ИмяДбф = "SC2875";
   // вар.1, читает русские буквы, но не поля integer
   СтрСоединения = "Driver=Microsoft Visual FoxPro Driver;Exclusive=No;SourceType=DBF;Null = No;SourceDB=" + Путь + ";";
   СтрЗапрос = "SELECT * FROM " + ИмяДбф;
   // вар.2, не читает русские буквы, но поля integer читает
   СтрСоединения = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq="+Путь+";";
   СтрЗапрос = "Select * from "+ИмяДбф;
   Соединение = CreateObject("ADODB.Connection");
   Соединение.Open(СтрСоединения);
   НаборЗаписей = Соединение.Execute(СтрЗапрос);
   Кол = 0;
   Пока НаборЗаписей.EOF = 0 Цикл
       Кол = Кол + 1;
       Сообщить("#"+Кол+"------------------");
       Для к = 1 По НаборЗаписей.Fields.Count Цикл
           Поле = НаборЗаписей.Fields(к-1);
           Попытка
               //Значение = AnsiToOem(Поле.Value); // варианту 2 не поможет
               Значение = Поле.Value;
               Сообщить(Строка(Поле.Name)+" ("+Поле.Type+"): "+Значение);
           Исключение
               Сообщить(Строка(Поле.Name)+" ("+Поле.Type+"): ошибка","!");
           КонецПопытки;
       КонецЦикла;
       НаборЗаписей.MoveNext();
   КонецЦикла;
   Соединение.Close();
9 Звездочёт
 
24.07.07
14:56
Ап
10 Звездочёт
 
24.07.07
16:37
Ап
11 Звездочёт
 
24.07.07
22:13
Ап
12 UnoMomento
 
25.07.07
08:28
А не пробовал через "XBase" ?
13 Звездочёт
 
25.07.07
09:59
(12) конечно. С ним таких проблем нет.
Только он работает в 1С и еще в нем запрос нельзя написать.
14 Звездочёт
 
25.07.07
14:46
"Еще по 150 и все!..." (х/ф "Бриллиянтовая рука")
15 Звездочёт
 
26.07.07
00:55
А можно тему перенести в раздел IT?
16 Ковычки
 
26.07.07
02:16
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
DataCodePage=ANSI
...
я вот предпочитаю рекордсет, хотя пофих...
17 Ковычки
 
26.07.07
03:21

//*******************************************
Процедура Сформировать()
   Перем Имя,Путь;
   Если ФС.ВыбратьФайл(0,Имя,Путь,"","ДБФ|*.dbf","DBF")=0 Тогда
       Возврат;
   КонецЕсли;
   ИмяДбф = СтрПолучитьСтроку(СтрЗаменить(Имя,".",РазделительСтрок),1);
   Текст=СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку("REGEDIT4");
   Шел=СоздатьОбъект("WScript.Shell");
   Шел.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage","ANSI","REG_SZ");
   Шел.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\BDE",2,"REG_DWORD");
   СтрСоединения = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq="+Путь+";";
   СтрЗапрос = "Select * from "+ИмяДбф;
   Соединение = CreateObject("ADODB.Connection");
   Соединение.Open(СтрСоединения);
   //Можно и так
   //Соединение.Provider="Microsoft.Jet.OLEDB.4.0";
   //Соединение.ConnectionString = "Data Source="+Путь+"; Extended Properties=dBase IV";
   //Соединение.Open();
   РекордСет=СоздатьОбъект("ADODB.Recordset");
   Рекордсет.Open(СтрЗапрос,Соединение,3,1,1);
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   Для к=0 По Рекордсет.Fields.Count-1 Цикл
       ТЗ.НоваяКолонка(Рекордсет.Fields.item(к).Name);
   КонецЦикла;
   Рекордсет.MoveFirst();
   Пока Рекордсет.EOF=0 Цикл
       н=ТЗ.НоваяСтрока();
       Для к=1 По ТЗ.КоличествоКолонок() Цикл
           ТЗ.УстановитьЗначение(н,к,Рекордсет.Fields.item(к-1).Value);
       КонецЦикла;
       Рекордсет.MoveNext();
   КонецЦикла;
   Рекордсет.Close();
   Соединение.Close();
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
18 Garykom
 
гуру
26.07.07
09:18
(7) Есть самолично написанная обработка делающая это (причем с memo)
Могу выложить (если найду). На 7.7 с применением binfiles.dll (чтобы сомволы с кодом 0 читать)

(17) рекордсет хорошо, но попробуйте прочитать из дбф файла если в текстовых полях находятся непечатные символа (коды до 32) - что у вас будет?
19 Звездочёт
 
26.07.07
14:26
(17) спасибо за ответ :)
А изменения ключа в реестре на другие программы не повлияет?
Мало ли кто захочет пользоваться провайдером Microsoft dBASE Driver (*.dbf)
20 Звездочёт
 
26.07.07
14:29
(18) такие строчки, мне кажется, и 1С не прочтет.
21 Garykom
 
гуру
26.07.07
17:25
(20) через XBase конечно, а вручную по байтикам прекрасно читает, главное чтобы с кодом 0 не было (не понимает в типе строка), binfiles заменяет на то что указано

Там суть была в том что индексы(ключевые поля) в старой фоксовой проге такие были, и нужно было переконвертить их в числа по кодам символов.