Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
1-94869
Marina_S
2003-05-20 09:53
2003.05.29
Как расположить на форме документ HTML?


14-95068
Соловьев
2003-05-08 10:16
2003.05.29
Мастаки, поделитесь опытом защиты прав на пргу.


8-94979
real_dimedrol
2003-02-15 12:40
2003.05.29
Помогите разобраться со Scanline


3-94713
Lin
2003-05-08 11:15
2003.05.29
Как программно сменить кодировку таблицы


1-94798
Kettle of delphi
2003-05-18 22:20
2003.05.29
Вопрос о компоненте Chart (графики, закладка Additional).





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский