Логические таблицы

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

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

Ответить
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Логические таблицы

Сообщение 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
...
посмотрите пожалуйста может я что-нибудь неправильно написал, слово пропустил или вообще конструкция не такая...
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение edward_K »

1. Вы совершено забываете о необходимости правильно спозиционироваться на нужную запись - в вашем куске этого не видно.
2. Ко всем полям логических таблиц(включая var ), кроме первой обязательно нужно обращаться с указанием имени этой таблицы (да и в операторе позиционирования _loop getfirst и так далее тоже) - massa.katsopr.nrec , massa.getfirst katsopr, иначе вы обращаетесь к полям таблиц из главной логической таблицы фейса.
3.Всегда смотрите лог компиляции - если у вас будут сообщения что такая то таблица добавлена не в ту логическую таблицу(а будет добавляться в первую), значит вы не так к ней обратились.
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение 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;
}
}
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение edward_K »

и где именно у вас не то вывелось? Какое поле? Научитесь писать свои проблемы точнее, иначе вам не помочь. Надо писать четко строка такая то, поле такое ждал то то, получил то. Не надо писать общих фраз что у вас там чего то не получается. Не пробовали посмотреть что же у вас в полях выводиться? И попадаете ли вы в цикл вообще? что у вас в полях org_nrec , OP? Вставьте вывод этих полей перед циклом и внутри цикла(message или Logstrtofile) - выдает, то что хотите?
Есть ли у вас например debet:=0? Вы можете уже сделать докомпиляцию в 20 строк, а не приводить отрывочные куски, из которых все равно не ясно где ваша ошибка ? 50% информации это где то около 0% от требуемой для понимания вашей ошибки.
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение 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);
	}
...
но ничего не выводит. выводит либо пустое окошко либо окошко вообще не появляется! может я криво объявил??
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение edward_K »

ну хоть что то
должно быть как то так

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

cmbut1:
      {
  Step:=SpStep.Nrec // а чего вы хотели - это главная логич. таблицв
  kor._loop spstep // или if kor.getfirst spstep=0 
   kor._loop katmc
   {
       message(kor.katmc.name);
   }
Вообще по возможности переменные для фильтрации нужно объявлять в самой логической таблице и обращаться к ним уже как kor.Step.
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение 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тыс раз каждое???
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение 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
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение 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 сообщений по пене. а хотелось бы чтобы по одному сообщению на каждый товар. и не зависело какая продукция выбрана, выводилось сообщение по каждой продукции
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение edward_K »

Я не люблю viewtable. Для того, чтобы вывелось вы должны написать
Create view kor as select katmc.name from
других полей этого тоже касается. Можно написать * - но это падение быстродействия.
попробуйте перед сообщением поставить

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

if kor.getfirst katmc=0 {}
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение Espada »

edward_K писал(а):Я не люблю viewtable. Для того, чтобы вывелось вы должны написать
Create view kor as select katmc.name from
других полей этого тоже касается. Можно написать * - но это падение быстродействия.
попробуйте перед сообщением поставить

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

if kor.getfirst katmc=0 {}
сделал вроде так, однако обратно зацикливается. пробовал изменять лок.табл. ничего
вот так получается на данный момент. локальная таблица

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

...
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));
     }
результат тотже
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Логические таблицы

Сообщение edward_K »

Логику нужно слегка понимать - кто же сканирует сначала по дочерним таблицам, а потом по родителям? конечно зациклит
так правильнее
kor._loop Basedoc
kor._loop stepdoc1
kor._loop spstep1
kor._loop katmc
kor._loop katotped
Espada
Местный житель
Сообщения: 336
Зарегистрирован: 07 май 2013, 17:32
Откуда: РБ, Минск

Re: Логические таблицы

Сообщение Espada »

edward_K писал(а):Логику нужно слегка понимать - кто же сканирует сначала по дочерним таблицам, а потом по родителям? конечно зациклит
так правильнее
kor._loop Basedoc
kor._loop stepdoc1
kor._loop spstep1
kor._loop katmc
kor._loop katotped
спасибо за помощь. Всё работает, на данный момент, хорошо. проблема заключалась в строчке

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

if kor.getfirst stepdoc=0 {}
она почему-то зацикливала код. её убрал всё работает.
под каждым красивым павлиньим хвостом, скрывается самая обычная куриная жопа!!! так что меньше пафоса господа!!!
Ответить