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

Re: Прямой SQL

Добавлено: 11 янв 2012, 17:13
RAJAH
Den писал(а):Попробовать может сделать, например ..TOP 1000
Попробовал. Всё равно 30007.

Re: Прямой SQL

Добавлено: 27 янв 2012, 12:44
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 вложенный запрос то все работает. Неужели галактика не понимает такой простой запрос?

Re: Прямой SQL

Добавлено: 27 янв 2012, 13:06
RAJAH
denisag писал(а):tmpVozvratMC
Это откуда такая таблица?

Re: Прямой SQL

Добавлено: 27 янв 2012, 18:13
denisag
Это моя временная таблица))
В общем разобрался что не нравилось ему, було 1 избыточное условие которое квери обрабатывал без проблем а вот галактика считала что я хочу еще одно поле

Re: Прямой SQL

Добавлено: 25 апр 2012, 09:24
RAJAH
Если кому интересно:
30007 - ошибка несоответствия полей; возникала из-за того, что SQLSelectInto - метод логической таблицы, поэтому необходимо писать <<имя view>>.SQLSelectInto(...)

Re: Прямой SQL

Добавлено: 12 май 2012, 10:20
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] Ошибка последовательности функций".
Как правильно вызвать процедуру?

Re: Прямой SQL

Добавлено: 12 май 2012, 12:09
n0where
SqlBindParam(henzap, 1, '0x80010000000002E5');
SqlBindParam(henzap, 1, '0x8001000000000000');

Re: Прямой SQL

Добавлено: 12 май 2012, 12:13
Den
RAJAH писал(а):SQLExecStmt(henzap, 's$VedomMater(?, ?)');
+ Если создавали посредством dsql процедуру, то префикс s$ при вызове вроде не нужно указывать

Re: Прямой SQL

Добавлено: 12 май 2012, 12:32
RAJAH
n0where
Упс... Опечатка... Но и с SqlBindParam(henzap, 2, '0x8000000000000000') то же.
Den писал(а):Если создавали посредством dsql процедуру
Неа.
RAJAH писал(а):Создал с помощью CREATE PROCEDURE хранимку в базе.

Re: Прямой SQL

Добавлено: 12 май 2012, 12:54
Den
Хм...вроде навскидку ок все. Может comp в SqlBindParam без кавычек передать все же ? (и через переменные-comp еще попробуйте...).

Re: Прямой SQL

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

Re: Прямой SQL

Добавлено: 12 май 2012, 13:21
edward_K
В ms70drv на строчку выше иногда еще и написано в какой строке, того запроса что вызвал ошибку.
А переменные не пробовали передать? Для обычного запроса вместо параметров теперь юзаю #comp(284554544445454) - именно в десятичном виде - драйвер их тогда сам преобразовывает. Ну и всегда можно передать параметры через временнную таблу.
А вот не подскажете как мне отладить свою процедуру? Хотелось бы вывести в файл нужные мне переменные. Куда выводит Print не нашел.
Функций по работе с файлоами в DSQL тоже как то не увидел сходу.

Re: Прямой SQL

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

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

var param1,param2 : comp
....

param1:=0x80010000000002E5;
SqlBindParam(henzap, 1, param1);
...

Re: Прямой SQL

Добавлено: 12 май 2012, 13:28
Den
edward_K писал(а): А вот не подскажете как мне отладить свою процедуру?
Я напрямую всегда отлаживаю через MS Managment Studio (QA) - экономит массу времени

Re: Прямой SQL

Добавлено: 12 май 2012, 14:03
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.