Спасибо.
Первую кнопку сделал через ShowRecord

procedure Form1_Button4_OnClick (Sender: TObject; var Cancel: boolean);
begin
  form1.TableGrid1.dbUpdate;
  frm_main.ShowRecord('main',form1.tablegrid1.dbitemid);
end;

Вторую кнопку спрятал (стандартные настройки кнопки для открытия записи на редактирование в новой форме).
В Итоге получил что было нужно.
При выборе записи в таблице и нажатии на кнопку - редактирование в одной форме.
При двойном клике по записи в таблице - открытие другой формы на редактирование записи.
Ошибки нет.
Еще раз спасибо.

Добрый день.
Спасибо.
Убрал обработчики.
Теперь 2 кнопки для редактирования записи в разных формах.
При двойном нажатии мышью - открываются для одной записи 2 разные формы???

Здравствуйте.
На главной форме Form1 есть TableGrid.
Соответственно для его заполнения есть действие

 procedure Form1_OnShow (Sender: string; Action: string);
begin
   Form1.TableGrid1.dbUpdate;
end;

Так же у TableGrid есть два действия

procedure Form1_TableGrid1_OnClick (Sender: TObject);
begin
      idZapis := Form1.TableGrid1.dbItemID;
      end;
procedure Form1_TableGrid1_OnDoubleClick (Sender: TObject);
begin
    Form1.Button5.Click;
      end;

Действие Button5 - Показать запись для TableGrid в новой форме.
Теперь вопрос: при переходе (закрытии всех открытых форм) на главную форму Form1 выскакивает ошибка: "Не выбрана запись для редактирования". Это нормальное поведение главной формы. Т.е., как я понимаю, при обновлении таблицы происходит действие procedure Form1_TableGrid1_OnDoubleClick (Sender: TObject);???

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 сов.

k245 wrote:

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

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

Добрый день.
Есть заполнение поля 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

Окончание аренды домена 29 октября 2022. Осталось 4 месяца.
https://radikalfoto.ru/ib/Yq1DnETCm7.JPG
Константин - k245.
Учитывая тот факт, что Вы являетесь "продолжателем проекта",
думаю, что вам необходимо задуматься о поднятии аналогичного форума с максимально возможным переносом в него информации из текущего. Активным пользователям текущего форума, нужно будет плавно перейти в новый. Тогда текущий проект будет жить и дальше.

Все равно не понятна задача.
Посмотрите данный вариант.

procedure frm_Button1_OnClick (Sender: TObject; var Cancel: boolean);
 begin  
      if ((frm.ComboBox1.dbItemID  = 1) and (frm.edit1.Text <> '10'))  then
    begin
        ShowMessage('Не правильно заполнено поле Edit');
        frm.edit1.SetFocus;
        Cancel := True;
        exit;
    end;
end;

Здравствуйте.
Как выяснилось понимал не правильно)
Ваш скрипт работает. Спасибо.
Рабочий вариант с диапазоном дат, который мне был нужен.

procedure FrmOth_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
     FrmOth.Button1.dbSQL :=   ' SELECT login.login, login.FIO, '+
     ' (SELECT COUNT(*) FROM main WHERE main.id_login = login.id AND (main.data >= {DateTimePicker5} AND main.data <= {DateTimePicker6})) '+
      ' FROM login '+
      ' WHERE (login.aktiv = (2)) ';
               end;

Добрый день. Спасибо что ответили.
Моя цель выбрать уникальные записи ФИО из таблицы login (login.FIO) с условием login.aktiv = 2 и в вычисляемом столбце t1 посчитать кол-во записей в таблице main. 
Если я правильно понимаю, то выбрать из таблицы login не получится.https://radikalfoto.ru/ib/0yfA5xpTUd.JPG
Поэтому пытаюсь через группировку по id_login.main.

Ответа не последовало. Хотелось бы уточнить. Выборка правильно написана и не хватает ресурсов у сервера?
Или не правильный подход и так делать нельзя?

procedure FrmOth_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
     FrmOth.Button1.dbSQL :=   ' SELECT login.FIO, '+
                                    ' (SELECT COUNT(*) FROM main t1 WHERE t1.id_login = main.id_login) '+
                                    ' FROM main LEFT OUTER JOIN login ON login.id=main.id_login '+
                                    ' WHERE (login.aktiv = 2) '+
                                    ' group BY id_login ';
end;

Здравствуйте.
Есть 2 таблицы
1- login; 2-main
Задача выбрать количество записей с группировкой из таблицы main И ОТСЕЧЬ НЕ ДЕЙСТВУЮЩИЕ ЗАПИСИ в связанной таблице login условие WHERE (login.aktiv = 2) .
Рабочий скрипт:

procedure FrmOth_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
     FrmOth.Button1.dbSQL :=   ' SELECT login.FIO, '+
                                    ' (SELECT COUNT(*) FROM main t1 WHERE t1.id_login = main.id_login) '+
                                    ' FROM main LEFT OUTER JOIN login ON login.id=main.id_login '+
                                    ' group BY id_login ';
end;

Если добавляю условие WHERE (login.aktiv = 2) запрос зависает.

procedure FrmOth_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
     FrmOth.Button1.dbSQL :=   ' SELECT login.FIO, '+
                                    ' (SELECT COUNT(*) FROM main t1 WHERE t1.id_login = main.id_login) '+
                                    ' FROM main LEFT OUTER JOIN login ON login.id=main.id_login '+
                                    ' WHERE (login.aktiv = 2) '+
                                    ' group BY id_login ';
end;

рабочий вариант

' SELECT sch.id_print, '+
                                ' (SELECT max(sch) from sch t1 where (t1.id_print = sch.id_print) and (t1.id_priznzam = 1)), '+
                                ' (SELECT min(sch) from sch t2 where (t2.id_print = sch.id_print) and (t2.id_priznzam = 1)), '+
                                ' (SELECT  ((SELECT max(sch) from sch t1 where (t1.id_print = sch.id_print) and (t1.id_priznzam = 1)) - (SELECT min(sch) from sch t2 where (t2.id_print = sch.id_print) and (t2.id_priznzam = 1))) as t3) '+
                                ' from sch '+
                                ' group BY id_print ';
k245 wrote:

Вот только не понятно, что вам даст Group_by...

Спасибо проверю.
Если не ставлю группировку по id_print, выводятся все строки какие есть у данного id_print, только заполняются max (например 200) и min (например 100) значениями

id_print            t1 (max)                  t2(min)
11                   200                         100
11                   200                         100
11                   200                         100
11                   200                         100

Если ставлю группировку по id_print, выводится по одной строке
id_print            t1 (max)                  t2(min)
11                   200                         100

Новый вопрос: Как сделать что б в случае пустого combobox на нем всплывало сообщение о том что он обязателен для заполнение, такое же как всплывает над пустым TextBox, обязательным для заполнения. Сейчас при пустом просто вылетает ошибка

Посмотрите

 begin
    if frm.ComboBox1.dbItemID = -1 then
    begin
        ShowMessage('Обязательное поле');
        frm.ComboBox1.SetFocus;
        frm.ComboBox1.DroppedDown := True;
        Cancel := True;
    end;

Здравствуйте.
Есть кнопка при нажатии на которую выбираются значения в столбцы t1 (Max) и t2 (Min)

frmOth1.Button16.dbSQL :=  ' SELECT sch.id_print, '+
                                ' (SELECT max(sch) from sch t1 where (t1.id_print = sch.id_print)), '+
                                ' (SELECT min(sch) from sch t2 where (t2.id_print = sch.id_print)) '+
                                ' from sch '+
                                ' group BY id_print ';

Можно ли в данном скрипте провести математические вычисления t3=t1-t2?
Если да, то как это проще сделать?

Спасибо. Понял.

SQLExecute('INSERT INTO test(ee,dateTime)VALUES('''+Form1.DateTimePicker1.sqlDate+''')');

Задал вопрос от безысходности...
Не объявляю переменную. Без var

SQLExecute ('INSERT INTO main (data_1,data_2) VALUES ("'+ FormatDateTime('DD.MM.yyyy',  frm_vvod.DateTimePicker1.Date)  + '", "'+ FormatDateTime('DD.MM.yyyy',  frm_vvod.DateTimePicker2.Date)  + '")')

Все тоже самое.
Не трогаю DateTimePicker, чтобы получить пустое поле NULL. Все равно ставится дата - текущая дата.

Добрый день.
Столкнулся с проблемой, а именно не получается записать в таблицу NULL  из компонента DateTimePicker  при неустановленном Chekbox. Параметр ShowCheckbox = True.

procedure frm_vvod_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
     sDate1 : string = FormatDateTime('dd.mm.yyyy',frm_vvod.DateTimePicker1.Date);
     sDate2 : string = FormatDateTime('dd.mm.yyyy',frm_vvod.DateTimePicker2.Date);
               begin
SQLExecute ('INSERT INTO main (data_1, data_2) VALUES ("'+sDate1+'","'+sDate2+'")');
end;

1)Работаем с DateTimePicker - выбираем из календаря дату. Ставится дата та, которую выбрал. Правильное действие;
2)Не трогаем DateTimePicker - нужно пустое поле NULL. Все равно ставится дата - текущая дата. Не правильное действие - нужно пустое поле NULL.
Поля data_1 и data_2 bvt.имеют текстовый формат

20

(5 replies, posted in Russian)

Здравствуйте.
Если в столбце date (frm_stat.tablegrid1.cells[11,]) в поле находится NULL, то процедура не работает - подсвечиваются строки до поля NULL, дальше выполнение скрипта прерывается с ошибкой  "" is not valid date Script position ....
Есть способ пропустить поля со значением NULL?

соорудил костыль (выборку  where inv is not null), можно как ни будь без него?

 procedure Frm_Stat_Button6_OnClick (Sender: TObject; var Cancel: boolean);
begin
     Frm_Stat.Button6.dbSQL := ' SELECT * '+
                                ' from svod '+
                                ' where inv is not null ';

end;

procedure Frm_Stat_Button6_OnAfterClick (Sender: TObject);

var  vrow, vcolumn: integer;
begin
  for vrow := 0 to frm_stat.tablegrid1.RowCount- 1 do
    begin
      if strtodate(frm_stat.tablegrid1.cells[11,vrow]) < now -30 then
          for vcolumn := 0 to frm_stat.tablegrid1.columns.Count -1 do
            begin
              frm_stat.tablegrid1.cell[vcolumn,vrow].TextColor := clblue;
            end;
    end;
Petr wrote:

добрый день господа!
подскажите как правильно прописать в скрипте условие сравнения текущей даты с заданной?
что то типа: if Date > 27-04-2021 then
спасибо.

if t1.Date > "2021-04-27"

Наверное правильнее не в скрипте указывать конкретную дату, а на форме выбирать из календаря.

procedure form1_Button1_OnClick (Sender: TObject);
begin
if t1.Date > {DateTimePicker1} then ... 

Ребята.
Константин.
Огромное спасибо.
То что нужно.
Не представляете сколько различных вариантов я перепробовал...
"Как собака. Понимаю, а написать не могу..."

немножко не то.
Если мы делаем select

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, res.res as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE res.id_Priznak = 1
GROUP BY print.model  

в поля будут вставлены первые значения из таблицы для значений WHERE res.id_Priznak = 1 с группировкой GROUP BY print.model 
МОЯ ЦЕЛЬ:
нужно в таблице выбрать последние строки создать подзапрос, что то типа

MAX(id) FROM res WHERE id_priznak =1
 для каждого id_print

Вполне возможно группировка и не нужна???
ЧТО ТО ВРОДЕ ЭТОГО

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, res.res as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE (select id FROM res WHERE id_priznak =1)
????? и должно быть условие что id = MAX(ID) FROM res WHERE id_priznak =1 для каждого id_print

Ощущение что нужно создавать временные таблицы

Создал свой неправильный проект.
Нужно вытащить последние записи замены картриджей для всех принтеров

konstantin wrote:

Мне нужен вывод с 2-4 знаками после запятой.

Привет. Точно видел обсуждение данного вопроса на форуме когда искал ограничение длины числа MySQL.