Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
1-27427
AlexanderSK
2003-09-30 13:56
2003.10.09
Новый класс от TFrame


14-27651
Lony
2003-09-22 15:29
2003.10.09
Замок на папку.


1-27597
Кен
2003-09-29 07:20
2003.10.09
Как сделать, чтобы через определённый промежуток времени,


1-27560
anonymous
2003-09-29 14:02
2003.10.09
Есть ли что-нить типа StringGrid1.Cells[i,j] для DBGrid1 ?


1-27562
Lionzi
2003-09-29 15:38
2003.10.09
WindowMenu Tform





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский