![]() |
![]() |
![]() |
|
Как сделать запрос к 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");
|
|||
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) Автоматически. Из числа в строку (поскольку складываются строки).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |