Форум: "Базы";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизСделать в 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.009 c