Страница 6 из 19

Re: Прямой SQL

Добавлено: 15 дек 2011, 08:01
n0where
sildae
Посмотрите пост Vikа там написано как надо править описывать тип comp

А так же почитать
http://www.tyumbit.ru/gal_forum/viewtop ... =2&t=11776

Re: Прямой SQL

Добавлено: 26 дек 2011, 16:01
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
);

Re: Прямой SQL

Добавлено: 10 янв 2012, 14:15
RAJAH
Никто не надумал ничего за праздники?

Re: Прямой SQL

Добавлено: 10 янв 2012, 14:44
m0p3e
Какая БД?

Re: Прямой SQL

Добавлено: 10 янв 2012, 15:12
RAJAH
MS SQL.

Re: Прямой SQL

Добавлено: 10 янв 2012, 15:57
m0p3e
RAJAH писал(а):MS SQL.
Там вроде тоже лог драйвера есть. По крайней мере в оракле при ошибках 300xx в логе было осмысленное описание ошибки.

Re: Прямой SQL

Добавлено: 10 янв 2012, 16:32
RAJAH
Где "там"? ms70drv.log не появляется. Я так понимаю, в него скидываются ошибки в запросе, но запрос синтаксически верен. Почему-то его результат не сбрасывается в таблицу в памяти.

Re: Прямой SQL

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

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

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

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

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

Возвращаемое значение
Функция возвращает код последней ошибки.

Re: Прямой SQL

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

Re: Прямой SQL

Добавлено: 10 янв 2012, 18:43
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% не могу.

Re: Прямой SQL

Добавлено: 11 янв 2012, 01:51
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 ну и сами данные выводятся по условиям поступления основных ср-в заданным.

Re: Прямой SQL

Добавлено: 11 янв 2012, 11:30
RAJAH
m0p3e писал(а):Т.е. в логе виден передаваемый запрос? Ничего не бросается в глаза?
:grin: Бросается - я ж специально ошибку сделал.
m0p3e писал(а):Не нравится мне как задан второй параметр.
Таково требование синтаксиса: <имя_view>.tn<имя_таблицы>
m0p3e писал(а):Можно выполнить просто select и фетчить данные.
Можно, я так и сделал, но это ещё медленнее, чем обычным create view: всё, что я выиграл прямым SQL, и даже больше, тратится на навигацию по запросу.
Den
Да, и у меня так отработало, и даже мой, более сложный запрос, прокатил (код ошибки равен 0). А вот в реальной форме почему-то по-другому. Может, 30007 - это нехватка оперативной памяти? 8)

Re: Прямой SQL

Добавлено: 11 янв 2012, 13:33
Den
Навигация (видимо Вы имеете ввиду то, что внутри конструкции .{table.... ) по отобранному набору данных быстро должна осуществляться вроде как. Хотя, конечно, может у Вас там навороченный алгоритм какой внутри .{table .... Большой набор данных ? У Вас сотни тысяч записей выбирает запрос дскл ? :)
Не знаю даже...пробовали этот же самый алгоритм реализовать на vip а не на фком. Тот же затык наблюдаться будет ?

Re: Прямой SQL

Добавлено: 11 янв 2012, 14:01
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.

Re: Прямой SQL

Добавлено: 11 янв 2012, 15:32
Den
Ну наман так )
Попробовать может сделать, например ..TOP 1000.., ради инетереса в дскл запросе этом , если дело в кол0ве данных получаемом