Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Обновление грида после 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.035 c
2-1144758893
Дарья
2006-04-11 16:34
2006.04.30
поиск


1-1143183057
Iton
2006-03-24 09:50
2006.04.30
Текст в HTML


3-1140564295
TheEd
2006-02-22 02:24
2006.04.30
Как при вставке задать полям знач-я по умолч., те что в БД заданы


2-1144931377
Кир
2006-04-13 16:29
2006.04.30
Классическая такая задачка...


1-1143012630
FastReporter
2006-03-22 10:30
2006.04.30
AV при загрузке FastReport 2.31