Форум: "Базы";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
ВнизРедактирование calculated-поля в гриде Найти похожие ветки
← →
Tlotr (2002-11-29 14:43) [0]Возможно ли такое ?
У меня не получается.... :(
← →
Tlotr (2002-11-29 14:44) [1]Сорри. D6+IB6
← →
makdi (2002-11-29 15:05) [2]На то оно и вычисляемое, чтоб его не редактировать, оно вычисляется. :)
Как ты себе представляешь провести обратное преобразование?
← →
BlackTiger (2002-11-29 15:12) [3]makdi - Самое смешное, что в хелпе НАПИСАНО, что вычисляемые поля МОЖНО редактировать, при этом введенное значение просто потеряется.
НО!!!! Нифига не работает. Обманули... Кинули сссс...волочи.
← →
makdi (2002-11-29 15:16) [4]BlackTiger
Не все в хелпе правильно пишут, люди ведь писали вот описались :))
Нельзя тупо верить тому что написано - попробуй исполни и после этого можно сказать "Да действительно это работает" :).
Как говорил Лебедь: "Одна старушка на заборе прочитала - потрогала окозался сучок!" :))
← →
Victor_Cr (2002-11-29 15:23) [5]Можно... но только изменив изначальные величины. Я это делал с помошью диалогового окна, т.е. нажал на кнопочку рядом со значением - вылезло окошко - вписал значение - изменил поля, которые используются в вычислениях - радуешься :-)).
← →
BlackTiger (2002-11-29 15:31) [6]Выдержка из хелпа (D6, "CLX Reference", "property FieldKind")
---------------------------------------
Note: Fields calculated by SQL servers have a FieldKind of fkInternalCalc, not fkCalculated. This is because the field values are stored in the dataset. Calculated fields in a client dataset that are calculated in an OnCalcFields event handler but stored in
the dataset also have a FieldKind of fkInternalCalc instead of fkCalculated. Unlike regular calculated fields, internally calculated fields can be used in filter expressions. They can be edited, but the changes are discarded. To prevent editing, set the ReadOnly property to True.
---------------------------------------
Хотя только сейчас дошло - эта фраза есть только в CLX-версии описания и отсутствует в VCL.
← →
BlackTiger (2002-11-29 15:42) [7]Интересно, а как без "таблиц в памяти" сделать такое:
Необходима колонка вроде "Record Is Marked". Смысл ее в том, что пользователь (в МНОГОПОЛЬЗОВАТЕЛЬСКОМ режиме) отмечает несколько записей. Далее с этими записями происходит что-то. А в то же самое время другой пользователь делает то же самое, но с другими записями.
← →
Tlotr (2002-11-29 15:49) [8]2 Victor_Cr ©
Tnx. Интересная мысль... :)
← →
Victor_Cr (2002-11-29 16:02) [9]
> Tlotr (29.11.02 15:49)
> 2 Victor_Cr ©
> Tnx. Интересная мысль... :)
Gjkmpeqcz yf pljhjdmt :)
← →
Victor_Cr (2002-11-29 16:02) [10]
> Tlotr (29.11.02 15:49)
> 2 Victor_Cr ©
> Tnx. Интересная мысль... :)
Пользуйся на здоровье :)
← →
Andriano (2002-11-29 16:24) [11]Интересно. Этот вопрос возникает на форуме примерно раз в две недели.
Действительно нужная штука.
Я решил эту проблему с помощью врем. таблиц, т.к. с ними потом легко работать, т.е. обработка одним запросом. Врем. таблицы храню в разрезе пользователей.
Пробовал черех RxMemoryData, получилось красиво и живо, и scrollbar-ы приятно выглядят. И работать с RxMemoryData ОЧЕНЬ легко: полностью совместим с TDataSet. Но есть одно неудобство - потом при обработке придётся бегать по этим RxMemoryData.
Вот ещё способ: В таблице, для кот. требуется обработка, добавить поле нужного типа. Это поле добавлять в SelectSQL, но не использовать в UpdateSQL. В итоге значения будут храниться во внутр. кэше DataSet-а.
А ещё можно завести таблицу в которой будут храниться помеченные записи из другой таблицы, т.е. номер_записи. Одна колонка. И правильно написать UpdateSQL, который будет удалять запись, если снята пометка и добавлять если выставлена пометка. Правда, наверное, придётся вызывать храним. процедуру из UpdateSQL, но это не сложно. Ещё придётся подумать над расставлением галочек при открытии таблицы.
← →
Tlotr (2002-11-29 19:56) [12]2 Andriano:
Ну, наверное, это не свсем правильно - хранить на сервере параметры предстваления данных у клиента ? ;) Ну, оно понятно, что изврат вре равно будет, но лишняя колонка в таблице или таблица, это уже, наверное все-таки перебор.
А если RxMemoryData полностью совместим, то что значит "бегать" ? То есть типа First, Last ? Он что-то вроде массива в памяти ?
← →
BlackTiger (2002-11-29 20:12) [13]RxMemoryTable - это таблица в памяти. Все как у таблицы, но сама "таблица" не привязана ни к чему и хранится только в памяти клиента (следовательно есть требования к памяти, но на это есть виртуальная память винды). Есть возможность загрузить данные из стандортного датасета и загрузить в него (второе не пробовал).
Правда вот у меня обнаружилась проблема с фильтрацией - проверку на вхождение в допустимые значения надо писать самому (определять руками метод OnFilter), сам он (этот компонент) этого не делает.
А так - только через него (и аналоги) и получаются такие фишки. Зато можно редактировать заведомо нередактируемые данные (SELECT с группировкой, к примеру).
← →
Tlotr (2002-11-30 02:47) [14]Резюма:
Решение основано на совете Victor_Cr.
Использовал DBGridEh, IBQuery, поле string fkCalculated
На ячейке постоянно видна кнопка редактирования типа Ellipsis,
по нажатию на которую открывается форма редактирования значения.
Написаны четыре функции преобразования данных:
NumToStr, NettoToStr, которые приобразуют значения из 12345 в "12 345 шт" для целых и из 12345,678 в "12 345,678 тн" для float, которые вызываются для отображения данных в ячейке в нужном формате.
Единственное неудобство - модальное окно редактирования. :(
Т.о. решена поставленная задача. Всем спасибо.
← →
ЮЮ (2002-11-30 07:36) [15]А я делал это в гриде :-)
Немного правишь код грида, лучше навороченного наследника, чтобы не редактировались только поля грида (а не датасета), у которых стоит ReadOnly. Теперь если y Calculated поставитть ReadOnly = false появляется стандартный InplaceEditor. B Column добавил обработчик OnBeforeUpdateCell, который вызывается после получения значения полем при выходе из InplaceEditora. Там анализировал, что ввёл пользователь и изменял реальные поля, значения которых используются в вычислимом поле и в результате пользователь видел в гриде как раз то (или почти то :-), что он ввёл
← →
BlackTiger (2002-11-30 11:02) [16]Изврата и только изврат.
А может есть где нибудь Table с возможностью вставить "фиктивные" поля?
← →
ЮЮ (2002-11-30 11:36) [17]>А может есть где нибудь Table с возможностью ...
... извратьться :-)
Ну зачем, скажи, оно нужно, если оно "фиктивное", т.е. его даже хранить не надо?
← →
Tlotr (2002-12-01 04:43) [18]2ЮЮ:
А я делал это в гриде :-)
А не мог бы ты поделиться исходниками данного опыта ?
А то как-то не по-человечески все равно у меня прога выглядит с окошечком... хотя все работает.
← →
BlackTiger (2002-12-01 13:06) [19]2Tlotr: бери на вооружение RxMemoryData или аналог (есть несколько, не не помню названия). Если данных не очень много, то на производительности не отразится. Сценарий такой:
1. Формируешь набор полей в RxMemoryData (либо в дизайнере, либо кодом)
2. При открытии формы загружаешь данные из ОСНОВНОГО датасета в RxMemoryData (метод LoadFromDataSet())
3. Делаешь все что хочешь с данными (можешь изменения сохранять немедленно при их вводе или отложи до закрытие формы)
4. При закрытии формы обрабатываешь все изменения
Если данных много, то будут несколько повышенные запросы к объему оперативки рабочей станции (чтобы не шла постоянная работа с файлом подкачки). Ну и при загрузке и обработке данных несколько все притормоэит, хотя сам компонент загружает данные очень шустро.
ЗАМЕТКА! RxMemoryData загрузит данные из тех полей, которые по имени совпадают с датасетом.
ЮЮ: поле не совсем фиктивное, а должно существовать ТОЛЬКО на клиенте и напрочь отсутсвовать реально, но при этом пользователь должен иметь возможность ввести туда какие-либо данные (временные) и не мешая делать то же самое другому пользователю. Ситуация - сплошь и рядом, только ее пытаются избегать.
← →
Tlotr (2002-12-01 15:08) [20]2 BlackTiger:
Tnx. Попробую.
← →
ЮЮ (2002-12-02 03:14) [21]>поле не совсем фиктивное, а должно существовать ТОЛЬКО на клиенте и напрочь отсутсвовать реально, но при этом пользователь должен иметь возможность ввести туда какие-либо данные (временные) и не мешая делать то же самое другому пользователю
По отношению к DataSety - оно фиктивное. В общем случае, DataSet работает с одной, текущей записью, он даже не в состоянии определить порядковый номер этой записи (RecNo). Он должен перетянуть на клиента все записи, чтобы это заработало. После этого на клиенте имеется область памяти, где размещены все записи. Отсюда - два пути для достижения твоей цели:
1) В запрсе запросить поле, которое ни в коем случае не будешь пытыться сохранить назад и использовать его на клиенте в вышеуказанных целях
2) Создать в памяти собственную структуру , обеспечив однозначное соответствие "запись - элемент структуры" и использовать её
Так и не уразумею, для чего оно нужно. :-((
← →
ЮЮ (2002-12-02 03:41) [22]>А не мог бы ты поделиться исходниками данного опыта ?
Дело в том, что меня уже более 2х лет не интересуют никакие DBGrid-ы, т.е. компоненты, работающие с записями БД, а не объектами предметной области, хранящимися в БД. Мой последний опыт датировант мартом 2000, является компонентом для D3 и получен в рез-те непосредственного препарироваия актуального на тот момент DBGridEh, так что вряд ли может быть использован непосредственно. Если всё ещё интересует, могу выслать.
Сейчас я работаю над скромненьким таким :-) проектом TObjectGrid, позволяющим отображать в необходимом виде и редактировать в одном гриде записи из разных таблиц (точнее, объекты предметной области, хранящихся в различных таблицах). Через пару недель могу поделиться :-)
← →
Юрий Жуков (2002-12-02 09:04) [23]Не знаю как там в ваших датасетах, но я делаю
FieldKind:=fkInternalCalc
И все. Это работает в ToracleDataSet из DOA
← →
ЮЮ (2002-12-02 10:08) [24]FieldKind:=fkInternalCalc
Это, по сути и есть вариант 1), когда поле присутствует в DataSete, но не сохраняется в таблице.
Чисто практический вопрос по "я делаю FieldKind:=fkInternalCalc".
Для какого поля это делается? Для возвращенного запросом, и его FieldKind заменяется с fkData на fkInternalCalc? Или это поле над добавить как fcCalculated и изменить FieldKind ?
← →
KSergey (2002-12-02 10:53) [25]Попробую спросить ще раз, а то в прошлый при аналогичном диспуте не ответили: не может ли кто поподробнее описать тип поля fkInternalCalc, как с ним работать и отличия от fkCalc? В хелпе не совсем секу нюансы и отличия...
← →
Юрий Жуков (2002-12-02 13:50) [26]>ЮЮ Для какого поля это делается?Для возвращенного запросом, и его FieldKind заменяется с fkData на fkInternalCalc?
Да именно так я и поступаю.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c