Конференция "Базы" » IBDataset обновляет не все поля [D6, Firebird 2.1]
 
  • Степан (05.02.10 11:42) [20]
    > Sergey13

    Поле CUST_ID заполняется через DBLookupComboBox в модальной форме
  • Виталий Панасенко(дом) (05.02.10 11:44) [21]
    А ты это значение получаешь на клиенте?
  • Sergey13 © (05.02.10 11:44) [22]
    > [0] Степан   (05.02.10 07:09)
    > Поля таблицы orders обновляются, а cust.name - нет.

    А после переоткрытия датасета или перезапуска программы все поля видны нормально?

    > [19] Степан   (05.02.10 11:40)
    > Поле CUST_ID заполнено
    Пока это только твое мнение. Код жалко выложить?
  • Вариант (05.02.10 11:49) [23]

    > Степан   (05.02.10 11:40) [19]

    Хорошо, сомнения правда развеяли не полностью
    Где он его задает? Каким образом - подробней , как это задали, как это сделали? И еще CashedUpdate чему равно?
  • Степан (05.02.10 11:51) [24]
    > Виталий Панасенко(дом)

    пробовал любой способ получения значения, результат тотже

    > Sergey13

    пере открытие модальной формы
    IBDataset1.Append;
    при закрыти
    with IBDataSet1 do if Modified then Post;

    когда в модальной форме в DBLoopkupComboBox выбираешь значение, то на главной форме в DBGrid оно сразу отображается

    Пре переоткрытии IBDataset все обновляется, оно и понятно работает SQLSelect, но это плохое решение проблемы
  • Вариант (05.02.10 12:00) [25]

    > Степан   (05.02.10 11:51) [24]

    Любой - это уже не правильно для данного случая. Надо получать на клиенте.  ID должен быть известен до того как произойдет реальная вставка для твоего случая.

    В каком виде сейчас RefreshSQL? И что ответишь на вопрос
    > Sergey13 ©   (05.02.10 11:44) [22]


    > А после переоткрытия датасета или перезапуска программы
    > все поля видны нормально?
  • Вариант (05.02.10 12:09) [26]
    И еще интересует поле CachedUpdates.

    А так кроме того -  приведи значения всех полей записи после INSERT - тоже интересно глянуть
  • Сергей М. © (05.02.10 12:14) [27]

    > пере открытие модальной формы
    > IBDataset1.Append;
    > при закрыти
    > with IBDataSet1 do if Modified then Post;


    А если юзер открыл форму ошибочно ?
    Или, не дай бог, открыл, ушел в сортир и не вернулся оттуда ?)
  • Степан (05.02.10 12:21) [28]
    > Сергей М.

    1) я опускаю подробности, которые к делу не относятся

    Если нужно подробно:

    на модальной форме две кнопки ОК(mrOK) и Отмена(mrCancel), при закрытии формы обработка ModalResult:  = mrOK -> Post, = не mrOK -> Cancel

    2) Обновления не кэшируются, CachedUpdates = False

    3) RefreshSQL =
    select
     ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
    from
     orders ord, customers cust
    where
     cust.id = ord.cust_id and ord.id = :id
  • Вариант (05.02.10 12:43) [29]

    > Степан   (05.02.10 12:21) [28]

    Хорошо, осталось вытащит пару ответов на ранее заданные вопросы

    И что ответишь на вопрос
    > Sergey13 ©   (05.02.10 11:44) [22]
    > А после переоткрытия датасета или перезапуска программы
    > все поля видны нормально?

    Приведи значения всех полей записи после INSERT - тоже интересно глянуть, может там и увидим что  ord.id есть NULL например или что еще -а то задавать наводящие вопросы издалека трудно. Отладчиком по коду пройти не можем, свойства глянуть не можем -вот и выдвигаем разные догадки. Дай исходные данные в виде - "а что у нас получилось сразу после INSERT, когда не видно поле cust.name" - интересны все поля
  • Sergey13 © (05.02.10 13:19) [30]
    > [24] Степан   (05.02.10 11:51)
    > Пре переоткрытии IBDataset все обновляется, оно и понятно
    > работает SQLSelect, но это плохое решение проблемы

    Это пока и не решение вовсе, а вытягивание из ТЕБЯ, как из партизана, подробностей ТВОЕЙ проблемы.

    Ты кроме Post никак модифицируемые запросы руками не запускаешь (где то видел таке)?

    > [28] Степан   (05.02.10 12:21)
    > Если нужно подробно:

    Код такой секретный?
  • Степан (05.02.10 19:54) [31]
    > Sergey13

    Зачем ручной код если есть средства визуального программирования, Append, и Post или Cancel - это единственный код, который я написал, остальное же настойка компонент.

    > Вариант

    > [24] При переоткрытии IBDataset все обновляется, оно и понятно работает > SQLSelect, но это плохое решение проблемы
  • Loginov Dmitry © (05.02.10 20:58) [32]

    > в модальной форме добавляю новый заказ, при ее закрытии
    > делаю Post. Поля таблицы orders обновляются, а cust.name
    > - нет.


    Ну не может IBDataSet автоматически связать твой INSERT и твой RefreshSQL! Тогда вообще зачем париться? После закрытия модальной формы делай IBDataSet1.Close, а затем IBDataSet1.Open. Вариант кстати ОЧЕНЬ даже стандартный.
  • Виталий Панасенко(дом) (06.02.10 00:13) [33]
    Видимо все-таки ты CUST_ID так и не научился получать..Ни на клиенте, ни с использованием GeneratorField. Я так думаю, там же генератор используется? только в триггере вызывается GEN_ID
  • Степан (06.02.10 18:54) [34]
    CUST_ID я не генерю ни на сервере ни локально > [24] про DBLookupComboBox
  • Виталий Панасенко(дом) (06.02.10 19:03) [35]
    ой!а ord.ID?
  • Степан (06.02.10 19:05) [36]
    Я так понял, что никто из участующих в обсуждении с данной проблемой никогда не сталкивался.

    Проблема решена.

    Если кому интересно:

    SelectSQL относится к данным в целом, а все остальные запросы: InsertSQL, RefreshSQL, DeleteSQL имееют оношение только к текущей записи.

    Поэтому они должно иметь не только ссылку на :ID или :OLD_ID (в зависимости от ситуации) в условии WHERE, но все все остальные прибамбамы свойственные SQL-запросам (это про выкрутасы от Сергей М. ©).

    Проблема заключалась в генераторе поля ORD.ID. Значение должно получаться только локально (On New Record), тогда IBdataset может полноценно им оперировать, инче он не зает его значения, ну и все вытекующие последствия отсюда.

    Проработал все возможные пути решения проблемы, спасибо Варианту, хотя его предположение и не было столь уверенным.

    Спасибо всем за участие.
  • Виталий Панасенко(дом) (06.02.10 20:06) [37]

    > Степан   (06.02.10 19:05) [36]

    просто проблема "надуманная"... нужно было "тупо"(в смысле, без всякой фантазии) получить ord.id (или :id в твоем варианте).. вот и все... нормально используй GeneratorField... но, допустим, FIBPlus могут использовать RETURNING для FireBird.. т.е., ВСЕ, что сделал триггер/ХП(новое значение, удаление, изменение) возможно получить на клиенте.. IBX(закладка InterBase) этого не умеет.. или умеет криво.. вот и все... а ты, я так понял, получал ord.id на сервере, соответственно, о его значении клиент ничего не знает(я о программе) и твой запрос на рефреш
    > RefreshSQL
    > select
    >  ord.id, ord.date_reg, ord.summa, ord.cust_id, cust.name
    > from
    >  orders ord, customers cust
    > where
    >  cust.id = ord.cust_id and ord.id = :id
    >

    "гонит"
 
Конференция "Базы" » IBDataset обновляет не все поля [D6, Firebird 2.1]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]