Есть DBF с ежедневным добавлением записей. Соответственно кол-во строк может быть большое. Есть колонка Дата. Как делать запрос непосредственно к дбф, не перебирая все строки (XBase) а сразу с отбором?
Есть DBF с ежедневным добавлением записей. Соответственно кол-во строк может быть большое. Есть колонка Дата. Как делать запрос непосредственно к дбф, не перебирая все строки (XBase) а сразу с отбором?
Если у тебя свой файл DBF (не связанный с конфигурацией 7.7), то к нему можно сделать индексный файл и использовать методы поиска.
"Запрос непосредственно к 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 достать не может."
А почему в обходе используешь RecordCount(), а не EOF()?
Можно и EOF, тоже будет работать. А в чем критерий предпочтения того или иного варианта? Разве что для сверхогромнных таблиц данных RecordCount может выйти за границы типа Long, но dbf-ы точно такими не бывают.<br>Я вообще сначала хотел написать:<br><br><pre>Для Каждого Запись Из НаборЗаписей Цикл </pre><br><br> <br>А меня система обругала что нет итератора в RecordSet-е.
Ни у всех источников данных работает метод RecordCount() (SQL Pervasive например).
Да, точно. Лучше, видимо EOF, согласен. Помнится, что в MS Jet (Access) тоже определение количества записей в "рекордсете" дает какое то ненулевое значение только после принудительного применения последовательных MoveLast, MoveFirst.