Страница 1 из 3

Table struct local в интерфейсе и отчёте

Добавлено: 11 апр 2008, 10:30
RAJAH
Здравствуйте все!
Заметил странную особенность - почему-то одна и та же таблица в памяти (table struct local) при её заполнении в фейсе оказывается пустой в отчёте, и наоборот - при заполнении в отчёте, фейс не видит в ней ни одной записи. И таблица, и интерфейс, и отчёт подключаются к одному проекту (include и make). Это у всех так? Таблица же должна быть одна и та же в пределах проекта. У нас Галактика 8.10.53.0, Support 5.3.18.0 на MSSQL.

Добавлено: 11 апр 2008, 11:04
Алексей
таблица описана в проекте?

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

Добавлено: 11 апр 2008, 12:18
RAJAH
Содержание файла проекта:
var
nr1: comp;
#include C:\Forms\TPP\SpecTree.vpp
#include C:\Forms\TPP\SpecTree2.vpp
#include C:\Forms\TPP\SpecTree3.vpp
#make 'C:\Forms\TPP2\TreePS.vip'
#make 'C:\Forms\TPP\Specif.vip'
#make 'c:\Forms\TPP2\PodNorm.slk'

Файл SpecTree2.vpp с таблицей:
table struct local tlist2
(
fnum: longint,
fmc: string,
fnn: string[18],
fin: integer,
fmcnr: comp,
fpar: comp,
ftip: string[150],
fwtip: word,
fkoef: double,
fend: boolean,
fob: string[30],
fchar: string[21],
fnrp: comp,
fizg: string,
fizgk: string[15],
fskl: string,
fsklk: string[15],
fkol: double,
fued: string[15],
foed: string[15],
fotk: double,
fokdp: string[11],
frazm: string[20]
)
with index
(
iipw = fin+fpar+fwtip,
inum = fnum
);

В интерфейсе TreePS.vip происходит insert в tlist2. Специально ставлю message(tlist2.fmc) после каждого insert tlist2 set.... - выдаётся.
А когда в PodNorm.slk делаю цикл по вьюхе create view sost2 * from tlist2 (c помощью .{table ) - ничего нет.

Добавлено: 11 апр 2008, 12:41
Алексей
1. а что за описание переменных в проекте?
2. а в slk при описании логической таблицы на tlist2 ограничений никаких не наложено?
3. попробуйте логическую таблицу в слк

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

 create view sost2 from tlist2(inum); 
т.е. жестко указать индекс...
ну и тэйбл делать как

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

.{Table 'sost2.tlist2'
.}

Добавлено: 11 апр 2008, 12:42
edward_K
mtChangeRefCount посмотрите и на форуме поищите.
весь вопрос - откуда отчет запускается. Если в том же фейсе где и наполняется то должно и так работать.

Добавлено: 11 апр 2008, 13:07
RAJAH
Для Алексея:
1. а что за описание переменных в проекте?
Глобальная переменная, для проекта.
2. а в slk при описании логической таблицы на tlist2 ограничений никаких не наложено?
Нет, беру всё.
3. попробуйте логическую таблицу в слк
Попробовал так с индексом - всё равно нет записей.
Для edward_k:
В интерфейсе TreePS.vip есть строка RunForm('PodNorm'), после которой следует CloseInterface(0). В том то и дело, что должно, а не работает.

Добавлено: 11 апр 2008, 13:37
Den
Если фейс запускается из формы, то тока поможет :

Процедура mtChangeRefCount

Назначение

Увеличивает /уменьшает счетчик ссылок на экземпляр данных таблицы в памяти. Если счетчик ссылок = 0, то экземпляр освобождается. Система ведет два счетчика ссылок - один для прикладного, другой для системного использования. Таким образом, система не позволяет освободить экземпляр таблицы в памяти до тех пор, пока на нее есть хотя бы одна реальная ссылка.

Описание

function mtChangeRefCount(iTable : integer;
iCount : integer
) : longInt;
Параметры

iTable - номер узла в логической таблице.

iCount - значение, на которое надо увеличить /уменьшить значение счетчика ссылок на экземпляр таблицы в памяти.

Возвращаемое значение

Возвращает новое значение счетчика ссылок.

Добавлено: 11 апр 2008, 14:21
RAJAH
А где её написать?
Пробовал в интерфейсе двумя способами

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

      mtChangeRefCount(#sost2.tlist2, 1);
      RunForm('PodNorm');
      CloseInterface(0);
И так:

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

      RunForm('PodNorm');
      mtChangeRefCount(#sost2.tlist2, 1);
      CloseInterface(0);
Не помогло...

Добавлено: 11 апр 2008, 15:12
Den
Дак прямо в интерсе пеерд вызовом формы..
Только у Вас как то странно mtChangeRefCount(#sost2.tlist2, 1);

tlist2 то вроде название таблицы....

Добавлено: 11 апр 2008, 15:20
edward_K
mtChangeRefCount(sost2.tntlist2, 1); попробуйте. ну и ест.перед runform.
вообще перед run еще раз проверте, что записи есть (цикл сделайте ).

Добавлено: 11 апр 2008, 15:20
RAJAH
Если перед tlist2 не писать имя вьюхи ругается - "нет такой функции, поля или метода #tlist2". Перед RunForm и пишу - не помогает.

Добавлено: 11 апр 2008, 15:34
RAJAH
Непонятно...
При вставке записей много - срабатывает множество message:

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

    sost2.insert tlist2 set
      tlist2.fmc  := probel(sost.tlist.fin)+sost.tlist.fmc,
      tlist2.fnum := j,
      tlist2.fnn  := sost.tlist.fnn,
      tlist2.fmcnr:= sost.tlist.fmcnr,
      tlist2.fin  := sost.tlist.fin,
      tlist2.ftip := sost.tlist.ftip,
      tlist2.fwtip:= sost.tlist.fwtip,
      tlist2.fob  := sost.tlist.fob,
      tlist2.fchar:= sost.tlist.fchar,
      tlist2.fend := sost.tlist.fend,
      tlist2.fnrp := sost.tlist.fnrp,
      tlist2.fizg := sost.tlist.fizg,
      tlist2.fizgk:= sost.tlist.fizgk,
      tlist2.fskl := sost.tlist.fskl,
      tlist2.fsklk:= sost.tlist.fsklk,
      tlist2.fkol := sost.tlist.fkol,
      tlist2.fkoef:= sost.tlist.fkoef,
      tlist2.fued := sost.tlist.fued,
      tlist2.foed := sost.tlist.foed,
      tlist2.fotk := sost.tlist.fotk,
      tlist2.fokdp:= sost.tlist.fokdp,
      tlist2.frazm:= sost.tlist.frazm,
      tlist2.fpar := sost.tlist.fpar;
    j:=j+1;
    message(sost2.tlist2.fmc);
До вызова RunForm - только один message (самый первый):

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

      sost2._loop
      {
        message(sost2.tlist2.fmc);
      }
      mtChangeRefCount(sost2.tntlist2, 100);
      RunForm('TreePodNorm');
      CloseInterface(0);
А в форме - ни одного...

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

.{table 'sost2' by sost2.tlist2.fnum
.begin
   message(sost2.tlist2.fmc);
   dopar:=ispar;
   ispar:=sost2.tlist2.fpar;
   nrc:=ispar;
   obz:=sost2.tlist2.fob;
   wtip:=sost2.tlist2.fwtip;
   razmer:=sost2.tlist2.frazm;
   mcnr:=sost2.tlist2.fmcnr;
   nn:=' '+sost2.tlist2.fnn;
   mc:=sost2.tlist2.fmc;
   ediz:=sost2.tlist2.fued;
   kol:=sost2.tlist2.fkol*sost2.tlist2.fkoef*sost2.tlist2.fotk;
   pdrk:=' '+sost2.tlist2.fizgk;
   sklk:=' '+sost2.tlist2.fsklk;
end.
Как так?!

Добавлено: 11 апр 2008, 15:40
Den
RAJAH писал(а):Если перед tlist2 не писать имя вьюхи ругается - "нет такой функции, поля или метода #tlist2". Перед RunForm и пишу - не помогает.
У Вас в интерфейсе логическая таблица поименованная что ли sost2 ?
Ой да, не заметил..сорри

Добавлено: 11 апр 2008, 15:45
RAJAH
Прошу прощения, во втором случае message также, как и в первом, выводятся в большом количестве, но в форме всё равно нет ни одного.

Добавлено: 11 апр 2008, 15:49
Den
А что возвращает после вставок необходимых в tlist2
Message(Recodsintable(sost2.tntlist2));