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

Re: Остатки мц

Добавлено: 11 сен 2014, 13:27
edward_K
а SQL кто будет вначале писать? без этого вы должны использовать синтаксис атлантиса - там вложенные запросы тоже есть - смотрите в доке. Вам вообще ничего не нужно было менять с SQL , кроме того что написал. Какие то ключи могут не прокатить - все таки там транслятор пашет и может не понять. В этом случае можно написать процедуру в оракле или напишите запрос попроще. В опыте пример был. Я бы нашел максимальную дату по разрезу в подзапросе в where и на эту дату вывел бы - медленно , но верно.

Re: Остатки мц

Добавлено: 11 сен 2014, 15:40
Den
Как то так....там всякие фильтры/джойны на архивные мц/нормы запаса и т.п. и прочие Ваши особенности сами добавите....

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

          SQL SELECT
                    t1.cmc as cmc,
                    katpodr.nrec as cpodr,
                    COALESCE(mol.nrec, #comp(0)) as cmol,
                    COALESCE(party.nrec, #comp(0)) as cparty,
                    t1.kol as kol
              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 inner join katpodr podr on s.cpodr=podr.nrec
                      where s.dsaldo<=#date(31,12,2100) and s.sp=0 //and s.cmc=#comp(0001000000000008h)
                  ) t1
                                inner join katpodr on t1.cpodr=katpodr.nrec
                left join katmol mol on t1.cmol=mol.nrec
                left join katparty party on t1.cparty=party.nrec
                                where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0
               ;


Re: Остатки мц

Добавлено: 11 сен 2014, 17:46
Руслан
А как view писать, с SQL ругается. В support отрабатывает:

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

.create view t1
as SQL SELECT
					   t1.cmc as cmc,
					   t1.name,
					   katpodr.nrec as cpodr,
					   katpodr.name,
					   COALESCE(mol.nrec, #comp(0)) as cmol,
					   COALESCE(party.nrec, #comp(0)) as cparty,
					   t1.kol
				 from(
					   select s.cmc,mc.name, 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 katmc mc, NORMZAPAS nz, NORMZAPASSPEC nzs, saldomc s inner join katpodr podr on s.cpodr=podr.nrec
					   where s.dsaldo<=#date(31,12,2100)
					   and NZ.ATL_NREC = NZS.CNORM
					   and NZS.CMC = s.cmc
					   and s.CPODR = NZ.CPODRAZD
					   and s.cmc = mc.nrec
					   and s.cpodr <> ('0000000000000000h')
					   //and s.sp=0
					  ) t1
								   inner join katpodr on t1.cpodr=katpodr.nrec
				   left join katmol mol on t1.cmol=mol.nrec
				   left join katparty party on t1.cparty=party.nrec
								   where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0;

Re: Остатки мц

Добавлено: 11 сен 2014, 17:58
RAJAH
Руслан писал(а):А как view писать, с SQL ругается.
Не надо путать тёплое с мягким: view - не для прямого SQL! Ищите в vipprogr.chm "Функциональный интерфейс к прямому SQL".

Re: Остатки мц

Добавлено: 11 сен 2014, 18:05
Den
на 2 папочки Выше от "Функциональный интерфейс к прямому SQL". Смотри "Встроенный прямой SQL"
Эта конструкция описывается вне VIEW а прямо в коде обработчика/процедуры...

Re: Остатки мц

Добавлено: 11 сен 2014, 18:12
edward_K
где то здесь видел SQL прямо в коде - но не в view разумеется наверное в insert into.
А так ищем по форуму и в доке sqlAddStr, sqlFetchInto и так далее, получаем пару рантаймов(про это тоже читаем на форуме), бъем себя по башке и в дальнейшем наслаждаемся. При юзании sqlFetchInto следим внимательно за типом и порядком полей во времянке, а также юзаем COALESCE везде где есть возможность не заполнить столбец реальным значением.

Re: Остатки мц

Добавлено: 12 сен 2014, 17:03
Руслан
В ard-отчетах во view разве нельзя обращаться ко временным таблицам? И еще почему-то ругается на sqlFetchInto.

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

.FORM 'Ведомость наличия норм страхового запаса'
.ard
.var
day1,month1,year1:integer;
day2,month2,year2:integer;
BegDate,EndDate:date;
stmt, astmt : longint;
.endvar
.begin
RunDIALOG('C_COMMON::GETINTERVAL',BegDate, EndDate);
day1:=day(BegDate);
month1:=month(BegDate);
year1:=Year(BegDate);
day2:=day(EndDate);
month2:=month(EndDate);
year2:=Year(EndDate);
end.
.var
T_kmc:longint;
T_mc, T_rtnpa, T_khar, T_ed, T_rhar:string;
T_kol:double;
sch , x , xlsi, ks : integer ;
.endvar

	table struct tnormost
		(
			mcname : string, 
			podrname : string, 
			kolost : double, 
			kolnorm : double
		)
	with index (n = mcname);

.create view t1
as SELECT *
from tnormost;


.begin
			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,'select basedoc.nrec, basedoc.ddoc, basedoc.nodoc from basedoc inner join ttndoc on (BaseDoc.Nrec = TTNDOC.CDOC) and ttndoc.wtable=1102 inner join attrval on ttndoc.nrec = attrval.CREC inner join attrnam on attrval.cattrnam = attrnam.nrec and attrnam.nrec = comp(''281474976711117'')');
			sqlExecStmt(stmt,'SELECT t1.name, katpodr.name, t1.kol, t1.normkol from( select s.cmc,mc.name, s.cmol,s.cparty,s.cpodr,s.kolp,s.kolr,s.kol,nzs.kol as normkol, s.srprice,s.dsaldo, max(s.dsaldo) OVER(partition by s.cmc, s.cmol, s.cparty, s.cpodr) as maxdate from katmc mc, NORMZAPAS nz, NORMZAPASSPEC nzs, saldomc s inner join katpodr podr on s.cpodr=podr.nrecwhere s.dsaldo<=#date(31,12,2100) and NZ.ATL_NREC = NZS.CNORM and NZS.CMC = s.cmc and s.CPODR = NZ.CPODRAZD and s.cmc = mc.nrec and s.cpodr <> (''0000000000000000h'')) t1 inner join katpodr on t1.cpodr=katpodr.nrec left join katmol mol on t1.cmol=mol.nrec left join katparty party on t1.cparty=party.nrec where dsaldo = maxdate and (t1.kolp-t1.kolr)<>0;');
		  //Читаем ВТ
!		  sqlExecStmt(stmt,'select F from MyData');
			sqlFetchInto(stmt, tntnormost);
			sqlFreeStmt(stmt);

	 T_kmc:=Tblinitnew(12,1);
	 T_mc:=Tblnewfield(T_kmc,12);
     Tblendkey(t_Kmc);
	 T_rtnpa:=Tblnewfield(T_kmc,12);
     T_khar:=Tblnewfield(T_kmc,12);
     T_ed:=Tblnewfield(T_kmc,12);
     T_kol:=Tblnewfield(T_kmc,12);
     T_rhar:=Tblnewfield(T_kmc,12);

	 TblSetDuplicate(T_kmc,true);
	 TblClearbuffer(T_kmc);
 end.

Re: Остатки мц

Добавлено: 12 сен 2014, 18:14
Den
Ваш опыт :
http://tyumbit.ru/gal_forum/viewtopic.php?f=2&t=12601
должен был подсказать Вам уже что использование dsql-функциональности в fcom таит черные дыры...
Временные таблицы можно использовать в fcom только если их в проекте собираешь vip.exe

Re: Остатки мц

Добавлено: 15 сен 2014, 14:03
Руслан
Den писал(а):Ваш опыт :
http://tyumbit.ru/gal_forum/viewtopic.php?f=2&t=12601
должен был подсказать Вам уже что использование dsql-функциональности в fcom таит черные дыры...
Временные таблицы можно использовать в fcom только если их в проекте собираешь vip.exe
В том то и дело, что собираю vip.exe и ругается на sqlFetchInto. Когда в интерфейсе была такая проблема, добавляешь во view временную таблицу и все пашет. В ard-отчете если во view добавляешь времянку, ругается, что нет такой таблицы в словаре...

Re: Остатки мц

Добавлено: 15 сен 2014, 15:06
Den
временная таблица д.б. описана на уровне проекта

Re: Остатки мц

Добавлено: 15 сен 2014, 15:57
Руслан
Den писал(а):временная таблица д.б. описана на уровне проекта
Это как? В файле debug? Подробнее объясните...

Re: Остатки мц

Добавлено: 15 сен 2014, 16:11
Den