Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Редактируемый отчет   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
14-27683
Alexia2
2003-09-22 10:40
2003.10.09
Что-то не получается!


3-27400
niko4543
2003-09-18 09:43
2003.10.09
Добавление динамически нового поля


1-27556
Alexia
2003-09-29 16:20
2003.10.09
Вызов PopupMenu


3-27341
Нитолай
2003-09-19 18:08
2003.10.09
Date


3-27322
lamer1
2003-09-21 16:03
2003.10.09
DCOM