Пример использования функционального интерфейса к прямому SQL Назад В начало Вперед
//=============================================================
interface TestDSQL 'Test DSQL';

//---------------------------------------------------------
table struct MyTable
(
  wCode: word,
  sName: string
)
with index
(
  MyTable0  = sName
);

//-------------------------------------------------------------
create view

as select
  *

from
  MyTable, x$files
;

File sf;

//-------------------------------------------------------------
browse brwMyTable;
  show at(,1,,10);
  table MyTable;

fields
  sName	#3'Имя' ('Имя таблицы',,) : [20], protect, noDel;
  wCode	#3'Код' ('Код таблицы',,) : [10], protect, noDel;
end;

//-------------------------------------------------------------
browse brwFiles;
  show at(,11,,20);
  table x$files;

fields
  xf$name  #3'Имя' ('Имя таблицы',,) : [20], protect, noDel;
  xf$code  #3'Код' ('Код таблицы',,) :  [5], protect, noDel;
end;

//-------------------------------------------------------------
handleEvent
cmInit:
{
  var stmt : longInt;
  var buf  : record as table X$INDEXES;
  var code : word;
  var str  : string;
  var n	: longInt;

  MessageLogEnableBatch;
  OpenMessageLog('DSQL_test.log', mfLog2Stream+mfBatch);

// Немедленное выполнение запроса (sqlExecDirect)
  sqlExecDirect('INSERT INTO appendix(NRec) VALUES(100)');

// Обработка выборки в цикле по одной записи
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Обработка выборки в цикле по одной записи');
  stmt := sqlAllocStmt; 
  Message('Код sqlAllocStmt: ' + string(sqlErrorCode(stmt)));
  sqlBindCol(stmt, 1, buf.xi$number);
  sqlBindCol(stmt, 2, buf.xi$name);
  sqlExecStmt(stmt, 'SELECT xi$number,xi$name FROM x$indexes WHERE xi$filecode = 1');
  Message('Код sqlExecStmt: ' + string(sqlErrorCode(stmt)));

  n := 0;
  while sqlFetch(stmt) = tsOk do
  {
	n := n+1;
	Message(string(n) + '. ' + buf.xi$number + ' => ' + buf.xi$name);
  }
  Message('Код sqlFetch: ' + string(sqlErrorCode(stmt)));

  sqlFreeStmt(stmt);

// Использование переключаемого CASE
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Использование переключаемого CASE');
  stmt := sqlAllocStmt; 
  var query : string;
  var col1 : string;
  var col2 : string;
  sqlBindCol(stmt, 1, col1);
  sqlBindCol(stmt, 2, col2);
  query := 'SELECT'
		+ ' CASE xf$code'
		+  ' WHEN 0 THEN ''словарь'''
		+  ' WHEN 1 THEN ''таблицы'''
		+  ' WHEN 2 THEN ''поля'''
		+  ' WHEN 3 THEN ''индексы'''
		+  ' ELSE ''прочие'''
		+ ' END,'
		+ ' xf$name'
		+ ' FROM x$files WHERE xf$code < 7'
  sqlExecStmt(stmt, query);

  n := 0;
  while sqlFetch(stmt) = tsOk do
  {
	n := n+1;
	Message(string(n) + '. ' + col1 + ' => ' + col2);
  }

  sqlFreeStmt(stmt);

// Использование условного CASE
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Использование условного CASE');
  stmt := sqlAllocStmt; 
  sqlBindCol(stmt, 1, col1);
  sqlBindCol(stmt, 2, col2);
  query := 'SELECT'
		+ ' CASE'
		+  ' WHEN xf$code = 0 THEN ''словарь'''
		+  ' WHEN xf$code <= 3 THEN ''описание таблиц'''
		+  ' ELSE ''прочие'''
		+ ' END,'
		+ ' xf$name'
		+ ' FROM x$files WHERE xf$code < 7'
  sqlExecStmt(stmt, query);

  n := 0;
  while sqlFetch(stmt) = tsOk do
  {
	n := n+1;
	Message(string(n) + '. ' + col1 + ' => ' + col2);
  }

  sqlFreeStmt(stmt);

// Использование параметра в SQL-запросе
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Использование параметра в SQL-запросе');
  stmt := sqlAllocStmt;  
  sqlPrepare(stmt, 'SELECT xf$code FROM x$files WHERE xf$name = ?');
  sqlBindParam(stmt, 1, str);
  sqlBindCol(stmt, 1, code);

//----- получить код таблицы для X$FIELDS
  str := 'X$FIELDS';
  sqlExecute(stmt); 
  Message('Код sqlExecute для X$FIELDS: ' + string(sqlErrorCode(stmt)));

  while sqlFetch(stmt) = tsOk do
	Message('Код файла ' + str + '=' + string(code));

//----- получить код таблицы для X$FILES
  str := 'X$FILES';
  sqlExecute(stmt);
  Message('Код sqlExecute для X$FILES: ' + string(sqlErrorCode(stmt)));

  while sqlFetch(stmt) = tsOk do
	Message('Код файла ' + str + '=' + string(code));

  sqlFreeStmt(stmt);

// Использование функций
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Использование функций');
  stmt := sqlAllocStmt;
  var cnt : word;
  var min : word;
  var max : word;
  var curDt : date;
  sqlBindCol(stmt, 1, cnt);
  sqlBindCol(stmt, 2, min);
  sqlBindCol(stmt, 3, max);
  sqlBindCol(stmt, 4, curDt);
  sqlExecStmt(stmt, 'SELECT COUNT(*), MIN(xf$code), MAX(xf$code), CURDATE FROM x$files WHERE xf$code < 15');

  while sqlFetch(stmt) = tsOk do
	Message('На ' + string(curDt) + ' записей: ' + string(cnt) + ', мин.код: ' + string(min) + ', макс.код: ' + string(max));

// Загрузка выборки в заданную таблицу в памяти (MyTable)
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Загрузка выборки в таблицу в памяти MyTable');
  stmt := sqlAllocStmt;
  code := 5;
  sqlBindParam(stmt, 1, code);
  sqlExecStmt(stmt, 'SELECT xf$code, xf$name FROM x$files WHERE xf$code > ? AND xf$code < 15');

  sqlFetchInto(stmt, tnMyTable);
  sqlFreeStmt(stmt);

// Загрузка выборки в автоматически создаваемую таблицу в памяти (хендл => mt)
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Загрузка выборки в автоматически создаваемую таблицу в памяти');
  stmt := sqlAllocStmt;
  code := 7;
  sqlBindParam(stmt, 1, code);
//----- заодно проверим конкатенацию строк
  sqlExecStmt(stmt, 
	'SELECT xf$code, ''=> ''||xf$name FROM x$files WHERE xf$code > ? AND xf$code < 15');
		 
  var mt : longInt;
  sqlFetchIntoMT(stmt, mt);

//----- обработка созданной таблицы
  var rec : array[1..1] of variant;
  if (sqlNavigateMT(mt, ffGetFirst, rec) = tsOk)
	do
	{
	var i : integer;
	var s : string;
	s := '';
	for (i:=1; i<=Count(rec); i:=i+1)
		s := s + ' ' + string(rec[i]);
	Message(s);
}
	while (sqlNavigateMT( mt, ffGetNext, rec ) = tsOk);

  sqlFreeStmt(stmt)
  sqlFreeMT(mt)

// Обработка memo-полей
  WriteMessageLog ('----------------------------');
  WriteMessageLog ('Обработка memo-полей');
  var f : longInt;
  var fname : string;

  f := sf.Handle;
  fname := CreateTmpFileName;
  if (sf.OpenFile(fname, stCreate))
  {
	sf.WriteLn('This is just the test! Eeeee!!!');
	sqlStoreMemo(coAPPENDIX, 100, f);
	Message('Код sqlStoreMemo: ' + string(sqlErrorCode(stmt)));
	sf.Close;
	DeleteFile(fname);
  }

  if (sf.OpenFile('DSQL_test_memo.txt', stCreate))
  {
	sqlLoadMemo(coAPPENDIX, 100, f);
	Message('Код sqlLoadMemo: ' + string(sqlErrorCode(stmt)));
	sf.Close;
  }

  CloseMessageLog;
  MessageLogDisableBatch;
}
end; // handleEvent

end.