Конференция "Базы" » ADODataSet - константы в запросе [D7, MSSQL]
 
  • u905097 (23.05.12 10:42) [0]
    вопрос знатокам:
    как правильно определить константы в запросе ?

    в запросе должна присутствовать колонка '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 необходимо использовать ?
  • turbouser © (23.05.12 10:48) [1]
    cast(1 as tinyint) as property
    ?
  • turbouser © (23.05.12 10:58) [2]
    и к тому же оно readonly.
    придется использовать ADODataSet7 в связке с ClientDataSet и после открытия ADODataSet7 делать поле PROPERTY not readonly
  • Anatoly Podgoretsky © (23.05.12 11:07) [3]
    > u905097  (23.05.2012 10:42:00)  [0]

    Я бы не рискнул использовать идентификаторы с пробелом без экранирования "1
    property"
    и не рискнул бы использовать слово 'property' в запросе
    и не рискнул бы использовать идентификаторы начинающие с цифры

    Все это противоречит определению языка
  • u905097 (23.05.12 11:29) [4]

    > и к тому же оно readonly.

    так почему никто не выдает EXCEPTION на присвоение readonly полю значения ???
  • u905097 (23.05.12 11:35) [5]

    > 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
    ---------------------------------------------------------------------
  • u905097 (23.05.12 12:33) [6]

    > turbouser ©   (23.05.12 10:48) [1]
    > cast(1 as tinyint) as property
    > ?

    пробовал - не помогает,
    проверил св-ва поля 'PROPERTY':
    -------------------------------------
    if DataSet['PROPERTY'].Readonly then
    -------------------------------------
    результат = FALSE
  • sniknik © (23.05.12 13:43) [7]
    > проверил св-ва поля 'PROPERTY':
    в дизайнтайм проверь, активируй запрос и определи все поля в датасете, т.е. без своего кода.
    или так
    if ADODataSet1.FieldByName('PROPERTY').ReadOnly then
    (сомневаюсь что "магия" старичка DataSet-а верно работает с ADO)
  • Anatoly Podgoretsky © (23.05.12 14:08) [8]
    В D7 - неправильно, более менее нормально в Д2006
  • u905097 (23.05.12 14:14) [9]

    > 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

    результат моего вопроса ОТРИЦАТЕЛЬНЫЙ.
    неужели никто такие запросы не пишет ???
    или использует какой-то другой механизм, господа знатоки ???
  • u905097 (23.05.12 14:17) [10]

    > Anatoly Podgoretsky ©   (23.05.12 14:08) [8]
    > В D7 - неправильно, более менее нормально в Д2006

    проверил в:
    D7, BDS 2006, CodeGear 2009, Embarcadero RAD Studio XE, Embarcadero RAD Studio XE2.
    очень нужен проверенный рабочий механизм - это основа работы с БД через эти компоненты ...
  • turbouser © (23.05.12 14:39) [11]

    > u905097   (23.05.12 14:14) [9]

    сделай
    ADODataSet7.FieldByName('PROPERTY').ReadOnly:=False;
    на ADODataSet7OnAfterOpen
    Но это не поможет. С этим полем не получится нормально работать в ADODataSet
  • u905097 (23.05.12 15:00) [12]

    > turbouser ©   (23.05.12 14:39) [11]
    > Но это не поможет. С этим полем не получится нормально работать
    > в ADODataSet

    чем можно заменить ?
  • sniknik © (23.05.12 15:15) [13]
    > когда я добавляю в датасет в дизайнтайм поле 'PROPERTY', его св-во READONLY по умолчанию = TRUE. изменяю на FALSE.
    вопрос... НАФИГА?
    т.е. оно тебе правильно определило, ты его значение испортил и теперь возмущаешься?...
  • turbouser © (23.05.12 15:16) [14]
    ClientDataSet
  • sniknik © (23.05.12 15:20) [15]
    > ClientDataSet
    ничем не лучше, отличие в данной ситуации только в том, что работа не с полученным с сервера рекордсетом, а сформированным на клиенте с перекачкой в него данных... сделай тоже самое из одного ADODataSet-а в другой и получишь тоже самое. т.е. типа "нормальную" работу с "кривым" полем (вернее во втором оно уже будет "прямым" как и в ClientDataSet).
  • 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


    overall_id/его замена должно быть редактируемое
  • u905097 (23.05.12 15:44) [17]

    > 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 ?
  • turbouser © (23.05.12 15:45) [18]

    > sniknik ©   (23.05.12 15:26) [16]


    > overall_id/его замена должно быть редактируемое

    ТС требуется виртуальное поле.
  • sniknik © (23.05.12 16:05) [19]
    > PROPERTY должно принимать значение 0 или 1, но никак не overall_id
    что мешает исправить?

    > ТС требуется виртуальное поле.
    а это не оно? копия поля со сменой значений только на клиенте (можно включить батчапдейте) по любому будет быстрее перегрузки всего рекордсета в копию.
 
Конференция "Базы" » ADODataSet - константы в запросе [D7, MSSQL]
Есть новые Нет новых   [119568   +89][b:0][p:0.001]