![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редактирование calculated-поля в гриде
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". Смысл ее в том, что пользователь (в МНОГОПОЛЬЗОВАТЕЛЬСКОМ режиме) отмечает несколько записей. Далее с этими записями происходит что-то. А в то же самое время другой пользователь делает то же самое, но с другими записями.