Topic: SOS!!! 3-й день топчусь на месте

Добрый день.
3-й день не могу сдвинуться с места. Пожалуйста посмотрите процедуру.
Вариант рабочий.

procedure frmAddSch1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
     if frmAddSch1.dbAction = 'NewRecord' then frmAddSch1.Tag := 1 else frmAddSch1.Tag := 0;
end;

procedure frmAddSch1_Button1_OnAfterClick (Sender: TObject);
var
     vyrab_otp: string;
         begin
     if frmAddSch1.Tag = 1 then
begin
         vyrab_otp := SQLExecute('SELECT IFNULL(vyrab_otp, 0) FROM sch LEFT OUTER JOIN print ON print.id=sch.id_print WHERE sch.id = ' + IntToStr(frmAddSch1.Button1.dbGeneralTableId));
           if ValidInt(vyrab_otp) then SQLExecute ('INSERT INTO res (res, date,id_print, id_sch) VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+', now(), ' + IntToStr(idprint)+', '+ IntToStr(frmAddSch1.Button1.dbGeneralTableId)+')');
     end;
end;

Теперь нужно еще в одну колонку res1 добавить запись. В данную колонку должен записываться расчет (Trunc) 1-е значение frmAddSch1.Edit1.Value, 2-е значение - Max значение счетчика (sch) при замене картриджа id_priznzam=2
Пробую ввести переменную pok_k

pok_k := SQLExecute('SELECT (Max(sch)) FROM sch WHERE id_priznzam = (2) AND id_print = ' + IntToStr(idprint));

B итоге получилось. Можно так делать или нет?

procedure frmAddSch1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
 begin
     if frmAddSch1.dbAction = 'NewRecord' then frmAddSch1.Tag := 1 else frmAddSch1.Tag := 0;
 end;

procedure frmAddSch1_Button1_OnAfterClick (Sender: TObject);
var
     vyrab_otp: string;
     pok_k: string;
begin
     if frmAddSch1.Tag = 1 then
     begin
         vyrab_otp := SQLExecute('SELECT IFNULL(vyrab_otp, 0) FROM sch LEFT OUTER JOIN print ON print.id=sch.id_print WHERE sch.id = ' + IntToStr(frmAddSch1.Button1.dbGeneralTableId));
         pok_k := SQLExecute('SELECT (Max(sch)) FROM sch WHERE id_priznzam = (2) AND id_print = ' + IntToStr(idprint));
         if ValidInt(vyrab_otp) and ValidInt(pok_k) then SQLExecute ('INSERT INTO res (res, date,id_print, id_sch, res1) VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+', now(), ' + IntToStr(idprint)+', '+ IntToStr(frmAddSch1.Button1.dbGeneralTableId)+', '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_k))+')');
      end;
end;

Ошибок нет, но в поле res1 проставляется нулевое значение 0/
Если ошибка в написании и так делать можно, то хотелось бы еще добавить условие в последний расчет если '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_k))+'. Что если id_priznzam <> (2), то записываем в res1 ноль (res1=0).

2 (edited by sibprogsistem 2019-06-21 18:15:02)

Re: SOS!!! 3-й день топчусь на месте

+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+

вот тут попробуйте без получения в целочисленной части числа..
Trunc делает ноль
 
Да можно

if (условие 1) AND (условие 2) then r:=1 else r:=0;

а в записи используйте переменную +r+

Re: SOS!!! 3-й день топчусь на месте

form1.Edit2.text:= FloatToStr(Int(form1.Edit1.Value));
form1.Edit2.text:= FloatToStr(Frac(form1.Edit1.Value));
form1.Edit2.text:= IntToStr(Trunc(form1.Edit1.Value)); 

во всех вариантах аозвращается ноль..

Re: SOS!!! 3-й день топчусь на месте

Добрый день.
Разобрался. Процедура была рабочая. Дело было в том, что переменная из процедуры frmAddSch1_Button1_OnAfterClick почему то забирала значение frmAddSch1.Edit1.Value. Получалось, что значение само себя минусовало и получался ноль (0). Пришлось объявлять переменную раньше, до procedure frmAddSch1_Button1_OnClick.

Re: SOS!!! 3-й день топчусь на месте

Вопрос №2 остался актуальным.
Как в Insert вставить условие если id_priznzam <> (2), то записываем в res1 ноль (res1=0), а если  id_priznzam = (2), то '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_k))+'

procedure frmAddSch1_OnShow (Sender: TObject; Action: string);
begin
   pok_k := SQLExecute('SELECT IFNULL (Max(sch), 0) FROM sch WHERE id_priznzam = (2) and sch.id_print= '+ inttostr (idprint)); 
      end;
procedure frmAddSch1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
          begin
               if frmAddSch1.dbAction = 'NewRecord' then frmAddSch1.Tag := 1 else frmAddSch1.Tag := 0;
      end;
procedure frmAddSch1_Button1_OnAfterClick (Sender: TObject);
 var
     vyrab_otp: string;
           begin
     if frmAddSch1.Tag = 1 then
     begin
vyrab_otp := SQLExecute('SELECT IFNULL(vyrab_otp, 0) FROM sch LEFT OUTER JOIN print ON print.id=sch.id_print WHERE sch.id = ' + IntToStr(frmAddSch1.Button1.dbGeneralTableId));
      if ValidInt(vyrab_otp) and ValidInt(pok_k) then SQLExecute ('INSERT INTO res (res, res1) VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+',  '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_k))+')');
end;
 end;

Re: SOS!!! 3-й день топчусь на месте

Если я правильно понял вопрос, то так

procedure frmAddSch1_Button1_OnAfterClick (Sender: TObject);
var
    vyrab_otp: string;
    id_priznzam: string;
begin
    if frmAddSch1.Tag = 1 then
    begin
        vyrab_otp := SQLExecute('SELECT IFNULL(vyrab_otp, 0) FROM sch LEFT OUTER JOIN print ON print.id=sch.id_print WHERE sch.id = ' + IntToStr(frmAddSch1.Button1.dbGeneralTableId));
        if ValidInt(vyrab_otp) and ValidInt(pok_k) then 
        begin
            id_priznzam := SQLExecute('SELECT id_priznzam FROM sch WHERE id=' + IntToStr(frmAddSch1.Button1.dbGeneralTableId));
            if id_priznzam <> '2' then SQLExecute('INSERT INTO res (res, res1) VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+',  0') 
            else if id_priznzam = '2' SQLExecute('INSERT INTO res (res, res1) VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+',  '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_k))+')');
        end;    
    end;
end;
Dmitry.

Re: SOS!!! 3-й день топчусь на месте

Дмитрий спасибо.
Неделю уже как работает у пользователей. Проанализировав вводимые ими данные, СРОЧНО появилась необходимость ввернуть контроль "and pok_max > pok_e"

if id_priznzam = '1' and pok_max > pok_e then SQLExecute ('INSERT INTO res (res, res1)  VALUES('+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(vyrab_otp))+',  '+IntToStr(Trunc(frmAddSch1.Edit1.Value) - StrToInt(pok_e))+')')
        else
            begin
            ShowMessage('Проверьте вносимые показания счетчиков');
            FrmAddSch1.Close;
               end;

Красный курсор становится после оператора and. Пробовал написать по разному но ошибка в условии остается.
Переменные pok_max и pok_e без условия, которое выдает ошибку отдают значения (например ShowMessage(pok_max) = 1000 и ShowMessage(pok_e) = 500).

Re: SOS!!! 3-й день топчусь на месте

vovka3003 wrote:
(id_priznzam = '1') and (pok_max > pok_e)

Пробовал.
Курсор ошибки становится после знака больше.

9 (edited by Andrei 2019-07-03 10:38:39)

Re: SOS!!! 3-й день топчусь на месте

Спасибо.

vovka3003 wrote:

Что-то неправильно значит пробовали...

Когда увидел, что ошибка стала после знака больше (>) начал разбираться с переменными.
pok_max - integer
pok_e - string
Соответственно

If (id_priznzam = '1') and (pok_max > StrToInt(pok_e))