Прямой SQL

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

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

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

Re: Прямой SQL

Сообщение RAJAH »

Den писал(а):Попробовать может сделать, например ..TOP 1000
Попробовал. Всё равно 30007.
denisag
Постоянный гость
Сообщения: 59
Зарегистрирован: 02 дек 2011, 14:28

Re: Прямой SQL

Сообщение denisag »

народ а как написать чтобы галактика поняла такой запрос

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

sql select
 SET1.KATSOPRNSOPR,
 SET1.KATSOPRDSOPR,
 SET1.KATMCNAME,
 SET1.SPSOPRPRICE,
 SET1.katorg2name,
 SET1.KATPARTYNAME,
 SET1.SKLORDERNORDER,
 SET1.KATPODRNAME,
 SET1.KATORG2ADDR,
 SET1.SPORDERKOL,
 SET2.SPORDERKOL2,
 (SET1.SPORDERKOL - SET2.SPORDERKOL2),
 SET1.KATORG1NAME,
 SET1.SPSOPRKOLFACT,
 SET1.SPORDERNREC,
 SET1.KATSOPRCGRUZFROM
from
(select
       SPORDER.NREC as SPORDERNREC
       ,KATSOPR.NSOPR as KATSOPRNSOPR
       ,KATSOPR.DSOPR as KATSOPRDSOPR
       ,KATMC.NAME as KATMCNAME
       ,SPSOPR.PRICE as SPSOPRPRICE
       ,katorg2.name as katorg2name
       ,KATPARTY.NAME as KATPARTYNAME
       ,SKLORDER.NORDER as SKLORDERNORDER
       ,KATPODR.NAME as KATPODRNAME
       ,KATORG2.ADDR as KATORG2ADDR
       ,SPORDER.KOL as SPORDERKOL
       ,KATORG1.NAME as KATORG1NAME
       ,SPSOPR.CSPORDER as SPSOPRCSPORDER
       ,SPSOPR.KOLFACT as SPSOPRKOLFACT
       ,SPORDER.NREC as SPORDERNREC
       ,KATSOPR.CGRUZFROM as KATSOPRCGRUZFROM
   from
       KATSOPR
       INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC
       INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR
       INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC
       LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC
       LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC
       LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC
       LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC
       LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC
  where
       201 = KATSOPR.VIDSOPR and
       (katsopr.corgbase = :_corg ) and
       (spsopr.cmcusl = :_cmc )
     ) as SET1
LEFT OUTER JOIN
(select
       SPSOPR.CSPORDER
       ,SUM (SPORDER.KOL) as SPORDERKOL2
   from
       KATSOPR
       INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC
       INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR
       INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC
       LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC
       LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC
       LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC
       LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC
       LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC
  where
       106 = KATSOPR.VIDSOPR
group by KATMC.NAME, KATORG1.NAME, katorg2.name, SPSOPR.CSPORDER, SPORDER.CSPORDV) as SET2
ON SET1.NREC = SET2.CSPORDER
into tmpVozvratMC
sqlFreeStmt(Stmt);  
При таком написании - випер компилирует без ошибок, а в галактике вываливается "Ошибка компиляции прямого SQL. Таблица L_SOPRDOC::TMPVOZVRATMC".
Если оставить 1 вложенный запрос то все работает. Неужели галактика не понимает такой простой запрос?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

denisag писал(а):tmpVozvratMC
Это откуда такая таблица?
denisag
Постоянный гость
Сообщения: 59
Зарегистрирован: 02 дек 2011, 14:28

Re: Прямой SQL

Сообщение denisag »

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

Re: Прямой SQL

Сообщение RAJAH »

Если кому интересно:
30007 - ошибка несоответствия полей; возникала из-за того, что SQLSelectInto - метод логической таблицы, поэтому необходимо писать <<имя view>>.SQLSelectInto(...)
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Помогите, пожалуйста, разобраться с запуском хранимых процедур.
Создал с помощью CREATE PROCEDURE хранимку в базе. Её вызов в Query Analyzer (EXEC S$VEDOMMATER 0x80010000000002E5, 0x8000000000000000) срабатывает: процедура успешно выполняется. Пытаюсь на основе примера из vipprogr запустить её из "Галактики" ("Суппорта"):

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

     BeginTransaction(0);
     henzap:=SQLAllocStmt;
     SqlBindParam(henzap, 1, '0x80010000000002E5');
     SqlBindParam(henzap, 1, '0x8001000000000000');
     SQLExecStmt(henzap, 's$VedomMater(?, ?)');
     message(sqlfetchintomt(henzap, mt));
     if (sqlNavigateMT(mt, ffGetFirst, rec) = tsOk) do
     {
       message(string(rec[4]));
     }
     while (sqlNavigateMT(mt, ffGetNext, rec) = tsOk);
     SqlFreeStmt(henzap);
     EndTransaction;
Получаю сообщение с кодом ошибки 311 (вроде как, "внутренняя ошибка в драйвере БД"), а сообщения из раздела навигации нет. В ms70drv.log появляется запись "HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций".
Как правильно вызвать процедуру?
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Прямой SQL

Сообщение n0where »

SqlBindParam(henzap, 1, '0x80010000000002E5');
SqlBindParam(henzap, 1, '0x8001000000000000');
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

RAJAH писал(а):SQLExecStmt(henzap, 's$VedomMater(?, ?)');
+ Если создавали посредством dsql процедуру, то префикс s$ при вызове вроде не нужно указывать
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

n0where
Упс... Опечатка... Но и с SqlBindParam(henzap, 2, '0x8000000000000000') то же.
Den писал(а):Если создавали посредством dsql процедуру
Неа.
RAJAH писал(а):Создал с помощью CREATE PROCEDURE хранимку в базе.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Хм...вроде навскидку ок все. Может comp в SqlBindParam без кавычек передать все же ? (и через переменные-comp еще попробуйте...).
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

Без кавычек уже на стадии компиляции ругается.
Пробовал даже переписать процедуру: не binary(8)-параметры сделал, а varchar(20), чтобы строки передавать - бесполезно.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

В ms70drv на строчку выше иногда еще и написано в какой строке, того запроса что вызвал ошибку.
А переменные не пробовали передать? Для обычного запроса вместо параметров теперь юзаю #comp(284554544445454) - именно в десятичном виде - драйвер их тогда сам преобразовывает. Ну и всегда можно передать параметры через временнную таблу.
А вот не подскажете как мне отладить свою процедуру? Хотелось бы вывести в файл нужные мне переменные. Куда выводит Print не нашел.
Функций по работе с файлоами в DSQL тоже как то не увидел сходу.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

RAJAH писал(а):Без кавычек уже на стадии компиляции ругается.
Пробовал даже переписать процедуру: не binary(8)-параметры сделал, а varchar(20), чтобы строки передавать - бесполезно.

попробуйте все же через переменную....

var param1,param2 : comp
....

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

Re: Прямой SQL

Сообщение Den »

edward_K писал(а): А вот не подскажете как мне отладить свою процедуру?
Я напрямую всегда отлаживаю через MS Managment Studio (QA) - экономит массу времени
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Прямой SQL

Сообщение RAJAH »

edward_K писал(а):В ms70drv на строчку выше иногда еще и написано в какой строке, того запроса что вызвал ошибку.
Полный текст:

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

12.05.2012 14:00:47 [RUSSIA81#USER]:
  HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
Den писал(а):попробуйте все же через переменную
Писал и так:

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

 
    henzap:=SQLAllocStmt;
     SqlBindParam(henzap, 1, hdrpsnrec);
     SqlBindParam(henzap, 2, canvalnrec);
     SQLExecStmt(henzap, 'VedomMater(?, ?)');
Без разницы...
edward_K писал(а):теперь юзаю #comp(284554544445454)
И так пробовал:

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

     SqlBindParam(henzap, 1, #comp(string(hdrpsnrec)));
     SqlBindParam(henzap, 2, #comp(string(canvalnrec)));
Ругается, что нет такой функции #comp.
Ответить