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

Как вывести данные из Таблицы в Памяти в LinkForm'е

Добавлено: 11 окт 2006, 11:49
DarkAngel27

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

.LinkForm 'NAME' Prototype is 'Schfrees'
.Create view Tabl
from  SchFact, SpSchf, KatMc, KatParty, KatOtPed
where
        ((
          nSchFact == SchFact.nRec             and
          SchFact.nRec == SpSchf.cSchFact  and
          SpSchf.cMcUsl == KatMc.nRec       and
          SpSchf.cParty == KatParty.nRec    and
          SpSchf.cOtpEd == KatOtPed.nRec
        ))
order external by KatMc.Name, KatParty.Name, SpSchf.Price
;
... // структура прототипа
.{Table tabl
.begin
... // Заполнение Таблицы в Памяти
end.
.}
Как далее можно организовать цикл по Таблице в Памяти и вывести из неё все необходимые данные?

Добавлено: 11 окт 2006, 11:56
dp
абсолютно не понятно какая таблица и в какой памяти имеется в виду...

Добавлено: 11 окт 2006, 11:57
Алексей
во вьюхе надо указать в секции фром имя своей таблицы временной, наприме tTable

.fields
table.tTable.field1
table.tTable.field2
.endfields
.{Table 'tabl.tTable'
^ ^
.}

Добавлено: 11 окт 2006, 14:46
DarkAngel27
Добавил следующее:

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

.Create view tabl_1
from tabl_in_memory
;
... // тело прототипа
.{Table tabl 
.begin 
... // Заполнение Таблицы в Памяти tabl_in_memory
end. 
.} 
.{table 'tabl_1.tabl_in_memory'
.fields
        tabl_1.tabl_in_memory.field1
        tabl_1.tabl_in_memory.field2
 .endfields
^ ^
.}
После компиляции и запуска LinkForm'ы Галактика выдаёт ошибку:
"Внутренняя ошибка - объект не найден в ресурсе" и вылетает по RunTime'у.

Добавлено: 11 окт 2006, 15:03
edward_K
logstrtofile или message вам поможет :(
а вообще хотите ответа выкладывайте всю форму, а не ее фрагменты.

Добавлено: 11 окт 2006, 15:28
DarkAngel27

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

!
! #include table_in_mem.inc (Включено в проектном файле перед данной LinkForm'ой
!
.LinkForm 'SCHFREES_DA' Prototype is 'Schfrees'
.Group 'Бланки счетов-фактур'
.NameInList 'Унифицированная форма'
.p 60
.DEFO LANDSCAPE
.var
    SrcCountry:String;
    GTDNumber:String;
    rNDS:Double;
    rSumNoNDS:Double;
    rAkcis:Double;
    rSaleTax:Double;
    rSumma:Double;
    StrPrim1:String;
    StrPrim2:String;
    plat_No:String;
    plat_Date:String;
    platNo_Date:String;
    EmptyField:String;
    is2004:Boolean;

    mc_name:string[100];
.endvar
.Create view tabl1
from table_in_mem
;
.Create view DA
from  SchFact, SpSchf, KatMc, KatParty, KatOtPed
where
        ((
          nSchFact == SchFact.nRec         and
          SchFact.nRec == SpSchf.cSchFact  and
          SpSchf.cMcUsl == KatMc.nRec      and
          SpSchf.cParty == KatParty.nRec   and
          SpSchf.cOtpEd == KatOtPed.nRec
        ))
order external by KatMc.Name, KatParty.Name, SpSchf.Price
;
.Create  view vSpSchf
from
        SpSchf  ,  KatParty,  SchFact,  BookPrZk
where
        ((
          cSpSchf == SpSchf.nRec and
          SpSchf.cParty == KatParty.nRec
        ));
.Create  view vSchf
from
        SchFact, BookPrZk, SchFact SchFactPlat, SoprHoz, KatParty, SpSopHoz, SpSopr
where
        ((
          nSchFact             == SchFact.nRec and (SchFact.SubTip = 0)
          and SchFact.nRec         == BookPrZk.cSchFact and
          ((BookPrZk.SubTip = 4) or (BookPrZk.SubTip = 20))
          and BookPrZk.cSchFactS   == SchFactPlat.nRec
          and SchFactPlat.cSoprHoz == SoprHoz.nRec

          and SoprHoz.nRec         == SpSopHoz.cSoprHoz
          and SpSopHoz.cSpSopr     == SpSopr.nRec
        ))
;
!
! // ЗДЕСЬ идёт базовая форма (БЕЗ ИЗМЕНЕНИЙ)
!
.{Table da
.begin
        if getfirst da.SpSchf = tsOK then do
           {
            mc_name := replace(da.KatMC.NAME,'&&&',DoubleToStr(Double(da.KatParty.Name),'777.8'));
            if getfirst table_in_mem(byOTCH) where (( mc_name                 == table_in_mem.NAME  and
                                                      da.SpSchf.Price  == table_in_mem and
                                                      da.KatOtPed.Name == table_in_mem.ED
                                                   ))<>tsOK then
               If insert in table_in_mem<>tsOK then
                  {
                   message('Не удалось добавить запись');
                   exit;
                  }
               set table_in_mem.name     := mc_name;
               set table_in_mem.BARKOD := da.KatMC.BarKod;
               set table_in_mem.CMC      := da.SpSchf.cMcUsl;
               If update current table_in_mem<>tsOK then
                 {
                  message('Не удалось модифицировать запись');
                  exit;
                 }
           }while getnext da.SpSchf=tsOK
end.
.}
.{table 'tabl1.table_in_mem'
.fields
        tabl1.table_in_mem.NAME tabl1.table_in_mem.BARKOD
.endfields
^ ^
.} // tabl1
.}
.endform

Добавлено: 11 окт 2006, 16:02
Vek
случайно не забыли в файле проекта таблицу table_in_mem описать?

что-то типа:

table struct table_in_mem (
...
)
with index (
...
)
;

то есть обращение в форме к ней есть, а вдруг ее нету :)

Добавлено: 11 окт 2006, 16:04
edward_K
1. order external by - уберите нафиг, вы ж все равно во времянку грузите.
2.getfirst da.SpSchf - правильней писать da.getfirst SpSchf - в 8 такое и компилятор не скушает.
3.чтобы понять в чем дело(в коде или в select)
вставте мессагу в первую строку формы.
4.insert in table_in_mem тоже не понятно - убирайте
set tabl1.table_in_mem.name := mc_name;
set tabl1.table_in_mem.BARKOD := da.KatMC.BarKod;
set tabl1.table_in_mem.CMC := da.SpSchf.cMcUsl;
If tabl1.insert current table_in_mem<>tsOK then
insert into ??? set здесь не покатит, так есть данные с другой вьюхи(тогда точно такая мессага и будет)

Добавлено: 11 окт 2006, 16:25
DarkAngel27
2. Спасибо за совет.
3. Вставил Message. В итоге ошибка выскачила до появления сообщения.
4. Сделано так исходя из того, что: если такого индекса нету, то мы вставляем запись, а если он есть, то только делаем update строки.

To Vek
Не забыл.

Добавлено: 11 окт 2006, 16:43
DarkAngel27
Если убрать из формы

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

.Create view tabl1 
from table_in_mem 
; 

и

.{table 'tabl1.table_in_mem' 
.fields 
        tabl1.table_in_mem.NAME tabl1.table_in_mem.BARKOD 
.endfields 
^ ^ 
.} // tabl1 
То программа отработает нормально...

Добавлено: 11 окт 2006, 17:56
edward_K
ну попробуйте оставить тока
.Create view tabl1 as select table_in_mem.*
from table_in_mem
;
мне вообще не нравиться table_in_mem - какое то оно не уникальное
может с другим ресом пересеклось?
поменяйте имя таблы.
и
If insert in table_in_mem<>tsOK
все таки неправильная конструкция.

Добавлено: 11 окт 2006, 18:07
DarkAngel27
1. Пробовал, та же ошибка.
2. Имя таблицы менял, та же ошибка (На сколько помню, если в ресурсе таблицы с одним и тем же именем встретятся, то компелятор выдаст ошибку)

Добавлено: 11 окт 2006, 18:37
edward_K
при компиляции ругнется если у вас все ресы подцепляны.
сделайте ард тока с этой view и мессагой и скомпилите в новый рес.
у меня всегда работало - даже на 573.
поробуйте объявить новую таблу с 1,2 полями.

Добавлено: 12 окт 2006, 11:56
DarkAngel27
Поменял имя таблицы в памяти на ASDLKJFHG, после чего форма заработала.
Но появилась новая проблема:

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

.{table 'tabl1.ASDLKJFHG'
.fields
        tabl1.ASDLKJFHG.NAME tabl1.ASDLKJFHG.BARKOD
.endfields
^ ^
.}
Выдаются пустые значения (такое впечатление, что таблица в памяти заполнена пустыми записями), ставил message после update запись в таблице есть и правильная. Но при печати выводятся пустые строки, хотя их количество верное.
Что сделано не так?

Если в .fields выводить ASDLKJFHG.NAME ASDLKJFHG.BARKOD, то выводится последняя запись в таблице.

Добавлено: 13 окт 2006, 11:52
dp
а по моему
.fields
.endfields
должно быть до цикла

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

.fields 
        tabl1.ASDLKJFHG.NAME tabl1.ASDLKJFHG.BARKOD 
.endfields 
.{table 'tabl1.ASDLKJFHG' 
^ ^ 
.}