Использование функции sqlAddStr

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Использование функции sqlAddStr

Сообщение falcon »

Необходимо построить запрос длиной более 255 символов
Документация по функции sqlAddStr очень неполная. Прошу помощи в использовании.
Мой пример кода (ПК "Галактика" закрывается по Runtime error)

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

Var stmt       : LongInt;
Var nameOrg: String;

stmt := sqlAllocStmt;
sqlAddStr(stmt, 'Select KATORG.NAME From KATORG '); //запрос упрощен для читаемости кода
sqlAddStr(stmt, 'Where('''' != KATORG.NAME)');

sqlBindCol(stmt, 1, nameOrg);
sqlExecute(stmt);

While(sqlFetch(stmt) = TsOk)
  {
     LogStrToFile('c:\galLog.txt', nameOrg);
  }

sqlFreeStmt(stmt);
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Сообщение falcon »

После долгого ожидания ответа и множества проб все таки удалось получить работающий код:

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

Var stmt    : LongInt;
Var stmt_str: LongInt;
Var nameOrg: String;

stmt := sqlAllocStmt;

sqlAddStr(stmt_str, 'Select KATORG.NAME From KATORG '); //запрос упрощен для читаемости кода
sqlAddStr(stmt_str, 'Where('''' <> KATORG.NAME) ');
sqlPrepare(stmt, stmt_str);
sqlFreeStr(stmt_str);

sqlBindCol(stmt, 1, nameOrg);
sqlExecute(stmt);

While(sqlFetch(stmt) = TsOk)
  {
      LogStrToFile('C:\galLog.txt', nameOrg);
  }

sqlFreeStmt(stmt);
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

Не стану открывать новую тему...

Не удается выполнить успешно следующий вариант запроса :

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

var
 stmt,stmt_str : LongInt; 
 crec: comp; 
 li1,li2 : integer;
 vid,tip,year_ : word;

...
{
          vid:=110;
          tip:=2  ;
          year_:=2008;


           stmt := sqlAllocStmt; 
           sqlAddStr(stmt_str, 'Select katsopr.nrec from katsopr '+
                            'where katsopr.vidsopr=?'+
                             'and katsopr.tipsopr=?'+
                             'and year(katsopr.dsopr)=?'
                  );

         sqlPrepare(stmt, stmt_str); 
         sqlFreeStr(stmt_str); 
 
         sqlbindparam(stmt,1,vid);
         sqlbindparam(stmt,2,tip);
         sqlbindparam(stmt,3,year_);

         sqlBindCol(stmt, 1, crec); 
         li2:=sqlExecute(stmt); // li2 возвращает не 0.....
}
Причем без 'and year(katsopr.dsopr)=?' в собираемом запросе, все отрабатывает на ура. В разделе хэлпа "Функции прямого sql" заявлена функция year для использования. Что, собственно, не так делаю ?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Александр, извините за долгое молчание: лето, отпуска, авралы и пр.
Впрочем, вижу, что вы уже разобрались. В самом деле, проблема в том, что вы перепутали два типа хэндлов: хэндл на запрос и хэндл на строку запроса.

Денис, а что именно возвращает запрос? Формируется ли драйверный лог? Можете ли внешними средствами посмотреть, какой запрос уходит в СУБД?
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

переделал немножко(год тоже bind-ю) :

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

         sqlAddStr(stmt_str, 'Select katsopr.nrec from katsopr '+
                             'where katsopr.vidsopr=?'+
                             'and katsopr.tipsopr=?'+
                             'and year(katsopr.dsopr)=?'
                  );
но все равно ничего...а скуль получает для выполнения:

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

"
eclare @P1 int
set @P1=1
exec sp_prepexec @P1 output, N'@P1 int,@P2 int,@P3 int', N'SELECT T$KATSOPR.F$NREC FROM T$KATSOPR WHERE ( T$KATSOPR.F$VIDSOPR = @P1 AND T$KATSOPR.F$TIPSOPR = @P2 AND dbo.DTYEAR( T$KATSOPR.F$DSOPR ) = @P3 )', 110, 2, 2008
select @P1
"
в функции DTYEAR в качестве входного описан как binary(8)...
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

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

CREATE function dtYEAR(@DT BINARY(4)) returns INT as   // раз уж ТОЛЬКО INT, то и преобразуем в 4-х байтовое binary
begin
--  return CONVERT(INT,SUBSTRING(@DT,1,2))&0x7FFF
return CONVERT(INT,SUBSTRING(@DT,1,2))&0x7FFF
end
ну или уж тогда

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

CREATE function dtYEAR(@DT BINARY(8)) returns INT as
begin
--  return CONVERT(INT,SUBSTRING(@DT,1,2))&0x7FFF
return CONVERT(INT,SUBSTRING(@DT,5,2))&0x7FFF
end
Привет разрабтчику TSQL - скриптов !
Такое впечатление, что разработчики скриптов TSQL полагают один формат датового поля, а гало-движка - по-другому....

А вообще сразу видно что прикладники эти функционалом не пользуются наверное практически, иначе бы уж давно это исправили...(+ аналогичные функции дня и месяца) . :-(
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

не, тут похоже функция заточена на datetime, а не на date
разбираться с этим по ходу времени нет, поэтому, пожалуйста, обратитесь в техподдержку, зарегистрируйте инцидент. будем решать
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Сообщение falcon »

Могу предложить запрос вида:

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

sql Select katsopr.nrec from katsopr where katsopr.vidsopr=110 and katsopr.tipsopr=2 and Year(DateTime(katsopr.dsopr, CurTime))=2008;
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

falcon писал(а):Могу предложить запрос вида:

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

sql Select katsopr.nrec from katsopr where katsopr.vidsopr=110 and katsopr.tipsopr=2 and Year(DateTime(katsopr.dsopr, CurTime))=2008;
Федору...

Множественые пасы руками над грудой файлов базы... и вот - НОВая примочка АТЛАНТИСа - РУЛИТ!...осталось каждому из НАС (дописывателей) - стать фокусниками. Проверка типов - первое дело для любого конвертатора!
НЕ можно смешивать разнотипные параметры: SQL типы (BINARY(8), datatime, int) и VIP-SQL-типы (Date, Time и т.п.), ЕСЛИ конечная СУБД "может неправильно" произвести неявное пробразование типов. Вы всё же АТЛАНТИСовцы, а не 1С-ники, где все типы равны и все ошибки вылезут только при исполнении. У вас же есть типизация переменных! ..поэтому косяки типа "тип не угадали" - не рулят :-) Ну чё уж такое то в эфир выпускать - я всё ещё считаю, Вас, профи... :)
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

ну так и не смешивайте....
защиту от дурака, конечно, можно встроить, но....
Ответить