Временные таблицы и noob

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Временные таблицы и noob

Сообщение niteo »

Доброго всем времени. Вот есть такой кусочек кода:

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

.LinkForm ’NformRD90a_1_2’ Prototype is ’NformRD90a’
.NameInList ’1234567890’

table struct stmp
(
  nrec : comp       "nrec",
  fio  : string[61] "ФИО"
);

Create view vdb
as select * 
from Stmp;

.Fields
vdb.stmp.fio
.EndFields

.{ NformRD90aCycle CheckEnter
Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO)
.}

if( getFirst stmp = tsOk )
  do
  {
	^
  }
  while getNext stmp = tsOk;
.endform
Вопрос: почему это бесчинство не компилится (ругается так: Нет такой функции, поля или метода : VDB.STMP.FIO (стр.17, поз.1 в .\RTF\FORM_RVD.RTF))? Необходимо-ли писать Create view вообще и для чего он нужен? И где можно достать инфы по временным таблицам? Потому что в справочнике ответов на мои вопросы я не нашел.
P. S. На самом деле, есть подозрение, что тут в Create view надо добавить еще одну, "живую", табличку. Но инфы по этому поводу нету...
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Временные таблицы и noob

Сообщение KATZ »

niteo писал(а):почему это бесчинство не компилится (ругается так: Нет такой функции, поля или метода : VDB.STMP.FIO (стр.17, поз.1 в .\RTF\FORM_RVD.RTF))?
Ваши table struct, create view и прочие программные вставки компилятор воспринимает как статический текст.
niteo писал(а):инфы по этому поводу нету...
Посмотрите FRM-ы, которые идут с "Галактикой", там можно найти массу примеров, они вам даже без чтения документации многое прояснят.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Временные таблицы и noob

Сообщение niteo »

KATZ писал(а):Ваши table struct, create view и прочие программные вставки компилятор воспринимает как статический текст.
Это я понимаю. Не понимаю только одного, как это все работает. Допустим тот же create view, для чего он вообще нужен. Нет я понимаю, если я делаю выборку то использую её. А если она мне не нужна? Или в данном случае, нужна ли мне она? Этого я не нашел...
niteo писал(а):Посмотрите FRM-ы, которые идут с "Галактикой", там можно найти массу примеров, они вам даже без чтения документации многое прояснят.
Так вроде смотрел. Не помогло. Может ткнете меня носом, где я ошибся?
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Временные таблицы и noob

Сообщение KATZ »

niteo писал(а):Допустим тот же create view, для чего он вообще нужен. Нет я понимаю, если я делаю выборку то использую её. А если она мне не нужна? Или в данном случае, нужна ли мне она? Этого я не нашел...
Create view требуется, если в прототипе нет нужного поля в готовом виде. Например, вам надо было бы напечатать не только ФИО, но и дату рождения, которой в прототипе нет, но зато там есть PersNRec. Тогда можно было бы сделать примерно так: определить лог. таблицу

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

.create view MyView as select Persons.BornDate from Persons where ((PersNRec==Persons.NRec));
внутри цикла по людям вставить

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

.begin if (MyView.GetFirst Persons = 0) {} end.
и в списке полей для печати написать MyView.Persons.BornDate. Обратите внимание на точку перед create и на конструкцию .begin-end.

Если в прототипе все нужные поля уже есть, то create view, естественно, не требуется.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Временные таблицы и noob

Сообщение niteo »

Переписал вот так:

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

.LinkForm ’NformRD90a_1_2’ Prototype is ’NformRD90a’
.NameInList ’1234567890’

table struct stmp
(
  nrec : comp       "nrec",
  fio  : string[61] "ФИО"
);
.Fields
  stmp.fio
.EndFields

.{ NformRD90aCycle CheckEnter
Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO)
.}
if( getFirst stmp = tsOk )
  do
  {
	^
  }
  while getNext stmp = tsOk;
.endform
Ругается вот так:
Ошибка: Нет такой функции, поля или метода : STMP.FIO (стр.10, поз.1 в .\RTF\FO
RM_RVD.RTF)
.EndFields
^ [ Enter-продолжить ] : ok.


Почему он не видит поля STMP.FIO этой таблички? Хотя инструкцию Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO) он прожевал..?
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Временные таблицы и noob

Сообщение KATZ »

niteo писал(а):Почему он не видит поля STMP.FIO этой таблички? Хотя инструкцию Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO) он прожевал..?
Еще раз: для компилятора это не табличка и не поле и не инструкция, а статический текст. Чтобы стало по-другому, надо использовать специальный синтаксис. Читайте документацию, смотрите примеры, благо их достаточно.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Временные таблицы и noob

Сообщение niteo »

Да, спасибо за разъяснения, но как я уже писал, в доках я не нашел ничего, что помогло бы мне. Статический он или динамический, это не имеет значения, в любых случаях его обрабатывает транслятор. ИМХО.

Прошу вас, если есть какая либо информация, написать почему ругается компилятор. Или указать на статью или еще куда, где будет необходимая мне информация. Потому что глядя на мной приведенный код, я не вижу в нем ошибок. Понимаю, что где то делаю не так, но не могу понять где... А то, что это статический текст, мне от этого, решения на ум не приходят...
Заранее благодарный
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Временные таблицы и noob

Сообщение m0p3e »

В формах создавать ТП нельзя. Создают их в файле проекта. По крайней мере раньше так было.
В файл проекта:

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

table struct stmp
(
 nrec : comp  
,fio  : string[61]
);
#make 'MyForm.frm'

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

.LinkForm 'NformRD90a_1_2' Prototype is 'NformRD90a'
.NameInList '1234567890'

.create view a1 as select * from stmp;
.Fields
  a1.stmp.fio
.EndFields

.{ NformRD90aCycle CheckEnter
Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO)
.}
.{table 'a1:MAIN'
 ^
.}
.}
.endform
Компиляется.
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Временные таблицы и noob

Сообщение KATZ »

Чтобы не описывать временную таблицу в линкформе, взял из словаря:

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

.linkform 'NformRD90a_1_2' Prototype is 'NformRD90a'
.NameInList '1234567890'
.create view MyView from Persons, TempKol where ((PersNRec==Persons.NRec)) order by TempKol.MC;
.fields
   MyView.TempKol.MC
.endfields
.begin MyView.Delete All NoVisual TempKol; end.
.{ NformRD90aCycle CheckEnter
.begin if (MyView.GetFirst Persons = 0)  MyView.insert TempKol set TempKol.MC:=MyView.Persons.FIO; end.
.}
.{ table 'MyView.TempKol'
  ФИО из временной таблицы: ^
.}
.begin MyView.Delete All NoVisual TempKol; end.
.endform
В качестве демонстрационного примера подойдет, подробности ищите в документации, там они есть.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Временные таблицы и noob

Сообщение Den »

и конструкции insert в фком всегда описывались в begin end
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Временные таблицы и noob

Сообщение m0p3e »

Den писал(а):и конструкции insert в фком всегда описывались в begin end
Den - Зоркий глаз! ;-)
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Временные таблицы и noob

Сообщение niteo »

Взял пример m0p3e. Не скомпилилось.
Вот код проекта:

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

#define ComponentVersion
#component "RVD"
#include DeptIer.vih
#include extattr.vih
#Include odecl.vih
!#include LocalTbl.inc 

table struct stmp
(
  nrec : comp       "nrec",
  fio  : string[61] "ФИО"
);
#make ".\rtf\form_rvd.rtf"
Вот сам файл form_rvd.rtf:

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

.LinkForm ’NformRD90a_1_2’ Prototype is ’NformRD90a’
.NameInList ’1234567890’

Create view a1 as select * from stmp;
.Fields
  a1.stmp.fio
.EndFields

.{ NformRD90aCycle CheckEnter
.begin Insert Stmp (Stmp.nrec, Stmp.fio) values (PERSNREC, FIO) End.
.}
.{table ' vdb.stmp'
	^
.}
.endform
Вот что пишет компилятор:
.\RTF\FORM_RVD.RTF(7)
Ошибка: Нет такой функции, поля или метода : A1.STMP.FIO (стр.7, поз.1 в .\RTF\
FORM_RVD.RTF)
.EndFields
^ [ Enter-продолжить ] : ok.


Вот строка которой собираю:%ApiExePath%\vip.exe form_rvd.prj /R:report_rvd.res /c:vip.cfg
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Временные таблицы и noob

Сообщение m0p3e »

create view должно начинаться с точки:

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

.create view
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Временные таблицы и noob

Сообщение niteo »

m0p3e писал(а):create view должно начинаться с точки:

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

.create view
В этом и была моя ошибка, черт, из-за проклятой точки столько проблем!!! Всё работает. Огромное спсибо!!! :grin:
Ответить