Отфильтровать значения в DBF

1. oleandr 11.07.11 14:56 Сейчас в теме
Здраствуйте! Есть база ДБФ. Нужно отфильтровать(установить фильтр) все записи в базе по ключу "SERIES"! З найденых записей витянуть код. Как установить фильтр?
У меня получаетса только получить(найти) 1 строку, хотя их есть и больше. Вот код:
Функция ПоискВБазеДБФ(Путь,ПолучитьСерию)
// Вставити вміст обробника.
//ЗначениеКодВДБФ = "";
КодВДБФ="CODEGOOD";
Серия = "SERIES";
ПоискДБФ = НайтиФайлы(Путь,"*.dbf",Истина);
Код = Новый Структура("Код");
//открываем файл
хВ = Новый XBase();
ЗначениеКодВДБФ = 0;
Для каждого ФайлДБФ из ПоискДБФ Цикл
Если ФайлДБФ.Существует() Тогда
ФайлНайден = Истина;
хВ.ОткрытьФайл(ФайлДБФ.Путь + ФайлДБФ.Имя,,);
хВ.Кодировка = КодировкаXBase.ANSI;
// Поиск по составному ключу
хВ.Индексы.Добавить("IDXCODE","SERIES",Истина));
хВ.СоздатьИндексныйФайл("C:\temp\dirfile.cdx");
хВ.Кодировка = КодировкаXBase.ANSI;
хВ.ТекущийИндекс = хВ.Индексы.IDXCODE; // индекс CODE
ЗаписьНайдена = хВ.Найти(СокрЛП(ПолучитьСерию), "=");
Если ФайлНайден Тогда
Если ЗаписьНайдена = Ложь Тогда
ЗначениеКодВДБФ = 0;
Иначе
//отримаемо значення з базы СокрЛП(ИскомаяСерия)
ЗначениеКодВДБФ = хВ.ПолучитьЗначениеПоля(КодВДБФ);//Уникальний код
Код.Вставить("Код",ЗначениеКодВДБФ);
КонецЕсли;
Иначе
ЗначениеКодВДБФ = 0;
КонецЕсли;
Иначе
ЗначениеКодВДБФ = 0; // Неопределено;
КонецЕсли;
КонецЦикла;
Возврат Код;
КонецФункции;
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. hogik 443 11.07.11 15:32 Сейчас в теме
(1)
Понятие "отфильтровать(установить фильтр)" очень странное.
Возможно, Вам надо выбрать (просмотреть) все записи с неким значением поля?
Тогда, если есть индекс по этому полю, то надо:
1) Установить порядок просмотра по индексу.
2) Найти по ключу первое значение.
3) Просматривать в цикле записи до первого неравенства значения поля искомому значению или признака конца файла.
Если индекса нет, то можно его создать и задача сведётся к предыдущему алгоритму. Либо не создавать индекс, а просматривать все записи таблицы в физической последовательности (без выбранного индекса - так быстрей работает) и проверять значение поля каждой записи на искомое.
Или я не понял постановку Вашей задачи?
3. oleandr 11.07.11 15:38 Сейчас в теме
hogik пишет:
Возможно, Вам надо выбрать (просмотреть) все записи с неким значением поля?

Да вы все правильно поняли. Ето мне и нужно.
hogik пишет:
1) Установить порядок просмотра по индексу.

хВ.Индексы.Добавить("IDXCODE","SERIES",Истина));
хВ.СоздатьИндексныйФайл("C:\temp\dirfile.cdx");
хВ.Кодировка = КодировкаXBase.ANSI;
хВ.ТекущийИндекс = хВ.Индексы.IDXCODE; // индекс CODE
hogik пишет:
2) Найти по ключу первое значение.

ЗначениеКодВДБФ = хВ.ПолучитьЗначениеПоля(КодВДБФ);
hogik пишет:
3) Просматривать в цикле записи до первого неравенства значения поля искомому значению или признака конца файла.

Как реализоват даный цикл?
4. hogik 443 11.07.11 15:55 Сейчас в теме
(3)
Индекс надо установить по искомому значению. Индекс CODE содержит искомое поле с первой (!!!) позиции ключа? Думаю - нет.
Цикл, примерно так:
do while (!eof())
if SERIES<>"Искомое значение" exit
...
Обработка записи таблицы
....
skip 1
enddo
5. hogik 443 11.07.11 16:00 Сейчас в теме
(3)
Нет. Индекс содержит искомое поле. Но, метод "ПолучитьЗначениеПоля" - это разве поиск по ключу?
6. hogik 443 11.07.11 16:14 Сейчас в теме
(3)
Целиком, примерно так:
use TABLE
index on SERIES to IND
set order to IND
seek "Нужное значение"
do while (!eof())
if SERIES<>"Нужное значение" exit

skip 1
enddo
7. oleandr 11.07.11 16:21 Сейчас в теме
Ага, значит мой метод нето что мне нужно. hogik, Большое спасибо, буду делать по другому. Если что отпишусь :D
8. FreeArcher 159 12.07.11 08:09 Сейчас в теме
А вобще порой проще загрузить ДБФ в Таблицу значений и работать уже с ней, проще и надежней получается.
9. oleandr 14.07.11 13:25 Сейчас в теме
Всем спасибо!
Вот как у меня получилось установить фильтр, может пригодитса:
хВ = Новый XBase();
хВ.ОткрытьФайл(ФайлДБФ.Путь + ФайлДБФ.Имя,,);
хВ.Кодировка = КодировкаXBase.OEM;
хВ.Индексы.Добавить("IDXCODE","SERIES",,,"SERIES = " + Код); //фильтр
хВ.СоздатьИндексныйФайл("C:\temp\dirfile.cdx");
хВ.Кодировка = КодировкаXBase.OEM;
хВ.ТекущийИндекс = хВ.Индексы.IDXCODE;
Если НЕ хВ.Первая() Тогда
Сообщить("База отсутствует");
КонецЕсли;

Пока Истина Цикл

Если СокрЛП(хВ.SERIES) <> Серия Тогда
прервать;
КонецЕсли;
ЗначениеКодВДБФ = хВ.CODEGOOD;

КонецЦикла;

Если Не хВ.Следующая() Тогда
Прервать;
КонецЕсли;
10. hogik 443 14.07.11 16:24 Сейчас в теме
(9)
Типа, ну очень хотелось - "фильтр". ;-)
А если потребуется другое значение "Код"?
Надеюсь, что такой алгоритм найдет применение только в Ваших задачах. :-(
Не рекомендую так делать...
11. SergSC 11.07.18 15:09 Сейчас в теме
(9)
Спасибо большое! Фильтр рабочий!
12. SergSC 16.10.18 15:24 Сейчас в теме
(11)
1С:Предприятие 8.3 (8.3.13.1513)
Бухгалтерия предприятия, редакция 3.0 (3.0.64.48)
Данный способ фильтрации перестал работать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот