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

Проблема с PanelInputLine

Добавлено: 02 июн 2010, 11:20
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.
Но она почему-то не выводит координату по х?

Добавлено: 02 июн 2010, 11:26
edward_K
попробуйте в create view перенести описание

Добавлено: 02 июн 2010, 11:43
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, но почему-то не проходит?

Добавлено: 02 июн 2010, 11:50
Vik
grSum - используется для группировки, например, в _LOOP. Sum используется во вложенных запросах.

Добавлено: 02 июн 2010, 12:14
BlazeBio
Это понятно. Только как сделать,чтобы сумма summat была записана в PanelInputLine и не было такого:
- Нет такой функции, поля или метода: summat.
- Ошибка интерпретации имени поля: summat.
Можно ли тут провести какие-либо манипуляции?

Добавлено: 02 июн 2010, 12:41
edward_K
я вообще то это имел ввиду

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

create view
var summat:double
(osum)
as select 
как вариант можно использовать функцию в as select - там мне больше нравится объявлять указав явно атрибуты поля, а не так как вы - (filedname=summat) , функция которая будет собирать нужно перед create view объявить повторно, указав forward дополнительно. почитайте еще про вложенные запросы - им можно подбить значения, в фейсе правда не юзал, но в сапорте пашет (в dbf только не получалось выводить). Ну еще есть "прямой" - но это не для всех.

Добавлено: 02 июн 2010, 13:51
Den
Эдвард правильно Вам подсказывает - переменные нужно описывать внутри главн. логической таблицы интерфейсав случае alter

Добавлено: 04 июн 2010, 11:43
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 не могли бы пояснить.

Добавлено: 04 июн 2010, 13:27
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 ничего не забивается?

Добавлено: 04 июн 2010, 14:12
edward_K
зайдите в выбор ДО например в платежках - внизу справа поле долг - там все работает. Часто еще бывает что дублируют имена переменных - но у них ранная видимость, а операции присваивания и чтения работаю по разному и получается что присваиваете глобальной, а выводите локальное значение. logstrtofile вам в помощь.

Добавлено: 04 июн 2010, 14:15
BlazeBio
А где ДО находится конкретнее?

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

Добавлено: 07 июн 2010, 10:50
BlazeBio
Неужели никто незнает. Или все уже в отпусках ? :-?

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

Добавлено: 07 июн 2010, 11:01
edward_K
"До" это "документ основание". По вашим кускам кода не сказать что же именно у вас происходит. Сделайте тестовый фейс строк на 30 и если не запашет то код в студию.

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

Добавлено: 07 июн 2010, 11:07
edward_K

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

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

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

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