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

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

Сделать в Query неБазовое поле


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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