Страница 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
Руслан
В том то и дело, что собираю 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