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