-
вопрос знатокам:
как правильно определить константы в запросе ?
в запросе должна присутствовать колонка 'property', кот. определит результат выбора пользователя (0, 1 через Grid и СheckBox) и последующую обработку ADODataSet для записи изменений в БД.
в ADODataSet определен такой запрос:
------------------------------------------------------
SELECT
safety_standards_id
,profession_id
,overall_id
,unit_id
,1 property
FROM v_safety_standards
WHERE profession_id=:PROFESSION_ID
------------------------------------------------------
в такой нотации ADODataSet не реагирует на редактирование поля 'property':
--------------------------------------------------------------
DataModule1.ADODataSet7.Edit;
DataModule1.ADODataSet7['PROPERTY']:=0;
DataModule1.ADODataSet7.Post;
showmessage(
'p='+VarToStr(DataModule1.ADODataSet7['PROPERTY']+'.')
);
результат = > 'p=.'
--------------------------------------------------------------
свойства ADODataSet:
CursorLocation: clUseClient
CursorType: ctStatic
LockType: ltBatchOptimistic
как правильно определять такие поля в запросе и какие с-ва ADODataSet необходимо использовать ?
-
cast(1 as tinyint) as property
?
-
и к тому же оно readonly.
придется использовать ADODataSet7 в связке с ClientDataSet и после открытия ADODataSet7 делать поле PROPERTY not readonly
-
> u905097 (23.05.2012 10:42:00) [0]
Я бы не рискнул использовать идентификаторы с пробелом без экранирования "1
property"
и не рискнул бы использовать слово 'property' в запросе
и не рискнул бы использовать идентификаторы начинающие с цифры
Все это противоречит определению языка
-
> и к тому же оно readonly.
так почему никто не выдает EXCEPTION на присвоение readonly полю значения ???
-
> Anatoly Podgoretsky © (23.05.12 11:07) [3]
> > u905097 (23.05.2012 10:42:00) [0]
>
> Я бы не рискнул
а чито можно реально рискнуть,
чтобы правильно реализовать поставленную задачу.
кроме определить реальную колонку ('PROPERTY') в таблице - это не подходит, т.к. сл. запрос будет такой, и тут уж ...:
---------------------------------------------------------------------
SELECT
safety_assurance_id
,safety_standards_id
,overall_state_id
,size1
,size2
,sa_start_date
,sa_end_date
,relevant
FROM v_safety_assurance
WHERE staff_id=:STAFF_ID
UNION
SELECT
null safety_assurance_id
,safety_standards_id
,null overall_state_id
,MAX(size1)
,MAX(size2)
,null sa_start_date
,null sa_end_date
,1 relevant
FROM v_safety_assurance
WHERE staff_id=:STAFF_ID
AND relevant = 0
GROUP BY safety_standards_id
---------------------------------------------------------------------
-
> turbouser © (23.05.12 10:48) [1]
> cast(1 as tinyint) as property
> ?
пробовал - не помогает,
проверил св-ва поля 'PROPERTY':
-------------------------------------
if DataSet['PROPERTY'].Readonly then
-------------------------------------
результат = FALSE
-
> проверил св-ва поля 'PROPERTY':
в дизайнтайм проверь, активируй запрос и определи все поля в датасете, т.е. без своего кода.
или так
if ADODataSet1.FieldByName('PROPERTY').ReadOnly then
(сомневаюсь что "магия" старичка DataSet-а верно работает с ADO)
-
В D7 - неправильно, более менее нормально в Д2006
-
> sniknik © (23.05.12 13:43) [7]
> > проверил св-ва поля 'PROPERTY':
> в дизайнтайм проверь, активируй запрос и определи все поля
> в датасете, т.е. без своего кода.
> или так
> if ADODataSet1.FieldByName('PROPERTY').ReadOnly then
> (сомневаюсь что "магия" старичка DataSet-а верно работает
> с ADO)
в дизайнтайм активировал, все поля определены.
когда я добавляю в датасет в дизайнтайм поле 'PROPERTY', его св-во READONLY по умолчанию = TRUE. изменяю на FALSE.
проверяю
if ADODataSet7.FieldByName('PROPERTY').ReadOnly then
результат = FALSE
результат моего вопроса ОТРИЦАТЕЛЬНЫЙ.
неужели никто такие запросы не пишет ???
или использует какой-то другой механизм, господа знатоки ???
-
> Anatoly Podgoretsky © (23.05.12 14:08) [8]
> В D7 - неправильно, более менее нормально в Д2006
проверил в:
D7, BDS 2006, CodeGear 2009, Embarcadero RAD Studio XE, Embarcadero RAD Studio XE2.
очень нужен проверенный рабочий механизм - это основа работы с БД через эти компоненты ...
-
> u905097 (23.05.12 14:14) [9]
сделай
ADODataSet7.FieldByName('PROPERTY').ReadOnly:=False;
на ADODataSet7OnAfterOpen
Но это не поможет. С этим полем не получится нормально работать в ADODataSet
-
> turbouser © (23.05.12 14:39) [11]
> Но это не поможет. С этим полем не получится нормально работать
> в ADODataSet
чем можно заменить ?
-
> когда я добавляю в датасет в дизайнтайм поле 'PROPERTY', его св-во READONLY по умолчанию = TRUE. изменяю на FALSE.
вопрос... НАФИГА?
т.е. оно тебе правильно определило, ты его значение испортил и теперь возмущаешься?...
-
ClientDataSet
-
> ClientDataSet
ничем не лучше, отличие в данной ситуации только в том, что работа не с полученным с сервера рекордсетом, а сформированным на клиенте с перекачкой в него данных... сделай тоже самое из одного ADODataSet-а в другой и получишь тоже самое. т.е. типа "нормальную" работу с "кривым" полем (вернее во втором оно уже будет "прямым" как и в ClientDataSet).
-
> результат моего вопроса ОТРИЦАТЕЛЬНЫЙ.
попробуй
SELECT
safety_standards_id
,profession_id
,overall_id
,unit_id
,overall_id AS property
FROM v_safety_standards
WHERE profession_id=:PROFESSION_ID
overall_id/его замена должно быть редактируемое
-
> sniknik © (23.05.12 15:15) [13]
> > когда я добавляю в датасет в дизайнтайм поле 'PROPERTY',
> его св-во READONLY по умолчанию = TRUE. изменяю на FALSE.
>
> вопрос... НАФИГА?
> т.е. оно тебе правильно определило, ты его значение испортил
> и теперь возмущаешься?...
мне нужно, чтобы поле было редактируемое, т.е.
ADODataSet7['PROPERTY'].ReadOnly=FALSE
> sniknik © (23.05.12 15:26) [16]
> попробуй
> SELECT
> safety_standards_id
> ,profession_id
> ,overall_id
> ,unit_id
> ,overall_id AS property
> FROM v_safety_standards
> WHERE profession_id=:PROFESSION_ID
PROPERTY должно принимать значение 0 или 1, но никак не overall_id = {1..1млн.}
, и на каком этапе/событии инициализировать 1 в ADODataSet7['PROPERTY'], кот. будет отражено в Grid ?
-
> sniknik © (23.05.12 15:26) [16]
> overall_id/его замена должно быть редактируемое
ТС требуется виртуальное поле.
-
> PROPERTY должно принимать значение 0 или 1, но никак не overall_id
что мешает исправить?
> ТС требуется виртуальное поле.
а это не оно? копия поля со сменой значений только на клиенте (можно включить батчапдейте) по любому будет быстрее перегрузки всего рекордсета в копию.