Проблема с PanelInputLine

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

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

BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Проблема с PanelInputLine

Сообщение BlazeBio »

Набрасал такой код:

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

alter interface RASHORD;
var fMy_var2,pil1:string;
	katsoprnrec:comp;
	summat:double;
	var aList : array [1..100] of string
create view
(osum)
as select
sporder.rsrprice*sporder.kol,
sporder.*
 from sporder;
create view v2  (osum2) as select sporder.rsrprice*sporder.kol from SpSopr,SpOrder
where ((1==SpSopr.PrMc
	and  katsoprnrec == SpSopr.cSopr
	and  SpSopr.Nrec  == SpOrder.cSpSopr
	and 1==sporder.vidorder));
	 handleevent
		 cmInit:
		 {		inherited :: handleEvent(cmInit);
				katsoprnrec:=katsopr.nrec;
				cfsSetCurrentContainer('RASHORD.EDITORDERS.BRSPORDER');
				var  i: integer;
				for (i:=0;   i<2;   i++)
				{summat:=0;
					v2._loop spsopr
					{
						v2._loop sporder
						{
							summat:=summat+v2.osum2;
						}
					}
				cfsCreateObject('Column','BRSPORDER','osum',FALSE, fMy_var2);
				cfsSetProp('osum','Visible',TRUE);
				if (i =0)
				{
				cfsSetProp('osum','Visible', FALSE );
				}
				else
				{
				cfsSetProp('osum' , 'Visible', TRUE ) ;
				}
				cfsSetProp('osum' , 'Title' , 'Стоимость' ) ;
				cfsSetProp('osum' , 'PrecisionVarName' , 'digitToch2');
				cfsSetProp('osum' , 'PassiveFormat' , '[|-]366`666`666`666`666.88');
				SetPrecisionGroup('digitToch2',2);
				cfsSetProp('osum' , 'MaxLen', 18 );
				cfsSetProp('osum','Protect',true);
				cfsDestroyObject('c_BRSPORDER_SUMPRICE_Стоимость');
				cfsSetCurrentContainer('RASHORD.PROSCINFO');
				cfsCreateObject('PanelInputLine','PROSCINFO','summat',FALSE, pil1);
				cfsSetProp('summat','Origin_X',10);
				cfsSetProp('summat','Origin_Y',30);
				cfsSetProp('summat' , 'MaxLen', 18 );
				cfsSetProp('summat' , 'Size_X',50);
				cfsSetProp('summat' , 'Size_Y',10);
				cfsSetProp('summat' , 'Visible', TRUE );
				cfsSetProp('summat' , 'FieldName', summat);
				}
				message(summat);
				cfsGetPropList('i_PROSCINFO_TORDSTR','Origin_X',aList);
				message(aList[i]);
				cfsDestroyObject('i_PROSCINFO_TORDSTR');
				cfsDestroyObject('i_PROSCINFO_ATTRVALP.VSTRING');
				cfsDestroyObject('i_PROSCINFO_SFLDCOUNTANDSUM');
				rescanpanel(PROSCINFO);
		 }
	 end;
end.
Всё хорошо, только при открытии непосредственно интерфейса вылезают ошибки:
- Нет такой функции, поля или метода: summat.
- Ошибка интерпретации имени поля: summat.
Далее интерфейс как обычно загружается.
Может быть проблема в том, что перекрывается PanelInputLine браузером? Если в этом, то тут я использовал функцию cfsGetPropList.
Но она почему-то не выводит координату по х?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

попробуйте в create view перенести описание
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

При таком view:

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

create view v2  (summat) as select grsum(sporder.rsrprice*sporder.kol) from SpSopr,SpOrder
where ((1==SpSopr.PrMc
	and  katsoprnrec == SpSopr.cSopr
	and  SpSopr.Nrec  == SpOrder.cSpSopr
	and 1==sporder.vidorder));
Ошибка: Не знаю такого атрибута для поля выборки

А при таком:

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

create view v2  (summat) as select sum(sporder.rsrprice*sporder.kol) from SpSopr,SpOrder
where ((1==SpSopr.PrMc
	and  katsoprnrec == SpSopr.cSopr
	and  SpSopr.Nrec  == SpOrder.cSpSopr
	and 1==sporder.vidorder));
Нет такой функции, поля или метода: sum.
Я так понял, что должно проходить grsum, но почему-то не проходит?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

grSum - используется для группировки, например, в _LOOP. Sum используется во вложенных запросах.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Это понятно. Только как сделать,чтобы сумма summat была записана в PanelInputLine и не было такого:
- Нет такой функции, поля или метода: summat.
- Ошибка интерпретации имени поля: summat.
Можно ли тут провести какие-либо манипуляции?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

я вообще то это имел ввиду

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

create view
var summat:double
(osum)
as select 
как вариант можно использовать функцию в as select - там мне больше нравится объявлять указав явно атрибуты поля, а не так как вы - (filedname=summat) , функция которая будет собирать нужно перед create view объявить повторно, указав forward дополнительно. почитайте еще про вложенные запросы - им можно подбить значения, в фейсе правда не юзал, но в сапорте пашет (в dbf только не получалось выводить). Ну еще есть "прямой" - но это не для всех.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Эдвард правильно Вам подсказывает - переменные нужно описывать внутри главн. логической таблицы интерфейсав случае alter
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Вот сделал так через вложенный запрос:

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

alter interface RASHORD;
var fMy_var2,pil1:string;
	katsoprnrec:comp;
	sklorderrec:comp;
	summat:double;
	summAll : integer;
	aList : array [1..1] of integer

create view v1
(osum)
as select
sporder.rsrprice*sporder.kol,
sporder.*
 from sporder;
create view v2 (osum2) as select spsopr.nrec,sporder.nrec from SpSopr,SpOrder,
(select sum(sporder.rsrprice*sporder.kol) (fieldName "summak")  from SpSopr,SpOrder
where ((1==SpSopr.PrMc
	and  katsoprnrec/*281474976821314*/== SpSopr.cSopr
	and  SpSopr.Nrec  == SpOrder.cSpSopr
	and 1==sporder.vidorder)))

where ((1==SpSopr.PrMc
	and  katsoprnrec/*281474976821314*/== SpSopr.cSopr
	and  SpSopr.Nrec  == SpOrder.cSpSopr
	and 1==sporder.vidorder));
	 handleevent
		 cmInit:
		 {		inherited :: handleEvent(cmInit);
				katsoprnrec:=katsopr.nrec;
				sklorderrec:=sklorder.nrec;
				summat:=0;
				summAll:=0;
				cfsSetCurrentContainer('RASHORD.EDITORDERS.BRSPORDER');
				var  i: integer;
				for (i:=0;   i<2;   i++)
				{						cfsCreateObject('Column','BRSPORDER','osum',FALSE, fMy_var2);
				cfsSetProp('osum','Visible',TRUE);
				if (i =0)
				{
				cfsSetProp('osum','Visible', FALSE );
				}
				else
				{
				cfsSetProp('osum' , 'Visible', TRUE ) ;
				}
				cfsSetProp('osum' , 'Title' , 'Стоимость' ) ;
				cfsSetProp('osum' , 'PrecisionVarName' , 'digitToch2');
				cfsSetProp('osum' , 'PassiveFormat' , '[|-]366`666`666`666`666.88');
				SetPrecisionGroup('digitToch2',2);
				cfsSetProp('osum' , 'MaxLen', 18 );
				cfsSetProp('osum','Protect',true);
				cfsDestroyObject('c_BRSPORDER_SUMPRICE_Стоимость');
				cfsSetCurrentContainer('RASHORD.PROSCINFO');
				cfsCreateObject('PanelInputLine','PROSCINFO','summak',FALSE, pil1);
				cfsSetProp('summak','Origin_X',100);
				cfsSetProp('summak','Origin_Y',25);
				//cfsSetProp('summat' , 'MaxLen', 18 );
				cfsSetProp('summak' , 'Size_X',60);
				//cfsSetProp('summat' , 'Size_Y',30);
				cfsSetProp('summak' , 'Visible', TRUE );
				cfsSetProp('summak' , 'Protect', False );
				cfsSetProp('summak' , 'Skip', False );
				}
				cfsSetCurrentContainer('RASHORD.PROSCINFO');
				cfsDestroyObject('i_PROSCINFO_TORDSTR');
				cfsDestroyObject('i_PROSCINFO_ATTRVALP.VSTRING');
				cfsDestroyObject('i_PROSCINFO_SFLDCOUNTANDSUM');
							 rescanpanel(PROSCINFO);
		 }
	 end;
end.
Все равно Галактика ругается, что нет такого поля. Что делать?
Как обратится к агрегатному полю вложенного запроса? (summak, v2.summak не работают).
Не совсем понятно в стандартном описании как работает grsum :-o не могли бы пояснить.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Пробовал через функцию:

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

...
function funcSUM( price : double; kol : double ) : integer; forward;
function funcSUM( price : double; kol : double ) : integer;
  { var	summAll : integer;
	summAll:=price*kol; 
  }
...

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

...
create view v2 (summak) as select funcSUM(sporder.rsrprice,sporder.kol) from SpSopr,SpOrder,
	where ((1==SpSopr.PrMc
		and  katsoprnrec/*281474976821314*/== SpSopr.cSopr
		and  SpSopr.Nrec  == SpOrder.cSpSopr
		and 1==sporder.vidorder));
...
Нет ошибок в Галактике, но выводится нулевое значение в поле summak интерфейса L_SKLAD::Rashord. :???: ?!
Почему в поле summak ничего не забивается?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

зайдите в выбор ДО например в платежках - внизу справа поле долг - там все работает. Часто еще бывает что дублируют имена переменных - но у них ранная видимость, а операции присваивания и чтения работаю по разному и получается что присваиваете глобальной, а выводите локальное значение. logstrtofile вам в помощь.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

А где ДО находится конкретнее?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: Проблема с PanelInputLine

Сообщение BlazeBio »

Неужели никто незнает. Или все уже в отпусках ? :-?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Проблема с PanelInputLine

Сообщение edward_K »

"До" это "документ основание". По вашим кускам кода не сказать что же именно у вас происходит. Сделайте тестовый фейс строк на 30 и если не запашет то код в студию.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Проблема с PanelInputLine

Сообщение edward_K »

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

function funcSUM( price : double; kol : double ) : integer;
  { var   summAll : integer;
   summAll:=price*kol;
  }
вот этот код логики никакой не имеет
1. ошиблись с типом переменной и функции.
2. значение функции не присвоили.
3. я так понял что вам нужно подсумировать значения по дочерней табле - для главной этого не требуется. Да. Желательно чтобы табла по которой делаете суммирование не была в визуальных объектах либо нужно запоминать позицию и в конце ее востанавливать - лучше синоним сделать.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: Проблема с PanelInputLine

Сообщение BlazeBio »

Мне нужно, чтобы в PanelInputLine отображалась сумма по позициям конкретного расходного ордера. И при выборе другого ордера менялась на сумму позиций соответствующего ордера. Как-то так. :razz:
Ответить