Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1144814654
Rubey
2006-04-12 08:04
2006.04.30
Круглые кнопки


2-1144680738
ctudent
2006-04-10 18:52
2006.04.30
Ошибка FFFFFFFFFF


15-1144484300
(AD)acid
2006-04-08 12:18
2006.04.30
Смерш 2 Василия Голвачева


9-1129041625
Кефир87
2005-10-11 18:40
2006.04.30
Организация текстурирования уровней


15-1144440543
Цукор5
2006-04-08 00:09
2006.04.30
narod.ru





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский