1 (edited by builov.maikl 2021-02-06 16:04:12)

Topic: Сопоставление sqlValue с одним из значений запроса

Добрый день. В таблице 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') 

Re: Сопоставление sqlValue с одним из значений запроса

Не совсем понял вопрос, но если Вам надо установить ComboBox сотрудника из результата запроса, то выглядеть это буде так:

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

3 (edited by builov.maikl 2021-02-07 11:30:40)

Re: Сопоставление sqlValue с одним из значений запроса

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

Post's attachments

Attachment icon Безымянный.png 18 kb, 97 downloads since 2021-02-07 

Re: Сопоставление sqlValue с одним из значений запроса

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

5 (edited by builov.maikl 2021-02-07 16:53:04)

Re: Сопоставление sqlValue с одним из значений запроса

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

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

Re: Сопоставление sqlValue с одним из значений запроса

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

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

Re: Сопоставление sqlValue с одним из значений запроса

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;

Re: Сопоставление sqlValue с одним из значений запроса

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

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

Re: Сопоставление sqlValue с одним из значений запроса

вот пример подобного из моего проекта

//***********************************************************************************************
//подмена кнопки авторизации при выборе в комбобоксе логина без пароля***************************
//требуется для авторизации без пороля***********************************************************
//***********************************************************************************************
procedure frmLogin_cbStatus_OnClick (Sender: TObject);
begin
   // если выбранный логин имеет значение 1 (без пароля)
   if SQLExecute('SELECT pass FROM users WHERE id='+frmLogin.cbStatus.sqlValue)='1' then
   begin
    // скрыть поле пароль
    frmLogin.ePassword.Visible:=False;
    // скрыть кнопку авторизации по поролю
    frmLogin.bLoginOk.Visible:=False;
    // отобразить в поле статутаса права выбранного пользователя
    frmLogin.eStatus.text := sqlexecute('SELECT userStatus.userStatusName FROM users LEFT OUTER JOIN userStatus ON userStatus.id=users.id_userStatus WHERE users.id=' +frmLogin.cbStatus.sqlValue);
     end else
     //иначе если выбранный логин имеет значение не 1
     if  SQLExecute('SELECT pass FROM users WHERE id='+ frmLogin.cbStatus.sqlValue)<>'1' then
     begin
     // показать поле пароль
     frmLogin.ePassword.Visible:=True;
     // показать кнопку авторизации по поролю
     frmLogin.bLoginOk.Visible:=True;
    end;
end;

 
сам проект можно скачать тут
http://myvisualdatabase.com/forum/viewtopic.php?id=6853
тут вы должны найти нужные Вам примеры

10 (edited by builov.maikl 2021-02-07 18:40:20)

Re: Сопоставление sqlValue с одним из значений запроса

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 строк я не осилил)))

11 (edited by builov.maikl 2021-02-07 19:01:36)

Re: Сопоставление sqlValue с одним из значений запроса

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

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;

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

12 (edited by builov.maikl 2021-02-07 21:24:29)

Re: Сопоставление sqlValue с одним из значений запроса

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

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;

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

Re: Сопоставление sqlValue с одним из значений запроса

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

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

Re: Сопоставление sqlValue с одним из значений запроса

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)

Re: Сопоставление sqlValue с одним из значений запроса

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