Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизОбновление грида после Update Найти похожие ветки
← →
neat (2006-03-07 10:15) [0]Приветствую всех!
Такая проблемка. Есть две связанные таблицы подключенные к гридам. В подчинённой данные обновляю через запрос, но обновлённые данные на гриде появляются только те, которые принадлежат текущему индексу главной таблицы,
ГЛАВНАЯ Подчинённая
поле1 -----------|_ поле11
поле2 -----| |_ поле12
поле3 -| | |_ поле13
поле4 |______ поле21
|______ поле22
т.е., допустим, курсор в момент обновления(изменения) данных находится на поле2 главной таблицы, то обновлённые данные я вижу только у связанных с этим полем, т.е. поле21, поле22. Остальные обновления видно только после перезапуска программы. Почему так?
← →
Sergey13 © (2006-03-07 10:20) [1]Непонятно, что ты меняешь в главной таблице и что должно измениться при этом в подчиненной.
Меняй в датасете, а не через отдельный запрос - и обновлять не надо ничего.
← →
neat (2006-03-07 10:32) [2]В главной таблице я не меняю ничего. Меняю только в подчинённой. Данные, изменённые в подчинённой таблице отображаются только те, которые видно на экране перед обновлением, т.е. связанные с полем текущей записи в главной таблице. Если менять в датасете, то придётся пробегать по всей базе и наблюдать неприятное мерцание на контролах. Отключить (DisableControl) не получится, потому что при этом теряется связь с починённой таблицей.
← →
sniknik © (2006-03-07 10:45) [3]> Отключить (DisableControl) не получится, потому что при этом теряется связь с починённой таблицей.
попробуй "отключить" все окно (LockWindowUpdate), или отсоедени DataSource (возможно нужно скомбинировать), а еще лучше разорви связь, обнови, после восстанови... и будет счастье. ;о)
← →
neat (2006-03-07 11:05) [4]Что такое LockWindowUpdate? Прошу прощения, а как отсоединить DataSource? Как подключить другой понятно, а как задать пустое значение этому свойству?
> а еще лучше разорви связь, обнови, после восстанови... и будет счастье. ;о)
Сделал так, но почему-то всё по старому. Совсем забыл сказать, новые данные отображаются на другой странице PageControl(на одной странице грид с одними полями(TabSheet1), на другой странице(TabSheet2) грид с другими полями той же таблицы). Может всё с этим связано?
← →
Sergey13 © (2006-03-07 11:15) [5]2[2] neat (07.03.06 10:32)
> Меняю только в подчинённой.
В гриде меняешь вручную? Зачем тогда вообще обновление?
← →
neat (2006-03-07 11:22) [6]Да нет же, с чего ты взял, что вручную. я же пишу UPDATE в запросе. Я может непонятно описал проблему? Скажи, что неясно, попробую ещё раз, а то у меня всякие мысли бредовые лезут на счёт как это всё обойти, такой огород получается.
← →
Sergey13 © (2006-03-07 11:28) [7]2[6] neat (07.03.06 11:22)
>Да нет же, с чего ты взял, что вручную. я же пишу UPDATE в запросе.
Можно и редактируя в гриде вручную делать все обновления через UPDATE в отдельном запросе. Многие компоненты доступа делают как раз так же "автоматически".
Ты изменяешь одну запись (текущую) одним запросом или несколько записей?
← →
sniknik © (2006-03-07 11:33) [8]> Сделал так, но почему-то всё по старому.
ошибка в 17й строке.
> Сделал так, но почему-то всё по старому.
меняеш в базе, а изменения смотриш в датасете на клиенте без перезапроса? в этом случае ничто не поможет. (кроме перезапроса естественно, сделаного тем или иным способом)
> Я может непонятно описал проблему?
ты ее вообще не описал, приводиш симптомы а "больного" не показываеш. этого мало.
← →
msguns © (2006-03-07 11:40) [9]После любого изменения в отображаемой запросом акцесной таблице запрос следует переоткрывать. Явно или неявно.
← →
Sergey13 © (2006-03-07 11:44) [10]2 [9] msguns © (07.03.06 11:40)
Даже послеEdit;
FieldByName("name").asString:="ля-ля";
Post;
?
← →
sniknik © (2006-03-07 11:47) [11]> Даже после
> ...
это изменение рекордсета. (Post переносит это и в базу (грубо говоря), поэтому некоторые и не видят разници)
← →
Sergey13 © (2006-03-07 11:51) [12]2[11] sniknik © (07.03.06 11:47)
Я про то и говорю, что после этого не надо ничего обновлять.
← →
sniknik © (2006-03-07 12:09) [13]> Я про то и говорю, что после этого не надо ничего обновлять.
но вопрос [10] задан после обсуждений о необходимости перезапроса после изменений непосредственно в таблице базы (запросом на обновление/добавление/из другого рекордсета неважно, важно что не из отображаемого).
естественно тебя поняли "немного" не так. (кстати действительно, если твой пример изменений делается не в отображаемом рекордсете... то перезапрос нужен и в этом случае)
← →
neat (2006-03-07 12:09) [14]tbl_CAT - главная таблица
tbl_CAT.IndCat - индекс для связи с подчинённой
tbl_CAT.NameCat - наименование категории товара
располагается на TabSheet1, связана с dbgrCAT
tbl_TOVAR - подчинённая
tbl_TOVAR.IndCat - индекс для связи с главной
tbl_TOVAR.IndTovar - индекс для связи с tbl_RASHOD
tbl_TOVAR.NameTovar - наименование товара
tbl_TOVAR.Ostatok - количество оставшегося товара
tbl_TOVAR. ... - другие поля
располагается на TabSheet1, связана с dbgrTOVAR. Здесь показываются поля:NameTovar, Ostatok и ещё парочка
tbl_RASHOD - подчинённая у tbl_TOVAR
tbl_RASHOD.IndTovar - индекс для связи с tbl_TOVAR
tbl_RASHOD.KolRashod - количество расхода
располагается на TabSheet1, связана с dbgrRASHOD
На TabSheet2 располагаются два грида, тоже связанные с tbl_CAT и tbl_TOVAR. Но здесь у грида с tbl_TOVAR показываются поля
KolTovarOff - количество переданное в офис
PrihodOff - оно же в денежном выражении
OstatokOff - остаток в офисе на конец периода
SumOstatokOff - он же в денежном выражении
Обновляю поле KolTovarOff из таблицы расхода tbl_RASHOD
update tbl_TOVAR, tbl_RASHOD, tbl_CATEGORIA
SET
KolTovarOff = KolTovarOff + KolRashod
where
DateRashod =:DR and
tbl_CATEGORIA.IndCat = tbl_TOVAR.IndexCat and
tbl_TOVAR.IndTovar = tbl_RASHOD.IndTovar
procedure TfmTovToOff.btGiveClick(Sender: TObject);
begin
qTTOf.Parameters.ParamValues["DR"] := DateOf(dtpZa.Date);
qTTOf.ExecSQL;
DatM.tbl_CAT.DisableControl;
DatM.tbl_TOVAR.Refresh;
DatM.tbl_CAT.EnableControl;
end;
← →
Sergey13 © (2006-03-07 12:14) [15]2[13] sniknik © (07.03.06 12:09)
> но вопрос [10] задан после обсуждений о необходимости перезапроса
Вопрос в [10] задан Ганзу, на его утверждение
[9] msguns © (07.03.06 11:40)
>После любого изменения в отображаемой запросом акцесной таблице запрос следует переоткрывать. Явно или неявно.
← →
msguns © (2006-03-07 12:15) [16]>neat (07.03.06 12:09) [14]
>DatM.tbl_TOVAR.Requery
ЗЫ. Рефреш не перечитывает данные с "сервера".
← →
msguns © (2006-03-07 12:20) [17]>Sergey13 © (07.03.06 12:14) [15]
>Вопрос в [10] задан Ганзу, на его утверждение
Во-первых, это не мое утверждение
Во-вторых, метод Post гарантирует только одно, а именно фиксацию изменений в записи набора данных на клиенте, но никак не таблицы на сервере.
Для того, чтобы быть уверенным в том, что обновилась и запись в таблице БД, надо знать параметры коннекта, применяется ли кэширование и т.д.
И это еще не все. Иногда важно, чтобы изменения в БД сразу становились доступны конкурентам. Для чего запрос необходимо переоткрывать, иногда даже рестартуя транзакцию.
Именно поэтому я и "утверждал", что для того, чтобы изменения "железно" были прописаны в таблице БД, запрос надо как минимум переоткрывать.
← →
Sergey13 © (2006-03-07 12:27) [18]2[14] neat (07.03.06 12:09)
У тебя в структуре бардачокс или я не понял чего-то?
>tbl_TOVAR.IndTovar - индекс для связи с tbl_RASHOD
и
>tbl_RASHOD - подчинённая у tbl_TOVAR
>tbl_RASHOD.IndTovar - индекс для связи с tbl_TOVAR
как уживаются вместе?
← →
neat (2006-03-07 12:35) [19]>У тебя в структуре бардачокс.
Есть немного, согласен. Я наверное немного путаюсь в терминологии. Наверное нужно назвать не индекс, поле для связи с таблицей ... . IndTovar - индексированное поле, находится в таблицах tbl_TOVAR и tbl_RASHOD и связаны ими между собой. А что разве нельзя называть одинаково поля связи в разных таблицах? У меня всё работает (до определённого момента).
← →
sniknik © (2006-03-07 12:38) [20]neat (07.03.06 12:09) [14]
а где изменения непосредственно в рекордсете? и LockWindowUpdate и т.д. что говорил для этого случая (убрать мелькание при этом)
и началось с ответа на
> Если менять в датасете, то придётся пробегать по всей базе и наблюдать неприятное мерцание на контролах.
> Отключить (DisableControl) не получится, потому что при этом теряется связь с починённой таблицей.
впрочем и для твоего случая (апдейта запросом) есть приемлемый вариант (и даже более правильный)
делать вообще все на запросах, связь тоже, тогда переход с записи на запись вызовет перезапрос автоматически (заодно и уберется закачка ненужных данных при любом самом минимальном изменении (от таблиц придется избавиться, возможно сменить движок (не знаю как ведет себя BDE в подобных связях))).
>> У тебя в структуре бардачокс.
> Есть немного, согласен. ...
ключей нет?
← →
Sergey13 © (2006-03-07 12:45) [21]2 [19] neat (07.03.06 12:35)
Если Расход ссылается на Товар, то в Расходе должно быть поле ссылающееся на первичный ключ (или его уникальный аналог) Товара, а не на како-то специальное дополнительное поле.
← →
msguns © (2006-03-07 12:52) [22]Посмотрел таки [14]: ужос !!!
1. Нафига показывать в гриде группы и тем более делать ее мастером для картотеки товаров ? А если у товара нет группы ? И еще вопрос: почему у групп только один уровень ? Почему это не "деревянный" справочник ?
2. Есть только расход, а прихода нет ?
3. Типичнейшая ошибка проектирования БД новичков, разрабатывающих "складские" программы - полное игнорирование накладных и "вбивание" в карточку остатка. При поступлении этого же товара с другой ценой надо заводить новую карточку. Через пару месяцев работы в таком режиме (когда для определения остатка по колбасе "Докторской" надо пересмотреть кучу карточек и на калькуляторе сложить все их остатки) крутая программа с возмущением отправляется с рабочего стола в корзину.
Названия таблиц и полей - отдельная песня. И отнюдь не лирическая ;)
Советую в 1000-й раз:
НУ ПОСМОТРИТЕ ЖЕ КАК УСТРОЕН СКЛАДСКОЙ УЧЕТ В 1С !!!
Только по меню - в Базу лезть не надо: Журналы, Документы, Балансы, Движение, Остатки и т.д.
Ну сколько ж можно лениться !?
← →
neat (2006-03-07 12:55) [23]sniknik (07.03.06 12:38) [20]
> а где изменения непосредственно в рекордсете?
KolTovarOff в tbl_TOVAR меняет значение.
> LockWindowUpdate
не знаю, что это такое.
> делать вообще все на запросах
Возможно, может даже и InterBase поставлю, но это немного погодя, сейчас (практически срочно) надо сделать, что бы работало, потом уже "следующая версия".
> ключей нет?
есть в tbl_CAT, tbl_RASHOD
← →
neat (2006-03-07 13:03) [24]Прошу прощения. Спасибо всем.
← →
msguns © (2006-03-07 13:03) [25]>neat (07.03.06 12:55) [23]
>сейчас (практически срочно) надо сделать, что бы работало, потом уже "следующая версия".
Лучше всего купить и поставить 1С, но если не годится, все это элементарно делается экселем с банальными макросами. Кстати, в этом случае не будет никаких проблем с отчетами.
Умоляю !- не надо никаких "следующих" версий. Этой одной хватит загнать товароведа с кладовщиком в гроб.
← →
sniknik © (2006-03-07 13:25) [26]>> а где изменения непосредственно в рекордсете?
> KolTovarOff в tbl_TOVAR меняет значение.
в том то и дело, в приведенном коде меняется значение запросом таблици в базе, а не рекордсета на клиенте. разницу понимаеш?
>> LockWindowUpdate
> не знаю, что это такое.
волшебная кнопка F1 поможет... или комбинация Ctrl+F1, или из меню выбрать "Windows SDK"
>> делать вообще все на запросах
> Возможно, может даже и InterBase поставлю, ...
Access это тоже позволяет, не стоит откладывать на потом "сделать правильно" только изза отсуствия InterBase.
>> ключей нет?
> есть в tbl_CAT, tbl_RASHOD
ключи должны быть весде, а не только у избранных. (исключения редки... и у тебя явно "не тот случай")
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.012 c