Имя: Пароль:
1C
 
Как сделать запрос к dbf ?
0 Штурман
 
21.06.10
06:23
Подскажите собственно как извлечь нужные данные из файлов *.dbf посредством запросов 1С ?
1 Rie
 
21.06.10
06:30
Запросы _1С_ непосредственно с DBF-файлами не работают.
Тут или объект XBase использовать, или подключаться через OLE DB и там уже запросами.
2 Штурман
 
21.06.10
06:40
(1) т.е. лучше всего перекинуть временно все данные из дбф в таблицу значений а там уже использовать менеджер временных таблиц ?
3 DCKiller
 
21.06.10
06:43
(0) юзай ADO
4 Штурман
 
21.06.10
06:48
(3) а пример ?
5 Rie
 
21.06.10
06:49
(2) Если в запросе будут использоваться ещё и данные из 1С - то да, каким-либо способом перекинуть во временную таблицу и дальше 1С-овскими запросам.
Если нет - то можно запросами через ADO.
6 DCKiller
 
21.06.10
06:49
Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Mode=Read;Extended Properties=""DSN=Файлы dBASE;Collate=Russian;DBQ="+СокрЛП(КаталогФайлаБД)+";Collate=Russian;Null=Yes;Deleted=Yes;""";
   Соединение.Open();
   
   //получим количество записей в выборке
   Команда = Новый COMОбъект("ADODB.Command");
   Команда.ActiveConnection = Соединение;
ТекстЗапроса = "SELECT DB1.*, DB2.* FROM DB1 LEFT JOIN DB2";
   Команда.CommandText = ТекстЗапроса;
   Команда.CommandType = 1;
   Запрос = Новый COMОбъект("ADODB.RecordSet");
   Запрос = Команда.Execute();
//здесь обходишь результат
Пока Запрос.EOF() = 0 Цикл
//твои действия...
Запрос.MoveNext();
КонецЦикла;
Запрос.Close();
7 DCKiller
 
21.06.10
06:50
(6) к (3)
8 DCKiller
 
21.06.10
06:50
ТекстЗапроса = "SELECT DB1.*, DB2.* FROM DB1 LEFT JOIN DB2 ON DB2.FIELD1 = DB1.FIELD1";
9 Штурман
 
21.06.10
07:12
зм, а как вывести на экран результат запроса?
10 Defender aka LINN
 
21.06.10
07:15
(9) Ну, тут уж придется позвать программиста, без него никак.
11 Штурман
 
21.06.10
07:19
да, еще вопрос, а как собственно этот дбф открывать то?
12 Штурман
 
21.06.10
07:19
в искеле например так: ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
13 DCKiller
 
21.06.10
07:21
(12) читать-то хоть умеем? В (6) все написано как.
14 Штурман
 
21.06.10
07:22
т.е. нужен только путь к каталогу, а "FROM DB1" - это и есть имя файла ?
15 DCKiller
 
21.06.10
07:23
(14) да
16 DCKiller
 
21.06.10
07:23
Имя файла - это DB1. А FROM - это команда запроса, указывающая, что мы получаем данные из DB1.
17 Штурман
 
21.06.10
07:26
(16) спасибо )
18 Штурман
 
21.06.10
07:54
(16) уважаемый, вы тут?
в общем я запрос написал, мну понравилось )

а можно ссылку на более подробный механизм работы в 1с с использованием ADO ?
19 DCKiller
 
21.06.10
08:01
(18) гугл рулит
20 Штурман
 
21.06.10
08:02
(19) а я спрашивать большей часть не у гугла лублу )
21 Штурман
 
21.06.10
08:28
ап, завис чуток, как задать параметр в вышепредставленном запросе?
т.е. на форме есть поле выбора сотрудника, мы запоминаем его код, вот так:

Имя = Сотрудник.Код;

а как теперь Имя вставить в запрос?

Where ....
22 Штурман
 
21.06.10
08:29
Where TBN=<что тут писать>
23 Rie
 
21.06.10
08:32
(21) Объект ADODB.Command позволяет установить параметры запроса (коллекция Parameters).
24 Маленький Вопросик
 
21.06.10
08:37
(0) лучше загрузи в неотображаемое табличное поле 1 раз... потом делай запрос уже с помощью временных таблиц - будет быстрее...
25 Штурман
 
21.06.10
08:40
(24) шот я вас не пойму - одни АДО советуют, я уже код написал, а терь советуют юзать временные таблицы :))

а можно точнее, где быстрее все ж ?
26 Odavid
 
21.06.10
08:42
(25) одно другому не мешает :)
Сначала делаешь запрос через ADO, потом результат загружаешь в ВрТ
Это разные механизмы, а не одно и то же.
27 Маленький Вопросик
 
21.06.10
08:44
(25) мне кажется временные таблицы пошустрее будут т.к. работа тут с памятью идет только, а при чтении из дбф - ты каждый раз дбф-ку считываещь
28 Штурман
 
21.06.10
08:45
(26) (27) ладно, я сейчас допишу через АДО, тока разберусб как параметр в запрос вставить, а потом буду запрос с временными таблицами писать
29 Odavid
 
21.06.10
08:47
(27) вы человеку объясните :)
Что сначала все равно запрос к DBF делать, а потом, перед циклом - выгрузку во временную таблицу (конструкция заполнения ВрТ используется непосредственно в запросе, либо через менеджер ВрТ).
30 Odavid
 
21.06.10
08:48
(28) в (27) подразумевалась замена цикла по Запрос.MoveNext() на цикл по ТЗ из временной таблицы.
31 Маленький Вопросик
 
21.06.10
08:49
(0) короче так:
1.подключаешься через к дбф (обычное чтение дбф) - адо не надо..
2.результат считываешь в табличное поле - например скрытое
3.результат с тп - засовываешь во временную таблицу
4.работаем с временной таблице запросами sql
32 Alpinist22
 
21.06.10
08:51
Вот держи, сам делал, работает на любой винде старше XP, наличие офиса не обязательно:
MyCon=Новый COMОбъект ("ADODB.Connection");
   MyCon.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ПутьКФайлу+";Extended Properties=""Excel 8.0;HDR=No;IMEX=1""");
   MyRst=Новый COMОбъект ("ADODB.Recordset");
   MyStr="select * from [Лист1$]";
   MyRst.Open (MyStr, MyCon, 2, 3);//adOpenDynamic, adLockOptimistic
   Пока НЕ MyRst.EOF() Цикл
       Если ЗначениеЗаполнено(Строка(MyRst.Fields(MyRst.Fields.Item(0).Name).Value)) И Флаг1=Истина И Лев(Строка(MyRst.Fields(MyRst.Fields.Item(0).Name).Value),1)="8" Тогда
           НоваяСтрокаТЗ=ТЗExcel.Добавить();
           НоваяСтрокаТЗ.Номер=Строка(MyRst.Fields(MyRst.Fields.Item(0).Name).Value);
           НоваяСтрокаТЗ.Дата=Строка(MyRst.Fields(MyRst.Fields.Item(3).Name).Value);
КонецЕсли;
MyRst.MoveNext();
   КонецЦикла;
MyRst.Close();
MyCon.Close();
33 Штурман
 
21.06.10
08:53
(31) понятно
34 Штурман
 
21.06.10
08:53
(32) спасибо )
35 Злобный Йожег
 
21.06.10
08:54
(31) "обычное чтение дбф) - адо не надо" Ты представляешь, какая скорость чтения дбф через адо и черех Xbase? Если файл загрузки большой, то обычное чтение будет идти очень медленно.
36 Alpinist22
 
21.06.10
08:56
(35) у меня на дбф с 4000 записей через адо читает с такой же скоростью как и обычным способом, зато привязки к офису нету
37 Злобный Йожег
 
21.06.10
08:58
(36) хз, у меня через адо быстрее было примерно в 2-3 раза минимум
38 Штурман
 
21.06.10
08:58
таварищи, никто еще раз не подскажет как в АДО в запросе передать параметр?
39 Штурман
 
21.06.10
09:04
пишу так:

сотрудник = Формат(Сотр.Код, "ЧГ=");
ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN=&сотрудник";

не канает (
40 Alpinist22
 
21.06.10
09:05
ну там SQL запрос как видно из текста, но я бы на твоем месте анализировал данные программно на 1С, слишком много нюансов в этом запросе получиться
41 Штурман
 
21.06.10
09:15
да меня в общем зацепило, хочется табельный сотра передать, никак не выходит

уже так написал:

ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN=:sotr";
       par = Команда.CreateParameter("sotr", );
       Команда.Parameters.Append(par);
       par.Value = сотрудник;
       Команда.CommandText = ТекстЗапроса;
       Команда.CommandType = 1;
       Запрос = Новый COMОбъект("ADODB.RecordSet");
       Запрос = Команда.Execute();
42 Штурман
 
21.06.10
09:21
никто не посоветует ?
43 Штурман
 
21.06.10
09:22
да, вот какую ошибку выдает:

Ошибка при вызове метода контекста (Append): Произошла исключительная ситуация (ADODB.Parameters): Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения.
44 Lelic
 
21.06.10
09:23
А просто как строку "склеить" параметры не получается? У нас вроде работает. С датами только приходится поковыряться
45 Штурман
 
21.06.10
09:25
(44) а как? можно на моем примере привести?
46 Lelic
 
21.06.10
09:26
Должно получиться что-то вроде этого:
ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN"+sotr;
sotr=ТабельныйНомер;
47 Штурман
 
21.06.10
09:26
ошибка вроде тут: CreateParameter("sotr", ?, ? );

вот вместо вопросов не понял что писать
48 Штурман
 
21.06.10
09:27
(46) не вышло...
вот текст ошибки:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Драйвер ODBC dBase] Слишком мало параметров. Требуется 1.
49 Alpinist22
 
21.06.10
09:29
Забей, больше времени уйдет на запрос, чем на его анализ в 1С.
50 Штурман
 
21.06.10
09:29
+(48) это на такой код:

ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN"+сотрудник;

написал потом так:

ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN="+сотрудник;

сейчас выдает такую ошибку:

Ошибка при вызове метода контекста (Fields): Произошла исключительная ситуация (ADODB.Recordset): Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру.
51 Штурман
 
21.06.10
09:30
(49) не, вот всего один параметр передам и забью )
52 Штурман
 
21.06.10
09:31
вот весь код запроса

сотрудник = Формат(Сотр.Код, "ЧГ=");
   
   
   Попытка
       // Открытие файла DBF
       Соединение = Новый COMОбъект("ADODB.Connection");
       Соединение.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Mode=Read;Extended Properties=""DSN=Файлы dBASE;Collate=Russian;DBQ="+СокрЛП(ИмяПути)+";Collate=Russian;Null=Yes;Deleted=Yes;""";
       Соединение.Open();
       //получим количество записей в выборке
       
       Команда = Новый COMОбъект("ADODB.Command");
       Команда.ActiveConnection = Соединение;
       //ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN=:sotr";
       ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN="+сотрудник;
       //par = Команда.CreateParameter("sotr");
       //Команда.Parameters.Append(par);
       //par.Value = сотрудник;
       Команда.CommandText = ТекстЗапроса;
       Команда.CommandType = 1;
       Запрос = Новый COMОбъект("ADODB.RecordSet");
       Запрос = Команда.Execute();
       
       // обход результата        
       Пока Запрос.EOF() = 0 цикл
           сообщить(Запрос.Fields("TBN").Value);
           Запрос.MoveNext();
       конеццикла;
       Запрос.Close();
       
   Исключение
       Сообщить("Ошибка при открытии/чтении файла " + ИмяПути + "." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
   КонецПопытки;
53 Штурман
 
21.06.10
09:32
как параметр то передать? (сотрудник)
54 Lelic
 
21.06.10
09:32
А где вы его присваиваете?
55 Lelic
 
21.06.10
09:33
Д.б.что-то вроде сотрудник=...Что-то не вижу
56 Штурман
 
21.06.10
09:35
(55) в самом верху
57 Штурман
 
21.06.10
09:35
сотрудник = Формат(Сотр.Код, "ЧГ=");

Сотр выбирается на формочке
58 Rie
 
21.06.10
09:36
(53) В тексте запроса в местe параметра ставишь "?".
Ну и устанавливаешь параметр через Parameters.
59 Штурман
 
21.06.10
09:40
(58) ну написал так:

ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN=?";

вот ошибка:
Ошибка при вызове метода контекста (Append): Произошла исключительная ситуация (ADODB.Parameters): Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения.

может все дело в том что у меня написано так:

par = Команда.CreateParameter("sotr");

вроде нужно писать так:

par = Команда.CreateParameter("sotr", ?, ?);

вот вместо вопросительных знаков не ясно что писать
60 Lelic
 
21.06.10
09:41
Извиняюсь. Я все про строки...Насколько я понимаю в результате запрос д.выглядеть ка-то так SELECT DUP FROM RLS03 WHERE TBN='000001'. Наверное просто кавычек не хватает. Может так получится:
"SELECT DUP FROM RLS03 WHERE TBN=' "+сотрудник+"'";
61 Rie
 
21.06.10
09:45
(59) Если мне не изменяет мой склероз, то второй параметр - тип, третий параметр - in/out. И то, и другое обозначается числами (см. в документации).
62 Штурман
 
21.06.10
09:46
(60)
ну что ж такое ((((((

пишу уже так: ТекстЗапроса = "SELECT DUP FROM RLS03 WHERE TBN='"+сотрудник+"'";

так вылетает такая ошибка:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Драйвер ODBC dBase] Несоответствие типов данных в выражении условия отбора.
63 Rie
 
21.06.10
09:49
(62) Типы проверь. Где строка, а где - число. И не сравнивай строки с числами.
64 Lelic
 
21.06.10
09:52
Согласна с Rie. Я бы уже попробовала в лоб запрос написать с конкретным таб.номером, чтобы он отработал, а потом параметр передать.
65 Штурман
 
21.06.10
09:54
(63), (64)

ну спасибо, я уже написал в лоб, тока таже ошибка вылетает

может все дело в том, что 1С у четырехзначных цифр после первой цифры ставит пробел, т.е. получается ввели 5555 а на выходе такое число: 5 555
66 Rie
 
21.06.10
09:55
(65) Очень может быть. Функция Формат поможет с этим справиться.
67 Lelic
 
21.06.10
09:55
А формат зачем? Там есть галочка группировка
68 Rie
 
21.06.10
10:01
(67) "Там" - это где?
В "SELECT ..... WHERE TBN="+сотрудник
этот самый сотрудник преобразуется в строку автоматически, вставляя неразрывный пробел между группами разрядов.
69 Lelic
 
21.06.10
10:04
Как это он сам преобразуется? А "там" это в функции Формат
70 Штурман
 
21.06.10
10:13
шота нипанятное дело выходит - запрос через АДО писать

уже явно усе прописал:

сотрудник = Формат(Число("5555"), "ЧГ=0");
ИмяПути = "D:\123\";

ан нет, вылетает та же ошибка
71 Штурман
 
21.06.10
10:17
написал так:

сотрудник = СокрЛП(Формат(Число("5555"), "ЧГ=0"));

аналогично, думаю уже забить на это
72 Rie
 
21.06.10
12:11
(70) Тип у поля TBN - какой?
73 Rie
 
21.06.10
12:11
(69) Автоматически. Из числа в строку (поскольку складываются строки).
AdBlock убивает бесплатный контент. 1Сергей