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