Читать «Виртуальная библиотека Delphi» онлайн - страница 93

Unknown

Вам не нужно использовать оператор INTO для программного доступа к результату — его можно получить используя свойства Fields или FieldByName соответствующего компонента TQuery.

TQuery1.Add(' SELECT MAX(FiledA) FROM TableB ');

TQuery.Open;

...

VariableC := TQuery1.Fields[0];

Или, если результат нужно визуально отобразить, достаточно подключить к используемому TQuery компоненты TDataSource и TDBText.

7. Автоматический подсчет сумм при помощи TQuery.

Меня интересует возможность подсчета суммы по таблицам, которые уже находятся на форме.

Есть очень простой способ — предположим, что у вас есть на форме Query1, DataSource1, DBGrid1. Добавьте на эту же форму компоненты Query2, DataSource2, DBText1. Установите property Query2.DataSource=DataSource1. В Query2.SQL напишите

SELECT SUM(FieldName) FROM TableName

где TableName — имя той же таблицы что и у Query1, а FieldName — имя столбца по которому производится подсуммирование. Далее свяжите между собой Query2, DataSource2 и DBText1.

При изменении Query1 (если конечно Query1.RequestLive=True) Query2 будет автоматически перевыполняться. Это решение хоть и простое, но неэкономичное — особенно при большом количестве записей в исходной таблице. Более того, запрос Query2 должен иметь WHERE идентичный Query1.

Для подсчета сумм правильнее использовать событие TQuery.OnCalcFields. Хорошим примером является X:\DELPHI\DEMOS\DB\MASTAPP\MASTAPP.DPR.

8. Использование кавычек в параметризированном запросе.

Мой запрос получает параметр. Проблема в том, что строка параметра содержит " (двойную кавычку), которая приводит к Runtime Error.

Вам необходимо использовать динамический SQL-запрос, иначе при указании например

WHERE TABLE.FIELD = 'let"ter'

вы получите ошибку.

9. Как создать отдельный компонент TTable?

Легко и просто — точно также как и обычный компонент. При этом в качестве параметра конструктору можно передавать значение nil.

var

  MyTable: TTable;

begin

  MyTable := TTable.Create(nil);

  try

    MyTable.DatabaseName := 'MyDB';

    MyTable.TableName := 'MyTable.db';

    Mytable.IndexName := 'MyIndex';

    MyTable.Open;

    { делать то, что надо }

  finally

    MyTable.Free;

  end;

end;

10. Как узнать, какая ячейка при просмотре TDBGrid текущая?

Здесь процедура для сохранения текущего номера строки и колонки. Следующий код в методе MyDBGridDrawDataCell обновляет переменные Col и Row (которые не должны быть локальными для этого метода) каждый раз, когда таблица перерисовывается. Используя этот код, вы можете считать, что Col и Row указывают на текущую колонку и строку соответственно.

var

  Col, Row: Integer;

procedure TForm1.MyDBGridDrawDataCell(Sender: TObject; const Rect: TRect;