主页
Top.Mail.Ru Yandeks.Metrika
论坛:“基地”;
当前存档:2006.04.30;
下载:[xml.tar.bz2];

向下

更新后更新 找到类似的分支


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.Re询问

ЗЫ. Рефреш не перечитывает данные с "сервера".



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.68 MB
时间:0.059 c
9-1127503221
grouzd [E] v
2005-09-23 23:20
2006.04.30
64k介绍测试


2-1145190553
Ji
2006-04-16 16:29
2006.04.30
Сопоставление окна процессу


2-1144920305
Ded22
2006-04-13 13:25
2006.04.30
передача фокуса


3-1141901273
_kostet
2006-03-09 13:47
2006.04.30
Проблемы с ADOConnection


2-1144915498
elfebet
2006-04-13 12:04
2006.04.30
程序可以删除自己吗?





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский