26 (edited by Inkalika 2020-07-05 15:38:13)

Re: Вычисляемое поле

sibprogsistem wrote:

ок

Действительно, заработало! Большое спасибо!
При использовании вычисляемого поля, я писал:
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks и это работало
А в скрипте эта строка не работала и вы предложили писать вместо нее:
statuses_etalon_ks.id_card_etalon_ks = '+ FrmEquipment_KS.TableGrid1.sqlValue +'.
А что означает эта фраза '+ ........sqlValue +' ? Получение номера id открываемой записи получается? А для чего в этом случае одинарные кавычки, знаки плюсов?
Скажите, как в случае использования скриптов вместо вычисляемых полей, отобразить в таблице card полученную дату? Мне бы не хотелось создавать еще одно поле для хранения этой даты в таблице card, потому вычисляемое поле как временный параметр подходил для этих целей. Жаль, оно не обновляется сразу

Если вы не против, в будущем воспользуюсь вашим примером для демонстрации еще некоторых затруднений в реализации вычислений.

27 (edited by sibprogsistem 2020-07-05 16:12:51)

Re: Вычисляемое поле

да, так мы берем id записи выделенной в таблице..
это называется "Конкатена́ция" - склеивание строк пишется через '  ' так используются два разных (обработчика) а с помощью + происходит склеивание строк..  в общем так мы добавляем текст из переменной...

если Вам нужно отобразить дату в tablegrid есть два варианта
1.   tab1 -- tab2 -- tab3 чтобы вывести информация всех трех таблиц ...... в 1-м условии настройки таблицы нужно выбрать таблицу tab2..
2.  tab1 -- tab2 -- tab3-- tab4  в этом случае без SQL запроса не получиться..
если вам нужно отобразить отфильтрованную дату в таблице то без запроса не получиться..
 
я не против

Re: Вычисляемое поле

sibprogsistem wrote:

да, так мы берем id записи выделенной в таблице..
это называется "Конкатена́ция" - склеивание строк пишется через '  ' так используются два разных (обработчика) а с помощью + происходит склеивание строк..  в общем так мы добавляем текст из переменной...

если Вам нужно отобразить дату в tablegrid есть два варианта
1.   tab1 -- tab2 -- tab3 чтобы вывести информация всех трех таблиц ...... в 1-м условии настройки таблицы нужно выбрать таблицу tab2..
2.  tab1 -- tab2 -- tab3-- tab4  в этом случае без SQL запроса не получиться..
если вам нужно отобразить отфильтрованную дату в таблице то без запроса не получиться..

Спасибо! Теперь понятно!
С отфильтрованной датой для отображения в таблице пока решил оставить вычисляемое поле, а вот для форм использую скрипт, чтобы оперативно данные менялись.

29 (edited by Inkalika 2020-07-05 18:21:46)

Re: Вычисляемое поле

На базе прошлой задачи возникла задача сложения полученной отфильтрованной даты со значением to_inerval.value (целое число), что представляет собою количество месяцев.
Физический же смысл следующий - оборудование из таблицы card имеет статус "Проведено техническое обслуживание" (name status) такого-то числа (date) (эту дату получили с помощью скрипта ранее). Чтобы получить следующую дату проведения технического обслуживания, нужно сложить интервал тех.обсл. (to_interval.value) и последнюю дату проведенного тех.обсл..
Пробовал использовать функции date (..., '+to_interval.value months') и strftime  ('%Y-%m-%d',..., '+to_interval.value months'), но не работает ни вычисляемое поле, ни скрипт. Если писать в скобках вместо  '+to_interval.value months', например, '+12 months', то все работает, а если значение из таблицы, то нет.

FrmCard.Edit2.Text:=SQLexecute('SELECT date (date, ''+to_interval.value months'') FROM status LEFT OUTER JOIN organization ON status.id_organization=organization.id LEFT OUTER JOIN to_interval ON card.id_to_interval=to_interval.id WHERE organization.id_name_status=1 AND status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1');
Скажите, в чем моя ошибка использования этих функций?

Post's attachments

Attachment icon test.rar 295.57 kb, 237 downloads since 2020-07-05 

30 (edited by sibprogsistem 2020-07-05 19:05:24)

Re: Вычисляемое поле

procedure FrmCard_ComboBox1_OnChange (Sender: TObject);
begin
  FrmCard.Edit2.Text:=SQLexecute('SELECT date(date, "+'+ FrmCard.ComboBox1.Text +' month") FROM status WHERE id='+FrmCard.TableGrid1.sqlValue );
end;

если у вас уже есть таблица с датами, то просто при открытии формы можно получить самую большую дату путем выбора последней записи в таблице

   
Также можно с помощью раннего запроса получить номер id  в переменную, а потом вставить ее в условие WHERE id='+ Ваша_переменная );

   вот так склеиваются строки "+'+ FrmCard.ComboBox1.Text +'   первый + - это часть уже написанной строки другие два + склеивают строки со значением в переменной..

Post's attachments

Attachment icon test.7z 5.4 kb, 222 downloads since 2020-07-05 

31 (edited by Inkalika 2020-07-06 07:19:16)

Re: Вычисляемое поле

Спасибо, sibprogsistem! Работает.
Скажите, а как в этом случае показать в таблице на форме FrmCard_Full после названия card, to_interval, полученную дату? Я только знаю способ через вычисляемое поле отобразить нужное мне значение, но с таким текстом как:
(
SELECT date(date, '+ to_interval.value month')
FROM status
LEFT OUTER JOIN organization ON status.id_organization=organization.id
LEFT OUTER JOIN to_interval ON card.id_to_interval=to_interval.id
WHERE organization.id_name_status=1
AND status.id_card=card.id
ORDER BY date DESC LIMIT 1

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

Post's attachments

Attachment icon test (нов).rar 296.58 kb, 246 downloads since 2020-07-06 

Re: Вычисляемое поле

не форме  FrmCard Вы используете кнопку сохранить, просто добавьте поле с новой датой к сохранению...

Post's attachments

Attachment icon test (нов).7z 5.29 kb, 231 downloads since 2020-07-06 

33 (edited by Inkalika 2020-07-06 09:53:03)

Re: Вычисляемое поле

Да, такой вариант тоже возможен, но все же это избыточность данных, потому хотел его на самый последний случай оставить, а использовать вычисляемое поле, но не могу понять, как его правильно оформить, чтобы оно вычитывало значение и не сохраняло в базу при этом отдельным параметром.
В любом случае, большое спасибо Вам!
Попробую пока самостоятельно реализовать еще одну надстройку над этой датой.

34 (edited by Inkalika 2020-07-06 15:27:23)

Re: Вычисляемое поле

А можно как-то вычисленную дату записать не в компонент Edit, а в DateTimePicker? Хотел это реализовать, чтобы при сохранении полученной даты в БД, по ней потом поиск вести через компонент DateTimePicker.

Написал так:
Var
i: string;
begin
i:=SQLexecute(SQLexecute ('SELECT date(date, "+'+ FrmCard.ComboBox1.Text +' month") FROM status WHERE id='+FrmCard.TableGrid1.sqlValue)');
FrmCard.DateTimePicker1.Date:=StrToDate('i');
end;
Пишет, что ошибка в неверном формате даты.

Post's attachments

Attachment icon test (нов).rar 296.47 kb, 229 downloads since 2020-07-06 

Re: Вычисляемое поле

FrmCard.DateTimePicker1.Date:=SQLDateTimeToDateTime(SQLexecute('SELECT date(date, "+'+ FrmCard.ComboBox1.Text +' month") FROM status LEFT OUTER JOIN organization ON status.id_organization=organization.id WHERE organization.id_name_status=1 AND status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1'));
Post's attachments

Attachment icon test (нов).7z 5.62 kb, 234 downloads since 2020-07-06 

36 (edited by Inkalika 2020-07-07 02:56:45)

Re: Вычисляемое поле

Спасибо! Точно, этой функции в списке вариантов не увидел smile

Re: Вычисляемое поле

Решил отобразить в форме Card последний по дате статус прибора (name_status.name). Сделал отображение в Edit2 FrmCard. Но тут задумался - мне же нужно потом по этому параметру осуществлять поиск по приборам Card у кого какой текущий статус и они могут быть разные, а выбираются они из комбобокса, который хранится в таблице name_status. Вывел его на той же форме Комбобокс2.

Как мне в таком случае быть, чтобы организовать поиск?
Как я понимаю - 1) попробовать сохранять не в Edit, а в том самом комбобоксе, что отвечает за выбор статусов, но что-то у меня это не сработало с моим запросом.
2) Сохранять в Edit, но потом как-то в поиске придумать комбобокс и к нему как-то привязать компонент Edit - тоже не знаю как
3) Искать по компоненту Edit, заполняя вручную статусы, без возможности выбора. Могу, но как-то это будет смотреться криво.
Идеально конечно был бы первый вариант, но как его реализовать я не знаю. Прошу помощи в этом.

Post's attachments

Attachment icon Пример.rar 295.39 kb, 239 downloads since 2020-07-08 

38 (edited by sibprogsistem 2020-07-08 15:30:06)

Re: Вычисляемое поле

скорее всего вы не правильно  устанавливаете связь между (card - name_status)..
потому как данная таблица формируется с других связей где card - name_status не учитывается..
 
изменил связь - попробуйте (может так?)

Post's attachments

Attachment icon Пример.7z 4.8 kb, 236 downloads since 2020-07-08 

39 (edited by Inkalika 2020-07-08 15:48:30)

Re: Вычисляемое поле

А что именно вы поменяли? Вроде отличие только в закомментированной части скрипта, но она не сработала после разкомментирования.

Да, создается сама связь в другом месте, а в этой форме я хотел лишь отобразить выбор с другой формы.

Re: Вычисляемое поле

Inkalika wrote:

А что именно вы поменяли? Вроде отличие только в закомментированной части скрипта, но она не сработала после разкомментирования.

Да, создается сама связь в другом месте, а в этой форме я хотел лишь отобразить выбор с другой формы.

изменил связь в самом comboBox     
organization - name_status

41 (edited by Inkalika 2020-07-08 16:32:33)

Re: Вычисляемое поле

Понял, что вы сделали.
Я имел в виду показывать в поиске не все записи с этим статусом, а лишь тот Card, у которого запись с таким статусом последняя.
Потому я решил создать дополнительный параметр - Текущий статус, по которому уже и фильтровать Card в поиске, но не знаю как присвоить определенный статус комбобоксу, чтобы его потом на форме Card сохранить, а уже на форме Card_Full использовать в качестве комбобокса для поиска.

Post's attachments

Attachment icon Пример.rar 295.63 kb, 230 downloads since 2020-07-08 

42 (edited by Inkalika 2020-07-09 09:01:05)

Re: Вычисляемое поле

В прошлом примере была ошибка, потому сделал дубликат комбобокса, значение которого и хотелось бы использовать на форме как текущий статус.

Может просто кто знает как с помощью скрипта выбрать значение из одной сущности и этот выбор отобразить в форме на комбобоксе?

Например. В одной форме я задаю варианты значений Статус (1,2...). А на другой форме я в комбике уже отображаю этот самый выбор из 1,2... по условиям, что прописываю в скрипте.

Post's attachments

Attachment icon Тест.rar 296.4 kb, 224 downloads since 2020-07-09 

Re: Вычисляемое поле

то есть Вы хотите, что бы в ComboBox загрузился список?

44 (edited by Inkalika 2020-07-09 09:52:41)

Re: Вычисляемое поле

Вопрос снят.Решил такой записью: FrmCard.ComboBox2.ItemIndex:=SQLexecute('SELECT name_status.id FROM...
При таком запросе в комбике сразу отображается Текущий статус из вообще всех возможных статусов