Страница 1 из 1

Прямой SQL

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

Добавлено: 13 апр 2009, 08:51
Nikos
А если использовать представления в БД?

Добавлено: 13 апр 2009, 11:00
Ged

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

sqlAddStr(str_handle ,'Select ');
sqlAddStr(str_handle ,'* ');
sqlAddStr(str_handle ,'From ');
sqlAddStr(str_handle ,'X$tables ');

Добавлено: 14 апр 2009, 04:31
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);
}
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?

Добавлено: 14 апр 2009, 04:34
Hmyrii
использовать представления в БД считаю не очень удобным, так как при разработке и отладки отчета придется постоянно дергать админов заказчика чтобы они пересоздавали VIEW по мере того как я ее буду сначала отлаживать а потом развивать и усовершенствовать

Добавлено: 14 апр 2009, 08:28
Nikos
В этом случае, конечно, вы правы. Это у нас один человек на все - вот я и работаю через представления...

Добавлено: 14 апр 2009, 11:28
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) забыли просто

Добавлено: 14 апр 2009, 12:21
Hmyrii
Den писал(а): Вроде sqlPrepare(stmt, str_handle) забыли просто
хотел уж было написать про то что вы не внимательно читали хелп, что у данной ф-ции первый параметр это хэндл (longint), а второй это запрос (string)
а потом думаю ... а дай попробуй залепить ей туда вместо запроса хэндл на запрос ... а в голове мысль "только зря время потрачу, в доке же ясно написано" ...
и прокатило, вот большое спасибо за явно неординарный ответ

Добавлено: 23 апр 2009, 13:52
Vik
Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?

Добавлено: 23 апр 2009, 18:34
LaaLaa
Vik писал(а):Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?
Для первасива подерки DSQL в интсрументарии нет.

Добавлено: 23 апр 2009, 19:09
Vik
В документации смущает такая фраза:

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

"Однако на Pervasive SQL доступ через прямой SQL и доступ через классический интерфейс идет через разные коннекты (разные сервисы). В результате доступ через разные механизмы к одним и тем же данным будет приводить к взаимной блокировке. Необходимо учитывать эти особенности при разработке алгоритмов со смешанным типом доступа к данным.
"
То есть, в ней не сказано, что это невозможно..

Добавлено: 23 апр 2009, 19:16
Vik
вопрос снимается..

Добавлено: 14 май 2009, 14:53
TYZ
я прошу прощения, тема для меня новая
где можно взять документацию по direct sql ?
или где почитать?
я так понял что это дает возвожность использовать нормальные sql запросы к примеру в ард отчетах, так?

Добавлено: 01 июл 2009, 11:06
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);
То есть во втором варианте подготавливаю запрос, а потом лишь меняю параметры. По идее второй должен отработать быстрее, так оно и есть. Но вот результаты почему-то совершенно разные. Правильно выбирается только в первом случае, во втором результатов примерно в два раза меньше. Что не так делаю?