Форум: "Базы";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
ВнизРедактируемый отчет Найти похожие ветки
← →
MsGuns (2003-09-18 17:07) [0]Кратко проблема следующая.
Есть форма отчета с N колонками. M из них заполняются информацией из БД, а (N-M) надо дать заполнять узеру как ему надо (этой инфы нет и не может быть в БД).
Вывод в Excel не подходит, т.к. отчет такой замудренный (итоги по группам то печатаются, то нет, например). Я хочу заполнить некую таблицу - грид выбранными данными, а затем дать узеру ее колбасить как заблагорассудится. Была мысль через TStringGrid, но минусы,- гемор с сохранением-восстановлением и морока с QReport`ом. Похоже, клиентский НД самое то.
Но вот беда: никогда с ним не работал. Прорабатываю сейчас хэлп, но надо срочно (до завтра) дать заказчику "редактить отчет" (по его словам)
Если не затруднит, дайте кратко, схематично, сам принцип и алгоритм связок. На таком примере: Есть TQuery, возвращающая поля F1,F2,F3. Требуется заиметь редактируемый НД, в котором к этим 3 полям прога добавить еще 2, которые сама вычислит, и еще 2, которые может редактить узер. Из этого НД (7 полей) я уже буду просто выводить QReport`ом требуемый капризнице отчет. После печати НД надо убивать.
Заранее благодарен за внимание и помощь.
← →
Zacho (2003-09-18 17:19) [1]
> MsGuns © (18.09.03 17:07)
Самый простой вариант: TQuery.CachedUpdates:=true; и в запросе делаешь "фиктивные" поля, т.е SELECT .., CAST(0) AS INTEGER, CAST ("" AS VARCHAR (..)) и т.п.
← →
Johnmen (2003-09-18 17:23) [2]Самый простой выход, на мой взгляд, TRxMemoryData.
Или же TClientDataSet.
← →
MsGuns (2003-09-18 18:10) [3]>Zacho © (18.09.03 17:19) [1]
И что, дает редактить ? "Виртуальные" поля ? Если можно поподробнее, пжлст..
>Johnmen © (18.09.03 17:23) [2]
>Или же TClientDataSet.
Жень, ну дочитай же сабж до конца блин ;(
← →
Zacho (2003-09-18 18:23) [4]
>
> 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.
← →
Val (2003-09-18 18:39) [5]>Zacho © (18.09.03 18:23) [4]
По-моему, в данном случае, и TUpdateSQL не нужен.
Насколько я помню, именно для возможности редактирования в интерфейсе достаточно CachedUpdates:=true и
такого финта:
procedure TMyForm.MyQueryUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
// hack
end;
← →
MsGuns (2003-09-18 18:41) [6]>Zacho © (18.09.03 18:23) [4]
Понял. Щас попробую.
ЗЫ. Интересно, блин, получается все мои многоступенчатые выпендрежи со специально создаваемыми "временными" таблицами (когда нельзя было получить нужные данные одним запросом, а надо было select, потом Insert/Update from Select и т.д.) - есть следствие ламерности и тяжкого наследия парадоксизма ?
ЗЗЫ. Так и клиентский НД на фиг не нужен (в смысле для этой цели) ?
← →
Zacho (2003-09-18 18:44) [7]
> Val © (18.09.03 18:39) [5]
Точно. А я уже и подзабыл.
← →
VAleksey (2003-09-18 18:55) [8]
> MsGuns © (18.09.03 18:41)
RequestLive:=true; Как раз не нужен. Нужен RequestLive:=false;
← →
MsGuns (2003-09-18 19:27) [9]>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;
Не дает в гриде редактить ;(Опции грида нормальные)
← →
MsGuns (2003-09-18 19:33) [10]Кинул TIBUpdateSQL, связал его с запросом - дала редактить в гриде, но уйти с записи не дает - пишет "Нет Update SQL", который мне и на фиг не нужен !!!
← →
kaif (2003-09-18 19:41) [11]Используй TRxMemoryData, если данных мало. Если же данных много и скорость нужна при закачке туда исходного НД - рекомендую тоже бесплатный, но очень быстрый TkbmMemTable с возможностью индексации и быстрого бинарного поиска внутри набора. Можно однако, конечно, насиловать режим IBDataSet.CachedUpdates...
← →
Zacho (2003-09-18 19:42) [12]
> 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:52) [13]чтобы cachedUpdates работал нужно, как правильно говорит Zacho, вписать любой синтаксически верный SQL-запрос в ModifySQL. Еще хорошо бы как-то отключить ForcedRefresh, чтобы не срабатывал RefreshSQL. И желательно вписать в обработчики BeforeDelete и BeforeInsert команду Abort, чтобы при редактировании в Grid-е юзер случайно не мог удалить или вставить запись.
← →
MsGuns (2003-09-18 19:56) [14]>kaif © (18.09.03 19:41) [11]
Спасибо за участие, но не надо предлагать эскаватор с грейдером для того, чтобы посадить дерево ;))
>Zacho © (18.09.03 19:42) [12]
Сделал так:
Во всех TIBUpdateSQL.xxxSQL прописал "SELECT 0 FROM RDB$DATABASE"
В обработчиках TIBQuery.BeforeInsert/Delete поставил "Abort"
Все заработало ! Сейчас проверю, выводит ли все эту байду в отчет...
Спасибо большое,- не надо возиться с клиентским датасетом ;)
← →
MsGuns (2003-09-18 20:24) [15]>kaif © (18.09.03 19:52) [13]
Спасибо Ашот за подробное объяснение, но эт я сам сообразил ;))
Все в репорт выводится - все Ok! Сейчас быстренько встрамлю новые идеи в рабочий проект и... возможно, успею еще и пивка пивануть. Всем большое спасибо ! Zacho © еще и пончик (виртуальный)
← →
Zacho (2003-09-18 20:45) [16]
> MsGuns © (18.09.03 20:24) [15]
Хочу предупредить. В IBX 6.0 я в таком же случае напоролся на весьма неприятный баг - если включено CachedUpdates, а ApplyUpdates не делается, сначало - Filtered:=false; и заполняются/изменяются значения "фиктивных" полей, то после Filtered:=true; при обращении к датасету в "фиктивных" полях довольно хаотично появляются прежние значения. А без фильтра - все нормально.
Впрочем, возможно, в более свежих версиях IBX этот баг исправлен.
← →
MsGuns (2003-09-18 20:53) [17]Так ведь на кой его фильтровать, отчет-то ? Он и так ведь типа уже "фильтрован" дОнельзя ? Не буду я ставить Filtered в true чесслово !!!
← →
Deniz (2003-09-19 07:27) [18]В догонку вопрос.
А почему в обсуждении от TClientDataSet отказались не рассматривая?
← →
Danilka (2003-09-19 08:37) [19]Deniz © (19.09.03 07:27)
дык, лишняя длл-ка, и еще кажется (не уверен) денег стоит.
← →
Johnmen (2003-09-19 11:34) [20]>MsGuns © (18.09.03 18:10) [3]
>>Johnmen © (18.09.03 17:23) [2]
>>Или же TClientDataSet.
>Жень, ну дочитай же сабж до конца блин ;(
Серега, я не понял, что ты имел в виду... Твой вопрос мной был прочитан. До конца.
По поводу применения TClientDataSet.
Все реализуется быстро (15-30 мин.), легко и просто. Никаких подводных камней. Полностью удовлетворяет твоим требованиям. Плюс возможность не только изменять, но и добавлять/удалять.
Всё...:)
← →
Danilka (2003-09-19 12:31) [21]Johnmen © (19.09.03 11:34)
В вопросе он написал, что похоже ему подойдет TClientDataSet и спрашивал как с ним работать, но его отговорили:
>...Похоже, клиентский НД самое то.
>Но вот беда: никогда с ним не работал...
Для TClientDataSet, как я понимаю, нужен midas.dll, а никаких денег дополнительных платить не нужно, это я с чем-то его спутал?
← →
MsGuns (2003-09-19 12:58) [22]>Johnmen © (19.09.03 11:34) [20]
>По поводу применения TClientDataSet.
Все реализуется быстро (15-30 мин.), легко и просто. Никаких подводных камней. Полностью удовлетворяет твоим требованиям. Плюс возможность не только изменять, но и добавлять/удалять.
Жень, да кто ж спорит. Нет сложных вещей - все очень просто. Когда знаешь. Так, как мне посоветовал Zacho (TQuery+TUpdateSQL) мне показалось проще и, главное, быстрее. В данном конкретном случае я выбрал то, что быстрее, хотя клиентский НД, ИМХО, вещь действительно стОящая и никуда от меня не уйдет. В сабже я пытался дать понять, что у меня нет вопросов по TClientDataSet по одной простой причине - я им еще не пользовался и, следовательно, не изучал. Лезть же в форум с вопросом на тему, по которой у меня куча инфы, до которой банально не дошли глаза и руки, считаю делом недостойным.
← →
Deniz (2003-09-19 14:07) [23]Так все таки TQuery или TIBQuery?
Дело в том, что ни та(BDE) ни другая(IBX) технология грамотно обрыв связи не обрабатывает, а вот TClientDataSet по барабану коннект, + добавление индексов "на лету" + фильтрация + сохранение готового набора в файл + ... короче, ИМХО, плюсов больше, а гемороя меньше. А пару DLL (если память не изменяет midas.dll+dbclient.dll) - это не проблема.
← →
MsGuns (2003-09-19 14:32) [24]>Deniz © (19.09.03 14:07) [23]
>Так все таки TQuery или TIBQuery?
Все IB, ессно. Хотя в принципе по сабжу - один хрен ;))
В данном случае у меня не стоит трабла обрыва, т.к. прога будет работать с "домашней" БД да к тому же без конкурентов ;)
← →
Leran2002 (2003-09-19 16:39) [25]
> Danilka © (19.09.03 08:37) [19]
В 6-х и 7-ых Дельфях можна включить модули:
uses Crtl, MidasLib;
И никаких ДДЛ-ок не надо... :))
← →
Leran2002 (2003-09-19 16:42) [26]Сори ДЛЛ-ок... :))
← →
Sandman25 (2003-09-19 16:43) [27]"И никаких ДДЛ-ок" было круче :)
Долой "create table" :)
← →
Leran2002 (2003-09-19 16:47) [28]
> Sandman25 © (19.09.03 16:43) [27]
> Долой "create table" :)
???
← →
Sandman25 (2003-09-19 16:51) [29]DDL - Data Definition Language, часть SQL, для описания данных.
← →
Vlad (2003-09-19 16:51) [30]Шутит он так, в ответ на твое "Никаких ДДЛ-ок" :)
Create table - DDL (Data Definition Language)
← →
Leran2002 (2003-09-19 16:56) [31]Ок... Понял... Спасибо за разъяснение... :)
← →
Виталий Панасенко (2003-09-19 17:47) [32]Есть генератор отчетов на основе RTF, использует Word - можно чт охочешь редактировать ! Могу подогнать, если нету..
← →
kaif (2003-09-19 19:00) [33]Насколько мне известно, Midas не входит в Delphi Professional. Так как стоимость Delphi Professional менее $1000, многие разработчики ее покупают и работают вообще легитимно. А вот Enterprise таким разработчикам пока не по карману. Я думаю, речь шла об этом.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c