22.04.2002, 18:49 | #1 |
Moderator
|
Запрос
Абстрактный вопрос с которым я столкнулся и который неожиданной вызвал у меня затруденение.
При удалении одной из строк заказа считать сумму оставшихся строк этого заказа. Я реализовал это так: Дописал delete у SalesLine_ds (то есть того, который содержится в форме следующими строками): st = SalesLine.SalesId; print st; t = (select * from SalesTable where SalesTable.SalesId == SalesLine.SalesId).RecId; print t; n = (select sum(LineAmount) from SalesLine where SalesLine.SalesID== (select * from SalesTable where SalesTable.RecId==t).SalesId).LineAmount; print n; Это работает. Но зачем такая сложность. Неужели нельзя проще ????? Очень хотелось сделать так: n = (select sum(LineAmount) from SalesLine where SalesLine.SalesId==st).LineAmount; Но Аксапта ругается, что в SQL выражениях нельзя осуществлять сравнение со строками. Что это за фигня ? Как нельзя ? И это при том, что почте все ключевые поля наследованы от строк !!!!!!! Может быть кто-нибудь сможет мне объяснить - в чем здесь смысл ???? А выражение n = (select sum(LineAmount) from SalesLine where SalesLine.SalesId==SalesLine.SalesId).LineAmount; естественно считает сумму по всем строкам всех заказов. |
|
22.04.2002, 19:30 | #2 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
22.04.2002, 21:05 | #3 |
Moderator
|
Всем привет!
В дополнение к словам PlasticinE: можно также сравнивать со строковой константой (в данном случае не подходит ) и со строковой переменной с заданным при ее объявлении размером, например: str 100 st; Цитата:
А выражение
n = (select sum(LineAmount) from SalesLine where SalesLine.SalesId==SalesLine.SalesId).LineAmount; естественно считает сумму по всем строкам всех заказов. SalesLine sl; ; select sum(LineAmount) from sl where sl .SalesId==SalesLine.SalesId; print sl.LineAmount; |
|
23.04.2002, 11:30 | #4 |
Moderator
|
Цитата:
PlasticinE
Попробуй сказать ему : SalesId st; Цитата:
Dron AKA andy
А здесь можно использовать переменную типа SalesLine: SalesLine sl; ; select sum(LineAmount) from sl where sl .SalesId==SalesLine.SalesId; print sl.LineAmount; print (select sum(LineAmount) from sl where sl .SalesId==SalesLine.SalesId).LineAmount; А вот это уже не работает !!!!! Курсор становится на sl и говорит, что таблица не существует. Почему ???? |
|
23.04.2002, 12:05 | #5 |
Moderator
|
Я так понял (из опыта), что конструкция вида
variable = (select Table_name).Field_name; т.е. когда сразу пытаешься получить значение поля из select`а, работает только для реальных названий таблиц из репозитария, а для переменных не работает. Соответственно, для переменных пригодна конструкция Table_name t; ; select t; variable = t.Field_name; |
|
24.04.2002, 10:15 | #6 |
Участник
|
Цитата:
Изначально опубликовано Андре
...сравнивать со строками нельзя, а с типами унаследованными от строки можно. Странно, но ладно... строка типа str - это строка неопределенной длины. В базе данных этому типу соответствует тип memo, а не str[xx] |
|