Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

Сделать в Query неБазовое поле   Найти похожие ветки 

 
lightix   (2003-05-07 10:03) [0]

Как сделать в Query неБазовое поле (типа как вычисляемое, но чтобы пользователь мог менять его значение)?


 
passm ©   (2003-05-07 10:09) [1]

Например:
SELECT T1.FIELD1, T1.FIELD2, CAST(NULL AS INTEGER) AS MODE_FIELD
FROM TABLE1 AS T1

И позволь менять MODE_FIELD.


 
Anatoly Podgoretsky ©   (2003-05-07 10:11) [2]

Парадокса не наблюдаешь между вычисляемым и редактируемым.


 
Соловьев ©   (2003-05-07 10:12) [3]


> типа как вычисляемое, но чтобы пользователь мог менять его
> значение)?

меняешь те поля которые участвуют в вычислениях. а вычисляемое менять нельзя.


 
passm ©   (2003-05-07 10:18) [4]

Anatoly Podgoretsky © (07.05.03 10:11)> Нет. Вопрос не звучит: как редактировать вычисляемое поле...
А кто сказал, что Paradox? ;))
Я понял, что ему нужно сгенерировать поле SQL"ем и редактировать.


 
Sergey13 ©   (2003-05-07 10:30) [5]

2lightix (07.05.03 10:03)
Нормально, ИМХО, никак. Придется поизвращаться. Я в таких случаях использую таблицы в памяти RxMemoryData.


 
Zacho ©   (2003-05-07 10:38) [6]


> Sergey13 © (07.05.03 10:30)

Да почему никак ? См. passm © (07.05.03 10:09) и еще, скорее всго, потребуется включить CascedUpdates. Сам так делаю, имхо нормальный способ.


 
lightix   (2003-05-07 10:40) [7]

Написал так:
select t.*,t.rowid,cast(null as varchar2(4)) as podr from kt_perem as t
where nvl(prz,0)=0
and tabn=:TABN

Редактироваться оно то редактируется, но когда перехожу на любое другое поле, оно чистится :(((
А мне нужно чтобы значение сохранялось (в Query)... и чтобы его можно было потом использовать ...

На форме стоит DBCtrlGrid ну и на нем DBEdit...
В таблице имеются поля
NOTD VARCHAR2(2);
NGRP VARCHAR2(2);

Поле PODR вычисляется как NOTD || NGRP. Если Пользователь изменил значение PODR то первые 2 символа идут в NOTD, остальные в NGRP..
и т.п.


 
Danilka ©   (2003-05-07 10:45) [8]

lightix
а для чего это может понадобиться, если не секрет? просо, не могу прдставить такой ситуации


 
Sergey13 ©   (2003-05-07 10:49) [9]

2lightix (07.05.03 10:40)
Судя по запросу Оракл+ДОА, я прав?
Так он тебе не даст редактировать, потому что в таблице нет такого поля kt_perem.


 
lightix   (2003-05-07 10:52) [10]

В таблице в отдельных полях хранится NOTD -номер отдела
и NGRP - номер группы
например 01 и 02
в некоторых программах юзера не хотят вводить их в отдельных полях, хочет в одном как 0102, а в других программах наоборот вот и приходится извращаться ....


 
Соловьев ©   (2003-05-07 10:55) [11]


> некоторых программах юзера не хотят вводить их в отдельных
> полях, хочет в одном как 0102

прямой путь к недостоверным данным. Юзеры не должны их вводить, а выбирать из справочника.


 
Zacho ©   (2003-05-07 10:58) [12]


> lightix (07.05.03 10:40)
> Редактироваться оно то редактируется, но когда перехожу
> на любое другое поле, оно чистится :(((

CachedUpdates:=true - и все изменения в этом поле будут сохраняться. Не забудь в нужном месте сделать ApplyUpdates. Еще тебе могут пригодиться события TField.OnGetText и TFiled.OnSetText


 
Sergey13 ©   (2003-05-07 11:01) [13]

2lightix (07.05.03 10:52)
Соловьев © (07.05.03 10:55) прав.
А уж если хочется именно так, то поставь рядышком 2 дбедита и будет юзерам счастье. 8-)


 
lightix   (2003-05-07 11:01) [14]

2Соловьев:
Не хотят они выбирать... а проверка на наличие в справочнике должна быть...

2Sergey13:
Оракл+NCOCI8
kt_perem это не поле а таблица.

Кеширование на Query включил, не помогло...
Так что делать-то, посоветуйте?


 
Anatoly Podgoretsky ©   (2003-05-07 11:05) [15]

После изменения по определению поле должно снова вычислиться и вся работа насмарку, иначе поле не вычисляемое, в этом и весь парадокс.

passm © (07.05.03 10:18)
Ты знаешь слово Парадокс это не только база данных такого типа.


 
Sergey13 ©   (2003-05-07 11:08) [16]

2lightix (07.05.03 11:01)
>kt_perem это не поле а таблица
Сори, не то скопировал. Хотел podr.
>Так что делать-то, посоветуйте?
Читай выше. Много насоветовали уже. 8-)
Юзер - он не клиент, и потому не всегда прав.


 
Соловьев ©   (2003-05-07 11:08) [17]


> Не хотят они выбирать... а проверка на наличие в справочнике
> должна быть...

геморой конечно... у меня тоже юзеры попорченные...:))
я думаю может тогда сделать так: вычислить поле, onCalcField
и присвоить значение Edit пусть себе юзеры редактят. А потом перед сохранением бей на части(вот тут геморой и начинается) и исчи в справочниках... ИМХО, геморой обеспечен... Что хоть за хадача? може структура БД неверна?


 
Zacho ©   (2003-05-07 11:12) [18]


> lightix (07.05.03 11:01)

Как именно не помогло ? Что конкретно не получается ?
Общая схема использования таких "фальшивых" полей (предпологается, что используется BDE и TQuery ):
Пишешь запрос типа: SELECT .., CAST(0 AS INTEGER)
Query.CachedUpdates:=true;
Обрабатываешь значения, введенные в это поле в событии OnSetText этого поля или перед ApplyUpdates.


 
lightix   (2003-05-07 11:16) [19]

2Соловьев © (07.05.03 11:08)
Дело в том что для групп свой справочник, для отделов свой справочник... Нельзя их в один реквизит загнать ...
А в одном DBEdite они уже привыкли (эти все программы были написаны мною на Oracle forms, и около 2-х лет работали, сейчас переписываю все это на C++Builder, т.к. наконец-то начальство согласилось отказаться от FORMSа ...),
и наврядли согласятся в 2-х DBeditах это все вводить... Хотя надо попробовать...


 
lightix   (2003-05-07 11:20) [20]

2Zacho © (07.05.03 11:12)
Вот именно так и сделал -
select t.*,cast(null as varchar2(4)) as podr from kt_perem t
Query1->CachedUpdates=true

Ввожу туда любое значение, перехожу на любое другое поле (в этой же записи) и это значение "исчезает" ...


 
Соловьев ©   (2003-05-07 11:23) [21]


> и наврядли согласятся в 2-х DBeditах это все вводить...
>

я же говорю в Edit.Text загнать вычисляемое поле.


 
Sergey13 ©   (2003-05-07 11:23) [22]

2lightix (07.05.03 11:16)
Ну а таблица в памяти? Если выборка небольшая все летает. К тому же удобно анализ изменений писать - не надо никаких ролбэков.


 
lightix   (2003-05-07 11:30) [23]

2Соловьев © (07.05.03 11:23)
В одной из программ я так и сделал, но здесь DBCtrlGrid и Edit на него не поставишь :(

2Sergey13 © (07.05.03 11:23)
Имеешь ввиду всю мою таблицу kt_perem вытянуть в память, работать с ней, а потом при комите в реальной таблице все грохнуть и запихнуть содержимое памяти?

2All
Сейчас эксперементальным путем вычислил что cast(...) as ...
при включеном кешировании работает! Но с типом integer, а с varchar2 почему-то не хочет :(


 
Danilka ©   (2003-05-07 11:34) [24]

lightix
можно сделать вьюху с составным полем NOTD||NGRP, пусть юзеры вводят в это поле в том виде, в которым это удобно, и сделать триггер на вьюхе, который будет писать введенное значение по разным полям.
и никакого гемороя, на все максимум пол-часа :))

Соловьев ©
мое мнение - нужно меньше выбирать, больше вбивать ручками - получится намного быстрее работа у юзеров после пары дней привыкания.


 
Соловьев ©   (2003-05-07 11:35) [25]


> можно сделать вьюху

СУБД, то какая?


 
lightix   (2003-05-07 11:37) [26]

Danilka © (07.05.03 11:34)
Да, вариант хороший, но лучше было бы без view обойтись - такое ведь не на одной таблице, а на нескольких ...


 
lightix   (2003-05-07 11:38) [27]

2Соловьев © (07.05.03 11:35)
Oracle8


 
Sergey13 ©   (2003-05-07 11:39) [28]

2lightix (07.05.03 11:30)
>Имеешь ввиду всю мою таблицу kt_perem вытянуть в память, работать с ней, а потом при комите в реальной таблице все грохнуть и запихнуть содержимое памяти?

Я такое не имею в виду никогда. 8-) Я вообще не имею ввиду тащить ВСЮ таблицу на клиента. Не хорошо это.
Из таблицы делается выборка. Этот датасет копируется в RxMemoryData (например), добавляется новое поле, в цикле по выборке складываешь два поля в одно и показываешь в гриде(или как ты там) юзеру. Он правит поле (не базовое а в памяти). На апдейт этого "памятного" датасета вешай какую угодно обработку. Если проверка на корректность прошла - пиши эту ЗАПИСЬ в БД.
Все. Все счастливы.


 
Zacho ©   (2003-05-07 11:41) [29]


> lightix (07.05.03 11:30)
> 2All
> Сейчас эксперементальным путем вычислил что cast(...) as
> ...
> при включеном кешировании работает! Но с типом integer,
> а с varchar2 почему-то не хочет :(

Ерунда какая-то. У меня с любым типом работало. Может стоит поставить последнюю версию BDE ?


 
lightix   (2003-05-07 11:47) [30]

Sergey13 © (07.05.03 11:39)
Я такого еще не слыхал .... А где можно почитать про этоот RxMemoryData и т.п. ?

Zacho © (07.05.03 11:41)
BDE тут не причем, они с ораклом не очень дружат (глючит), я юзаю NCOCI8. А у тебя точно с VARCHARом работало?


 
Zacho ©   (2003-05-07 11:51) [31]


> lightix (07.05.03 11:47)

Значит баг в NCOCI8. Или переходи на другие компоненты, или решай эту задачу по другому, здесь уже много чего насоветовали.

> А у тебя точно с VARCHARом работало?

Точно работало, и не только с VARCHAR, а и любыми другими типами. Но на БДЕ.


 
Danilka ©   (2003-05-07 11:52) [32]

lightix (07.05.03 11:37)
ну и что, несколько таблиц - несколько вьюх :))

а вообще, если у тебя query, то делай NOTD||NGRP прямо в этом запросе и никаких проблем

честно говоря, мне кажется проблема намного меньше, чем ее обсуждение ;))


 
Sergey13 ©   (2003-05-07 11:54) [33]

2lightix (07.05.03 11:47)
>А где можно почитать про этоот RxMemoryData и т.п. ?
Конкретно по RxMemoryData я читал в хелпе по библиотеке Rx. 8-)



 
lightix   (2003-05-07 11:56) [34]

Danilka © (07.05.03 11:52)
NOTD||NGRP - то выберет, но вот куда оно писа"ть будет?


 
Danilka ©   (2003-05-07 12:02) [35]

lightix (07.05.03 11:56)
куда ты ему скажешь :))
та как пишешь изменения датасета?

честно говоря, не работал с NCOCI8, но в БДЕ, чтобы можно было редактировать датасет для TQuery, нужен для него UpdateSQL, в котором прописываются запросы на добавление/изменение/удаление записи.


 
lightix   (2003-05-07 15:22) [36]

Спасибо ОГРОМНОЕ всем!
Все получилось!
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;

Вот и все ;)

Еще раз всем спасибо!!!


 
MsGuns ©   (2003-05-07 16:04) [37]

Типичный случай, когда следует отказаться от DW-Aware контролов и все делать с простыми Tedit`ами и им подобными. Ссылочные справочники показывать не "способом для ленивых" (;)) типа DBLookUpComboBox, а отд.модальной формой с возможностью правки "на лету" в зависимости от прав юзера на данный справочник.
На такую панель можно повесить все, что хочешь. А составные "поля" в просмотрах (гридах) лепить запросами или OnGetText. БД же дожна содержать нормализованные данные, ссылающиеся на полноценные справочники.
Тогда можно построить юзерам любые "фигуры" из данных, не меняя при этом бизнес-логику и структуры таблиц.



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
3-94758
Nikos
2003-05-11 17:29
2003.05.29
Помогите разобраться с методом Lookup


7-95144
Борис_Ш
2003-03-31 18:46
2003.05.29
Как отследить количество свобдной памяти?


3-94709
Evg12345
2003-05-08 08:03
2003.05.29
Перемещение по DBGrid


14-95021
Пастор
2003-05-11 18:31
2003.05.29
Память, занимаемая программой


3-94669
Ренат
2003-05-07 15:52
2003.05.29
Составной индекс в таблице foxpro