Topic: Нужен совет. Как правильнее сделать?

Здравствуйте.
Есть таблица показания счетчика Sch в ней 2 поля: id записи и сами показания Pok (целое число).
Как посчитать разницу между двумя последними Id записей?.
Т.е. в таблице 50 строк но нам нужен результат между записями id50-id49=xxx (id50 = 100, id49 = 80 получаем 100-80=20).
Если появится 51 строка запись id51=110, то нам нужен результат между записями id51-id50=xxx (id51 = 110, id50 = 100 получаем 110-100=10). И т.д.
Если коротко то нужна разница между последними двумя записями, не зависимо от кол-ва записей в таблице.

2 (edited by k245 2019-03-15 12:31:57)

Re: Нужен совет. Как правильнее сделать?

Воспользуемся тем фактом, что ID добавляются по возрастанию и не редактируются, тогда

select Pok from Sch order by id desc limit 1 offset 1 - вернёт предпоследнее значение, а 
select Pok from Sch order by id desc limit 1  - вернет последнее значение

Запросы для SQLite

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

3 (edited by derek 2019-03-16 01:36:00)

Re: Нужен совет. Как правильнее сделать?

Привет Andrei, K245,
Другой вариант - использовать tablegrid (вместо таблицы).
Это уменьшает количество обращений к базе данных, а также дает дополнительную возможность фильтрации таблицы и возможности вычислять разницу между двумя последними строками отфильтрованной tablegrid.
С Уважением,
Дерек.
(с гугл переводчиком - извиняюсь!)

Post's attachments

Attachment icon substract cell values.zip 337.8 kb, 316 downloads since 2019-03-16 

Re: Нужен совет. Как правильнее сделать?

Спасибо!!!

5 (edited by Andrei 2019-03-20 11:05:56)

Re: Нужен совет. Как правильнее сделать?

Дабы не плодить темы задам возникший вопрос в данной теме.
Не получается объявить переменную из TableGrid по которой дальше нужно делать SQL запрос.

Есть TableGrid в который выводится id всех записей таблицы print.
Не получается:
1) Объявить переменную idprint - соответственно значение id из таблицы print для выделенной строки в TableGrid;
В моем скрипте
procedure FrmOth_OnShow (Sender: TObject; Action: string);
begin
  idPrint := SQLExecute... (дальше перепробованная мною чушня)
end:
2) после в кнопке Button4 выполнить SQL запрос: select * from sch where id_print = idprint (или (idprint) или 'idprint')...

Заранее спасибо.

Re: Нужен совет. Как правильнее сделать?

К сожалению не понял вопросов.

Dmitry.

Re: Нужен совет. Как правильнее сделать?

1)Запомнить из Grida id выделенной записи из таблицы print;
2)Далее этот id загнать в переменную idprint для последующих selectов;
3)Синтаксис написания SQL запроса простого selecta.
например рабочий  select * from sch where id_print = (1), только за место id=1 из таблицы print нужно вставить значение  созданной переменной print

Re: Нужен совет. Как правильнее сделать?

1-2

var
   idPrint: integer;
begin
   idPrint := Form1.TableGrid1.dbItemID;


3.

Form1.Button4.dbSQL := 'select * from sch where id_print = ' + IntToStr(idprint);
Form1.Button4.Click;
Dmitry.

Re: Нужен совет. Как правильнее сделать?

Дмитрий спасибо!!! Работает!!!

Re: Нужен совет. Как правильнее сделать?

DriveSoft wrote:

1-2

var
   idPrint: integer;
begin
   idPrint := Form1.TableGrid1.dbItemID;


3.

Form1.Button4.dbSQL := 'select * from sch where id_print = ' + IntToStr(idprint);
Form1.Button4.Click;

А можно еще синтаксис запроса в MySQL для возможности использования join

select distinct b.kab, a.sch, a.data, c.priznzam
from sch a                         
join print b on a.id_print=b.id       
join priznzam c on a.id_priznzam=c.id
where b.id=??? (значение объявленной переменной idprint)

Re: Нужен совет. Как правильнее сделать?

У вас уже написан SQL запрос с использованием join, он не работает на MySQL?

Dmitry.

Re: Нужен совет. Как правильнее сделать?

Запрос работает если назначаю b.id =(1).
Но не знаю как прописать b.id =  ранее объявленная переменная (idprint).
Задача ругается на синтаксис написания.

Re: Нужен совет. Как правильнее сделать?

Andrei wrote:

А можно еще синтаксис запроса в MySQL для возможности использования join

select distinct b.kab, a.sch, a.data, c.priznzam
from sch a                         
join print b on a.id_print=b.id       
join priznzam c on a.id_priznzam=c.id
where b.id=??? (значение объявленной переменной idprint)

'select distinct b.kab, a.sch, a.data, c.priznzam '+
' from sch a '+
' join print b on a.id_print=b.id '+
' join priznzam c on a.id_priznzam=c.id '+
 'where b.id = '+ inttostr ( idprint ) ;
Визуальное программирование: блог и телеграм-канал.

Re: Нужен совет. Как правильнее сделать?

Ребята спасибо.
Выкладываю рабочий блок

procedure FrmOth_OnShow (Sender: TObject; Action: string);
begin
   idPrint := formOth_printDisplay.TableGrid1.dbItemID;
      FrmOth.Button4.dbSQL := 'select * from sch where id_print = ' + IntToStr(idprint);
      FrmOth.Button4.Click;
      FrmOth.Button3.dbSQL := 'select distinct b.kab, a.sch, a.data, c.priznzam '+
                                            ' from sch a '+
                                            ' join print b on a.id_print=b.id '+
                                            ' join priznzam c on a.id_priznzam=c.id '+
                                            ' where b.id = '+ IntToStr(idprint);
      FrmOth.Button3.Click;
    end;

Re: Нужен совет. Как правильнее сделать?

И снова синтаксис...

Как правильно написать условия >=  <=
' where b.id = '+ IntToStr(idprint) and (a.data >= {DateTimePicker3}) and (a.data <= {DateTimePicker4});

Re: Нужен совет. Как правильнее сделать?

Вроде правильно написано, возникает ошибка? если да, то какая?

Dmitry.

Re: Нужен совет. Как правильнее сделать?

DriveSoft wrote:

Вроде правильно написано, возникает ошибка? если да, то какая?

Если в скрипте то курсор ошибки становится перед >=
Если в SQL запросе через форму, то ошибка во вложении

Post's attachments

Attachment icon 1.jpg 44.95 kb, 166 downloads since 2019-03-25 

Re: Нужен совет. Как правильнее сделать?

Приложите пожалуйста ваш проект

Dmitry.

Re: Нужен совет. Как правильнее сделать?

DriveSoft wrote:

Приложите пожалуйста ваш проект

Здравствуйте.
Отправил проект на мыло support@drive-software.com

Re: Нужен совет. Как правильнее сделать?

Есть синтаксическая ошибка с кавычками, правильный вариант

      FrmOth.Button4.dbSQL := 'select distinct d.name, e.otdel, b.kab, a.sch, a.data, c.priznzam '+
                                            ' from sch a '+
                                            ' join print b on a.id_print=b.id '+
                                            ' join priznzam c on a.id_priznzam=c.id '+
                                            ' join mod_print d on b.id_mod_print=d.id '+
                                            ' join otd e on b.id_otd=e.id '+
                                            ' where b.id = '+ IntToStr(idprint)+' and (a.data >= {DateTimePicker3}) and (a.data <= {DateTimePicker4})';

также для поля sch.data указано неверное default значение: 2019.03.15
правильно будет 2019-03-15

но в тоже время в MVD есть ошибка, которая не позволяет указать default значение для поля ДАТА в MySQL, данная ошибка исправлена в версии 5.3 beta
https://www.dropbox.com/s/abazohrbdt3p9 … a.zip?dl=0


поэтому либо обновитесь, либо просто удалите Default значение для данного поля.

Dmitry.

Re: Нужен совет. Как правильнее сделать?

Не работает в скриптах закомментированная строчка.
Как правильно написать?

FrmSch.Button3.dbSQL := 'select distinct d.name, e.otdel, b.kab, a.sch, a.data, c.priznzam '+
                                     ' from sch a  '+
                                     ' join print b on a.id_print=b.id '+
                                     ' join priznzam c on a.id_priznzam=c.id  '+
                                     ' join mod_print d on b.id_mod_print=d.id   '+
                                     ' join otd e on b.id_otd=e.id '+
                                     ' where b.id = '+ inttostr (idprint);
                                     //' order by a.sch DESC '+
      FrmSch.Button3.Click;

Re: Нужен совет. Как правильнее сделать?

Имеете ввиду, что данные не сортируются?
Приложите пожалуйста ваш проект, протестирую.

Dmitry.

Re: Нужен совет. Как правильнее сделать?

DriveSoft wrote:

Имеете ввиду, что данные не сортируются?
Приложите пожалуйста ваш проект, протестирую.

Не совсем так.
Проект отправил на эл адрес.
В выполнении запроса Button SQL
select distinct d.name, e.otdel, b.kab, a.sch, a.data, c.priznzam
from sch a
join print b on a.id_print=b.id
join priznzam c on a.id_priznzam=c.id
join mod_print d on b.id_mod_print=d.id
join otd e on b.id_otd=e.id 
where b.id = '+ inttostr (idprint)
order by a.sch DESC   
Ошибок нет!!! Сортировка работает.

А вот вкладка в MVD "Скрипты" процедура работает только без закомментированой строки.
FrmSch.Button3.dbSQL := 'select distinct d.name, e.otdel, b.kab, a.sch, a.data, c.priznzam '+
                                     ' from sch a  '+
                                     ' join print b on a.id_print=b.id '+
                                     ' join priznzam c on a.id_priznzam=c.id  '+
                                     ' join mod_print d on b.id_mod_print=d.id   '+
                                     ' join otd e on b.id_otd=e.id '+
                                     ' where b.id = '+ inttostr (idprint);
                                     //' order by a.sch DESC '+
      FrmSch.Button3.Click;
Как только снимаю комментарий - Проверка краснит (курсор становится в начале строки ' order by a.sch DESC '+). Пробовал по разному написать . Проблема в синтаксисе.

Re: Нужен совет. Как правильнее сделать?

Правильно будет так

procedure FrmSch_OnShow (Sender: TObject; Action: string);
begin
   idPrint := frmSch.TableGrid1.dbItemID;
      FrmSch.Button3.dbSQL := 'select distinct d.name, e.otdel, b.kab, a.sch, a.data, c.priznzam '+
                                     ' from sch a  '+
                                     ' join print b on a.id_print=b.id '+
                                     ' join priznzam c on a.id_priznzam=c.id  '+
                                     ' join mod_print d on b.id_mod_print=d.id   '+
                                     ' join otd e on b.id_otd=e.id '+
                                     ' where b.id = '+ inttostr (idprint) +
                                     ' order by a.sch DESC';
      FrmSch.Button3.Click;

end;
Dmitry.

Re: Нужен совет. Как правильнее сделать?

Есть таблица print. В ней обязательное числовое поле print.schv
Есть таблица sch. В ней обязательное числовое поле schs. Таблица sch связана с таблицей print.id=sch.lrint_id. Вопрос как правильнее сделать? нужно вычислить (разность чисел) при сохранении нового строки в таблицу sch.schs, а именно sch.schs-print.schv (минус) в связанную таблицу res.id=schs.id_res поле res.res. Пример: print.schv=100. Print.id=1. Сохраняем значение в таблицу sch.schs=80 для sch.id_print=1. В момент сохранения появляется запись а таблице res.res=20 (100-80, сто минус восемьдесят) для res.id_sch