Конференция "Базы" » 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
    что мешает исправить?

    > ТС требуется виртуальное поле.
    а это не оно? копия поля со сменой значений только на клиенте (можно включить батчапдейте) по любому будет быстрее перегрузки всего рекордсета в копию.
  • sniknik © (23.05.12 16:09) [20]
    кстати при подключении к access (jet) подобный фокус (1 as xxxx и т.д. вплоть до редактирования) срабатывает без всяких извращений.
    что позволяет надеяться на возможность смены типа поля в рекордсете от mssql на нужное...
  • turbouser © (23.05.12 16:13) [21]
    я бы вообще сделал с помощью cxgrid unbound column :)
  • 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
  • u905097 (23.05.12 16:33) [23]

    > 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
    ---------------------------------------------------------------------
  • u905097 (23.05.12 16:54) [24]

    > 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);
    ...
  • sniknik © (23.05.12 17:07) [25]
    > проверил, запрос в БД - работает, а с ADODataSet не работает
    чудо чудное, диво дивное...

    > и в JOIN с врем. табл. тоже не работает:
    еще одно? ...
    компьютер давно освящал? а то смотри, без ушата святой воды "в дисковод" скоро ничего не поможет.
  • u905097 (23.05.12 17:13) [26]

    > 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.
  • u905097 (25.05.12 09:19) [27]
    проверил, результат отрицательный.

    Win XP+sp3, Win7+sp1,
    d7, d2006, d2009
    MSSQL 2005, 2008

    могу продемонстрировать неработу ПО через удаленный терминал (TeamViewer) или готов посмотреть правильную и действующую реализацию также.

    возможно, нужны какие-то определенные свойства ADODataSet ?

    это концептуальный вопрос, поэтому и спрашиваю у знатоков, как работаете с такими задачами.

    напимер, Delphi+DOA+Oracle - концептуальных проблем в работе DataSet нет.
  • sniknik © (25.05.12 09:31) [28]
    > могу продемонстрировать
    демонстрируй здравый смысл...
    http://maddog.sitengine.ru/smart-question-ru.html

    > возможно, нужны какие-то определенные свойства ADODataSet ?
    вся что нужно было написано. но видимо не прочитано/проигнорировано. т.е. смысл дальнейшего общения с тобой = 0.
  • u905097 (25.05.12 09:44) [29]
    "BEST" !!!
  • u905097 (25.05.12 15:18) [30]
    P.S.:
    некорректность работы ADODataSet на данном этапе моих знаний решена так (но это не совсем правильно):
    1. по событию BeforePost обращаюсь к БД и меняю данные хранимой процедурой, на этом этапе данные в ADODataSet, полученные из cxGridDBTableView еще правильные.
    2. по событию AfterPost выполняю ADODataSet.Requery, чтобы корректно вернуть данные в ADODataSet и cxGridDBTableView.

    результат:  ПОЛОЖИТЕЛЬНЫЙ.
 
Конференция "Базы" » ADODataSet - константы в запросе [D7, MSSQL]
Есть новые Нет новых   [119659   +89][b:0][p:0.001]