Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Редактирование calculated-поля в гриде


Страницы:   1 2

Tlotr ©   (2002-11-29 14:43:00) 

Возможно ли такое ?
У меня не получается.... :(


Юрий Жуков   (2002-12-02 13:50:00) [1]

>ЮЮ Для какого поля это делается?Для возвращенного запросом, и его FieldKind заменяется с fkData на fkInternalCalc?

Да именно так я и поступаю.


KSergey   (2002-12-02 10:53:00) [2]

Попробую спросить ще раз, а то в прошлый при аналогичном диспуте не ответили: не может ли кто поподробнее описать тип поля fkInternalCalc, как с ним работать и отличия от fkCalc? В хелпе не совсем секу нюансы и отличия...


ЮЮ   (2002-12-02 10:08:00) [3]

FieldKind:=fkInternalCalc
Это, по сути и есть вариант 1), когда поле присутствует в DataSete, но не сохраняется в таблице.

Чисто практический вопрос по "я делаю FieldKind:=fkInternalCalc".
Для какого поля это делается? Для возвращенного запросом, и его FieldKind заменяется с fkData на fkInternalCalc? Или это поле над добавить как fcCalculated и изменить FieldKind ?


Юрий Жуков   (2002-12-02 09:04:00) [4]

Не знаю как там в ваших датасетах, но я делаю
FieldKind:=fkInternalCalc
И все. Это работает в ToracleDataSet из DOA


ЮЮ   (2002-12-02 03:41:00) [5]

>А не мог бы ты поделиться исходниками данного опыта ?

Дело в том, что меня уже более 2х лет не интересуют никакие DBGrid-ы, т.е. компоненты, работающие с записями БД, а не объектами предметной области, хранящимися в БД. Мой последний опыт датировант мартом 2000, является компонентом для D3 и получен в рез-те непосредственного препарироваия актуального на тот момент DBGridEh, так что вряд ли может быть использован непосредственно. Если всё ещё интересует, могу выслать.

Сейчас я работаю над скромненьким таким :-) проектом TObjectGrid, позволяющим отображать в необходимом виде и редактировать в одном гриде записи из разных таблиц (точнее, объекты предметной области, хранящихся в различных таблицах). Через пару недель могу поделиться :-)


ЮЮ   (2002-12-02 03:14:00) [6]

>поле не совсем фиктивное, а должно существовать ТОЛЬКО на клиенте и напрочь отсутсвовать реально, но при этом пользователь должен иметь возможность ввести туда какие-либо данные (временные) и не мешая делать то же самое другому пользователю

По отношению к DataSety - оно фиктивное. В общем случае, DataSet работает с одной, текущей записью, он даже не в состоянии определить порядковый номер этой записи (RecNo). Он должен перетянуть на клиента все записи, чтобы это заработало. После этого на клиенте имеется область памяти, где размещены все записи. Отсюда - два пути для достижения твоей цели:
1) В запрсе запросить поле, которое ни в коем случае не будешь пытыться сохранить назад и использовать его на клиенте в вышеуказанных целях
2) Создать в памяти собственную структуру , обеспечив однозначное соответствие "запись - элемент структуры" и использовать её

Так и не уразумею, для чего оно нужно. :-((


Tlotr   (2002-12-01 15:08:00) [7]

2 BlackTiger:
Tnx. Попробую.


BlackTiger   (2002-12-01 13:06:00) [8]

2Tlotr: бери на вооружение RxMemoryData или аналог (есть несколько, не не помню названия). Если данных не очень много, то на производительности не отразится. Сценарий такой:
1. Формируешь набор полей в RxMemoryData (либо в дизайнере, либо кодом)
2. При открытии формы загружаешь данные из ОСНОВНОГО датасета в RxMemoryData (метод LoadFromDataSet())
3. Делаешь все что хочешь с данными (можешь изменения сохранять немедленно при их вводе или отложи до закрытие формы)
4. При закрытии формы обрабатываешь все изменения

Если данных много, то будут несколько повышенные запросы к объему оперативки рабочей станции (чтобы не шла постоянная работа с файлом подкачки). Ну и при загрузке и обработке данных несколько все притормоэит, хотя сам компонент загружает данные очень шустро.
ЗАМЕТКА! RxMemoryData загрузит данные из тех полей, которые по имени совпадают с датасетом.

ЮЮ: поле не совсем фиктивное, а должно существовать ТОЛЬКО на клиенте и напрочь отсутсвовать реально, но при этом пользователь должен иметь возможность ввести туда какие-либо данные (временные) и не мешая делать то же самое другому пользователю. Ситуация - сплошь и рядом, только ее пытаются избегать.


Tlotr   (2002-12-01 04:43:00) [9]

2ЮЮ:
А я делал это в гриде :-)

А не мог бы ты поделиться исходниками данного опыта ?
А то как-то не по-человечески все равно у меня прога выглядит с окошечком... хотя все работает.


ЮЮ   (2002-11-30 11:36:00) [10]

>А может есть где нибудь Table с возможностью ...
... извратьться :-)
Ну зачем, скажи, оно нужно, если оно "фиктивное", т.е. его даже хранить не надо?


BlackTiger   (2002-11-30 11:02:00) [11]

Изврата и только изврат.
А может есть где нибудь Table с возможностью вставить "фиктивные" поля?


ЮЮ   (2002-11-30 07:36:00) [12]

А я делал это в гриде :-)
Немного правишь код грида, лучше навороченного наследника, чтобы не редактировались только поля грида (а не датасета), у которых стоит ReadOnly. Теперь если y Calculated поставитть ReadOnly = false появляется стандартный InplaceEditor. B Column добавил обработчик OnBeforeUpdateCell, который вызывается после получения значения полем при выходе из InplaceEditora. Там анализировал, что ввёл пользователь и изменял реальные поля, значения которых используются в вычислимом поле и в результате пользователь видел в гриде как раз то (или почти то :-), что он ввёл


Tlotr   (2002-11-30 02:47:00) [13]

Резюма:
Решение основано на совете Victor_Cr.

Использовал DBGridEh, IBQuery, поле string fkCalculated
На ячейке постоянно видна кнопка редактирования типа Ellipsis,
по нажатию на которую открывается форма редактирования значения.

Написаны четыре функции преобразования данных:
NumToStr, NettoToStr, которые приобразуют значения из 12345в "12 345 шт"для целых и из 12345,678в "12 345,678 тн"для float, которые вызываются для отображения данных в ячейке в нужном формате.
Единственное неудобство - модальное окно редактирования. :(

Т.о. решена поставленная задача. Всем спасибо.


BlackTiger   (2002-11-29 20:12:00) [14]

RxMemoryTable - это таблица в памяти. Все как у таблицы, но сама "таблица" не привязана ни к чему и хранится только в памяти клиента (следовательно есть требования к памяти, но на это есть виртуальная память винды). Есть возможность загрузить данные из стандортного датасета и загрузить в него (второе не пробовал).
Правда вот у меня обнаружилась проблема с фильтрацией - проверку на вхождение в допустимые значения надо писать самому (определять руками метод OnFilter), сам он (этот компонент) этого не делает.
А так - только через него (и аналоги) и получаются такие фишки. Зато можно редактировать заведомо нередактируемые данные (SELECT с группировкой, к примеру).


Tlotr   (2002-11-29 19:56:00) [15]

2 Andriano:
Ну, наверное, это не свсем правильно - хранить на сервере параметры предстваления данных у клиента ? ;) Ну, оно понятно, что изврат вре равно будет, но лишняя колонка в таблице или таблица, это уже, наверное все-таки перебор.

А если RxMemoryData полностью совместим, то что значит "бегать" ? То есть типа First, Last ? Он что-то вроде массива в памяти ?


Andriano   (2002-11-29 16:24:00) [16]

Интересно. Этот вопрос возникает на форуме примерно раз в две недели.

Действительно нужная штука.
Я решил эту проблему с помощью врем. таблиц, т.к. с ними потом легко работать, т.е. обработка одним запросом. Врем. таблицы храню в разрезе пользователей.

Пробовал черех RxMemoryData, получилось красиво и живо, и scrollbar-ы приятно выглядят. И работать с RxMemoryData ОЧЕНЬ легко: полностью совместим с TDataSet. Но есть одно неудобство - потом при обработке придётся бегать по этим RxMemoryData.

Вот ещё способ: В таблице, для кот. требуется обработка, добавить поле нужного типа. Это поле добавлять в SelectSQL, но не использовать в UpdateSQL. В итоге значения будут храниться во внутр. кэше DataSet-а.

А ещё можно завести таблицу в которой будут храниться помеченные записи из другой таблицы, т.е. номер_записи. Одна колонка. И правильно написать UpdateSQL, который будет удалять запись, если снята пометка и добавлять если выставлена пометка. Правда, наверное, придётся вызывать храним. процедуру из UpdateSQL, но это не сложно. Ещё придётся подумать над расставлением галочек при открытии таблицы.


Victor_Cr   (2002-11-29 16:02:00) [17]


> Tlotr (29.11.02 15:49)
> 2 Victor_Cr ©
> Tnx. Интересная мысль... :)

Пользуйся на здоровье :)


Victor_Cr   (2002-11-29 16:02:00) [18]


> Tlotr (29.11.02 15:49)
> 2 Victor_Cr ©
> Tnx. Интересная мысль... :)

Gjkmpeqcz yf pljhjdmt :)


Tlotr   (2002-11-29 15:49:00) [19]

2 Victor_Cr ©
Tnx. Интересная мысль... :)


BlackTiger   (2002-11-29 15:42:00) [20]

Интересно, а как без "таблиц в памяти" сделать такое:

Необходима колонка вроде "Record Is Marked". Смысл ее в том, что пользователь (в МНОГОПОЛЬЗОВАТЕЛЬСКОМ режиме) отмечает несколько записей. Далее с этими записями происходит что-то. А в то же самое время другой пользователь делает то же самое, но с другими записями.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо