Прямой SQL

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

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

Ответить
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Прямой SQL

Сообщение Hmyrii »

Всем доброго времени суток.
Пришло желание начать активно использовать прямой sql. Все заявленные в доке функции вроде работают. Начинаешь писать запрос, не просто так, а настоящий запрос, чтобы одним маневром получить уже готовые данные, фильтрованые, групированые, агрегирование ... запрос получается ЗАЧЕТНЫМ. И тут то вылезает одно такое неприятное НО. Этот запрос не фига не влазиет в переменную типа string так как ее длина ограничена жалкими 255 символами.
Как же быть, может кто нить просветить?
Может я чего то незнаю?
В противном случае не вижу не малейшего смысла от этого прямого SQL если туда не удается протиснуть даже мало мальский запросик.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

А если использовать представления в БД?
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

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

sqlAddStr(str_handle ,'Select ');
sqlAddStr(str_handle ,'* ');
sqlAddStr(str_handle ,'From ');
sqlAddStr(str_handle ,'X$tables ');
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

sqlAddStr пожалуй должен был мне помочь но вот что то не выходит

есть такая процедура, она работает без проблем

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

procedure ExampleSELECT1;
{
   var stmt   : longInt;
   var query : string;
   var field1  : string;
   
   // разместить хэндл под запрос
   stmt := sqlAllocStmt;
   
   // подготовим запрос
   query := '';
   query := query + 'select Lschet.TabN ';
   query := query + 'from ';
   query := query + 'Lschet ';
   sqlPrepare(stmt, query);
   
   
   sqlBindCol(stmt, 1, field1);
   
   // выполним запрос
   sqlExecute(stmt);
   
   // прогоним выбраные записи
   while (sqlFetch(stmt) = tsOk)
     LogStrToFile(logFile, field1);
   
   // осбоводим хэндл
   sqlFreeStmt(stmt);
}
а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет

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

procedure ExampleSELECT2;
{
   var stmt       : longInt;
   var str_handle : longInt;
   var query      : string;
   var field1     : string;
   
   // разместить хэндл под запрос
   stmt := sqlAllocStmt;
   
   // подготовим запрос
   sqlFreeStmt(str_handle);
   sqlAddStr(str_handle, 'select Lschet.TabN ');
   sqlAddStr(str_handle, 'from ');
   sqlAddStr(str_handle, 'Lschet ');
   
   // привяжем поле
   sqlBindCol(stmt, 1, field1);
   
   // выполним запрос
   sqlExecute(stmt);
   
   // покажем данные
   while (sqlFetch(stmt) = tsOk)
     LogStrToFile(logFile, field1);
   
   sqlFreeStmt(stmt);
}
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

использовать представления в БД считаю не очень удобным, так как при разработке и отладки отчета придется постоянно дергать админов заказчика чтобы они пересоздавали VIEW по мере того как я ее буду сначала отлаживать а потом развивать и усовершенствовать
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

В этом случае, конечно, вы правы. Это у нас один человек на все - вот я и работаю через представления...
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Hmyrii писал(а):...а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет

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

procedure ExampleSELECT2;
{
   var stmt       : longInt;
   var str_handle : longInt;
   var query      : string;
   var field1     : string;
   
   // разместить хэндл под запрос
   stmt := sqlAllocStmt;
   
   // подготовим запрос
   sqlFreeStmt(str_handle);
   sqlAddStr(str_handle, 'select Lschet.TabN ');
   sqlAddStr(str_handle, 'from ');
   sqlAddStr(str_handle, 'Lschet ');
   
   // привяжем поле
   sqlBindCol(stmt, 1, field1);
   
   // выполним запрос
   sqlExecute(stmt);
   
   // покажем данные
   while (sqlFetch(stmt) = tsOk)
     LogStrToFile(logFile, field1);
   
   sqlFreeStmt(stmt);
}
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?
Вроде sqlPrepare(stmt, str_handle) забыли просто
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

Den писал(а): Вроде sqlPrepare(stmt, str_handle) забыли просто
хотел уж было написать про то что вы не внимательно читали хелп, что у данной ф-ции первый параметр это хэндл (longint), а второй это запрос (string)
а потом думаю ... а дай попробуй залепить ей туда вместо запроса хэндл на запрос ... а в голове мысль "только зря время потрачу, в доке же ясно написано" ...
и прокатило, вот большое спасибо за явно неординарный ответ
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?
LaaLaa

Сообщение LaaLaa »

Vik писал(а):Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?
Для первасива подерки DSQL в интсрументарии нет.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

В документации смущает такая фраза:

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

"Однако на Pervasive SQL доступ через прямой SQL и доступ через классический интерфейс идет через разные коннекты (разные сервисы). В результате доступ через разные механизмы к одним и тем же данным будет приводить к взаимной блокировке. Необходимо учитывать эти особенности при разработке алгоритмов со смешанным типом доступа к данным.
"
То есть, в ней не сказано, что это невозможно..
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

вопрос снимается..
TYZ
Сообщения: 14
Зарегистрирован: 20 окт 2006, 12:06
Откуда: Киев
Контактная информация:

Сообщение TYZ »

я прошу прощения, тема для меня новая
где можно взять документацию по direct sql ?
или где почитать?
я так понял что это дает возвожность использовать нормальные sql запросы к примеру в ард отчетах, так?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

У меня вопрос. Есть два варианта кода:
1)

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

 
      SetVisualHeader('Сохранение настроек'#13''+
                       'Заполнение таблицы')

    _Loop TfUsers {
          stmt := sqlAllocStmt;
          sqlBindParam(stmt, 1, TfUsers.Obj);
          sqlBindParam(stmt, 2, TfUsers.cUser);

          sqlExecStmt(stmt, 'SELECT'+
                             ' V.cTune'+
                             ',D.code'+
                             ',V.obj'+
                             ',V.cUser'+
                             ',V.longVal'+
                             ',V.doubleVal'+
                             ',V.dateVal'+
                             ',V.timeVal'+
                             ',V.compVal'+
                             ',V.strVal'+
                             ',V.isEmpty'+
                             ',V.strEmpty'+
                             ' FROM TuneVal as V '+
                             'inner join TuneDef as D on V.cTune = D.Nrec'+
                             ' WHERE V.Obj = ? AND V.cUser = ?');
          sqlFetchInto(stmt, tnTfTunes);
          sqlFreeStmt(stmt);
          NextVisual;
      }
2)

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

  stmt := sqlAllocStmt;
  sqlPrepare(stmt, 'SELECT'+
                   ' V.cTune'+
                   ',D.code'+
                   ',V.obj'+
                   ',V.cUser'+
                   ',V.longVal'+
                   ',V.doubleVal'+
                   ',V.dateVal'+
                   ',V.timeVal'+
                   ',V.compVal'+
                   ',V.strVal'+
                   ',V.isEmpty'+
                   ',V.strEmpty'+
                   ' FROM TuneVal as V '+
                   'inner join TuneDef as D on V.cTune = D.Nrec'+
                   ' WHERE V.Obj = ? AND V.cUser = ?');
    sqlBindParam(stmt, 1, TfUsers.Obj);
    sqlBindParam(stmt, 2, TfUsers.cUser);   
    SetVisualHeader('Сохранение настроек'#13''+
                       'Заполнение таблицы')
  _Loop TfUsers {
          sqlExecute(stmt);
          sqlFetchInto(stmt, tnTfTunes);
          NextVisual;
      }
    sqlFreeStmt(stmt);
То есть во втором варианте подготавливаю запрос, а потом лишь меняю параметры. По идее второй должен отработать быстрее, так оно и есть. Но вот результаты почему-то совершенно разные. Правильно выбирается только в первом случае, во втором результатов примерно в два раза меньше. Что не так делаю?
Ответить