Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

Вход или Регистрация

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[Другие решения на платформе "1С:Предприятие 8"]

Как сделать запрос непосредственно к DBF

Тимур15rus
читатель
офлайн
Дата регистрации: 08.11.2008
Сообщений: 613
Пост №1
 
15.12.2012 11:17

Есть DBF с ежедневным добавлением записей. Соответственно кол-во строк может быть большое. Есть колонка Дата. Как делать запрос непосредственно к дбф, не перебирая все строки (XBase) а сразу с отбором?

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №2
 
17.12.2012 09:36

Если у тебя свой файл DBF (не связанный с конфигурацией 7.7), то к нему можно сделать индексный файл и использовать методы поиска.

Thorvardr
читатель
офлайн
Дата регистрации: 25.02.2005
Сообщений: 3082
Пост №3
 
18.12.2012 13:24

"Запрос непосредственно к dbf:<br> <br><pre>СтрокаПодключения="DSN=dBASE Files;DBQ=C:\test"; //"dBASE Files" - идентификатор источника данных ODBC<br>//из пользовательского DSN. C:\test - путь к каталогу где лежит dbf <br>Соединение = Новый COMОбъект("ADODB.Connection");Соединение.ConnectionTimeOut =600;Соединение.CursorLocation = 3;Попытка Соединение.Open(СтрокаПодключения);Исключение Сообщить("Невозможно установить соединение",СтатусСообщения.Важное); Соединение=0; Возврат;КонецПопытки; Команда = Новый COMОбъект("ADODB.Command");Команда.ActiveConnection = Соединение;<br>//текст команды - SQL запрос. Имя таблицы, в которой идет выборка это имя dbf файла без расширения<br>Команда.CommandText = "SELECT * FROM MyDbfFile WHERE MyDbfFile.MyDateField='18.12.2012';";<br>НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");НаборЗаписей = Команда.Execute();<br><br>Для i=1 По НаборЗаписей.RecordCount() Цикл Сообщить(НаборЗаписей.Fields("Name").Value); //перебор записей, пусть, например, в dbf-е есть поле Name НаборЗаписей.MoveNext();КонецЦикла;<br><br>НаборЗаписей=0;Команда=0;Соединение=0;</pre><br><br>Зачем нужен именно такой ход как обращение к dbf через ODBC? Бывают dbf-ы не dBase (хотя тут пример для dBase-овских), а, например, Fox Pro-шные с memo полями и 1С их через XBase достать не может."

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №4
 
18.12.2012 13:54

А почему в обходе используешь RecordCount(), а не EOF()?

Thorvardr
читатель
офлайн
Дата регистрации: 25.02.2005
Сообщений: 3082
Пост №5
 
18.12.2012 14:17

Можно и EOF, тоже будет работать. А в чем критерий предпочтения того или иного варианта? Разве что для сверхогромнных таблиц данных RecordCount может выйти за границы типа Long, но dbf-ы точно такими не бывают.<br>Я вообще сначала хотел написать:<br><br><pre>Для Каждого Запись Из НаборЗаписей Цикл </pre><br><br> <br>А меня система обругала что нет итератора в RecordSet-е.

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №6
 
18.12.2012 15:40

Ни у всех источников данных работает метод RecordCount() (SQL Pervasive например).

Thorvardr
читатель
офлайн
Дата регистрации: 25.02.2005
Сообщений: 3082
Пост №7
 
18.12.2012 16:02

Да, точно. Лучше, видимо EOF, согласен. Помнится, что в MS Jet (Access) тоже определение количества записей в "рекордсете" дает какое то ненулевое значение только после принудительного применения последовательных MoveLast, MoveFirst.

Показывать по 10 20 40 сообщений

Читают тему:

Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация