-
вопрос знатокам: как правильно определить константы в запросе ?
в запросе должна присутствовать колонка '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 что мешает исправить?
> ТС требуется виртуальное поле. а это не оно? копия поля со сменой значений только на клиенте (можно включить батчапдейте) по любому будет быстрее перегрузки всего рекордсета в копию.
-
кстати при подключении к access (jet) подобный фокус (1 as xxxx и т.д. вплоть до редактирования) срабатывает без всяких извращений. что позволяет надеяться на возможность смены типа поля в рекордсете от mssql на нужное...
-
я бы вообще сделал с помощью cxgrid unbound column :)
-
> что позволяет надеяться вот так работает, пример SELECT ID,Name,a.Prop FROM Action LEFT JOIN (SELECT 1 AS Prop) AS a ON ID=ID должен быть включен ltBatchOptimistic
-
> turbouser © (23.05.12 16:13) [21] > я бы вообще сделал с помощью cxgrid unbound column :)
вариант неплох, но это частный случай, он не подойдет к такому запросу, построить такую логику обработки на клиенте средствами Делфи достаточно сложно: --------------------------------------------------------------------- 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 ---------------------------------------------------------------------
-
> sniknik © (23.05.12 16:22) [22] > > что позволяет надеяться > вот так работает, пример > SELECT ID,Name,a.Prop FROM Action LEFT JOIN (SELECT 1 AS > Prop) AS a ON ID=ID > должен быть включен ltBatchOptimistic
проверил, запрос в БД - работает, а с ADODataSet не работает и в JOIN с врем. табл. тоже не работает: ----------------------------------- DECLARE @T TABLE (property int); INSERT INTO @T VALUES (1); ...
-
> проверил, запрос в БД - работает, а с ADODataSet не работает чудо чудное, диво дивное...
> и в JOIN с врем. табл. тоже не работает: еще одно? ... компьютер давно освящал? а то смотри, без ушата святой воды "в дисковод" скоро ничего не поможет.
-
> sniknik © (23.05.12 17:07) [25] > > проверил, запрос в БД - работает, а с ADODataSet не работает > чудо чудное, диво дивное...
проверю дома, результат скажу завтра.
, но как только убираю константы из запроса ADODataSet работает -------------------------------------------------------------- DataModule1.ADODataSet7.Edit; DataModule1.ADODataSet7['PROPERTY']:=0; DataModule1.ADODataSet7.Post;
showmessage( 'p='+VarToStr(DataModule1.ADODataSet7['PROPERTY']+'.') ); -------------------------------------------------------------- результат: p=0.
-
проверил, результат отрицательный.
Win XP+sp3, Win7+sp1, d7, d2006, d2009 MSSQL 2005, 2008
могу продемонстрировать неработу ПО через удаленный терминал (TeamViewer) или готов посмотреть правильную и действующую реализацию также.
возможно, нужны какие-то определенные свойства ADODataSet ?
это концептуальный вопрос, поэтому и спрашиваю у знатоков, как работаете с такими задачами.
напимер, Delphi+DOA+Oracle - концептуальных проблем в работе DataSet нет.
-
> могу продемонстрировать демонстрируй здравый смысл... http://maddog.sitengine.ru/smart-question-ru.html> возможно, нужны какие-то определенные свойства ADODataSet ? вся что нужно было написано. но видимо не прочитано/проигнорировано. т.е. смысл дальнейшего общения с тобой = 0.
-
"BEST" !!!
-
P.S.: некорректность работы ADODataSet на данном этапе моих знаний решена так (но это не совсем правильно): 1. по событию BeforePost обращаюсь к БД и меняю данные хранимой процедурой, на этом этапе данные в ADODataSet, полученные из cxGridDBTableView еще правильные. 2. по событию AfterPost выполняю ADODataSet.Requery, чтобы корректно вернуть данные в ADODataSet и cxGridDBTableView.
результат: ПОЛОЖИТЕЛЬНЫЙ.
|