Прямой SQL
Модераторы: m0p3e, edward_K, Модераторы
Re: Прямой SQL
sildae
Посмотрите пост Vikа там написано как надо править описывать тип comp
А так же почитать
http://www.tyumbit.ru/gal_forum/viewtop ... =2&t=11776
Посмотрите пост Vikа там написано как надо править описывать тип comp
А так же почитать
http://www.tyumbit.ru/gal_forum/viewtop ... =2&t=11776
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Re: Прямой SQL
Расскажите мне, пожалуйста, что я делаю не так.
Запрос 100%-но рабочий - запускал в Support. Однако первый message выдаёт 30007 (что бы это значило?), а второго нет вообще (т.е., таблица iznosperos не заполнена).
Таблица:
Код: Выделить всё
...
.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.
...
Таблица:
Код: Выделить всё
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 раз.
Re: Прямой SQL
Никто не надумал ничего за праздники?
Re: Прямой SQL
Какая БД?
Re: Прямой SQL
MS SQL.
Re: Прямой SQL
Там вроде тоже лог драйвера есть. По крайней мере в оракле при ошибках 300xx в логе было осмысленное описание ошибки.RAJAH писал(а):MS SQL.
Re: Прямой SQL
Где "там"? ms70drv.log не появляется. Я так понимаю, в него скидываются ошибки в запросе, но запрос синтаксически верен. Почему-то его результат не сбрасывается в таблицу в памяти.
Re: Прямой SQL
Если запрос намеренно подпортить? ms70drv.log появляется? Если да, то настолько ли он правильный в неиспорченной части?
Еще можно посмотреть в сторону функции:
Еще можно посмотреть в сторону функции:
Код: Выделить всё
Назначение
Возвращает код последней ошибки.
Описание
function sqlErrorCode(stmt : longInt) : integer;
Параметры
stmt - хендл запроса (см. sqlAllocStmt).
Возвращаемое значение
Функция возвращает код последней ошибки.
Re: Прямой SQL
Да.m0p3e писал(а):Если запрос намеренно подпортить? ms70drv.log появляется?
Не пойдёт: она для хендла, вызванного sqlAllocStmt, а у меня хендл на строки.m0p3e писал(а):Еще можно посмотреть в сторону функции sqlErrorCode
m0p3e
А что означает ошибка 30007, если в Oracle есть осмысленное описание?
Re: Прямой SQL
Т.е. в логе виден передаваемый запрос? Ничего не бросается в глаза?RAJAH писал(а):Да.m0p3e писал(а):Если запрос намеренно подпортить? ms70drv.log появляется?
Присмотрелся к коду.RAJAH писал(а): Не пойдёт: она для хендла, вызванного sqlAllocStmt, а у меня хендл на строки.
Код: Выделить всё
kodosh:=SQLSelectInto(henzap_str, ros.tniznosperOS);
2. Опять же на Mssql указание приемника into не обязательно. Можно выполнить просто select и фетчить данные. Я это к тому, что можно попробовать упростить задачу и сделать sqlExecStmt. Если будет та же ошибка, то sqlErrorCode. Если же ошибки не возникнет, то проблема в описании принимающей таблицы.
В документации есть только: 30003, 30005, 30006.RAJAH писал(а):А что означает ошибка 30007, если в Oracle есть осмысленное описание?
Речь не об осмысленности 30007 на оракле. При появлении ее на оракле у меня в логе, кажется, было что-то осмысленное. Давно уже дело было и ручаться на 100% не могу.
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
Попробовал навскидку Ваш Вариант, из того что привели Вы, несколько упростив сам запрос:
У меня все отрабатывает. Т.е. kodosh возвращает 0 ну и сами данные выводятся по условиям поступления основных ср-в заданным.
Код: Выделить всё
.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
Re: Прямой SQL
Бросается - я ж специально ошибку сделал.m0p3e писал(а):Т.е. в логе виден передаваемый запрос? Ничего не бросается в глаза?
Таково требование синтаксиса: <имя_view>.tn<имя_таблицы>m0p3e писал(а):Не нравится мне как задан второй параметр.
Можно, я так и сделал, но это ещё медленнее, чем обычным create view: всё, что я выиграл прямым SQL, и даже больше, тратится на навигацию по запросу.m0p3e писал(а):Можно выполнить просто select и фетчить данные.
Den
Да, и у меня так отработало, и даже мой, более сложный запрос, прокатил (код ошибки равен 0). А вот в реальной форме почему-то по-другому. Может, 30007 - это нехватка оперативной памяти?
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
Навигация (видимо Вы имеете ввиду то, что внутри конструкции .{table.... ) по отобранному набору данных быстро должна осуществляться вроде как. Хотя, конечно, может у Вас там навороченный алгоритм какой внутри .{table .... Большой набор данных ? У Вас сотни тысяч записей выбирает запрос дскл ?
Не знаю даже...пробовали этот же самый алгоритм реализовать на vip а не на фком. Тот же затык наблюдаться будет ?
Не знаю даже...пробовали этот же самый алгоритм реализовать на vip а не на фком. Тот же затык наблюдаться будет ?
Re: Прямой SQL
это вот так: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);
Да. Порядка 300000-400000.Den писал(а):У Вас сотни тысяч записей выбирает запрос дскл ?
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Прямой SQL
Ну наман так )
Попробовать может сделать, например ..TOP 1000.., ради инетереса в дскл запросе этом , если дело в кол0ве данных получаемом
Попробовать может сделать, например ..TOP 1000.., ради инетереса в дскл запросе этом , если дело в кол0ве данных получаемом