Страница 1 из 1
Логические таблицы
Добавлено: 04 июн 2013, 18:12
Espada
Всем доброго времени суток! У меня такая проблемка: в коде создаю логические таблицы, всё компилирует нормально однако вычисления(некоторые значения) вообще непонятно откуда берутся. Есть подозрения, что в программке в этим таблицам вообще не обращаются. Пробовал найти синтаксис как в Vipe правильно создать лок. табл. однако ничего толкового не нашел.
Код: Выделить всё
#component"L_BaseDoc"
alter interface VSCHET;
var
...
Create view massa
from katsopr, spsopr, katmc
where
(( org_nrec == KatSopr.corg
and data <<= katsopr.dsopr
and word (201) == KatSopr.VidSopr (NoIndex)
and katsopr.nrec == spsopr.csopr
and spsopr.nrec == sporder.cspsopr
and sporder.CMC == katmc.nrec
));
Create view Org_attr
from katorg,synonym attrnam attrnamD,synonym attrval attrvalD,synonym attrnam attrnamK,synonym attrval attrvalK,synonym attrnam attrnamM,synonym attrval attrvalM
where
((
org_nrec == katorg.nrec and
word(1418) == attrnamK.wtable and
'Сальдо исходящее(кредит)' == attrnamK.name and
word(1418) == attrvalK.wtable and
katorg.nrec == attrvalK.crec and
attrnamK.nrec == attrvalK.cattrnam and
word(1418) == attrnamD.wtable and
'Сальдо исходящее(дебет)' == attrnamD.name and
word(1418) == attrvalD.wtable and
katorg.nrec == attrvalD.crec and
attrnamD.nrec == attrvalD.cattrnam and
word(1418) == attrnamM.wtable and
'Отгрузка за период' == attrnamM.name and
word(1418) == attrvalM.wtable and
katorg.nrec == attrvalM.crec and
attrnamM.nrec == attrvalM.cattrnam
));
Create view Saldo from SALDMOUN
where
((
'562' == SALDMOUN.SCHETO and
OP == SALDMOUN.DATESAL and
org_nrec == SALDMOUN.KAUOS[1](noindex)
));
Create view obormot from oborot
where
((
OP <<= oborot.DATob and
'562' == oborot.SCHETO and
org_nrec == oborot.KAUOS[1](noindex)
));
Create view obormotka from oborot
where
((
OP <<= oborot.DATob and
'562' == oborot.SCHETK and
org_nrec == oborot.KAUKS[1](noindex)
));
window wvschet;
handleevent
...
посмотрите пожалуйста может я что-нибудь неправильно написал, слово пропустил или вообще конструкция не такая...
Re: Логические таблицы
Добавлено: 04 июн 2013, 18:35
edward_K
1. Вы совершено забываете о необходимости правильно спозиционироваться на нужную запись - в вашем куске этого не видно.
2. Ко всем полям логических таблиц(включая var ), кроме первой обязательно нужно обращаться с указанием имени этой таблицы (да и в операторе позиционирования _loop getfirst и так далее тоже) - massa.katsopr.nrec , massa.getfirst katsopr, иначе вы обращаетесь к полям таблиц из главной логической таблицы фейса.
3.Всегда смотрите лог компиляции - если у вас будут сообщения что такая то таблица добавлена не в ту логическую таблицу(а будет добавляться в первую), значит вы не так к ней обратились.
Re: Логические таблицы
Добавлено: 04 июн 2013, 18:53
Espada
edward_K писал(а):1. Вы совершено забываете о необходимости правильно спозиционироваться на нужную запись - в вашем куске этого не видно.
2. Ко всем полям логических таблиц(включая var ), кроме первой обязательно нужно обращаться с указанием имени этой таблицы (да и в операторе позиционирования _loop getfirst и так далее тоже) - massa.katsopr.nrec , massa.getfirst katsopr, иначе вы обращаетесь к полям таблиц из главной логической таблицы фейса.
3.Всегда смотрите лог компиляции - если у вас будут сообщения что такая то таблица добавлена не в ту логическую таблицу(а будет добавляться в первую), значит вы не так к ней обратились.
Здесь я обращаюсь к данным таблицам
Код: Выделить всё
Saldo._loop SALDMOUN
{
{
if Saldo.SALDMOUN.VIOB = '1' Then VIDS := 'Дебет';
if Saldo.SALDMOUN.VIOB = '2' Then VIDS := 'Кредит';
}
{
if VIDS = 'Дебет' debet := debet + Saldo.SALDMOUN.SUMS;
if VIDS = 'Кредит' k := k + Saldo.SALDMOUN.SUMS;
}
}
{
saldo_vx := debet - k;
if saldo_vx >= 0 saldo_vxD := saldo_vx;
if saldo_vx <= 0 saldo_vxK := saldo_vx*(-1);
}
obormot._loop oborot
{
{
d_ob := d_ob + obormot.oborot.sumob;
}
}
obormotka._loop oborot
{
{
k_ob := k_ob + obormotka.oborot.sumob;
}
}
{
saldo_ISX := saldo_vxD - saldo_vxK + d_ob - k_ob;
if saldo_ISX > 0
{
saldo_ISXD := saldo_ISX;
saldo_ISXK := 0;
}
if saldo_ISX < 0
{
saldo_ISXD := 0;
saldo_ISXK := saldo_ISX*(-1);
}
if saldo_ISX = 0
{
saldo_ISXD := 0;
saldo_ISXK := 0;
}
weight :=0;
}
massa._loop katmc
{
{
if ( Substr(massa.katmc.KGROUPMC, 1, 2) = '04' and Substr(massa.katmc.KGROUPMC, 1, 4) <> '0410')
weight := weight + massa.sporder.kol;
}
}
Re: Логические таблицы
Добавлено: 04 июн 2013, 19:11
edward_K
и где именно у вас не то вывелось? Какое поле? Научитесь писать свои проблемы точнее, иначе вам не помочь. Надо писать четко строка такая то, поле такое ждал то то, получил то. Не надо писать общих фраз что у вас там чего то не получается. Не пробовали посмотреть что же у вас в полях выводиться? И попадаете ли вы в цикл вообще? что у вас в полях org_nrec , OP? Вставьте вывод этих полей перед циклом и внутри цикла(message или Logstrtofile) - выдает, то что хотите?
Есть ли у вас например debet:=0? Вы можете уже сделать докомпиляцию в 20 строк, а не приводить отрывочные куски, из которых все равно не ясно где ваша ошибка ? 50% информации это где то около 0% от требуемой для понимания вашей ошибки.
Re: Логические таблицы
Добавлено: 06 июн 2013, 13:05
Espada
edward_K писал(а):и где именно у вас не то вывелось? Какое поле? Научитесь писать свои проблемы точнее, иначе вам не помочь. Надо писать четко строка такая то, поле такое ждал то то, получил то. Не надо писать общих фраз что у вас там чего то не получается. Не пробовали посмотреть что же у вас в полях выводиться? И попадаете ли вы в цикл вообще? что у вас в полях org_nrec , OP? Вставьте вывод этих полей перед циклом и внутри цикла(message или Logstrtofile) - выдает, то что хотите?
Есть ли у вас например debet:=0? Вы можете уже сделать докомпиляцию в 20 строк, а не приводить отрывочные куски, из которых все равно не ясно где ваша ошибка ? 50% информации это где то около 0% от требуемой для понимания вашей ошибки.
необходимо кнопке задать определённую функцию. вот создаю логическую таблицу:
Код: Выделить всё
...
Create view kor
from BASEDOC, spstep,STEPDOC, katmc, katotped, statdoc
where
((
Step == spstep.nrec and
spstep.CSTEPDOC == STEPDOC.nrec and
STEPDOC.CBASEDOC == BASEDOC.nrec and
spstep.CMCUSL == katmc.nrec and
katmc.nrec == katotped.cmcusl
));
...
затем пробую обратиться к ней, вывести сообщение с названием:
Код: Выделить всё
...
cmbut1:
{
kor._loop katmc
{
message(kor.katmc.name);
}
...
но ничего не выводит. выводит либо пустое окошко либо окошко вообще не появляется! может я криво объявил??
Re: Логические таблицы
Добавлено: 06 июн 2013, 13:19
edward_K
ну хоть что то
должно быть как то так
Код: Выделить всё
cmbut1:
{
Step:=SpStep.Nrec // а чего вы хотели - это главная логич. таблицв
kor._loop spstep // или if kor.getfirst spstep=0
kor._loop katmc
{
message(kor.katmc.name);
}
Вообще по возможности переменные для фильтрации нужно объявлять в самой логической таблице и обращаться к ним уже как kor.Step.
Re: Логические таблицы
Добавлено: 06 июн 2013, 15:05
Espada
edward_K писал(а):ну хоть что то
должно быть как то так
Код: Выделить всё
cmbut1:
{
Step:=SpStep.Nrec // а чего вы хотели - это главная логич. таблицв
kor._loop spstep // или if kor.getfirst spstep=0
kor._loop katmc
{
message(kor.katmc.name);
}
Вообще по возможности переменные для фильтрации нужно объявлять в самой логической таблице и обращаться к ним уже как kor.Step.
спасибо я примерно так и сделал. только использовал viewtable/
Код: Выделить всё
...
kor._loop viewtable
{
message(katmc.name + '' + string(STEPDOC.CBASEDOC,0,0));
}
...
Всё вроде работает, однако сообщение выводит только 1-й пункт в списке наименований(а их 3). необходимо задать цикл, чтобы сообщения последовательно выводили данные по всем пунктам.
попробовал изменить лок.табл.
Код: Выделить всё
Create view kor from BASEDOC, stepdoc, katmc, katotped, spstep
where
((
b == Basedoc.nrec
STEPDOC.CBASEDOC == basedoc.nrec and
spstep.CSTEPDOC == STEPDOC.nrec and
spstep.CMCUSL == katmc.nrec and
katmc.nrec == katotped.cmcusl
));
и сообщение зациклилось. задал счетчик
Код: Выделить всё
b:=BaseDoc.Nrec
kor._loop viewtable
{
x:=x+1
}
message(x);
показало что перебираются все записи таблицы BaseDoc(в данном случае 30000). Можно ли как нибудь сделать чтобы выводились только необходимые 3 сообщения? а не 30тыс раз каждое???
Re: Логические таблицы
Добавлено: 06 июн 2013, 15:20
edward_K
ну надо еще понимать где с какой стороны задавать условия. в (( )) условия задаются слева, поля таблицы справа - у вас spstep получился без фильтров
и наверняка было предупреждение о повторном ограничении по basedoc.nrec
Надо так
Код: Выделить всё
b == Basedoc.nrec and
basedoc.nrec == STEPDOC.CBASEDOC and
STEPDOC.nrec == spstep.CSTEPDOC and
spstep.CMCUSL == katmc.nrec and
katmc.nrec == katotped.cmcusl
Re: Логические таблицы
Добавлено: 06 июн 2013, 15:56
Espada
edward_K писал(а):ну надо еще понимать где с какой стороны задавать условия. в (( )) условия задаются слева, поля таблицы справа - у вас spstep получился без фильтров
и наверняка было предупреждение о повторном ограничении по basedoc.nrec
Надо так
Код: Выделить всё
b == Basedoc.nrec and
basedoc.nrec == STEPDOC.CBASEDOC and
STEPDOC.nrec == spstep.CSTEPDOC and
spstep.CMCUSL == katmc.nrec and
katmc.nrec == katotped.cmcusl
Спасибо теперь стало по меньше сообщений выскакивать(7). однако информация показана только по выбранной продукции т.е.
если в наименованиях выбрана Эмаль то при нажатии на кнопку подряд идёт 7 сообщений по эмали(и только), если выбрана пена то 7 сообщений по пене. а хотелось бы чтобы по одному сообщению на каждый товар. и не зависело какая продукция выбрана, выводилось сообщение по каждой продукции
Re: Логические таблицы
Добавлено: 06 июн 2013, 16:11
edward_K
Я не люблю viewtable. Для того, чтобы вывелось вы должны написать
Create view kor as select katmc.name from
других полей этого тоже касается. Можно написать * - но это падение быстродействия.
попробуйте перед сообщением поставить
Re: Логические таблицы
Добавлено: 06 июн 2013, 17:50
Espada
edward_K писал(а):Я не люблю viewtable. Для того, чтобы вывелось вы должны написать
Create view kor as select katmc.name from
других полей этого тоже касается. Можно написать * - но это падение быстродействия.
попробуйте перед сообщением поставить
сделал вроде так, однако обратно зацикливается. пробовал изменять лок.табл. ничего
вот так получается на данный момент. локальная таблица
Код: Выделить всё
...
Create view kor as select * from synonym stepdoc stepdoc1, synonym spstep spstep1, basedoc, katmc, katotped
where
((
b == basedoc.nrec and
basedoc.nrec == STEPDOC1.CBASEDOC and
STEPDOC1.nrec == spstep1.CSTEPDOC and
spstep1.CMCUSL == katmc.nrec and
katmc.nrec == katotped.cmcusl
));
...
и непосредственно сам цикл
Код: Выделить всё
cmbut1:
...
{
b:=BaseDoc.Nrec
message(b);
kor._loop viewtable
{
if kor.getfirst stepdoc=0 {}
message(string(kor.stepdoc1.Nrec,0,0));
}
...
делал как вы говорили:
Код: Выделить всё
b:=BaseDoc.Nrec
message(b);
kor._loop Basedoc
kor._loop katmc
kor._loop katotped
kor._loop spstep1
kor._loop stepdoc1
{
//x:=x+1
if kor.getfirst stepdoc=0 {}
message(string(kor.stepdoc1.Nrec,0,0));
}
результат тотже
Re: Логические таблицы
Добавлено: 06 июн 2013, 18:08
edward_K
Логику нужно слегка понимать - кто же сканирует сначала по дочерним таблицам, а потом по родителям? конечно зациклит
так правильнее
kor._loop Basedoc
kor._loop stepdoc1
kor._loop spstep1
kor._loop katmc
kor._loop katotped
Re: Логические таблицы
Добавлено: 06 июн 2013, 18:23
Espada
edward_K писал(а):Логику нужно слегка понимать - кто же сканирует сначала по дочерним таблицам, а потом по родителям? конечно зациклит
так правильнее
kor._loop Basedoc
kor._loop stepdoc1
kor._loop spstep1
kor._loop katmc
kor._loop katotped
спасибо за помощь. Всё работает, на данный момент, хорошо. проблема заключалась в строчке
она почему-то зацикливала код. её убрал всё работает.