Страница 10 из 19
Re: Прямой SQL
Добавлено: 11 июл 2012, 18:39
Friendlyman
Посоветовали сделать так
Код: Выделить всё
table struct SellsAggr
(
cAn1 : comp,
cAn2 : comp,
cAn3 : comp,
SumUslAggr : double
)
with index
(
SellsAggr01 = cAn1 + cAn2 + cAn3
);
................................................................................................
MTClear(#SellsAggr, mfNormal);
dFrom := dBegDate;
dTo := dEndDate;
cAttrNam_NaprIsp := piExtAttr.AttrID(coKatZak, cAttrNam_NaprIsp_Name);
cAttrNam_KontrVid := piExtAttr.AttrID(coKatOrg, cAttrNam_KontrVid_Name);
StatPl := 1;
if cAttrNam_NaprIsp <> 0 and cAttrNam_KontrVid <> 0
{
SQL
SELECT KatOrg.NRec as cAn1,
NaprIsp.NaprIsp_vComp as cAn2,
KontrVid.KontrVid_vComp as cAn3,
SUM(ALL SpZakaz.SumUsl) as SumUslAggr
FROM
PutLst
INNER JOIN KatZak ON KATZAK.CPUTLST = PUTLST.NREC
INNER JOIN KATORG ON KATZAK.CORG = KATORG.NREC
LEFT OUTER JOIN SPZAKAZ ON KATZAK.NREC = SPZAKAZ.CKATZAK
LEFT OUTER JOIN
(SELECT ATTRVAL_NaprIsp.cRec as NaprIsp_cRec, ATTRVAL_NaprIsp.vComp as NaprIsp_vComp
FROM ATTRVAL AS ATTRVAL_NaprIsp
WHERE (ATTRVAL_NaprIsp.CATTRNAM = :cAttrNam_NaprIsp )
) AS NaprIsp ON KatZak.NRec = NaprIsp.NaprIsp_cRec
LEFT OUTER JOIN
(SELECT ATTRVAL_KontrVid.cRec as KontrVid_cRec, ATTRVAL_KontrVid.vComp as KontrVid_vComp
FROM ATTRVAL AS ATTRVAL_KontrVid
WHERE (ATTRVAL_KontrVid.CATTRNAM = :cAttrNam_KontrVid )
) AS KontrVid ON KatOrg.NREC = KontrVid.KontrVid_cRec
WHERE (PUTLST.DATOBR >= :dFrom )
AND (PUTLST.DATOBR <= :dTo )
AND (PUTLST.STATPL = :StatPl )
GROUP BY KatOrg.NRec,
NaprIsp.NaprIsp_vComp,
KontrVid.KontrVid_vComp
INTO SellsAggr byName
;
Так все прокатило. Но пришлось отказаться от полей-массивов во временной таблице типа cAn[1] их компилятор не переварил внутри прямого запроса.
Re: Прямой SQL
Добавлено: 11 июл 2012, 19:04
n0where
Но пришлось отказаться от полей-массивов во временной таблице типа cAn[1] их компилятор не переварил внутри прямого запроса.
может cAn#1# Хотя на MSSQL работает и вариант со скобками. правда я заворачиваю в строку через sqlAddStr
Re: Прямой SQL
Добавлено: 11 июл 2012, 19:33
Friendlyman
n0where писал(а):Но пришлось отказаться от полей-массивов во временной таблице типа cAn[1] их компилятор не переварил внутри прямого запроса.
может cAn#1# Хотя на MSSQL работает и вариант со скобками. правда я заворачиваю в строку через sqlAddStr
1) cAn#1# => Ошибка: Ожидалось : "FROM" ...
2) Похоже эту конструкцию не может обработать не MSSQL, а компилятор Атлантиса.
Re: Прямой SQL
Добавлено: 12 июл 2012, 02:53
Friendlyman
Продолжу рассказ о пути не лишенном трудностей.
Указанный ниже код упорно не формирует значение в поле cAn2, все остальные заполняются верно.
Код: Выделить всё
table struct SellsAggr
(
cAn1 : comp,
cAn2 : comp,
cAn3 : comp,
SumUslAggr : double
)
with index
(
SellsAggr01 = cAn1 + cAn2 + cAn3
);
...............
SQL
SELECT KatOrg.NRec as cAn1,
NaprIsp.NaprIsp_vComp as cAn2,
KontrVid.KontrVid_vComp as cAn3,
SUM(ALL SpZakaz.SumUsl) as SumUslAggr
FROM
PutLst
INNER JOIN KatZak ON KATZAK.CPUTLST = PUTLST.NREC
INNER JOIN KATORG ON KATZAK.CORG = KATORG.NREC
LEFT OUTER JOIN SPZAKAZ ON KATZAK.NREC = SPZAKAZ.CKATZAK
LEFT OUTER JOIN
(SELECT ATTRVAL_NaprIsp.cRec as NaprIsp_cRec, ATTRVAL_NaprIsp.vComp as NaprIsp_vComp
FROM ATTRVAL AS ATTRVAL_NaprIsp
WHERE (ATTRVAL_NaprIsp.CATTRNAM = :cAttrNam_NaprIsp )
) AS NaprIsp ON KatZak.NRec = NaprIsp.NaprIsp_cRec
LEFT OUTER JOIN
(SELECT ATTRVAL_KontrVid.cRec as KontrVid_cRec, ATTRVAL_KontrVid.vComp as KontrVid_vComp
FROM ATTRVAL AS ATTRVAL_KontrVid
WHERE (ATTRVAL_KontrVid.CATTRNAM = :cAttrNam_KontrVid )
) AS KontrVid ON KatOrg.NREC = KontrVid.KontrVid_cRec
WHERE (PUTLST.DATOBR >= :dFrom )
AND (PUTLST.DATOBR <= :dTo )
AND (PUTLST.STATPL = :StatPl )
GROUP BY KatOrg.NRec,
NaprIsp.NaprIsp_vComp,
KontrVid.KontrVid_vComp
INTO SellsAggr ByName
;
Словил в QueryAnalizer следующий запрос.
Код: Выделить всё
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 binary(8),@P2 binary(8),@P3 int,@P4 int,@P5 int',N'SELECT T$KATORG.F$NREC
CAN1, NAPRISP.NAPRISP_VCOMP CAN2, KONTRVID.KONTRVID_VCOMP CAN3, SUM( ALL T$SPZAKAZ.F$SUMUSL ) SUMUSLAGGR FROM
T$PUTLST INNER JOIN T$KATZAK ON ( ( T$KATZAK.F$CPUTLST = T$PUTLST.F$NREC ) ) INNER JOIN T$KATORG ON ( (
T$KATZAK.F$CORG = T$KATORG.F$NREC ) ) LEFT OUTER JOIN T$SPZAKAZ ON ( ( T$KATZAK.F$NREC = T$SPZAKAZ.F$CKATZAK )
) LEFT OUTER JOIN (SELECT ATTRVAL_NAPRISP.F$CREC NAPRISP_CREC, ATTRVAL_NAPRISP.F$VCOMP NAPRISP_VCOMP FROM
T$ATTRVAL ATTRVAL_NAPRISP WHERE ( ( ( ATTRVAL_NAPRISP.F$CATTRNAM = @P1 ) ) )) NAPRISP ON ( ( T$KATZAK.F$NREC =
NAPRISP.NAPRISP_CREC ) ) LEFT OUTER JOIN (SELECT ATTRVAL_KONTRVID.F$CREC KONTRVID_CREC,
ATTRVAL_KONTRVID.F$VCOMP KONTRVID_VCOMP FROM T$ATTRVAL ATTRVAL_KONTRVID WHERE ( ( ( ATTRVAL_KONTRVID.F$CATTRNAM
= @P2 ) ) )) KONTRVID ON ( ( T$KATORG.F$NREC = KONTRVID.KONTRVID_CREC ) ) WHERE ( ( ( T$PUTLST.F$DATOBR >= @P3
) AND ( T$PUTLST.F$DATOBR <= @P4 ) AND ( T$PUTLST.F$STATPL = @P5 ) ) ) GROUP BY T$KATORG.F$NREC,
NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP',0x80010000000000D5,0x80010000000000EB,131860226,131860481,1
select @p1
Слегка модифицировал подставив параметры
Код: Выделить всё
SELECT T$KATORG.F$NREC CAN1, NAPRISP.NAPRISP_VCOMP CAN2,
KONTRVID.KONTRVID_VCOMP CAN3, SUM( ALL T$SPZAKAZ.F$SUMUSL ) SUMUSLAGGR
FROM T$PUTLST
INNER JOIN T$KATZAK ON ( ( T$KATZAK.F$CPUTLST = T$PUTLST.F$NREC ) )
INNER JOIN T$KATORG ON ( ( T$KATZAK.F$CORG = T$KATORG.F$NREC ) )
LEFT OUTER JOIN T$SPZAKAZ ON (( T$KATZAK.F$NREC = T$SPZAKAZ.F$CKATZAK ) )
LEFT OUTER JOIN
(SELECT ATTRVAL_NAPRISP.F$CREC NAPRISP_CREC, ATTRVAL_NAPRISP.F$VCOMP NAPRISP_VCOMP FROM T$ATTRVAL
ATTRVAL_NAPRISP WHERE ( ( ( ATTRVAL_NAPRISP.F$CATTRNAM = 0x80010000000000D5 ) ) )) NAPRISP ON ( ( T$KATZAK.F$NREC = NAPRISP.NAPRISP_CREC ) )
LEFT OUTER JOIN
(SELECT ATTRVAL_KONTRVID.F$CREC KONTRVID_CREC, ATTRVAL_KONTRVID.F$VCOMP KONTRVID_VCOMP FROM T$ATTRVAL ATTRVAL_KONTRVID WHERE ( ( (
ATTRVAL_KONTRVID.F$CATTRNAM = 0x80010000000000EB ) ) )) KONTRVID ON ( ( T$KATORG.F$NREC = KONTRVID.KONTRVID_CREC ) )
WHERE
( ( ( T$PUTLST.F$DATOBR >= 131860226 )
AND ( T$PUTLST.F$DATOBR <= 131860481 )
AND ( T$PUTLST.F$STATPL = 1 ) ) )
GROUP BY T$KATORG.F$NREC, NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP
и получил результат с заполненными всеми полями из числа аналитик cAn1, cAn2, cAn3.
В чем же может быть причина незаполнения cAn2 ?!!
Re: Прямой SQL
Добавлено: 12 июл 2012, 03:36
Den
"Словил в QueryAnalizer следующий запрос...
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 binary(8),@P2 binary(8),@P3 int,@P4 int,@P5 int',N'SELECT T$KATORG.F$NREC
CAN1, NAPRISP.NAPRISP_VCOMP CANX,....
"
CANX ? не описались случайно ? ...а то ByName - связывает по именам полей, а "Остальные поля таблицы, которые оказались не связанными с колонками запроса, при вставке очередной записи инициализируются значениями по умолчанию."
Re: Прямой SQL
Добавлено: 12 июл 2012, 09:53
Friendlyman
Den писал(а):"Словил в QueryAnalizer следующий запрос...
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 binary(8),@P2 binary(8),@P3 int,@P4 int,@P5 int',N'SELECT T$KATORG.F$NREC
CAN1, NAPRISP.NAPRISP_VCOMP CANX,....
"
CANX ? не описались случайно ? ...а то ByName - связывает по именам полей, а "Остальные поля таблицы, которые оказались не связанными с колонками запроса, при вставке очередной записи инициализируются значениями по умолчанию."
Исправил в предыдущем посте.
CANX вместо CAN2 это уже мои эксперименты были.
Т.е. все равно CAN2 в MSSQL формируется а в одноименное поле времянки не грузится.
Re: Прямой SQL
Добавлено: 12 июл 2012, 11:13
Friendlyman
Любопытно, что на другой БД этот же код работает полностью.
Может chkmssql выполнить на первой БД...
Re: Прямой SQL
Добавлено: 12 июл 2012, 11:58
Den
мне кажется дело в данных. Я попробовал прогнать вот так:
Код: Выделить всё
table struct SellsAggr1
(
knrec : comp,
soprnrec : comp,
Sums : double
)
with index
(
SellsAggr01=knrec+soprnrec
);
.....
SQL SELECT Katorg.NRec as knrec,
tkatsopr.nrec as soprnrec,
Sum(Basedoc.summa) as Sums
FROM
Basedoc inner join katorg on basedoc.corg=katorg.nrec
inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc
left join
(
select nrec,cstepdoc from katsopr
) tkatsopr on stepdoc.nrec=tkatsopr.cstepdoc
WHERE (basedoc.ddoc >= :(dFrom) )
AND (basedoc.ddoc <= :(dTo) )
AND (basedoc.viddoc= :(StatPl))
GROUP BY KatOrg.NRec,
tkatsopr.nrec
INTO SellsAggr1 byname;
и вот так :
Код: Выделить всё
table struct SellsAggr1
(
knrec : comp,
soprnrec : comp,
Sums : double
)
with index
(
SellsAggr01=knrec+soprnrec
);
.....
SQL SELECT Katorg.NRec as knrec,
COALESCE(tkatsopr.nrec, #comp(0)) as soprnrec,
Sum(Basedoc.summa) as Sums
FROM
Basedoc inner join katorg on basedoc.corg=katorg.nrec
inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc
left join
(
select nrec,cstepdoc from katsopr
) tkatsopr on stepdoc.nrec=tkatsopr.cstepdoc
WHERE (basedoc.ddoc >= :(dFrom) )
AND (basedoc.ddoc <= :(dTo) )
AND (basedoc.viddoc= :(StatPl))
GROUP BY KatOrg.NRec,
COALESCE(tkatsopr.nrec, #comp(0))
INTO SellsAggr1 byname;
В первом варианте если не нашлось ничего из left join (нет накладных по ДО какому то...), то у меня в поле времянки soprnrec всегда 0-лем заполняется. Во втором, когда разруливаешь это дело COALESCE - все окейно.
У Вас точно ВСЕГДА есть совпадение на узле NAPRISP по левому джойну ?
Re: Прямой SQL
Добавлено: 13 июл 2012, 01:56
Friendlyman
COALESCE - помогло!
Выражаю благодарность, коллега!
Re: Прямой SQL
Добавлено: 17 июл 2012, 12:26
savov
m0p3e писал(а):savov писал(а):Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
Опс. Про жабу не заметил. Сталкиваться с ней пока не приходилось.
Получил ответ из ТП. Проблему зарегистрировали в ПИР. Как теперь решать вопрос, пока они ее там разрулят?
Re: Прямой SQL
Добавлено: 18 июл 2012, 12:11
savov
savov писал(а):Получил ответ из ТП. Проблему зарегистрировали в ПИР. Как теперь решать вопрос, пока они ее там разрулят?
Дело было не в бобине...
После некоторого разбирательства оказалось, что код программы на js в котором идет цикл по записям, полученным при помощи прямого sql, а внутри этого цикла идет другой прямой запрос ( к совершенно другим таблицам) приводит к "зависанию" Галактики.
Если же данные запроса сохранить ( например, в массив), то можно делать другие запросы безболезненно (и insert , и update).
Хотя, на мой взгляд, это все-таки некорректность системы. В другом программном обеспечении вполне можно внутри цикла по записям запроса делать другие запросы, использующие полученную предыдущим запросом информацию.
Re: Прямой SQL
Добавлено: 18 июл 2012, 17:06
savov
Столкнулся с еще одним сюрпризом.
Запрос DSQL из-под js:
Код: Выделить всё
...
sstr4_1="update katbox set katbox.'count'="+AllInPallet+" where katbox.nrec=#comp("+nreckatbox+")";
...
не работает, т.к. имя поля count совпадает со служебным словом.
Пробовал:
Код: Выделить всё
...
sstr4_1='update katbox set katbox."count"='+AllInPallet+' where katbox.nrec=#comp('+nreckatbox+')';
sstr4_1='update katbox set katbox.[count]='+AllInPallet+' where katbox.nrec=#comp('+nreckatbox+')';
sstr4_1='update katbox set katbox.""count""='+AllInPallet+' where katbox.nrec=#comp('+nreckatbox+')';
sstr4_1='update katbox set katbox.`count`='+AllInPallet+' where katbox.nrec=#comp('+nreckatbox+')';
...
Никакой вариант не проходит. Oracle дает ошибку
Как изменить поле, название которого совпадает со служебным словом sql?
Re: Прямой SQL
Добавлено: 20 июл 2012, 11:54
savov
Так что, есть ли еще какие варианты? Может я чего пропустил или не так записал?
Re: Прямой SQL
Добавлено: 20 июл 2012, 11:56
edward_K
а что просто katbox.count не проходит?
Не ну можно еще через dbo явно указать.
Re: Прямой SQL
Добавлено: 20 июл 2012, 11:59
savov
edward_K писал(а):а что просто katbox.count не проходит?
Не ну можно еще через dbo явно указать.
Не проходит. Ругается на count. Если взять любое другое поле, то работает.
Как через dbo? Где такое в js?