Re: Прямой SQL
Добавлено: 06 июл 2012, 15:18
А #double раньше использовали ?
вроде не было такого в константах dsql....
вроде не было такого в константах dsql....
Обсуждение различных вопросов, связанных с сопровождением, администрированием и программированием
https://asu.tyumbit.ru/
Странно, но сегодня чего-то ничего не пишется. Подвисает на этапе update. В log ничего не попадает, причем раньше такого не было, шел рантайм.m0p3e писал(а):Что сейчас пишется в ora90drv?
m0p3e писал(а):Рантайм это следствие ошибки при работе с DSQL. Исправляем ошибку - пропадает рантайм.
В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.savov писал(а):Однако update все же не проходит!
Код: Выделить всё
Interface Check_SQL;
Create View
Var
As Select *
From x$users
;
HandleEvent
cmInit :
{
var stmt, stmt_str : LongInt;
stmt := sqlAllocStmt;
sqlAddStr ( stmt_str, 'Update Persons Set Persons.PassNMB='#39 + 'DSQL'#39 + ' Where Persons.StrTabN='#39 + '4516'#39 );
sqlPrepare ( stmt, stmt_str );
sqlExecute ( stmt );
sqlFreeStr ( stmt_str );
sqlFreeStmt ( stmt );
}; //cmInit
End;
END.
Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!m0p3e писал(а):В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.
Набросал интерфейсик для проверки модификации стандартных таблиц через прямой SQL:
Опс. Про жабу не заметил. Сталкиваться с ней пока не приходилось.savov писал(а):Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
Код: Выделить всё
table struct SellsAggr
(
cAn : array[1..3] of comp,
Sum : double
)
with index
(
SellsAggr01 = cAn[1] + cAn[2] + cAn[3]
);
.....................................................
delete all SellsAggr;
dFrom := dBegDate;
dTo := dEndDate;
cAttrNam_NaprIsp := piExtAttr.AttrID(coKatZak, cAttrNam_NaprIsp_Name);
cAttrNam_KontrVid := piExtAttr.AttrID(coKatOrg, cAttrNam_KontrVid_Name);
if cAttrNam_NaprIsp <> 0 and cAttrNam_KontrVid <> 0
{
SellsAggrFillQuery := SQLQUERY (.
SELECT KatOrg.NRec,
NaprIsp.NaprIsp_vComp,
KontrVid.KontrVid_vComp,
SUM(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
.);
StatPl := 1;
var err : word;
err := sqlSelectInto(SellsAggrFillQuery, tnSellsAggr);
message(err);
Код: Выделить всё
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
SELECT T$KATORG.F$NREC, NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP, SUM( 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 = ? ) )) 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 = ? ) )) KONTRVID ON ( T$KATORG.F$NREC = KONTRVID.KONTRVID_CREC ) WHERE ( ( T$PUTLST.F$DATOBR >= ? ) AND ( T$PUTLST.F$DATOBR <= ? ) AND ( T$PUTLST.F$STATPL = ? ) ) GROUP BY T$KATORG.F$NREC, NAPRISP.NAPRISP_VCOMP, KONTRVID.KONTRVID_VCOMP
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
07002: [Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса
11.07.2012 01:24:43 [GALAXY81#VIKTOR]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
1. бросается что не сделан какой то exec.... т.е Вы задали запрос, не выполнили его, и сразу пытаетесь считать что он возвращает (ну или Вы опустили его в приведенном коде ?)Friendlyman писал(а): Подскажите, пожалуйста, что сделано неправильно?
Функция sqlSelectInto
Назначение
Выполнить запрос в таблицу (например, в таблицу в памяти).
Загрузка полученной выборки в таблицу управляется логической таблицей интерфейса. Поэтому количество полей таблицы, выбранных в логической таблице (т.е. перечисленных в конструкции select ЛТ), и их порядок в ЛТ должны совпадать с количеством полей, выбранных в конструкции select запроса прямого SQL, и их порядком.
Начиная с Атлантиса 5.4.22 выполняется контроль количества полей, перечисленных в ЛТ для загружаемой таблицы и в выборке DSQL. При их несовпадении функция возвращает ошибку tsDirectSQLIfcError.
Корректность порядка и типов выбираемых полей не производится. Т.о. если будет непреодолимая некорректность, то не сработает встроенный в клиенты СУБД конвертор типов данных, и выдастся ошибка, которая и вернется в качестве результата выполнения функции.
Описание
function sqlSelectInto(str_stmt : string; iTable : integer) : integer;
Параметры
str_stmt - текст запроса.
iTable - код таблицы.
Возвращаемое значение
Функция возвращает код ошибки. В т.ч. при несовпадении количества полей в ЛТ и в выборке функция возвращает ошибку tsDirectSQLIfcError.
Версия
Контроль количества полей, перечисленных в ЛТ для загружаемой таблицы и в выборке DSQL, выполняется начиная с Атлантиса 5.4.22.
Начиная с Атлантиса 5.2.07.
да про sqlSelectInto согласен...недосмотрелFriendlyman писал(а):Дока как раз гласит, что sqlSelectInto выполняет запрос в таблицу, так что с п.1. вроде все норм.
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...