1 (edited by Andrei 2023-09-26 06:26:33)

Topic: Пожалуйста подскажите как правильно написать

Добрый день.
Есть заполнение поля Edit текстовыми значениями

procedure frm_Button1_OnClick (Sender: TObject; var Cancel: boolean);
    var
     n1: String;
     n2: String;
     n3: String;
    begin
    If frm.CheckBox1.sqlValue then
    n1 := SQLExecute ('Select kodn FROM departament where (id = 1)');   // значение А1
    If frm.CheckBox2.sqlValue then
    n2 := SQLExecute ('Select kodn FROM departament where (id = 2)');   // значение А2
    If frm.CheckBox3.sqlValue then
    n3 := SQLExecute ('Select kodn FROM departament where (id = 3)');   // значение А3
        begin
        frm.close
        end;
  frm_vvod.Edit7.Text := n1+','+n2+','+n3;
    end;

При отсутствие установки какого либо CheckBoxa (а следовательно записи переменной) получаем ответ с пропуском переменной и имеем лишнюю запятую. Например при отсутствии  CheckBoxa n2

A1,,A3

Подскажите пожалуйста как правильно написать подстановку текстового значения  frm_vvod.Edit7.Text := no1+','+no2+','+no3; чтобы получить в поле Edit при отсутствии  CheckBoxa n2 значение

A1,A3

Re: Пожалуйста подскажите как правильно написать

вместо

 frm_vvod.Edit7.Text := n1+','+n2+','+n3;

вставьте

s := '';
If frm.CheckBox1.sqlValue then
  s := n1;
If frm.CheckBox2.sqlValue then
begin
  if s <>'' then
    s := s+',';
  s := s+ n2;
end;
If frm.CheckBox3.sqlValue then
begin
  if s <>'' then
    s := s+',';
  s := s+ n3;
end;
frm_vvod.Edit7.Text := s;

P.S. Судя по количеству строк, есть проблема в реализации решения изначальной бизнес-задачи. Но о ней вы ничего не сказали, поэтому получили ещё большее количество строк...

Визуальное программирование: блог и телеграм-канал.

3 (edited by pavlenko.vladimir.v 2023-09-26 10:02:47)

Re: Пожалуйста подскажите как правильно написать

Andrei wrote:

Добрый день.
Есть заполнение поля Edit текстовыми значениями

Попробуйте так

procedure frm_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
i,n:integer =0;
begin
  for i:=1 to 3 do
   begin
       if  (TdbCheckBox(frm.FindComponent('CheckBox'+IntToStr(i))).sqlValue) then  inc(n);
   end;

   for i:=1 to n do
   begin
       if (i > 1) then frm_vvod.Edit7.Text := frm_vvod.Edit7.Text + ',';
       frm_vvod.Edit7.Text  := frm_vvod.Edit7.Text + SQLExecute ('Select kodn FROM departament where id ='+IntToStr(i));
   end;
end;

4 (edited by Andrei 2023-09-26 09:21:32)

Re: Пожалуйста подскажите как правильно написать

k245 wrote:

P.S. Судя по количеству строк, есть проблема в реализации решения изначальной бизнес-задачи. Но о ней вы ничего не сказали, поэтому получили ещё большее количество строк...

Константин.
Спасибо. Действие кода понял полностью. Все заработало. Переработал Ваш скрипт под большее количество строк (12 CheckBox ов). Как Вы и предположили, код увеличился раза в 3.
Изначально ошибочно предположил, что могло сработать что-то типа : frm_vvod.Edit7.Text := (ifnull(no1+','))+(ifnull(no2+','))+(ifnull(no3));...

5 (edited by Andrei 2023-09-26 09:23:22)

Re: Пожалуйста подскажите как правильно написать

pavlenko.vladimir.v wrote:

Попробуйте так

procedure frm_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
i,n:integer =0;
begin
  for i:=1 to 3 do
begin
       if  (TdbCheckBox(frm.FindComponent('CheckBox'+IntToStr(i))).sqlValue) then  inc(n);
.....

Владимир. Спасибо.
Буду изучать Ваш код. Пока не хватает знаний понять принцип его работы. Позже обязательно вернусь и разберусь.
Сейчас сделал, как ранее предложил Константин. Под 12 CheckBox сов код увеличился в 3 раза. Предполагаю, что ваш вариант с циклом останется прежнего размера, в независимости от количества CheckBox сов.

6 (edited by pavlenko.vladimir.v 2023-09-26 10:08:05)

Re: Пожалуйста подскажите как правильно написать

Andrei wrote:

Владимир. Спасибо.
Буду изучать Ваш код. Пока не хватает знаний понять принцип его работы. Позже обязательно вернусь и разберусь.
Сейчас сделал, как ранее предложил Константин. Под 12 CheckBox сов код увеличился в 3 раза. Предполагаю, что ваш вариант с циклом останется прежнего размера, в независимости от количества CheckBox сов.

Не совсем, это хороший, но не верный цикл, только понял свою ошибку - id записи ставиться не верно

Re: Пожалуйста подскажите как правильно написать

  frm_vvod.Edit7.Text := sqlexecute('SELECT GROUP_CONCAT(kodn,'','') '+
  'FROM department '+
  'WHERE id IN ((CASE WHEN '+frm.CheckBox1.sqlValue+' = 1 THEN 1 ELSE NULL END), '+
  '(CASE WHEN '+frm.CheckBox2.sqlValue+' = 1 THEN 2 ELSE NULL END), '+
  '(CASE WHEN '+frm.CheckBox3.sqlValue+' = 1 THEN 3 ELSE NULL END))');

Re: Пожалуйста подскажите как правильно написать

Вот так будет правильно, хочу заметить, что тут есть привязка к номеру чекбокса.
Далее можете просто увеличивать значения.

procedure Form1_OnShow (Sender: TObject; Action: string);
begin
  if (SQLExecute('SELECT COUNT(id) FROM a') = 0) then SQLExecute('INSERT INTO a(name)VALUES("Привет мир!"),("Неземной разум"),("Земля")');
end;

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
arr: Array [1..3] of integer;
i,n:integer =0;
begin
  for i:=1 to 3 do
   begin
     if  (TdbCheckBox(Form1.FindComponent('CheckBox'+IntToStr(i))).sqlValue) then
     begin
       inc(n);
       arr[n] := i;
     end;
  end;
  Form1.Edit7.Text := '';
  for i:=1 to n do
  begin
    if (i > 1) then Form1.Edit7.Text := Form1.Edit7.Text + ',';
    Form1.Edit7.Text  := Form1.Edit7.Text + SQLExecute ('Select name FROM a where id ='+IntToStr(arr[i]));
  end;
end;
Post's attachments

Attachment icon test.rar 4.06 kb, 51 downloads since 2023-09-26