Проблема с вложенными запросами в frm

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Проблема с вложенными запросами в frm

Сообщение Hershy »

Добрый день, столкнулся который раз уже с такой проблемой.

В документации приведены примеры вложенных запросов.

Код: Выделить всё

Пример 1. Вложенный запрос включается в список таблиц для выборки.
select * from
  SomeTable1,
  (select Sum(someField) from SomeTable2)
;

Код: Выделить всё

Пример 2. Результирующему полю назначается имя. Теперь к нему можно обращаться из внешней ЛТ или использовать в качестве видимого поля интерфейса.
select someFieldName from
  SomeTable1,
  (select Sum(someField) (fieldName "someFieldName") from SomeTable2)
;

Код: Выделить всё

Пример 3. Вложенному запросу назначается имя.
select SomeSynonym.* from
  SomeTable1,
  (select Sum(someField) from SomeTable2) SomeSynonym
;

Код: Выделить всё

Пример 4. В условии where вложенного запроса используются поля внешней ЛТ. Также возможно использование других доступных величин.
select * from
  SomeTable1,
  (select Sum(someField) from SomeTable2 where ((SomeTable1.id1 == SomeTable2.id2)))
;
При попытке использовать это в следующем коде

Код: Выделить всё

.LinkForm DOGOVOR_CALPLAN_01 Prototype is 'DOGOVOR_CALPLAN'
!Чтобы перекрыть стандартную форму
.NameInList 'График платежей к договору'
.create view dog as
    select * from DOGOVOR, PLATDOG,
        (SELECT COUNT(*)(FieldName 'UNT') FROM PLATDOG WHERE ((DOGOVOR.NREC == PLATDOG.CDOGOVOR)));
.create view dog1 as
    select * from DOGOVOR, PLATDOG,
        (SELECT COUNT(*)(FieldName 'UNT') FROM PLATDOG WHERE ((DOGOVOR.NREC == PLATDOG.CDOGOVOR))) CO;

.begin
    var i : WORD;
    i := 0;
    dog._loop PLATDOG {
        i := dog.UNT;
    }
    var j : WORD;
    j := 0;
    dog1._loop PLATDOG {
        j := dog1.CO.UNT;
    }
end.
.{
.if DOGOVOR_CALPLAN01
.if DOGOVOR_CALPLAN02
.else
.end
.{
.}
.else
.end
.if DOGOVOR_CALPLAN03
.{
.if DOGOVOR_CALPLAN04
.else
.end
.if DOGOVOR_CALPLAN05
.{
.}
.else
.end
.}
.else
.end
.}
.endform
Компилятор сообщает
Ошибка: Нет такой функции, поля или метода : DOG.UNT (стр. 22, поз. 21, ...)
и
Ошибка: Нет такой функции, поля или метода : DOG1.CO.UNT (стр. 20, поз. 25, ...)

Это происходит и в Випере и в Саппорте при компиляции формы, а также при выполнении запроса в Саппорте. Т.е. вообще не работает никак.
Версия Атлантиса 5.4.x

Хотелось бы разъяснить ситуацию и узнать где ошибка, в нашей форме или в документации?
А еще больше, хотелось бы узнать как сделать, чтобы заработали вложенные запросы!
Damir
заказчик
Сообщения: 24
Зарегистрирован: Чт, 10/07/2008 07:43
Имя Фамилия: Дамир Ибатуллин
Откуда: Стерлитамак

Сообщение Damir »

(FieldName 'UNT')
- надо без кавычек:

Код: Выделить всё

(FieldName UNT)
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

Спасибо большое!
Все заработало

Код: Выделить всё

.create view dog1 as 
    select * from DOGOVOR, PLATDOG, 
        (SELECT COUNT(*)(FieldName UNT) FROM PLATDOG WHERE ((DOGOVOR.NREC == PLATDOG.CDOGOVOR))) CO; 

.begin
   i := dog1.CO.UNT;//не выдает ошибок
end.
Ged
топ-софт
Сообщения: 76
Зарегистрирован: Вс, 16/09/2007 10:23
Имя Фамилия: Леонид Поликутин
Откуда: Галактика СПб
Контактная информация:

Сообщение Ged »

Код: Выделить всё

.Form AAA
.Ard
.Create view vL
As Select *
From
 Lschet,
 (SELECT COUNT(*)(FieldName=CountLs) FROM Lschet) CoLs
;
.Begin
 If(vL.GetFirst =tsOk)
  {
    Message(vL.CountLs);
  }
End.
.{Table 'vL'
.Fields
 vL.CountLs
 vL.Lschet.TabN
.EndFields
@@@@@@@@@@@  @@@@@@@@@@@@@@@@@@@@@
.}
.EndForm
Ну или Message(vL.CoLs.CountLs);
Ответить