Страница 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 - помогло!
Выражаю благодарность, коллега! :cool:

Re: Прямой SQL

Добавлено: 17 июл 2012, 12:26
savov
m0p3e писал(а):
savov писал(а):Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
Опс. Про жабу не заметил. Сталкиваться с ней пока не приходилось.
Получил ответ из ТП. Проблему зарегистрировали в ПИР. Как теперь решать вопрос, пока они ее там разрулят? :(

Re: Прямой SQL

Добавлено: 18 июл 2012, 12:11
savov
savov писал(а):Получил ответ из ТП. Проблему зарегистрировали в ПИР. Как теперь решать вопрос, пока они ее там разрулят? :(
Дело было не в бобине... :grin:
После некоторого разбирательства оказалось, что код программы на 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 дает ошибку

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

Ошибка(1,25): Ожидался идентификатор 
Как изменить поле, название которого совпадает со служебным словом 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?