1 (edited by maksim.azizov 2019-11-26 14:05:59)

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

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

SELECT (Items.shprice * BuyerItems.itemcount) FROM BuyerOrder INNER  JOIN BuyerItems,Items ON BuyerItems.id_BuyerOrder = BuyerOrder.id and BuyerItems.id_Items = Items.id WHERE BuyerOrder.id = "ComboBox2") 

если я подставляю вместо ComboBox2 нужное число, все работает

Я понимаю , что концовка неправильная ( запись неправильная),но не могу найти информацию как сделать правильно

Post's attachments

Attachment icon med8.zip 339.57 kb, 286 downloads since 2019-11-26 

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

Здравствуйте.


В вычисляемое поле нельзя подставлять значения от компонентов.

Dmitry.

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

а как мне тогда узнать id нужной записи, что бы подставить значение

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

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

Dmitry.

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

При запуске программы открывается первая форма, на которой один выпадающий список
после выбора нужной записи из списка в таблице появляются имена клиентов, количество заказов и общая цена
при нажатии на любого из них открывается детальный заказ
в этой форме есть поле "к оплате" которое привязано к вычисляемому полю sumOrder таблицы BuyerOrder
там и записано выражение
SELECT sum(Items.shprice * BuyerItems.itemcount) FROM BuyerOrder INNER  JOIN BuyerItems,Items ON BuyerItems.id_BuyerOrder = BuyerOrder.id and BuyerItems.id_Items = Items.id WHERE BuyerOrder.id_Orders = 6 and BuyerOrder.id_Buyers = 1)       

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

BuyerOrder.id_Orders = 6
BuyerOrder.id_Buyers = 1

а мне надо что бы сюда подставлялись значения из формы

6 (edited by Patriot10200 2020-05-09 16:34:36)

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

а возможно, что-бы в Edit связанный с вычисляемым полем, выводились значения калькуляции в момент ввода в другом поле? а еще вычисляемое поле, категорически отказывается работать со знаком ( + )

С уважением.

7 (edited by Inkalika 2020-07-05 11:55:46)

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

Здравствуйте!
Помогите пожалуйста с создание вычисляемых полей.
Есть Карточка прибора (Card...), в нем таблица, в которой фиксируются различные этапы его эксплуатации (Statuses...). В Сущности Status... я указываю какие этапы эксплуатации могут быть в виде справочника. А в Сущности Organization attribute - вид организации.
Например, прибор может быть куплен (статус) у организации-поставщика (вид организации), находиться в эксплуатации у организации-владельца, в ремонте в сервисной организации, списан и т.п.
Задача же стоит в том, чтобы:
1) отобразить для каждого вида статуса (В Эксплуатации, Списан, В ремонте и т.п.) его последнюю дату создания для определенного прибора на форме этого самого прибора
2) отобразить последний по дате/времени создания статус для определенного прибора
3) Зная разницу даты создания определенного вида статуса с текущей датой, указать определенный текстовый индикатор, который также может быть выбран из отдельной сущности или прямо в вычисляемом поле указана интерпретация.

Post's attachments

Attachment icon Безымянный.png 42.59 kb, 110 downloads since 2020-07-05 

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

Еще одна картинка для понимания. Это форма для заполнения Сущности Statuses.

Post's attachments

Attachment icon Статус.png 8.64 kb, 122 downloads since 2020-06-25 

9 (edited by Inkalika 2020-07-03 15:52:30)

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

Нашел ответ на свой первый вопрос, создав запрос для вычисляемого поля, которое работает. Для первого статуса это:
SELECT date_status
FROM statuses_etalon_ks
INNER JOIN name_status_etalon_ks ON name_status_etalon_ks.id = organization_attribute_etalon.id_name_status_etalon_ks
INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND name_status_etalon_ks.id = 1
ORDER BY date_status DESC LIMIT 1

Решил перевести этот запрос в скрипт, но он выдает ошибку при открытии вкладки, на которой отображается Edit13. Не могу понять, что тут в синтаксисе не так. Помогите.
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM statuses_etalon_ks
    INNER JOIN name_status_etalon_ks ON name_status_etalon_ks.id = organization_attribute_etalon.id_name_status_etalon_ks
    INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
    WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND name_status_etalon_ks.id = 1
    ORDER BY date_status DESC LIMIT 1');

Скажите, где можно более подробно прочитать про синтаксис SQLexecute?

10 (edited by CDB 2020-07-04 00:18:47)

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

Maybe this will help:

 assemblyGroup := SQLExecute('SELECT assemblyNo, id_Part_categories FROM subOrdinateParts WHERE subOrdinateParts.id_products = "'+ intToStr(form1.Tablegrid1.dbItemID)+'"  AND "subOrdinateParts"."id_part_categories" = "2"');


With Joins:


 form1.TableGrid2.dbSQL:=('SELECT DISTINCT "products"."LineNumber" as "BSUITE#","productSupplier"."description" as "DESCRIPTION","productSupplier"."supplier_part_number" as "PART CODE","suppliers"."supplierName" as "SUPPLIER","part_categories"."notes" as "CATEGORIES" FROM "subOrdinateParts" LEFT OUTER JOIN "suppliers" ON "subOrdinateParts"."id_suppliers"="suppliers".id LEFT OUTER JOIN "part_categories" ON "subOrdinateParts"."id_part_categories"="part_categories".id LEFT OUTER JOIN "productSupplier" ON "subOrdinateParts"."id_productSupplier"="productSupplier".id LEFT OUTER JOIN "products" ON "subOrdinateParts"."id_products"="products".id WHERE "subOrdinateParts"."assemblyNo"= "'+assemblyGroup+'" AND "part_categories"."notes" != "Master Part"');
On a clear disk you can seek forever

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

Спасибо! Увы, но не помогло. Видимо я не так кавычки располагаю:
Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = 1 ORDER BY "date_status" DESC LIMIT 1');
Ошибка возникает, когда я открываю вкладку с этим полем.

12

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

У вас нет правильных кавычек.


You don't have the quotation marks correct.

See (.......... "2"')


Change /+ Изменить

"name_status_etalon_ks".id = 1 ORDER BY "date_status" DESC LIMIT 1');

To /к

"name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT "1"');
On a clear disk you can seek forever

13 (edited by Inkalika 2020-07-04 15:17:05)

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

Пробовал вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT "1"');  

и вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT "1"');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT 1');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT 1');  

Все равно, не работает.

Ему не нравится запись "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks".
Без нее во всех card_etalon_ks появляется дата одного из них

Post's attachments

Attachment icon Безымянный.png 6.88 kb, 110 downloads since 2020-07-04 

14 (edited by sibprogsistem 2020-07-04 17:59:26)

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

Inkalika wrote:

Пробовал вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT "1"');  

и вот так:

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT "1"');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks".id = "1" ORDER BY "date_status" DESC LIMIT 1');  
FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN "name_status_etalon_ks" ON "name_status_etalon_ks".id = "organization_attribute_etalon"."id_name_status_etalon_ks" INNER JOIN "organization_attribute_etalon" ON "organization_attribute_etalon".id = "statuses_etalon_ks"."id_organization_attribute_etalon" WHERE "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks" AND "name_status_etalon_ks"."id = 1" ORDER BY "date_status" DESC LIMIT 1');  

Все равно, не работает.

Ему не нравится запись "card_etalon_ks".id = "statuses_etalon_ks"."id_card_etalon_ks".
Без нее во всех card_etalon_ks появляется дата одного из них

интересно... Вы пытаетесь объединить 2-е таблицы statuses_etalon_ks - name_status_etalon_ks но в условии их объединения третья таблица organization_attribute_etalon ...
WHERE "card_etalon_ks".id - Вы пытаетесь получить условие где таблица card_etalon_ks, но она в роди как в данном
случае не имеет отношения к запросу..
зачем ковычки " "?
   
можно по подробнее, что Вы пытаетесь сделать?

15 (edited by Inkalika 2020-07-05 10:16:21)

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

sibprogsistem wrote:

интересно... Вы пытаетесь объединить 2-е таблицы statuses_etalon_ks - name_status_etalon_ks но в условии их объединения третья таблица organization_attribute_etalon ...
WHERE "card_etalon_ks".id - Вы пытаетесь получить условие где таблица card_etalon_ks, но она в роди как в данном
случае не имеет отношения к запросу..
зачем ковычки " "?
   
можно по подробнее, что Вы пытаетесь сделать?

Вот здесь я описал, что хочу реализовать и приложил фото куска своей базы http://myvisualdatabase.com/forum/viewt … 82#p37082.
Я хочу на форме, где расположены элементы таблицы Card_etalon отобразить п.1 своего запроса - последнюю дату (хранится в таблице statuses_etalon_ks) статуса (name_status_etalon_ks) с id=1.
Промежуточная таблица organization_attribute_etalon.
Двойные кавычки я использовал из примеры выше, что мне был предложен как вариант решения, но видимо дело не в них.
Вычисляемое поле с таким запросом работает, а вот скрипт нет. Я бы с радостью оставил вычисляемое поле с этим запросом, но оно не обновляется сразу после внесения изменений в таблицу statuses_etalon_ks, где я изменяю дату, а обновляется лишь как только закрываю и открываю вновь форму.

16 (edited by CDB 2020-07-05 09:22:26)

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

Причиной двойных кавычек является то, как MVD представляет все операторы SQL внутри. Это правда, что вам не нужно представлять их при использовании сценария.


Однако предоставленные мною фрагменты кода - это действующие фрагменты кода из моего текущего проекта.


Inilka, было бы полезно, если бы вы могли опубликовать фактический текст ошибки или изображение полученного вами текста ошибки.
Я упустил тот факт, что вы пытаетесь использовать вычисляемое поле.



The reason for double quotes is this is how MVD represents all the SQL statements inside. It is true that you do not need to represent them this way when using the script.


However, the code snippets I provided are valid code snippets from my current project.


Inilka, it would be helpful if you could either post the actual error text or a picture of the error text that you are getting.
I missed the fact that you are trying to use a calculated field.


Using Google translate.

On a clear disk you can seek forever

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

CDB wrote:

Причиной двойных кавычек является то, как MVD представляет все операторы SQL внутри. Это правда, что вам не нужно представлять их при использовании сценария.


Однако предоставленные мною фрагменты кода - это действующие фрагменты кода из моего текущего проекта.


Inilka, было бы полезно, если бы вы могли опубликовать фактический текст ошибки или изображение полученного вами текста ошибки.
Я упустил тот факт, что вы пытаетесь использовать вычисляемое поле.



The reason for double quotes is this is how MVD represents all the SQL statements inside. It is true that you do not need to represent them this way when using the script.


However, the code snippets I provided are valid code snippets from my current project.


Inilka, it would be helpful if you could either post the actual error text or a picture of the error text that you are getting.
I missed the fact that you are trying to use a calculated field.


Using Google translate.

Вот здесь я приложил файл с ошибкой. http://myvisualdatabase.com/forum/viewt … 281#p37281
Вычисляемое поле с этим же запросом SQL такой ошибки не выдает. А скрипт выдает.

18 (edited by sibprogsistem 2020-07-05 12:05:11)

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

В представленном Вами проекте - такие таблицы отсутствуют

 
так же

SELECT sum(Items.shprice * BuyerItems.itemcount) 

и

'SELECT "date_status" FROM "statuses_etalon_ks" INNER JOIN 

совсем разные запросы.

19 (edited by sibprogsistem 2020-07-05 12:41:44)

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

внешний ключ (organization_atalon.id_name_status_etalon) имеет те жи идентификаторы что и name_status_etalon.id
Вы точно знаете что name_status_etalon.id =1
то есть записать можно так  (organization_atalon.id_name_status_etalon=1)
---
Вам нужно вывести последнюю дату (из Вашего же запроса) в компонент Edit..
 
Примерно будет так, без проекта не могу точно написать

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM statuses_etalon_ks LEFT OUTER JOIN organization_attribute_etalon ON statuses_etalon_ks.id_organization_attribute_etalon = organization_attribute_etalon.id WHERE organization_atalon.id_name_status_etalon=1 ORDER BY date_status DESC LIMIT 1);

20 (edited by Inkalika 2020-07-05 13:27:22)

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

sibprogsistem wrote:

внешний ключ (organization_atalon.id_name_status_etalon) имеет те жи идентификаторы что и name_status_etalon.id
Вы точно знаете что name_status_etalon.id =1
то есть записать можно так  (organization_atalon.id_name_status_etalon=1)
---
Вам нужно вывести последнюю дату (из Вашего же запроса) в компонент Edit..
 
Примерно будет так, без проекта не могу точно написать

FrmCard_Etalon_KS.Edit13.Text:=SQLexecute('SELECT date_status FROM statuses_etalon_ks LEFT OUTER JOIN organization_attribute_etalon ON statuses_etalon_ks.id_organization_attribute_etalon = organization_attribute_etalon.id WHERE organization_atalon.id_name_status_etalon=1 ORDER BY date_status DESC LIMIT 1);

Без дополнения после WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks он выдает мне максимальную дату среди всех card_etalon_ks, а мне нужна максимальная дата для конкретной строки таблицы card_etalon_ks, потому добавляется данная строчка, но именно на нее и ругается программа после внесения изменений в таблице statuses_etalon_ks.
В работе вычисляемого поля нет проблем при таком написании, а в скрипте есть.
Видимо от того, что таблица card не связана напрямую с таблицей statuses возникает такая ошибка в скрипте, иначе я не понимаю, что не нравится программе в таком написании.

Вычисляемое поле выглядит сейчас с вашим сокращением вот так:
SELECT date (date_status)
FROM statuses_etalon_ks 
INNER JOIN organization_attribute_etalon ON organization_attribute_etalon.id = statuses_etalon_ks.id_organization_attribute_etalon
WHERE card_etalon_ks.id = statuses_etalon_ks.id_card_etalon_ks AND organization_attribute_etalon.id_name_status_etalon_ks = 1
ORDER BY date_status DESC LIMIT 1

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

Вот не большой аналог...
это должно Вам помочь

Post's attachments

Attachment icon test.7z 3.98 kb, 242 downloads since 2020-07-05 

22 (edited by Inkalika 2020-07-05 14:50:39)

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

Скорректировал ваш проект, добавив еще одну таблицу и пару форм, чтобы стало понятно, чего я хочу добиться.
На форме FrmCard я хотел бы отобразить макс дату статуса с id статуса равной 1. И так для каждой строки таблицы Card, которые отображаю на форме FrmCard_full.

Post's attachments

Attachment icon test.rar 294.9 kb, 239 downloads since 2020-07-05 

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

Добавил условие с таблицей card и появилась ошибка SQL запроса

Post's attachments

Attachment icon test.rar 294.9 kb, 238 downloads since 2020-07-05 

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

ок

Post's attachments

Attachment icon test.7z 4.73 kb, 253 downloads since 2020-07-05 

25 (edited by sibprogsistem 2020-07-05 15:21:24)

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

WHERE card.id=status.id_card
в этом случае у вас будут отображаться записи только равные card.id но они и так ей равны, естественно программа выведет все записи
в таком случае делается подзапрос, но он нужен только если есть какое-то доп условие, а так, как я уже писал можно использовать сам внешний ключ и обращение к самой таблице card не обязательно