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

Временная таблица в alter

Добавлено: 30 окт 2012, 11:27
Руслан
В alter-интерфейсе делаю времянку и заполняю ее через прямой SQL вот таким образом:

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

//'L_SKLAD::F_GETPRIH.BRWPRIH.TBLPRIH.PARTYNAME'
#define ComponentVersion
#component "L_SKLAD"
alter interface F_GETPRIH;
	var
	csp : comp;
	stmt : longint;

		table struct tempkatsopr
			(
				nrec : comp,
				nsopr : string,
				dsopr : date
			);

	create view
	as select *
 	from tempkatsopr, katsopr
	where
	((
		tempkatsopr.nrec == katsopr.nrec
		));

	handleEvent
		cmdefault :
		{
			csp := tblprih.csporder;
			message(csp);
			stmt := sqlAllocStmt;
			//Создаем ВТ
			sqlCreateTmpTable('Table tempkatsopr (nrec : comp, nsopr : string, dsopr : date);', ctmNormal);
		  //Заполняем ВТ
			sqlExecStmt(stmt, 'select KATSOPR.NREC, KATSOPR.NSOPR, katsopr.dsopr from KATSOPR, SPORDER, SKLORDER, KERAMINKATSOPRUSL where SPORDER.NREC = comp(csp) and SPORDER.CSKLORDER = SKLORDER.NREC and SKLORDER.CSOPR = KERAMINKATSOPRUSL.CKATSOPRBILL and KERAMINKATSOPRUSL.CKATSOPRUSL = KATSOPR.NREC');
		  //Читаем ВТ
			sqlFetchInto(stmt, tempkatsopr);
			sqlFreeStmt(stmt);

                 message(tempkatsopr.nsopr);
		_LOOP tempkatsopr //where ((katsopr.nrec == tkatsopr.nrec))
			{
				message('Выбор прихода  ' + tempkatsopr.nsopr);
			}
		}

	end;
end.
Ругается на строчку sqlFetchInto(stmt, tempkatsopr), нет такого поля, имени или метода tempkatsopr... В альтерах нельзя так заполнять временные таблы???

Re: Временная таблица в alter

Добавлено: 30 окт 2012, 11:48
RAJAH
Описание
function sqlFetchInto(stmt : longint; iTable : integer) : integer;
Параметры
stmt - хендл запроса
iTable - код таблицы.
То бишь, tn- надо бы!

Re: Временная таблица в alter

Добавлено: 30 окт 2012, 12:31
Руслан
Это я уже выложил последний вариант, а пробовал я и с tn и без tn. Дело оказалось в том, что в логической таблице надо указывать эту временную таблицу... Без этого ругается....

Re: Временная таблица в alter

Добавлено: 22 окт 2014, 16:46
Руслан
Заполняю временную таблицу в ard-отчете. Select рабочий, возвращает данные. Времянка пустая...

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

stmt := sqlAllocStmt;
			//Создаем ВТ
			sqlDropTmpTable('tnormost');
!		  Message('должна удалиться',0)
!		  sqlDropTmpTable(UpCase ( UserName ) +'.MyData');
!		  Message('а теперь?',0)
			sqlCreateTmpTable('Table tnormost (mcname : string, podrname : string, kolost : double, kolnorm : double);', ctmNormal);
		  //Заполняем ВТ
			sqlExecStmt(stmt,'sql SELECT mc.name mcname, katpodr.name podrname, t1.kol kolost, nzs.kol kolnorm from( select s.cmc, s.cmol,s.cparty,s.cpodr,s.kolp,s.kolr,s.kol, s.srprice,s.dsaldo, max(s.dsaldo) OVER(partition by s.cmc, s.cmol, s.cparty, s.cpodr) as maxdate from saldomc s where s.dsaldo<=#date(31,12,2100) and s.cpodr <> (''0000000000000000h'')) t1 right join NORMZAPASSPEC nzs on t1.cmc = NZS.CMC inner join katmc mc on nzs.cmc = mc.nrec inner join NORMZAPAS nz on NZS.CNORM = NZ.ATL_NREC inner join katpodr on nz.cpodrazd=katpodr.nrec where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0');
	  		  //Читаем ВТ
			sqlFetchInto(stmt, tntnormost);
			sqlFreeStmt(stmt);

Re: Временная таблица в alter

Добавлено: 24 окт 2014, 16:47
Руслан
Неужели никто не пользовался времянками в ard-отчетах. Подскажите, пожалуйста, отчет горит...

Re: Временная таблица в alter

Добавлено: 25 окт 2014, 00:37
edward_K
Вроде недавно писали что DSql не пашет в ард. Ms70drv или что там у вас создается? Может просто косяк в запросе - там будет написано какой. Полезно создавать запрос не прямо а с записью в лог - тогда запрос из лога можно будет выполнить в сапорте добавив в него SQL в начало. Ест. При этом нельзя юзать параметры -вместо них пишите значения прям в запрос используя #comp( вы неправильно написали надо #comp(0) в вашем случае) и #date. А зачем вы пишите SQL в начале запроса? Это надо писать в сапорте - для этих функций не нужно. Да и времянку я как то по другому создавал. Вы можете юзать таблы схемы user - pick tempdesgr но тогда вы будете зависеть от настройки в конфиге где хранить таблицы схемы user в секции database. Хранение их на локале сильно снижает нагрузку на сеть, но тогда их нельзя юзать в DSql. A еще у вас очень длинный запрос - тип string это 255 символов, если больше то надо писать построчно через sqladdstr ( пишу с планшете посему посмотри в vipprog.chm и поищите пример на форуме)

Re: Временная таблица в alter

Добавлено: 27 окт 2014, 11:40
pk
Руслан писал(а):Неужели никто не пользовался времянками в ard-отчетах. Подскажите, пожалуйста, отчет горит...
Пользовался, в таком варианте (в данном случае подошла таблица PARPRICE в качестве временной):

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

! отчет для замены элемента аналитики на другой в проводках, сальдо, шаблонах проводок ТХО
.form 'ARD101109'
.ARD
.Group 'Сервис ТНФ'
.nameinlist 'Замена элемента аналитики на другой в проводках, сальдо, ТХО'
.declare
#include getkau.vih
.enddeclare
.create view t1 from oborot,saldmoun,hozobor,PARPRICE(memory);
.var
 iGetKau: GetKau;    //объектный фейс для выбора аналитики по коду.
 c1,c2:comp;
 w1,w2:word;
 n1:word
.endvar
.fields
 n1
.endfields
.begin
 message('Выберите каталог и ЗАМЕНЯЕМЫЙ элемент',ok);
 if RunInterface('int100923',w1)=cmCancel then ARD101109.fExit
end.
.begin
 c1:=0;
! 5 - одиночный режим выбора без редактирования каталога
 iGetKau.GetCodeKau(5,w1,c1);
 if c1=0 then ARD101109.fExit
end.
.begin
 message('Выберите каталог и ЗАМЕНЯЮЩИЙ элемент',ok);
 if RunInterface('int100923',w2)=cmCancel then ARD101109.fExit
end.
.begin
 c2:=0;
 iGetKau.GetCodeKau(5,w2,c2);
 if c2=0 then ARD101109.fExit
end.
.begin
 n1:=0;
! проводки по ДТ
 t1.delete all PARPRICE;
! конструкция insert into t1 select 1,2,3 from t2 требует присвоения значений
! всему количеству полей таблицы t1 (1,2,3) значениями из таблицы t2 (или нулями)
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[1] and c1==oborot.KAUOS[1]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[1]:=w2,oborot.KAUOS[1]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[2] and c1==oborot.KAUOS[2]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[2]:=w2,oborot.KAUOS[2]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[3] and c1==oborot.KAUOS[3]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[3]:=w2,oborot.KAUOS[3]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[4] and c1==oborot.KAUOS[4]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[4]:=w2,oborot.KAUOS[4]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[5] and c1==oborot.KAUOS[5]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[5]:=w2,oborot.KAUOS[5]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLOS[6] and c1==oborot.KAUOS[6]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLOS[6]:=w2,oborot.KAUOS[6]:=c2;
  inc(n1)};

! проводки по КТ
 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[1] and c1==oborot.KAUkS[1]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[1]:=w2,oborot.KAUkS[1]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[2] and c1==oborot.KAUkS[2]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[2]:=w2,oborot.KAUkS[2]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[3] and c1==oborot.KAUkS[3]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[3]:=w2,oborot.KAUkS[3]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[4] and c1==oborot.KAUkS[4]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[4]:=w2,oborot.KAUkS[4]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[5] and c1==oborot.KAUkS[5]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[5]:=w2,oborot.KAUkS[5]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,oborot.nrec,0 from oborot where((w1==oborot.TBLkS[6] and c1==oborot.KAUkS[6]));
 t1._loop parprice{
  update oborot where((PARPRICE.cPRICEs==oborot.nrec)) set oborot.TBLkS[6]:=w2,oborot.KAUkS[6]:=c2;
  inc(n1)};

! Сальдо
 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[1] and c1==saldmoun.KAUOS[1]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[1]:=w2,saldmoun.KAUOS[1]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[2] and c1==saldmoun.KAUOS[2]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[2]:=w2,saldmoun.KAUOS[2]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[3] and c1==saldmoun.KAUOS[3]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[3]:=w2,saldmoun.KAUOS[3]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[4] and c1==saldmoun.KAUOS[4]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[4]:=w2,saldmoun.KAUOS[4]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[5] and c1==saldmoun.KAUOS[5]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[5]:=w2,saldmoun.KAUOS[5]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,saldmoun.nrec,0 from saldmoun where((w1==saldmoun.TBLOS[6] and c1==saldmoun.KAUOS[6]));
 t1._loop parprice{
  update saldmoun where((PARPRICE.cPRICEs==saldmoun.nrec)) set saldmoun.TBLOS[6]:=w2,saldmoun.KAUOS[6]:=c2;
  inc(n1)};

! Шаблоны проводок ДТ ТХО
 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[1] and c1==hozobor.ckauOS[1]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[1]:=w2,hozobor.ckauOS[1]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[2] and c1==hozobor.ckauOS[2]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[2]:=w2,hozobor.ckauOS[2]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[3] and c1==hozobor.ckauOS[3]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[3]:=w2,hozobor.ckauOS[3]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[4] and c1==hozobor.ckauOS[4]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[4]:=w2,hozobor.ckauOS[4]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[5] and c1==hozobor.ckauOS[5]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[5]:=w2,hozobor.ckauOS[5]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLOS[6] and c1==hozobor.ckauOS[6]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLOS[6]:=w2,hozobor.ckauOS[6]:=c2;
  inc(n1)};
 t1.delete all PARPRICE;

! Шаблоны проводок КТ ТХО
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[1] and c1==hozobor.ckaukS[1]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[1]:=w2,hozobor.ckaukS[1]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[2] and c1==hozobor.ckaukS[2]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[2]:=w2,hozobor.ckaukS[2]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[3] and c1==hozobor.ckaukS[3]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[3]:=w2,hozobor.ckaukS[3]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[4] and c1==hozobor.ckaukS[4]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[4]:=w2,hozobor.ckaukS[4]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[5] and c1==hozobor.ckaukS[5]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[5]:=w2,hozobor.ckaukS[5]:=c2;
  inc(n1)};

 t1.delete all PARPRICE;
 insert into PARPRICE select 0,hozobor.nrec,0 from hozobor where((w1==hozobor.TBLkS[6] and c1==hozobor.ckaukS[6]));
 t1._loop parprice{
  update hozobor where((PARPRICE.cPRICEs==hozobor.nrec)) set hozobor.TBLkS[6]:=w2,hozobor.ckaukS[6]:=c2;
  inc(n1)}
end.
Исправлено записей: ^.
Не забудьте исправить шаблоны ТХО для отражения изменений!
.endform
Позже "insert into" переделал на простой insert в цикле (в 2 раза быстрей работает).

Re: Временная таблица в alter

Добавлено: 31 окт 2014, 16:28
Руслан
Пробую делать вставку в ard-отчете, но ругается на insert (нет такой функции, поля или метода).
Часть кода, вставка:

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

insert into tempdo (crec, sumbuy, sumsell) SELECT mc.nrec, t1.kol, nzs.kol normkol from( select s.cmc, s.cmol,s.cparty,s.cpodr,s.kolp,s.kolr,s.kol, s.srprice,s.dsaldo,
					   max(s.dsaldo) OVER(partition by s.cmc, s.cmol, s.cparty, s.cpodr) as maxdate
					   from saldomc s
					   where s.dsaldo<=#date(31,12,2100) and s.cpodr <> ('0000000000000000h')) t1
					   right join NORMZAPASSPEC nzs on t1.cmc = NZS.CMC inner join katmc mc on nzs.cmc = mc.nrec inner join NORMZAPAS nz on NZS.CNORM = NZ.ATL_NREC inner join katpodr on nz.cpodrazd=katpodr.nrec
					   where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0;

Re: Временная таблица в alter

Добавлено: 31 окт 2014, 17:00
pk
Руслан писал(а):Пробую делать вставку в ard-отчете, но ругается на insert (нет такой функции, поля или метода).
Прогнал компиляцию своего примера только что на гал9 (именно с insert into) - преспокойно прошла. Так что дело в вашем мудрёном запросе.
Не зря прежде упомянул об использовании простого цикла - надёжно и быстрей (на этот раз в кач врем табл использовал DORES):

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

 t1.delete all dores;
 t1._loop oborot where((w1==oborot.TBLOS[1] and c1==oborot.KAUOS[1])) and oborot.CPLANSSCH=c0{
  t1.insert dores set CSPSTEP:=t1.oborot.nrec};
 t1._loop dores{
  update oborot where((CSPSTEP==oborot.nrec)) set oborot.TBLOS[1]:=w2,oborot.KAUOS[1]:=c2;
  inc(n1)};

Re: Временная таблица в alter

Добавлено: 31 окт 2014, 17:04
Руслан
По ходу дело в запросе, потому что обычная вставка работает

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

insert  tempdo set name := 'fdf';
Вопрос как этот вложенный запрос разбросать по циклам?

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

SELECT mc.nrec, t1.kol, nzs.kol normkol from( select s.cmc, s.cmol,s.cparty,s.cpodr,s.kolp,s.kolr,s.kol, s.srprice,s.dsaldo,
					   max(s.dsaldo) OVER(partition by s.cmc, s.cmol, s.cparty, s.cpodr) as maxdate
					   from saldomc s
					   where s.dsaldo<=#date(31,12,2100) and s.cpodr <> ('0000000000000000h')) t1
					   right join NORMZAPASSPEC nzs on t1.cmc = NZS.CMC inner join katmc mc on nzs.cmc = mc.nrec inner join NORMZAPAS nz on NZS.CNORM = NZ.ATL_NREC inner join katpodr on nz.cpodrazd=katpodr.nrec
					   where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0

Re: Временная таблица в alter

Добавлено: 03 ноя 2014, 11:02
Руслан
Ругается на цикл _loop. Может какой ресурс не подключен?

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

		_loop saldomc where (saldomc.dsaldo<=date(31,12,2100) and saldomc.cpodr <> ('0000000000000000h'))
					{
					_loop NORMZAPASSPEC where ((saldomc.cmc == NORMZAPASSPEC.CMC))
					{
					if (getfirst NORMZAPAS where ((NORMZAPASSPEC.CNORM = NORMZAPAS.ATL_NREC)) =tsok)
					{
					insert tempdo set
					tempdo.name:='fsdfsd',
					}
					}
					}

Re: Временная таблица в alter

Добавлено: 04 ноя 2014, 01:07
Den
у Loop в fcom обязательно для указания имя логической таблицы