Topic: выбор массива данных с условиями

Добрый день,
подскажите пожалуйста, как прописать процедуру для выбора соответствующего значения из двухмерного массива данных,
то  есть
при выборе критерия условия в Combobox (Опция1, Опция2, Опция3, Опция4) необходимо выбрать соответствующий двухмерный массив (при выборе Опция1 выбирается массив Опции1, при выборе  Опция2  выбирается массив Опции2, при выборе  Опция3 выбирается массив Опции3, при выборе Опция4 выбирается массив Опции4)  далее из выбранного массива по двум другим условиям: 1е - количество человек и 2е количество дней необходимо выбрать нужное значение из соответствующего массива.
Двухмерный массив - статический,  количество столбцов 6, количество строк 10,
1е условие количество человек определяется по столбцам (1 чел, 2 чел, 3 чел, 4 чел, 5 чел, 6 чел)
2е  условие количество дней пребывания за границей, период определяется по строкам (1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн)
Для каждого массива для указанных условий свои значения
Например: при выборе в ComboBox1 (Опции) я выбрал Опцию 1, затем в Combobox2 (Количество человек) я выбрал 3 чел, затем в DateTimePicker1 (выбрал дату отбытия) затем DateTimePicker2 (выбрал дату прибытия) разница между DateTimePicker1 и DateTimePicker2 является 2-м условием (дата отбытия 01/08/22 дата прибытия 01/10/22 разница 62дн ) необходимо чтобы из массива Опции1 при выборе 3 чел и сроком пребывания за границей 62 дня было выбрано соответствующее значение  (к примеру 288 руб.)

Буду очень сильно благодарен за любую помощь!!!

2 (edited by pavlenko.vladimir.v 2022-07-06 04:25:11)

Re: выбор массива данных с условиями

обьявление массива
var mas: array[1..3,1..2] of string;
vArr:mas; s:string;
в реальности массив будет выглядеть так
1 - 1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн
2 - 1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн
3 - 1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн
,,,
Задаём начальное значение переменной s:
s:=''; //пустая строка
   
Заполняем массив:
vArr[0,0]:='столбец 0 строка 0';
vArr[0,1]:='столбец 0 строка 1';
vArr[0,2]:='столбец 0 строка 2';
vArr[1,0]:='столбец 1 строка 0';
vArr[1,1]:='столбец 1 строка 1';
vArr[1,2]:='столбец 1 строка 2';
   
Формируем строку для вывода в memo:
s:=vArr[0,0]+'   '+vArr[0,1]+' '+vArr[0,2]+' '+vArr[1,0]+' '+vArr1,1]+' '+vArr[1,2];
   
Используем свойство «text» объекта memo1.Lines:
memo1.Lines.Text:=s;
   
дальше надеюсь сможите разобраться
   
А вообще получается слишком много строк не проще-ли использовать связь БД
Можно просто в Комбобоксы записать значения по умолчанию, так как значения все равно одинаковы.

3 (edited by NickB 2022-07-07 08:47:56)

Re: выбор массива данных с условиями

pavlenko.vladimir.v
Владимир,
большое спасибо Вам за вашу рекомндацию и совет, я думаю с моей стороны будет разумнее рассказать более детально о своем проекте (извините за такое большое сообщение).

Цель проекта-создать небольшую базу данных (для 6 человек) которая будет формировться через расчет калькулятора и заполнения сведений о клиентах с последующим формированием небольшого ежемесячного отчета.
Бизнес-процесс (формирования базы данных)- пришел клиент-сотрудник открыл калькулятор в приложении-расчитал страховую премию-огласил клиенту. Если клиент не согласен, далее ничего. Если клиент согласен-сотрудник жмет кнопку и переходит в форму опросника клиента-заполнил опросник-проверил все данные-сохранил -распечатал-далее сотрудник жмет кнопку переходит на форму полиса-заполнил поля полиса-проверил все данные-сохранил - расспечал - отдал клиенту. В конце месяца сформировал небольшой отчет и распечатал. (Сечйчас все это делается в РУЧНУЮ)
Форму и содержание калькулятора я сделал, сейчас думаю как реализовать расчет через процедуру OneClick.Button, паролельно доделываю другие формы и таблицы.
Алгоритм расчета (это даже не расчет а выборка по заданным параметрам) калькулятора: выбор (выбирается в ручную) Опции (это таблица с суммами), далее выбор (выбирается в ручную) условия 1 (это столбцы: 1 чел, 2 чел, 3 чел, 4 чел, 5 чел, 6 чел), далее выбор условия 2  в какой заданный период попадает разница дат (автоматически исходя из разницы между DateTimePicker1 (выбрал дату отбытия) затем DateTimePicker2 (выбрал дату прибытия) ), условие 2 (это строки: 1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн), результат выбора это ячейка таблицы на пересечении столбца и строки, где указанна сумма страховой премии.
Алгоритм расчета (выборки) в калькуляторе:
1.Выбирается клиентский продукт (Опция1, Опция2, Опция3, Опция4). Опция - это таблица с суммами.
2.Выбирается 1 е условие - количество человек(это столбцы выбранной таблицы Опции, название столбцов: 1 чел, 2 чел, 3 чел, 4 чел, 5 чел, 6 чел)
3.Выбирается 2 е условие - количество дней пребывания за границей (он расчитывается как разница между DateTimePicker1 (выбрал дату отбытия) затем DateTimePicker2 (выбрал дату прибытия)), данное условие должно автоматически проверяться на совпадения по строкам (это строки выбранной таблицы Опции, название строк:1-7дн, 8-14 дн, 15-21дн, 22-31дн, 32-62дн, 63-92дн, 93-130дн, 131-180дн, 181-270дн, 271-360дн)
4.выбирается дополнительные опции (это дополнительная таблица) к расчету.
Таблицы Оциий
Опция1                       
Период     1 чел.      2 чел.      3 чел.      4 чел.      5 чел.      6 чел.
1-7             17,97        26,55        33,00        37,00        42,00        45,00   
8-14             31,88        58,68        73,00        82,00        94,00        100,00   
15-21     53,30        85,00        107,00        120,00        137,00        145,00   
22-31     64,08        102,00        127,00        143,00        163,00        173,00   
32-62     88,23        161,00        201,00        225,00        257,00        273,00   
63-92     139,07        230,00        288,00        322,00        368,00        391,00   
93-130     214,84        326,00        407,00        456,00        521,00        554,00   
131-180     236,74        390,00        488,00        546,00        624,00        663,00   
181-270     275,41        517,00        647,00        724,00        828,00        879,00   
271-360     402,32        664,00        830,00        929,00        1 062,00        1 128,00   
Дополнительная опция к Опции1                       
Период     1 чел.      2 чел.      3 чел.      4 чел.      5 чел.      6 чел.
1-7             5,00        7,00        8,00        9,00        11,00        11,00   
8-14             8,00        15,00        18,00        21,00        23,00        25,00   
15-21     13,00        21,00        27,00        30,00        34,00        36,00   
22-31     16,00        25,00        32,00        36,00        41,00        43,00   
32-62     22,00        40,13        50,00        56,00        64,00        68,00   
63-92     35,00        58,00        72,00        81,00        92,00        98,00   
93-130     54,00        81,42        102,00        114,00        130,00        138,00   
131-180     59,00        98,00        122,00        137,00        156,00        166,00   
181-270     69,00        129,00        162,00        181,00        207,00        220,00   
271-360     101,00        166,00        207,00        232,00        265,00        282,00   
                       
Данные суммы необходимо будет менять раз в год.
Данный алгоритм выборки я смог реализовать на Excel с помощью функции ЕСЛИ и ЕСЛИ МНОЖЕСТВО.

В программировании я любитель либо очень очень начинающий, поискав и почитав литературу я пришел к выводу что выборку через процедуру OneClick.Button, я смогу релизовать через созданние двумерного массива и цикличсекой проверки по нему, возможно я неверно рассудил.

По поводу вашей рекомндации реализовать расчет (выборку) через использование связи с БД, я так понимаю мне необходимо будет установить MySQL на серевер или на ПК (в качестве сервера) где будет работать приложение, или будет достаточно автоматически созданного файла базы данных sqlite.db ?

Подскажите пожалуйства как лучше реализовать расчет калькулятора (это даже не расет а выборка при заданных параметрах)?

Заранее вам очень, очень благодарен!

Re: выбор массива данных с условиями

вот пример с БД SQLite

Post's attachments

Attachment icon test.rar 4.88 kb, 175 downloads since 2022-07-06 

Re: выбор массива данных с условиями

pavlenko.vladimir.v

Владимир, спасибо вам огромное!!!

6 (edited by NickB 2022-07-14 17:56:04)

Re: выбор массива данных с условиями

Добрый день, напишете пожалуйста что не так с моим кодом ? Мне нужно чтобы при нажатии на кнопку при  выборе в ComboBox1, ComboBox2, ComboBox3, в Edit выводился соответствующий результат из нужной таблицы

procedure Form1_Button3_OnClick (Sender: TObject; var Cancel: boolean);
begin
if (form1.ComboBox1.SelectedCount < 1) and (form1.ComboBox2.SelectedCount < 1) and (form1.ComboBox3.SelectedCount < 1)  then
    begin
     Form1.Edit2.dbFilter:= 'id_Tarif =(id_Option='+IntToStr(Form1.ComboBox1.dbItemID)+') AND (id_AmountPeople='+IntToStr(Form1.ComboBox2.dbItemID)+') AND (id_Days='+IntToStr(Form1.ComboBox3.dbItemID)+')';
     end
    else
     begin
       Form1.Edit2.Value:= 0;
      end;
end;

Заранее благодарю

Re: выбор массива данных с условиями

NickB wrote:

Добрый день, напишете пожалуйста что не так с моим кодом ? Мне нужно чтобы при нажатии на кнопку при  выборе в ComboBox1, ComboBox2, ComboBox3, в Edit выводился соответствующий результат из нужной таблицы

procedure Form1_Button3_OnClick (Sender: TObject; var Cancel: boolean);
begin
if (form1.ComboBox1.SelectedCount < 1) and (form1.ComboBox2.SelectedCount < 1) and (form1.ComboBox3.SelectedCount < 1)  then
    begin
     Form1.Edit2.dbFilter:= 'id_Tarif =(id_Option='+IntToStr(Form1.ComboBox1.dbItemID)+') AND (id_AmountPeople='+IntToStr(Form1.ComboBox2.dbItemID)+') AND (id_Days='+IntToStr(Form1.ComboBox3.dbItemID)+')';
     end
    else
     begin
       Form1.Edit2.Value:= 0;
      end;
end;

Заранее благодарю

 
 
не могу понять, что Вы хотите сделать!! ((

8 (edited by NickB 2022-07-14 18:31:42)

Re: выбор массива данных с условиями

на примере вашего проекта который вы мне ранее отправляли я сделал для Таблицы Опций Опция1 и  хочу чтобы при выборе условий через ComboBox выводился из таблицы нужный результат в Edit ...есть общая таблица из нее нужно получить значение поля

Re: выбор массива данных с условиями

Привет NickB, Vladimir,
Я посмотрел на ваш проект и подумал, не могли бы вы применить другой подход.
Насколько я понимаю, вы хотите рассчитать страховые взносы на основе таблицы страховых тарифов для «базовых страховых взносов» и далее ряда вариантов. Стоимость «базовой страховой премии» и любой комбинации опций зависит от количества дней, на которые требуется страхование, и количества лиц, которым требуется страховое покрытие.
Итак, во вложении
1. введите имя клиента
2. выбрать даты начала и окончания, на которые требуется страховка (количество дней рассчитывается автоматически и отображается в заголовке формы.
3. выбрать "статус" - при создании записи всегда будет "цитата".
4. выберите нужный «период» из выпадающего списка «период».
5. выберите «лица» из выпадающего списка «лица».
6. отметьте любую комбинацию флажков, чтобы отобразить соответствующие значения
7. общая стоимость вашего выбора рассчитывается автоматически.
Ваша таблица премий сохраняется в форме «конфигурации». Таблица страховых тарифов не используется реляционно — она существует для того, чтобы отдельные значения можно было найти и скопировать в таблицу «премий». Это означает, что вы можете изменить все значения в таблице «Премии» (например, вы меняете их каждый год), не затрагивая уже созданные премии.
Это также дает возможность вручную изменять некоторые стандартные страховые взносы в зависимости от индивидуальных обстоятельств.
Возможно, это может дать вам несколько разных идей, которые могли бы помочь.
С уважением,
Derek.
.
.
Hi NickB, Hi Vladimir,
I was having a look at your project and wondered if you could take a different approach.
As I understand it, you want to calculate insurance premiums based on a table of insurance rates for 'basic insurance premiums' and then a number of options.  The value of the 'basic insurance premium' and any combination of options is dependant on the number of days that insurance is required for and the number of persons that require insurance cover.
So, in the attachment
1.  enter the client name
2.  select the start and end dates that insurance is required for (the number of days is automatically calculated and displayed in the Form's caption.
3.  select the 'status' - when creating a record, it will always be 'quote'.
4.  choose the required 'period' from the 'period' combobox.
5.  choose the 'persons' from the 'persons' combox.
6.  tick any combination of checboxes to display the relevant values
7.  the total value of your selection is automatically calculated.
Your table of premiums is maintained in the 'configuration' form.  The table of insurance rates is not used relationally - it is there so the individual values can be looked up and copied to the 'premiums' table.  This means that you can change all of the values in the 'premiums' table (for example, you change them every year) without it affecting premiums that have already been created.
Perhaps it can give you some different ideas that might help.
Regards,
Derek.

Post's attachments

Attachment icon insurance.zip 352.51 kb, 202 downloads since 2022-07-14 

10 (edited by NickB 2022-07-14 18:39:46)

Re: выбор массива данных с условиями

Derek, You are right. Thank you so much!

Derek, Большое спасибо!