![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сделать в Query неБазовое поле
lightix © (2003-05-07 10:03:00)Как сделать в Query неБазовое поле (типа как вычисляемое, но чтобы пользователь мог менять его значение)?
MsGuns (2003-05-07 16:04:00) [1]Типичный случай, когда следует отказаться от DW-Aware контролов и все делать с простыми Tedit`ами и им подобными. Ссылочные справочники показывать не "способом для ленивых" (;)) типа DBLookUpComboBox, а отд.модальной формой с возможностью правки "на лету" в зависимости от прав юзера на данный справочник.
На такую панель можно повесить все, что хочешь. А составные "поля" в просмотрах (гридах) лепить запросами или OnGetText. БД же дожна содержать нормализованные данные, ссылающиеся на полноценные справочники.
Тогда можно построить юзерам любые "фигуры" из данных, не меняя при этом бизнес-логику и структуры таблиц.
lightix (2003-05-07 15:22:00) [2]Спасибо ОГРОМНОЕ всем!
Все получилось!
1) Для того чтобы cast сработал с varcharom вместо
cast(null,varchar2(4)) написал cast("",varchar2(4)) - и все ок!
2)Проблему решил следующим образом - в Query выбрал NOTD||NGRP, в свойствах этого поля выставил update=false и на OnSetText :
q_kt_perem->Fields->FieldByName("NOTD")->AsString=
Text.SubString(1,2);
q_kt_perem->Fields->FieldByName("NGRP")->AsString=
Text.SubString(3,4);
Sender->Value=Text;
Вот и все ;)
Еще раз всем спасибо!!!
Danilka (2003-05-07 12:02:00) [3]lightix (07.05.03 11:56)
куда ты ему скажешь :))
та как пишешь изменения датасета?
честно говоря, не работал с NCOCI8, но в БДЕ, чтобы можно было редактировать датасет для TQuery, нужен для него UpdateSQL, в котором прописываются запросы на добавление/изменение/удаление записи.
lightix (2003-05-07 11:56:00) [4]Danilka © (07.05.03 11:52)
NOTD||NGRP - то выберет, но вот куда оно писа"ть будет?
Sergey13 (2003-05-07 11:54:00) [5]2lightix (07.05.03 11:47)
>А где можно почитать про этоот RxMemoryData и т.п. ?
Конкретно по RxMemoryData я читал в хелпе по библиотеке Rx. 8-)
Danilka (2003-05-07 11:52:00) [6]lightix (07.05.03 11:37)
ну и что, несколько таблиц - несколько вьюх :))
а вообще, если у тебя query, то делай NOTD||NGRP прямо в этом запросе и никаких проблем
честно говоря, мне кажется проблема намного меньше, чем ее обсуждение ;))
Zacho (2003-05-07 11:51:00) [7]
> lightix (07.05.03 11:47)
Значит баг в NCOCI8. Или переходи на другие компоненты, или решай эту задачу по другому, здесь уже много чего насоветовали.
> А у тебя точно с VARCHARом работало?
Точно работало, и не только с VARCHAR, а и любыми другими типами. Но на БДЕ.
lightix (2003-05-07 11:47:00) [8]Sergey13 © (07.05.03 11:39)
Я такого еще не слыхал .... А где можно почитать про этоот RxMemoryData и т.п. ?
Zacho © (07.05.03 11:41)
BDE тут не причем, они с ораклом не очень дружат (глючит), я юзаю NCOCI8. А у тебя точно с VARCHARом работало?
Zacho (2003-05-07 11:41:00) [9]
> lightix (07.05.03 11:30)
> 2All
> Сейчас эксперементальным путем вычислил что cast(...) as
> ...
> при включеном кешировании работает! Но с типом integer,
> а с varchar2 почему-то не хочет :(
Ерунда какая-то. У меня с любым типом работало. Может стоит поставить последнюю версию BDE ?
Sergey13 (2003-05-07 11:39:00) [10]2lightix (07.05.03 11:30)
>Имеешь ввиду всю мою таблицу kt_perem вытянуть в память, работать с ней, а потом при комите в реальной таблице все грохнуть и запихнуть содержимое памяти?
Я такое не имею в виду никогда. 8-) Я вообще не имею ввиду тащить ВСЮ таблицу на клиента. Не хорошо это.
Из таблицы делается выборка. Этот датасет копируется в RxMemoryData (например), добавляется новое поле, в цикле по выборке складываешь два поля в одно и показываешь в гриде(или как ты там) юзеру. Он правит поле (не базовое а в памяти). На апдейт этого "памятного" датасета вешай какую угодно обработку. Если проверка на корректность прошла - пиши эту ЗАПИСЬ в БД.
Все. Все счастливы.
lightix (2003-05-07 11:38:00) [11]2Соловьев © (07.05.03 11:35)
Oracle8
lightix (2003-05-07 11:37:00) [12]Danilka © (07.05.03 11:34)
Да, вариант хороший, но лучше было бы без view обойтись - такое ведь не на одной таблице, а на нескольких ...
Соловьев (2003-05-07 11:35:00) [13]
> можно сделать вьюху
СУБД, то какая?
Danilka (2003-05-07 11:34:00) [14]lightix
можно сделать вьюху с составным полем NOTD||NGRP, пусть юзеры вводят в это поле в том виде, в которым это удобно, и сделать триггер на вьюхе, который будет писать введенное значение по разным полям.
и никакого гемороя, на все максимум пол-часа :))
Соловьев ©
мое мнение - нужно меньше выбирать, больше вбивать ручками - получится намного быстрее работа у юзеров после пары дней привыкания.
lightix (2003-05-07 11:30:00) [15]2Соловьев © (07.05.03 11:23)
В одной из программ я так и сделал, но здесь DBCtrlGrid и Edit на него не поставишь :(
2Sergey13 © (07.05.03 11:23)
Имеешь ввиду всю мою таблицу kt_perem вытянуть в память, работать с ней, а потом при комите в реальной таблице все грохнуть и запихнуть содержимое памяти?
2All
Сейчас эксперементальным путем вычислил что cast(...) as ...
при включеном кешировании работает! Но с типом integer, а с varchar2 почему-то не хочет :(
Sergey13 (2003-05-07 11:23:00) [16]2lightix (07.05.03 11:16)
Ну а таблица в памяти? Если выборка небольшая все летает. К тому же удобно анализ изменений писать - не надо никаких ролбэков.
Соловьев (2003-05-07 11:23:00) [17]
> и наврядли согласятся в 2-х DBeditах это все вводить...
>
я же говорю в Edit.Text загнать вычисляемое поле.
lightix (2003-05-07 11:20:00) [18]2Zacho © (07.05.03 11:12)
Вот именно так и сделал -
select t.*,cast(null as varchar2(4)) as podr from kt_perem t
Query1->CachedUpdates=true
Ввожу туда любое значение, перехожу на любое другое поле (в этой же записи) и это значение "исчезает" ...
lightix (2003-05-07 11:16:00) [19]2Соловьев © (07.05.03 11:08)
Дело в том что для групп свой справочник, для отделов свой справочник... Нельзя их в один реквизит загнать ...
А в одном DBEdite они уже привыкли (эти все программы были написаны мною на Oracle forms, и около 2-х лет работали, сейчас переписываю все это на C++Builder, т.к. наконец-то начальство согласилось отказаться от FORMSа ...),
и наврядли согласятся в 2-х DBeditах это все вводить... Хотя надо попробовать...
Zacho (2003-05-07 11:12:00) [20]
> lightix (07.05.03 11:01)
Как именно не помогло ? Что конкретно не получается ?
Общая схема использования таких "фальшивых" полей (предпологается, что используется BDE и TQuery ):
Пишешь запрос типа: SELECT .., CAST(0 AS INTEGER)
Query.CachedUpdates:=true;
Обрабатываешь значения, введенные в это поле в событии OnSetText этого поля или перед ApplyUpdates.