sparrow wrote:

Ну чтобы меньше читать и писать

procedure PruffPayment ();
var s, i: integer;
t:  string;
begin
...
t := SQLExecute ('SELECT PruffPayment FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" ');
if t = '0' then                    // Если чека нет окрасить всю строку в сиреневый
  begin
      for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7; 
  end;
if t = '1' then                   // Если чек получен окрасить всю строку в зеленый
  begin
     for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
  end;
// если t = '' остается белым Не делаем ничего
...
end;

Спасибо ещё раз за подсказку!
как вариант можно использовать и этот более "изящный" вариант

sparrow wrote:

Два раза в запросе

AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'"



Проверьте ваше решение для варианта если в таблице TblPayRoll не будет строки где PruffPayment = 1.
Т.е. все значения PruffPayment = 0.

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

procedure PruffPayment ();
var s, i: integer;


begin
 // цикл - пройти все строки начиная с первой (0)
 for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do

     if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND PruffPayment = 1')
  // если чек получен окрасить всю строку в зеленый
      then
       begin
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
       end
else if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND PruffPayment = 0')
  // Если чека нет окрасить всю строку в сиреневый
      then
       begin
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7;
       end

PruffPayment принимает значения или 0 или 1 третьего не дано.
строки где PruffPayment = 0 - одного цвета, где  PruffPayment = 1 - другого, а строки у которых нет совпадения по полям отличным от PruffPayment остаются белыми

Не реагируйте так бурно! ОГРОМНОЕ СПАСИБО за подсказку, натолкнули на правильный ход мысли. Всё  работает!!!!
в итоге получилось следующее:

procedure FrmOne_BtSavePay_OnClick (Sender: TObject; var Cancel: boolean);
var s, i: integer;

begin
 // цикл - пройти все строки начиная с первой (0)
 for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do

     if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND PruffPayment = 1')
  // окрасить всю строку
      then
       begin
 // цикл - Окрасить всю строку
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
       end

end;

Спасибо, попробую осознать.
Совпадений в гриде будет однозначно более чем 1, а это значит нужно заключить в цикл
в моём случае нужно сравнить строку в гриде с таблицей если совпадают все уловия - ракрасить.... имнеео в таком порядке и не наоборот

Добрый день!
Кодер из меня ещё тот!
Помогите понять что - где не так.
есть TableGrid сформированная SQL-запросом - FrmOne.TG_PayRoll
из TableGrid  данные из определённых ячеек записываем в отдельную таблицу.
кому интересно, выглядит это так:

// Передача в оплату!
procedure FrmOne_TG_PayRoll_OnDoubleClick (Sender: TObject; ACol, ARow: Integer; Value: String; var Accept: Boolean);
 var i: integer;
     Fam, Nam, First, pay, recip, Mo, BIK, RS, app, sql: string;
begin
   Mo := (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 7));
   i := FrmOne.TG_PayRoll.SelectedRow;
   Fam := FrmOne.TG_PayRoll.Cell[1,i].AsString ;
   Nam := FrmOne.TG_PayRoll.Cell[2,i].AsString ;
   First := FrmOne.TG_PayRoll.Cell[3,i].AsString ;
   Pay := FrmOne.TG_PayRoll.Cell[16,i].AsString ;
   recip := FrmOne.TG_PayRoll.Cell[17,i].AsString ;
   BIK := FrmOne.TG_PayRoll.Cell[18,i].AsString ;
   RS := FrmOne.TG_PayRoll.Cell[19,i].AsString ;
   app := FrmOne.TG_PayRoll.Cell[20,i].AsString ;

   if IDYES = MessageBox('Передать в оплату?'+#13#13+(Fam)+(' ')+(Nam)+(' ')+(First)+#13#13+('за')+(' ')+(Mo)+#13#13+('начислено')+(' ')+(pay)+#13#13+('получатель')+(' ')+(recip)+#13#13+('БИК')+(' ')+(BIK)+#13#13+('Счет №')+(' ')+(RS)+#13#13+('Назначение')+(' ')+(app), 'Передача в оплату', MB_YESNO+MB_ICONQUESTION)
    then
     begin SQLExecute('INSERT INTO TblPayRoll (Famaly, LastName, FirstName, Transfer, Mounth, RecipientPay, BIK, RS, appointment) VALUES("'+Fam+'", "'+Nam+'", "'+First+'", "'+Pay+'", "'+Mo+'", "'+recip+'", "'+BIK+'", "'+RS+'", "'+app+'")')
     end
    else if IDNO
     then
      begin
       ShowMessage('Вы отменили действие');
      end
end;

Хотелось бы строки данные из которых были записаны в таблицу выделить цветом, для этого был написан следующий код:

procedure FrmOne_BtSavePay_OnClick (Sender: TObject; var Cancel: boolean);
var  s, i: integer;
      Mo, sql: string;
 begin
 // Присваиваем переменной начальное значение
  // i := 0;
 // переменная для сравнения выбранной даты с db
   Mo:= (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 7));
 // цикл - пройти все строки начиная с первой (0)
    for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
 // если в db PruffPayment = 1 (да/нет = 1/0)
     if SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 1')
 // и совпадает месяц
      and (Mo = SQLExecute('SELECT Mounth FROM TblPayRoll WHERE Mounth = "'+Mo+'"'))
 // и совпадает фамилия
      and (FrmOne.TG_PayRoll.Cell[1,i].AsString = SQLExecute('SELECT Famaly FROM TblPayRoll WHERE Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'"'))
 // и совпадает имя
      and (FrmOne.TG_PayRoll.Cell[2,i].AsString = SQLExecute('SELECT LastName FROM TblPayRoll WHERE LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'"'))
 // и совпадает отчество
      and (FrmOne.TG_PayRoll.Cell[3,i].AsString = SQLExecute('SELECT FirstName FROM TblPayRoll WHERE FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'"'))
 // и совпадает сумма
      and (FrmOne.TG_PayRoll.Cell[16,i].AsString = SQLExecute('SELECT Transfer FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"'))
    then
     begin
    //ShowMessage('Есть совпадение');
    // окрасить всю строку
    for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
     do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7;
     end

Загвоздка в том что при наличии одного совпадения в таблице отвечающему 

SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 1')


в TableGrid окрашиваются и те у которых PruffPayment = 0....
и обратная ситуация при

SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 0')


не окрашивается ни одной строки

Добрый день
Следующий код работает:

procedure FrmOne_TGMaterial_OnChange (Sender: TObject);
 begin
    FrmOne.TGMaterial.Columns[11].Options := FrmOne.TGMaterial.Columns[11].Options + coEditing;
 end;

но не сохраняет  правки в DB. или я что то упустил?

Спасибо Друзья! всё получилось!

Спасибо, работает но только на первом вводимом символе. если недопустимый знак второй и последующий то нет!
и ещё, если усложнить задачу?
при вводе "?" сообщение выскакивает, но символ пишется в edit. как удалить последний введённый символ?

как предотвратить написание знаков / \ : * ? " < > | в поле edit
в моём проекте автоматически создаётся одноименная папка.
нужно запретить пользователю вводить недопустимые знаки... вопрос как?

10

(2 replies, posted in Russian)

почитав форум наткнулся на пост где было предложено включить id (в моём случае DictPloshadki.id) для идентификации записи... и всё заработало.

procedure frmWork_CB_Dogovor_OnCloseUp (Sender: TObject);
begin
  frmWork.CB_Ploshadka.dbSQLExecute('SELECT Ploshadki, DictPloshadki.id from DictPloshadki left Join Dogovor on DictPloshadki.id = Dogovor.id_DictPloshadki or DictPloshadki.id = Dogovor.id_DictPloshadki1 or DictPloshadki.id = Dogovor.id_DictPloshadki2 or DictPloshadki.id = Dogovor.id_DictPloshadki3 or DictPloshadki.id = Dogovor.id_DictPloshadki4 or DictPloshadki.id = Dogovor.id_DictPloshadki5 or DictPloshadki.id = Dogovor.id_DictPloshadki6 or DictPloshadki.id = Dogovor.id_DictPloshadki7 or DictPloshadki.id = Dogovor.id_DictPloshadki8 or DictPloshadki.id = Dogovor.id_DictPloshadki9 WHERE dogovor.id = ' + FrmWork.CB_Dogovor.sqlValue);
  frmWork.CB_Ploshadka.dbUpdate;
end;

возможно Вам поможет...

11

(2 replies, posted in Russian)

glkonst79 wrote:

Добрый вечер!
Обновил программу до версии 6.4 и проявилась проблема с комбобоксом.
procedure frmScore_ComboBox1_OnDropDown (Sender: TObject);
begin
    frmScore.ComboBox1.dbSQLExecute('SELECT DISTINCT name FROM Specification WHERE id_Dogovor='+frmScore.dogovor.sqlValue)
end;
При выборе записи согласно процедуре, запись в комбо показывается и исчезает.
Не могу понять почему она не фиксируется, в версии 6.2 все работало
Заранее спасибо.

мне кажется у Вас не совсем корректно написано, попробуйте

..................WHERE Dogovor.id='+frmScore.dogovor.sqlValue

Но в целом поддерживаю, сегодня столкнулся с похожей проблемой - невозможно выбрать запись в комбо боксе.
В таблице Dogovor несколько внешних ссылок на DictPloshadki. (Dogovor.DictPloshadki,  Dogovor.DictPloshadki1, Dogovor.DictPloshadki2 и т.д. до 9 сделано потому что площадки в разных договорах повторяются.)
запрос вида:

procedure frmWork_CB_Dogovor_OnCloseUp (Sender: TObject);
begin
  frmWork.CB_Ploshadka.dbSQLExecute('SELECT Ploshadki from DictPloshadki left Join Dogovor on DictPloshadki.id = Dogovor.id_DictPloshadki or DictPloshadki.id = Dogovor.id_DictPloshadki1 WHERE dogovor.id = ' + FrmWork.CB_Dogovor.sqlValue);

end;

Работает как надо, при выборе договора в CB_Dogovor выпадающий список CB_Ploshadka заполняется корректно, но при выборе значения в CB_Ploshadka бокс закрывается и остаётся пустым!

sibprogsistem wrote:

вот тут точно не правильно

if  FrmReportCard.CBStaff.sqlValue =  SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1')

if - если , то есть проверить условие на True или False

Вы пытаетесь сравнить выбранные условия  не понятно с чем... sqlValue - это id записи типа String

Я же получается сравниваю выбранный в комбо боксе staff.id со staff.id отвечающему условию Administrative = 1 или 0

sibprogsistem wrote:

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

StrToInt(SQLExecute('SELECT COUNT(Staff.id) FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1 AND Staff.id='+FrmReportCard.CBStaff.sqlValue))>0

Ради интереса попробую, но мой последний вариант работает как надо без перевода из строки в число (StrToInt)

Вобщем причесал скрипт на все случаи жизни получилось следующее:

procedure frmReportCard_BtSearch_OnAfterClick (Sender: TObject);
begin
 Report_Card()
end;

procedure frmReportCard_CBWork_OnChange (Sender: TObject);
begin
   Report_Card()
end;

procedure Report_Card();
 begin
      if (FrmReportCard.CBWork.ItemIndex = -1) AND (FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+''))
       Then
        begin
         FrmReportCard.CBWork.Enabled := False;
         FrmReportCard.SaveRepCard.Enabled := True;
        end
 Else if (FrmReportCard.CBWork.ItemIndex = -1) AND (FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 0 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+''))
        Then
         begin
          FrmReportCard.CBWork.dbUpdate;
          FrmReportCard.CBWork.Enabled := True;
          FrmReportCard.CBWork.DroppedDown := True;
          FrmReportCard.SaveRepCard.Enabled := False;
         end
 Else if (FrmReportCard.CBWork.ItemIndex <> -1) AND (FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+''))
        Then
         begin
          FrmReportCard.CBWork.Clear;
          FrmReportCard.CBWork.Enabled := False;
          FrmReportCard.SaveRepCard.Enabled := True;
         end
 Else if (FrmReportCard.CBWork.ItemIndex <> -1) AND (FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 0 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+''))
        Then
         begin
          FrmReportCard.CBWork.dbUpdate;
          FrmReportCard.CBWork.Enabled := True;
          FrmReportCard.SaveRepCard.Enabled := True;
         end
 end;

ещё раз спасибо за пример!!!!

Спасибо огромное за пример!!!!

procedure frmReportCard_BtSearch_OnAfterClick (Sender: TObject);
 begin
   If FrmReportCard.CBWork.ItemIndex = -1 then
     begin
      if  FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+'')
       Then
        begin
         FrmReportCard.SaveRepCard.Enabled := True;
        end
 Else if FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 0 AND Staff.id='+FrmReportCard.CBStaff.sqlValue+'')
        Then
         begin
          FrmReportCard.CBWork.DroppedDown := True;
          FrmReportCard.SaveRepCard.Enabled := False;
         end
     end
end;

ЗАРАБОТАЛО!!!

sibprogsistem wrote:

вот тут точно не правильно

if  FrmReportCard.CBStaff.sqlValue =  SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1')

if - если , то есть проверить условие на True или False

Вы пытаетесь сравнить выбранные условия  не понятно с чем... sqlValue - это id записи типа String

не правильно? но работает!
допустим sqlValue = 27  SQL Запрос возвращает 12 значений среди них есть 27
остальсь в WHERE добавить условие где отфильтруются все записи кроме sqlValue = 27 должно быть что то в виде FrmReportCard.CBStaff.sqlValue = Staff.id
сейчас попробую, на примере:

if  SQLExecute('SELECT pass FROM users WHERE id='+ frmLogin.cbStatus.sqlValue)<>'1' then

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

http://myvisualdatabase.com/forum/viewtopic.php?id=6853 этот проект мне попадался но 7000 строк я не осилил)))

sibprogsistem wrote:

давайте разбираться

Вам нужно получить все записи выбранного пользователя в комбобох  где имеются  значения Administrative=1 ?
Вы используете свойство кнопки SQLЗапрос? Если Да, то нужно использовать  не SQLEXecute а dbSQL
Куда Вы пытаетесь поместить результат запроса?

На форме заполнения табеля при выборе одного сотрудника в комбо боксе хочу чтобы сработал скрипт, а в зависимости от значения  Administrative=1 или 0 настроить поведение отдельных элементов формы.
в сыром виде выглядит так:

procedure frmReportCard_BtSearch_OnAfterClick (Sender: TObject);
begin
ShowMessage ('Результат выбора - ' +FrmReportCard.CBStaff.sqlValue+);
 begin
   // If FrmReportCard.CBWork.ItemIndex = -1 then
     //begin
      if  FrmReportCard.CBStaff.sqlValue =  SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 1')
       Then
        begin
         FrmReportCard.SaveRepCard.Enabled := True;
         ShowMessage ('Можно сохранять запись')
        end
 Else if FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative = 0')
        Then
         begin
          FrmReportCard.CBWork.DroppedDown := True;
          FrmReportCard.SaveRepCard.Enabled := False;
          ShowMessage ('Нельзя сохранить запись');
         end
     //end
 end
end;
sibprogsistem wrote:
builov.maikl wrote:

Нет, нужно вполнить условие.
Если выбранный сотрудник является административным персоналом ( Administrative = 1) то ......
Сам запрос правильный и возвращает несколько Id, а вот сопоставление с выбранным в комбо боксе хромает.

FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative ={имя_комбобокса}') 

http://myvisualdatabase.com/doc_ru/butt … query.html

К сожалению так не будет работать и не работает
FrmReportCard.CBStaff.sqlValue - Возвращает id выбранной записи в компоненте (одно значение)
Запрос вида:

SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative =1 

- возвращает 12 записей
правильно обрабатывается только первая запись из 12 найденных результатов. Проверял меняя значения Administrative = с 1 на 0 в разных вариациях.
В теории нужно чтобы SQL возвращал только одну запись например FrmReportCard.CBStaff.sqlValue = 27 и SQLExecute = 27 (см. скриншот постом выше)
опять же теоретически к WHERE Administrative =1 добавить (AND) FrmReportCard.CBStaff.sqlValue = Staff.id и полученный код должен выглядеть так:

FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative =1 AND FrmReportCard.CBStaff.sqlValue = Staff.id') 

но в этом случае ругается - no such column: FrmReportCard.CBStaff.sqlValue

Да, и на фигурные скобки в скрипте программа ругается.

Нет, нужно вполнить условие.
Если выбранный сотрудник является административным персоналом ( Administrative = 1) то ......
Сам запрос правильный и возвращает несколько Id, а вот сопоставление с выбранным в комбо боксе хромает.

Добрый день. В таблице DictPosition некоторые должности помечены как Administrative=1.
FrmReportCard.CBStaff.sqlValue возвращает id сотрудника, запрос возвращает все id сотрудников с Administrative=1 
нужно сопоставить выбор комбо бокса  со значениями из SQL запроса...
мой код работает криво:

 FrmReportCard.CBStaff.sqlValue = SQLExecute('SELECT Staff.id FROM Staff  JOIN DictPosition ON staff.id_DictPosition=DictPosition.id WHERE Administrative =1') 
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.

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

23

(24 replies, posted in Russian)

builov.maikl wrote:

Всем спасибо, сам спросил и сам ответил!
адаптированная под мой проект версия но думаю поймёте...

procedure frmOne_TableWork_OnDoubleClick (Sender: string);
var
    FileName: string;
begin
    FileName := SQLExecute('SELECT folder_filename FROM Work WHERE id='+frmOne.TableWork.sqlValue);
    if OpenFile(FileName) then;
end;

Вопрос по доработке:
Возможно ли прикрутить проверку? если папка не задана то вызвать сообщение с предложением задать папку, при положительном ответе вызвать окно выбора папки и сохранения в базу

Petr wrote:

по первому вопросу:
http://myvisualdatabase.com/forum/viewtopic.php?id=5840
по второму выложите проект, думаю вам помогут форумчане, по скринам не всегда можно разобраться в причинах

Спасибо, по первому вопросу помогло., по второму не критично, может позже.

25

(63 replies, posted in Russian)

Добрый день.
Не могу в полной мере сказать что нашел ошибку но хотелось бы исправить
поиск через компонент Edit выдаёт записи в соответствии с регистром букв (фильтр %s%) т.е. "Поиск" и "поиск" это разные слова!

P/S чуть ранее писал о других найденных ошибках в других ветках, (может не туда влепил?) можно посмотреть через профиль.