![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редактируемый отчет [D6, IB6.x]
MsGuns © (2003-09-18 17:07:00)
Кратко проблема следующая.
Есть форма отчета с N колонками. M из них заполняются информацией из БД, а (N-M) надо дать заполнять узеру как ему надо (этой инфы нет и не может быть в БД).
Вывод в Excel не подходит, т.к. отчет такой замудренный (итоги по группам то печатаются, то нет, например). Я хочу заполнить некую таблицу - грид выбранными данными, а затем дать узеру ее колбасить как заблагорассудится. Была мысль через TStringGrid, но минусы,- гемор с сохранением-восстановлением и морока с QReport`ом. Похоже, клиентский НД самое то.
Но вот беда: никогда с ним не работал. Прорабатываю сейчас хэлп, но надо срочно (до завтра) дать заказчику "редактить отчет" (по его словам)
Если не затруднит, дайте кратко, схематично, сам принцип и алгоритм связок. На таком примере: Есть TQuery, возвращающая поля F1,F2,F3. Требуется заиметь редактируемыйНД, в котором к этим 3 полям прога добавить еще 2, которые сама вычислит, и еще 2, которые может редактить узер. Из этого НД (7 полей) я уже буду просто выводить QReport`ом требуемый капризнице отчет. После печати НД надо убивать.
Заранее благодарен за внимание и помощь.
kaif (2003-09-18 19:52:00) [21]
чтобы cachedUpdates работал нужно, как правильно говорит Zacho, вписать любой синтаксически верный SQL-запрос в ModifySQL. Еще хорошо бы как-то отключить ForcedRefresh, чтобы не срабатывал RefreshSQL. И желательно вписать в обработчики BeforeDelete и BeforeInsert команду Abort, чтобы при редактировании в Grid-е юзер случайно не мог удалить или вставить запись.
Zacho (2003-09-18 19:42:00) [22]
> MsGuns © (18.09.03 19:27) [9]
> procedure TForm1.IBQuery1UpdateRecord(DataSet: TDataSet;
> UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
> begin
> Abort;
> end;
Abort не нужен ! Нужен просто пустой обработчик, т.е. достаточно в теле процедуры обработчика просто строки комментария.
> MsGuns © (18.09.03 19:33) [10]
Тоже способ, просто напиши какой-нибудь "левый" ModifySQL, например SELECT 0 FROM RDB$DATABASE
kaif (2003-09-18 19:41:00) [23]
Используй TRxMemoryData, если данных мало. Если же данных много и скорость нужна при закачке туда исходного НД - рекомендую тоже бесплатный, но очень быстрый TkbmMemTableс возможностью индексации и быстрого бинарного поиска внутри набора. Можно однако, конечно, насиловать режим IBDataSet.CachedUpdates...
MsGuns (2003-09-18 19:33:00) [24]
Кинул TIBUpdateSQL, связал его с запросом - дала редактить в гриде, но уйти с записи не дает - пишет "Нет Update SQL", который мне и на фиг не нужен !!!
MsGuns (2003-09-18 19:27:00) [25]
>VAleksey © (18.09.03 18:55) [8]
>RequestLive:=true; Как раз не нужен. Нужен RequestLive:=false;
У TIBQuery нет RequestLive.
Поставил CashedUpdates := true;
"Написал" обработчик
procedure TForm1.IBQuery1UpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
begin
Abort;
end;
Не дает в гриде редактить ;(Опции грида нормальные)
VAleksey (2003-09-18 18:55:00) [26]
> MsGuns © (18.09.03 18:41)
RequestLive:=true; Как раз не нужен. Нужен RequestLive:=false;
Zacho (2003-09-18 18:44:00) [27]
> Val © (18.09.03 18:39) [5]
Точно. А я уже и подзабыл.
MsGuns (2003-09-18 18:41:00) [28]
>Zacho © (18.09.03 18:23) [4]
Понял. Щас попробую.
ЗЫ. Интересно, блин, получается все мои многоступенчатые выпендрежи со специально создаваемыми "временными" таблицами (когда нельзя было получить нужные данные одним запросом, а надо было select, потом Insert/Update from Select и т.д.) - есть следствие ламерности и тяжкого наследия парадоксизма ?
ЗЗЫ. Так и клиентский НД на фиг не нужен (в смысле для этой цели) ?
Val (2003-09-18 18:39:00) [29]
>Zacho © (18.09.03 18:23) [4]
По-моему, в данном случае, и TUpdateSQL не нужен.
Насколько я помню, именно для возможности редактирования в интерфейсе достаточно CachedUpdates:=true и
такого финта:
procedure TMyForm.MyQueryUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
// hack
end;
Zacho (2003-09-18 18:23:00) [30]
>
> MsGuns © (18.09.03 18:10) [3]
> И что, дает редактить ?
Дает, конечно.
> Если можно поподробнее, пжлст..
Что именно подробнее ?
Ну, например, у тебя есть запрос SELECT F1,F2,F3 FROM T1 Надо добавить 2 поля, скажем типа integer. Делаем так: SELECT F1,F2,F3, CAST(0 AS INTEGER) AS F4, CAST (0 AS INTEGER) AS F5 FROM T1
Если CachedUpdates:=true и RequestLive:=true; и подключен TUpdateSQL - то прекрасно все редактируется. Естественно, в ModifySQL и т.п. эти "виртуальные" поля упоминать не надо. А если еще надо, что бы НД редактировался, а сама БД не редактировалась, то просто никогда не делаем ApplyUpdates, а по завершении работы с этим Query делаем CancelUpdates.
MsGuns (2003-09-18 18:10:00) [31]
>Zacho © (18.09.03 17:19) [1]
И что, дает редактить ? "Виртуальные" поля ? Если можно поподробнее, пжлст..
>Johnmen © (18.09.03 17:23) [2]
>Или же TClientDataSet.
Жень, ну дочитай же сабж до конца блин ;(
Johnmen (2003-09-18 17:23:00) [32]
Самый простой выход, на мой взгляд, TRxMemoryData.
Или же TClientDataSet.
Zacho (2003-09-18 17:19:00) [33]
> MsGuns © (18.09.03 17:07)
Самый простой вариант: TQuery.CachedUpdates:=true; и в запросе делаешь "фиктивные" поля, т.е SELECT .., CAST(0) AS INTEGER, CAST ("" AS VARCHAR (..)) и т.п.