Как организовать отбор данных по условию? ПО RAD Studio 10.1 Berlin.
Всё работает, но нужно изменить код. А именно каким либо образом вынести условие из кода во внешний файл, для возможности его изменения. Пока же условие "вшито" в программу.
Смысл программы - есть двумерный массив, который надо отфильтровать. (Своего рода таблица - упрощенно.)
Массив состоит из 100 элементов и 50000 строк.
Фильтрация осуществляется по первым 5-6 полям.
Условия фильтрации равно, не равно, содержит, и, или.
Условие совпало - нет ошибки, строка массива проходит. И всё это сейчас в коде программы.
Но условия меняются. Как их значения, так иногда и логика - последовательность.
Примерif ((A1='1') and (CountPos('A13.29',A2)>0) and (A3='73') and (A4='97') and (A5='3')) then error:=0;
CountPos - функция поиска содержимого (содержит).
А завтра может быть нужноif ((A1='222') and (CountPos('A13.29',A2)>0) or (A3='73') and (A4!='97') and (A5='3') and (A5<>'4')) then error:=0;
Что не меняется.
Названия переменных A1, A2...A6.
Их максимальное количество - 6, т.е. A7 никогда не будет в коде.
Вид условий.
Внутри скобок, до ОПЕРАТОР не более 3х.
Всего комбинаций "троек" условий не более 4х.if (
((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР
((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР
((условие 1) оператор (условие 2) оператор (условие 3)) ОПЕРАТОР
((условие 1) оператор (условие 2) оператор (условие 3))
) then begin end;
Как организовать отбор данных по условию?
Мысли идеи?

21 Авг 2019 в 06:19
236 +1
1
Ответы
1

Для того чтобы вынести условия фильтрации из программы во внешний файл и обеспечить возможность их изменения, можно воспользоваться следующим подходом:

Создать текстовый файл, в котором будут записаны условия фильтрации в нужном формате, например:((A1='1') and (CountPos('A13.29',A2)>0) and (A3='73') and (A4='97') and (A5='3'))В программе реализовать считывание условий из этого файла и их применение для фильтрации массива.

Примерный код для чтения файла с условиями и их применения к массиву может выглядеть примерно так:

procedure FilterArray(const conditionsFile: string);
var
fileStream: TFileStream;
conditions: TStringList;
condition: string;
i, j: Integer;
begin
fileStream := TFileStream.Create(conditionsFile, fmOpenRead);
conditions := TStringList.Create;
try
conditions.LoadFromStream(fileStream);
for i := 0 to conditions.Count - 1 do
begin
condition := conditions[i];
for j := 0 to 49999 do
begin
if EvaluateCondition(condition, Array[j]) then
begin
// Действия при совпадении условия
end;
end;
end;
finally
conditions.Free;
fileStream.Free;
end;
end;

Здесь EvaluateCondition - это функция, которая будет оценивать условие фильтрации для конкретной строки массива.

Таким образом, вы сможете легко изменять условия фильтрации, добавляя и изменяя их во внешнем файле, без необходимости менять код программы.

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 956 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир