Прямой SQL

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

А #double раньше использовали ?
вроде не было такого в константах dsql....
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

Убрал Double, ошибка синтаксиса ушла, но рантайм остался!
Ошибки рантайма те же.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

Доброго времени суток!
Уважаемые форумчане, может кто натолкнет на мысль, как бороться с рантаймом (см. предыдыдущий мой пост)?
Похоже Оракл не вомпринимает попытку Галактики изменить таблу. Как обходить?
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

Что сейчас пишется в ora90drv?
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

m0p3e писал(а):Что сейчас пишется в ora90drv?
Странно, но сегодня чего-то ничего не пишется. Подвисает на этапе update. В log ничего не попадает, причем раньше такого не было, шел рантайм.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

Рантайм это следствие ошибки при работе с DSQL. Исправляем ошибку - пропадает рантайм.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

m0p3e писал(а):Рантайм это следствие ошибки при работе с DSQL. Исправляем ошибку - пропадает рантайм.

Однако update все же не проходит!
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

savov писал(а):Однако update все же не проходит!
В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.
Набросал интерфейсик для проверки модификации стандартных таблиц через прямой SQL:

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

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.
работает.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Прямой SQL

Сообщение savov »

m0p3e писал(а):В данной ситуации план действия всегда один. Берем работающий примитив и начинаем его накручивать.
Набросал интерфейсик для проверки модификации стандартных таблиц через прямой SQL:
Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

savov писал(а):Весь фокус в том, что через интерфейс и вип у меня тоже проблем нет!
Проблема update именно при запуске из javascript ! Т.е. те функции, которые описаны в разделе ф-й прямого доступа к базе js.
Опс. Про жабу не заметил. Сталкиваться с ней пока не приходилось.
Friendlyman
Постоянный гость
Сообщения: 74
Зарегистрирован: 23 июн 2007, 23:07
Откуда: ТопСофт, Минск

Re: Прямой SQL

Сообщение Friendlyman »

Использую следующую конструкцию

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

  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);
При исполнении получаю ошибку 311, а в лог-файле ms70drv.log следующее

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

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] Ошибка последовательности функций
Подскажите, пожалуйста, что сделано неправильно?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Friendlyman писал(а): Подскажите, пожалуйста, что сделано неправильно?
1. бросается что не сделан какой то exec.... т.е Вы задали запрос, не выполнили его, и сразу пытаетесь считать что он возвращает (ну или Вы опустили его в приведенном коде ?)
2. Поименованные параметры как то не фурычат в приведенном примере (( ....пока параметры не забиндишь ( или не сделаешь setParam (это если объектный интерфейс использовать )), то все равно огребаешь ошибку 311
Я попробовал упрощенный пример (у меня все равно нет данных под таблицы модулей этих...). Вот так работает с bind (с поименованными параметрами нифига не вышло с использованием sqlquery):

var err : word;
sqlbindparam(stmt,1,dFrom);

err:=sqlExecStmt(stmt, sqlquery(SELECT
KatOrg.NRec,
SUM(SpZakaz.SumUsl)
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

WHERE (PUTLST.DATOBR >=?)
GROUP BY KatOrg.NRec
)
);
message(err);

в месседж получаем 0 и запрос до сервера доходит ок.
Friendlyman
Постоянный гость
Сообщения: 74
Зарегистрирован: 23 июн 2007, 23:07
Откуда: ТопСофт, Минск

Re: Прямой SQL

Сообщение Friendlyman »

Дока как раз гласит, что sqlSelectInto выполняет запрос в таблицу, так что с п.1. вроде все норм.
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...
Функция 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.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Friendlyman писал(а):Дока как раз гласит, что sqlSelectInto выполняет запрос в таблицу, так что с п.1. вроде все норм.
А вот связывание по именам может и правда не работает как надо... Но хотелось именно так сделать, изящно с точки зрения кода...
Может еще какие соображения?
Я вот подумал, может я логическую таблицу в vip неправильно построил...
да про sqlSelectInto согласен...недосмотрел
Со связыванием явно какая то муть. ЛОТ ,судя по всему у Вас нормальный (а то получили бы почти наверняка tsDirectSQLIfcError)
С изящностью соглашусь ..))
Но я посмотрел по прикладным сырцам - практически нигде не используют парни из галактики sqlSelectInto если запрос нужен с параметром. Они его в этом случае готовят(собирают) заранее и потом уже отдают в sqlSelectInto. Наверное это неспроста )
Friendlyman
Постоянный гость
Сообщения: 74
Зарегистрирован: 23 июн 2007, 23:07
Откуда: ТопСофт, Минск

Re: Прямой SQL

Сообщение Friendlyman »

Оказывается есть ПИР 101.48417 Не работает sqlExecDirect, если текст запроса содержит именованные параметры
Ответить