1 (edited by builov.maikl 2021-02-03 08:16:13)

Topic: как данные из SQL запроса Сохранить в DB

Добрый день.
В проекте есть расчет заработной платы посредством SQL запроса.  Вопрос: как полученный результат записать в таблицу DB? например: id.Staff / дата 01.01.2021 / Summa 55000
Поясню для чего:  Допустим у сотрудника оклад 50 000 р/мес. По табелю отработал  и получил  январь согласно формуле = оклад / часы рабочего календаря * сумму отработанных часов в январе. Если в феврале работнику поднять оклад то при обращении к выплате работнику за январь сумма изменится и уже не будет соответствовать действительности со всеми вытекающими.
Возможно у меня не правильный подход - прошу поделиться мыслями

2 (edited by sibprogsistem 2021-02-03 10:30:25)

Re: как данные из SQL запроса Сохранить в DB

SQLExacute('INSERT INTO Таблица(поле) VALUES("'+переменная с результатом вычисления+'")');

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

3 (edited by builov.maikl 2021-02-04 06:57:16)

Re: как данные из SQL запроса Сохранить в DB

sibprogsistem wrote:
SQLExacute('INSERT INTO Таблица(поле) VALUES("'+переменная с результатом вычисления+'")');

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


Спасибо, попробую. на самом деле я упростил здесь вопрос дабы не перегружать мозг читателя. мой SQL запрос выглядит следующим образом:

procedure update_report_Staff();
var v, sql: string;
begin
    v := (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 7));

    SQL := 'SELECT "$autoinc", Staff.Famaly AS "Фамилия", Staff.FirstName AS "Имя", Staff.LastName AS "Отчество",' +
            ' WorkCalendar.Hours AS "час",' +
            ' Staff.Oklad AS "Оклад",' +
            ' sum(ReportCard.Time) AS "факт",' +
            ' sum(ReportCard.Time) - (WorkCalendar.Hours) AS "Час.Перераб.",' +
            ' (IfNull(KTU.Bonus, 1) * (Staff.Oklad / WorkCalendar.Hours) * (1.5 * max(0, sum(ReportCard.Time) - hours))) AS "Сумма",' +
            ' IfNull(KTU.Bonus, 1) AS "КТУ",' +
            ' (IfNull(KTU.Bonus, 1) * (Staff.Oklad / WorkCalendar.Hours) * (min(sum(ReportCard.Time), WorkCalendar.Hours) + (1.5 * max(0, sum(ReportCard.Time) - hours)))) AS "К выдаче",' +
            ' (IfNull(KTU.Bonus, 1) * (Staff.Oklad / WorkCalendar.Hours) * (min(sum(ReportCard.Time), WorkCalendar.Hours) + (1.5 * max(0, sum(ReportCard.Time) - hours))) * 0.06383) AS "Налог",' +
            ' (IfNull(KTU.Bonus, 1) * (Staff.Oklad / WorkCalendar.Hours) * (min(sum(ReportCard.Time), WorkCalendar.Hours) + (1.5 * max(0, sum(ReportCard.Time) - hours))) * 1.06383) AS "Перевод"' +
            ' FROM ReportCard' +
            ' LEFT JOIN Staff ON ReportCard.id_Staff == Staff.id' +
            ' LEFT JOIN WorkCalendar ON WorkCalendar.YearMounth LIKE "' + v + '-% 00:00:00.000"' +
            ' LEFT JOIN KTU ON (Staff.id == KTU.id_Staff AND KTU.Mounth LIKE "' + v + '-% 00:00:00.000")' +
            ' WHERE DateIn LIKE "' + v + '-% 00:00:00.000" and Staff.Oklad <> "0"' +
            ' group by Staff.id;'; 
        

    FrmOne.Button15.dbSQL := sql;


end;

тоесть для записи например в таблицу Pay строку вида: id.Staff / дата 01.01.2021 / Summa 55000 - где id.Staff внешняя ссылка к работнику мне придется............. сильно подумать)))
В идеале добавить кнопку "передать в оплату" по которой все полученные из запроса записи (=количеству работников) записать в таблицу Pay.