Прямой SQL

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

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

n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Прямой SQL

Сообщение n0where »

sildae
Посмотрите пост Vikа там написано как надо править описывать тип comp

А так же почитать
http://www.tyumbit.ru/gal_forum/viewtop ... =2&t=11776
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Расскажите мне, пожалуйста, что я делаю не так.

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

...
.var
...
   henzap_str: LongInt;
...
.endvar
.create view ros as
select *
from iznosperOS
order sort1 by grosnrec, katosnrec, arciznosnrec;
...
.begin
...
   SQLFreeStr(henzap_str);
   SQLAddStr(henzap_str, 'select katos.nrec, katos.innum, katos.datek, gros.nrec,');
   SQLAddStr(henzap_str, 'arciznos.nrec, arciznos.sumizn, arciznos.stoim, arciznos.siznm, arciznos.data, spkatos.srokisp, spkatos.cisp');
   SQLAddStr(henzap_str, 'from katos');
   SQLAddStr(henzap_str, 'inner join gros on katos.cgrup = gros.nrec and ((katos.datv >= #date(1,1,2011) or katos.datv = 0) and #date(31,1,2011) >= katos.datek and 15 = katos.tidk)');
   SQLAddStr(henzap_str, 'inner join spkatos on katos.nrec = spkatos.ckatos and spkatos.cnastros = #comp(3) and');
   SQLAddStr(henzap_str, '(#comp(281474976710657) = spkatos.cisp or #comp(2) = spkatos.cisp or #comp(281474976710665) = spkatos.cisp or');
   SQLAddStr(henzap_str, ' #comp(281474976710673) = spkatos.cisp or #comp(281474976710672) = spkatos.cisp or #comp(281474976710674) = spkatos.cisp or #comp(281474976710675) = spkatos.cisp)');
   SQLAddStr(henzap_str, 'inner join arciznos on arciznos.ckatos = katos.nrec and arciznos.cnastros = #comp(3)');
   SQLAddStr(henzap_str, 'order by gros.nrec, katos.nrec, arciznos.nrec');
   kodosh:=SQLSelectInto(henzap_str, ros.tniznosperOS);
message(kodosh);
   ros.SetOrder(ros.tisort1);
   SQLFreeStr(henzap_str);
end.
.{table 'ros' by ros.iznosperos.grosnrec
.begin
   gr:=ros.iznosperos.grosnrec;
message(gr);
end.
...
Запрос 100%-но рабочий - запускал в Support. Однако первый message выдаёт 30007 (что бы это значило?), а второго нет вообще (т.е., таблица iznosperos не заполнена).
Таблица:

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

table struct local IznosPerOS
(
  katosnrec: comp,
  katosinnum: string,
  katosdatek: date,
  grosnrec: comp,
  arciznosnrec: comp,
  arciznossumizn: double,
  arciznosstoim: double,
  arciznossiznm: double,
  arciznosdata: date,
  spkatossrokisp: double,
  spkatoscisp: comp
)
with index
(
  igros=grosnrec,
  ios=katosnrec,
  iarc=arciznosnrec
);
Последний раз редактировалось RAJAH 11 янв 2012, 11:44, всего редактировалось 1 раз.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

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

Re: Прямой SQL

Сообщение m0p3e »

Какая БД?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

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

Re: Прямой SQL

Сообщение m0p3e »

RAJAH писал(а):MS SQL.
Там вроде тоже лог драйвера есть. По крайней мере в оракле при ошибках 300xx в логе было осмысленное описание ошибки.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Где "там"? ms70drv.log не появляется. Я так понимаю, в него скидываются ошибки в запросе, но запрос синтаксически верен. Почему-то его результат не сбрасывается в таблицу в памяти.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

Если запрос намеренно подпортить? ms70drv.log появляется? Если да, то настолько ли он правильный в неиспорченной части?
Еще можно посмотреть в сторону функции:

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

Назначение
Возвращает код последней ошибки.

Описание
function sqlErrorCode(stmt : longInt) : integer;

Параметры
stmt - хендл запроса (см. sqlAllocStmt).

Возвращаемое значение
Функция возвращает код последней ошибки.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

m0p3e писал(а):Если запрос намеренно подпортить? ms70drv.log появляется?
Да.
m0p3e писал(а):Еще можно посмотреть в сторону функции sqlErrorCode
Не пойдёт: она для хендла, вызванного sqlAllocStmt, а у меня хендл на строки.
m0p3e
А что означает ошибка 30007, если в Oracle есть осмысленное описание?
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Прямой SQL

Сообщение m0p3e »

RAJAH писал(а):
m0p3e писал(а):Если запрос намеренно подпортить? ms70drv.log появляется?
Да.
Т.е. в логе виден передаваемый запрос? Ничего не бросается в глаза?
RAJAH писал(а): Не пойдёт: она для хендла, вызванного sqlAllocStmt, а у меня хендл на строки.
Присмотрелся к коду.

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

kodosh:=SQLSelectInto(henzap_str, ros.tniznosperOS);
1. Не нравится мне как задан второй параметр. Message ( ros.tniznosperOS ); что выдаст?
2. Опять же на Mssql указание приемника into не обязательно. Можно выполнить просто select и фетчить данные. Я это к тому, что можно попробовать упростить задачу и сделать sqlExecStmt. Если будет та же ошибка, то sqlErrorCode. Если же ошибки не возникнет, то проблема в описании принимающей таблицы.
RAJAH писал(а):А что означает ошибка 30007, если в Oracle есть осмысленное описание?
В документации есть только: 30003, 30005, 30006.
Речь не об осмысленности 30007 на оракле. При появлении ее на оракле у меня в логе, кажется, было что-то осмысленное. Давно уже дело было и ручаться на 100% не могу.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Попробовал навскидку Ваш Вариант, из того что привели Вы, несколько упростив сам запрос:

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

.form swswswswff
.ard
.var
   henzap_str: LongInt;
   kodosh : integer ;
   gr : comp ;
.endvar
.create view ros as
select *
from iznosperOS
order sort1 by grosnrec, katosnrec, arciznosnrec;
.fields
  ros.iznosperos.katosinnum
  ros.iznosperos.katosdatek
  ros.iznosperos.grosnrec
.endfields
.begin
   SQLFreeStr(henzap_str);
   SQLAddStr(henzap_str, 'select katos.nrec, katos.innum, katos.datek, gros.nrec,');
   SQLAddStr(henzap_str, 'arciznos.nrec, arciznos.sumizn, arciznos.stoim, arciznos.siznm, arciznos.data, spkatos.srokisp, spkatos.cisp');
   SQLAddStr(henzap_str, 'from katos');
   SQLAddStr(henzap_str, 'inner join gros on katos.cgrup = gros.nrec and ((katos.datv >= #date(1,1,2008) or katos.datv = 0) and #date(31,12,2008) <= katos.datek and 15 = katos.tidk)');
   SQLAddStr(henzap_str, 'inner join spkatos on katos.nrec = spkatos.ckatos and spkatos.cnastros = #comp(3) and spkatos.cisp=#comp(2)');
   SQLAddStr(henzap_str, 'inner join arciznos on arciznos.ckatos = katos.nrec and arciznos.cnastros = #comp(3)');
   SQLAddStr(henzap_str, 'order by gros.nrec, katos.nrec, arciznos.nrec');
   kodosh:=SQLSelectInto(henzap_str, ros.tniznosperOS);
   message(kodosh);
   ros.SetOrder(ros.tisort1);
   SQLFreeStr(henzap_str);
end.
.{table 'ros' by ros.iznosperos.grosnrec
 ^ ^ ^
.}
.endform
У меня все отрабатывает. Т.е. kodosh возвращает 0 ну и сами данные выводятся по условиям поступления основных ср-в заданным.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

m0p3e писал(а):Т.е. в логе виден передаваемый запрос? Ничего не бросается в глаза?
:grin: Бросается - я ж специально ошибку сделал.
m0p3e писал(а):Не нравится мне как задан второй параметр.
Таково требование синтаксиса: <имя_view>.tn<имя_таблицы>
m0p3e писал(а):Можно выполнить просто select и фетчить данные.
Можно, я так и сделал, но это ещё медленнее, чем обычным create view: всё, что я выиграл прямым SQL, и даже больше, тратится на навигацию по запросу.
Den
Да, и у меня так отработало, и даже мой, более сложный запрос, прокатил (код ошибки равен 0). А вот в реальной форме почему-то по-другому. Может, 30007 - это нехватка оперативной памяти? 8)
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Навигация (видимо Вы имеете ввиду то, что внутри конструкции .{table.... ) по отобранному набору данных быстро должна осуществляться вроде как. Хотя, конечно, может у Вас там навороченный алгоритм какой внутри .{table .... Большой набор данных ? У Вас сотни тысяч записей выбирает запрос дскл ? :)
Не знаю даже...пробовали этот же самый алгоритм реализовать на vip а не на фком. Тот же затык наблюдаться будет ?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Den писал(а):Навигация
это вот так:

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

   if (sqlNavigateMT(mt, ffGetFirst, rec) = tsOk)
     do
     {
       ros.insert iznosperos set
         iznosperos.katosnrec:=comp(rec[1]),
         iznosperos.katosinnum:=string(rec[2]),
         iznosperos.katosdatek:=DateSQLtoAtlDate(rec[3]),
         iznosperos.grosnrec:=comp(rec[4]),
         iznosperos.arciznosnrec:=comp(rec[5]),
         iznosperos.arciznossumizn:=double(rec[6]),
         iznosperos.arciznosstoim:=double(rec[7]),
         iznosperos.arciznossiznm:=double(rec[8]),
         iznosperos.arciznosdata:=DateSQLtoAtlDate(rec[9]),
         iznosperos.spkatossrokisp:=double(rec[10]),
         iznosperos.spkatoscisp:=comp(rec[11]);
     }
     while (sqlNavigateMT(mt, ffGetNext, rec) = tsOk);
Den писал(а):У Вас сотни тысяч записей выбирает запрос дскл ?
Да. Порядка 300000-400000.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Ну наман так )
Попробовать может сделать, например ..TOP 1000.., ради инетереса в дскл запросе этом , если дело в кол0ве данных получаемом
Ответить