| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Foxpro/Clipper/Dbase > Обновление данных в View |
| Автор: Arien 14.3.2006, 10:45 |
| Ситуация следующая: данные из двух связанных таблиц собраны в view, которое на форме представлено grid'ом. Таблица "Отделы" связана с таблицей "Кадры" один-ко-многим. При добавлении или редактировании записи в view название отдела из таблицы "Отделы" подставляется только после закрытия формы. При этом данные в таблице "Кадры" обновляются корректно. Подскажите, как заставить данные в view обновляться раньше. |
| Автор: MFoxer 14.3.2006, 20:23 |
| Local View имеет режим буферизации №3. = TableUpdate ("View"...) пробовать не пробовали ? ( далее смотреть help ) Для начала приведите код вашего View, Вы же делали его либо "рукмми" , либо через коструктор представлений, а там есть возможностьего просмотра. И как вы закрываете формы и как вы оперируете данными - View, все равно. Есть каталог ( таблицы матер- слейв) из низ создан View, настроено ключевое поле и обновляемые поля. Вот и все. Приведите код представления, чтобы не аоду разводить , а сказать Вам,где вы ошиблись. |
| Автор: Arien 15.3.2006, 10:54 |
| SELECT Main.id, Main.surn, Main.name, Main.patronymic, Main.birth_date,; Main.educ, Main.speciality, Main.educ_institute, Main.depart_decree,; Departments_b.name, Main.depart_actual, Departments.name,; Main.date_end_contr, Main.num_decree, Main.date_decree, Main.seniority,; Main.home_addr, Main.addr_lutsk, Main.tel_home, Main.tel_mob,; Main.passport, Main.comment; FROM ; cadres!departments ; INNER JOIN cadres!main ; ON Departments.id = Main.depart_actual ; INNER JOIN cadres!departments Departments_b ; ON Main.depart_decree = Departments_b.id DBSetProp(ThisView,"View","SendUpdates",.T.) DBSetProp(ThisView,"View","BatchUpdateCount",1) DBSetProp(ThisView,"View","CompareMemo",.T.) DBSetProp(ThisView,"View","FetchAsNeeded",.F.) DBSetProp(ThisView,"View","FetchMemo",.T.) DBSetProp(ThisView,"View","FetchSize",100) DBSetProp(ThisView,"View","MaxRecords",-1) DBSetProp(ThisView,"View","Prepared",.F.) DBSetProp(ThisView,"View","UpdateType",1) DBSetProp(ThisView,"View","UseMemoSize",255) DBSetProp(ThisView,"View","Tables","cadres!main") DBSetProp(ThisView,"View","WhereType",3) DBSetProp(ThisView+".id","Field","Caption","¹") DBSetProp(ThisView+".id","Field","DataType","I") DBSetProp(ThisView+".id","Field","UpdateName","cadres!main.id") DBSetProp(ThisView+".id","Field","KeyField",.T.) DBSetProp(ThisView+".id","Field","Updatable",.T.) DBSetProp(ThisView+".surn","Field","Caption","Ïð³çâèùå") DBSetProp(ThisView+".surn","Field","DataType","C(30)") DBSetProp(ThisView+".surn","Field","UpdateName","cadres!main.surn") DBSetProp(ThisView+".surn","Field","KeyField",.F.) DBSetProp(ThisView+".surn","Field","Updatable",.T.) DBSetProp(ThisView+".name_a","Field","Caption","²ì'ÿ") DBSetProp(ThisView+".name_a","Field","DataType","C(20)") DBSetProp(ThisView+".name_a","Field","UpdateName","cadres!main.name") DBSetProp(ThisView+".name_a","Field","KeyField",.F.) DBSetProp(ThisView+".name_a","Field","Updatable",.T.) DBSetProp(ThisView+".patronymic","Field","Caption","Ïî-áàòüêîâ³") DBSetProp(ThisView+".patronymic","Field","DataType","C(20)") DBSetProp(ThisView+".patronymic","Field","UpdateName","cadres!main.patronymic") DBSetProp(ThisView+".patronymic","Field","KeyField",.F.) DBSetProp(ThisView+".patronymic","Field","Updatable",.T.) DBSetProp(ThisView+".birth_date","Field","Caption","Äàòà íàðîäæ.") DBSetProp(ThisView+".birth_date","Field","DataType","D") DBSetProp(ThisView+".birth_date","Field","UpdateName","cadres!main.birth_date") DBSetProp(ThisView+".birth_date","Field","KeyField",.F.) DBSetProp(ThisView+".birth_date","Field","Updatable",.T.) DBSetProp(ThisView+".educ","Field","Caption","Îñâ³òà") DBSetProp(ThisView+".educ","Field","DataType","N(4)") DBSetProp(ThisView+".educ","Field","UpdateName","cadres!main.educ") DBSetProp(ThisView+".educ","Field","KeyField",.F.) DBSetProp(ThisView+".educ","Field","Updatable",.T.) DBSetProp(ThisView+".speciality","Field","Caption","Ñïåö³àëüí³ñòü") DBSetProp(ThisView+".speciality","Field","DataType","C(15)") DBSetProp(ThisView+".speciality","Field","UpdateName","cadres!main.speciality") DBSetProp(ThisView+".speciality","Field","KeyField",.F.) DBSetProp(ThisView+".speciality","Field","Updatable",.T.) DBSetProp(ThisView+".educ_institute","Field","Caption","Íàâ÷. çàêëàä") DBSetProp(ThisView+".educ_institute","Field","DataType","C(40)") DBSetProp(ThisView+".educ_institute","Field","UpdateName","cadres!main.educ_institute") DBSetProp(ThisView+".educ_institute","Field","KeyField",.F.) DBSetProp(ThisView+".educ_institute","Field","Updatable",.T.) DBSetProp(ThisView+".depart_decree","Field","Caption","¹ â³ää³ëó çã³äíî íàêàçó") DBSetProp(ThisView+".depart_decree","Field","DataType","N(4)") DBSetProp(ThisView+".depart_decree","Field","UpdateName","cadres!main.depart_decree") DBSetProp(ThisView+".depart_decree","Field","KeyField",.F.) DBSetProp(ThisView+".depart_decree","Field","Updatable",.T.) DBSetProp(ThisView+".name_b","Field","Caption","³ää³ë çã³äíî íàêàçó") DBSetProp(ThisView+".name_b","Field","DataType","C(30)") DBSetProp(ThisView+".name_b","Field","UpdateName","cadres!departments.name") DBSetProp(ThisView+".name_b","Field","KeyField",.F.) DBSetProp(ThisView+".name_b","Field","Updatable",.F.) DBSetProp(ThisView+".depart_actual","Field","Caption","¹ â³ää³ëó ôàêòè÷íî") DBSetProp(ThisView+".depart_actual","Field","DataType","N(4)") DBSetProp(ThisView+".depart_actual","Field","UpdateName","cadres!main.depart_actual") DBSetProp(ThisView+".depart_actual","Field","KeyField",.F.) DBSetProp(ThisView+".depart_actual","Field","Updatable",.T.) DBSetProp(ThisView+".name_c","Field","Caption","³ää³ë ôàêòè÷íî") DBSetProp(ThisView+".name_c","Field","DataType","C(30)") DBSetProp(ThisView+".name_c","Field","UpdateName","cadres!departments.name") DBSetProp(ThisView+".name_c","Field","KeyField",.F.) DBSetProp(ThisView+".name_c","Field","Updatable",.F.) DBSetProp(ThisView+".date_end_contr","Field","Caption","Äàòà çàê³í÷. êîíòð.") DBSetProp(ThisView+".date_end_contr","Field","DataType","D") DBSetProp(ThisView+".date_end_contr","Field","UpdateName","cadres!main.date_end_contr") DBSetProp(ThisView+".date_end_contr","Field","KeyField",.F.) DBSetProp(ThisView+".date_end_contr","Field","Updatable",.T.) DBSetProp(ThisView+".num_decree","Field","Caption","¹ íàêàçó") DBSetProp(ThisView+".num_decree","Field","DataType","C(10)") DBSetProp(ThisView+".num_decree","Field","UpdateName","cadres!main.num_decree") DBSetProp(ThisView+".num_decree","Field","KeyField",.F.) DBSetProp(ThisView+".num_decree","Field","Updatable",.T.) DBSetProp(ThisView+".date_decree","Field","Caption","Äàòà íàêàçó") DBSetProp(ThisView+".date_decree","Field","DataType","D") DBSetProp(ThisView+".date_decree","Field","UpdateName","cadres!main.date_decree") DBSetProp(ThisView+".date_decree","Field","KeyField",.F.) DBSetProp(ThisView+".date_decree","Field","Updatable",.T.) DBSetProp(ThisView+".seniority","Field","Caption","Ñòàæ") DBSetProp(ThisView+".seniority","Field","DataType","C(15)") DBSetProp(ThisView+".seniority","Field","UpdateName","cadres!main.seniority") DBSetProp(ThisView+".seniority","Field","KeyField",.F.) DBSetProp(ThisView+".seniority","Field","Updatable",.T.) DBSetProp(ThisView+".home_addr","Field","Caption","Äîì. àäðåñà") DBSetProp(ThisView+".home_addr","Field","DataType","C(30)") DBSetProp(ThisView+".home_addr","Field","UpdateName","cadres!main.home_addr") DBSetProp(ThisView+".home_addr","Field","KeyField",.F.) DBSetProp(ThisView+".home_addr","Field","Updatable",.T.) DBSetProp(ThisView+".addr_lutsk","Field","Caption","Àäðåñà â Ëóöüêó") DBSetProp(ThisView+".addr_lutsk","Field","DataType","C(30)") DBSetProp(ThisView+".addr_lutsk","Field","UpdateName","cadres!main.addr_lutsk") DBSetProp(ThisView+".addr_lutsk","Field","KeyField",.F.) DBSetProp(ThisView+".addr_lutsk","Field","Updatable",.T.) DBSetProp(ThisView+".tel_home","Field","Caption","Òåë. äîì.") DBSetProp(ThisView+".tel_home","Field","DataType","C(10)") DBSetProp(ThisView+".tel_home","Field","UpdateName","cadres!main.tel_home") DBSetProp(ThisView+".tel_home","Field","KeyField",.F.) DBSetProp(ThisView+".tel_home","Field","Updatable",.T.) DBSetProp(ThisView+".tel_mob","Field","Caption","Òåë. ìîá.") DBSetProp(ThisView+".tel_mob","Field","DataType","C(15)") DBSetProp(ThisView+".tel_mob","Field","UpdateName","cadres!main.tel_mob") DBSetProp(ThisView+".tel_mob","Field","KeyField",.F.) DBSetProp(ThisView+".tel_mob","Field","Updatable",.T.) DBSetProp(ThisView+".passport","Field","Caption","Ïàñïîðòí³ äàí³") DBSetProp(ThisView+".passport","Field","DataType","C(30)") DBSetProp(ThisView+".passport","Field","UpdateName","cadres!main.passport") DBSetProp(ThisView+".passport","Field","KeyField",.F.) DBSetProp(ThisView+".passport","Field","Updatable",.T.) DBSetProp(ThisView+".comment","Field","Caption","Ïðèì³òêà") DBSetProp(ThisView+".comment","Field","DataType","C(30)") DBSetProp(ThisView+".comment","Field","UpdateName","cadres!main.comment") DBSetProp(ThisView+".comment","Field","KeyField",.F.) DBSetProp(ThisView+".comment","Field","Updatable",.T.) |
| Автор: MFoxer 17.3.2006, 04:05 | ||||||||
| На первый взгляд, ошибок я не вижу. Значит делаем так:
После этой команды курсор на логически 1 записи в твоем VIEW. Именно логической, так как в этом режиме ты еще можешь создавать для VIEW индекс, в 5 режиме не можешь. Допустим ты перешел на логическую запись 5 ( не RECNO() ! ), выбрал руками, поиском или иным другим механизмом тобой реализованным. Тебе нужно данные обновить. Это делается так, к примеру:
Теперь обязательно (!) нужно сбросить буфер в таблицы ( потому как 3 режим- это строчная буферизация): Самое простое решение, такое:
Теперь освежим VIEW новыми данными:
|
| Автор: Arien 17.3.2006, 14:04 |
| У объекта lo_Obj нет таких свойств, как Caption и Comment. Так что до error'а AERROR( laError ) вообще не доходит |
| Автор: MFoxer 18.3.2006, 03:19 | ||||||
Ну так для примера возьми что есть:
И еще , не шути вот с этим:
Как я понимаю, для удобство читабельности в Browse. Забудь о нем. Есть GRID. Должно быть:
REQUERY("VIEW") - верно, другая. А отслеживать у тебя не получиться. В буфере они лежать с "-", а в таблице с "+". Для примера, добавь в буфер запись и верни ее Recno(). = -1 и так далее с пометрокй операции что ты делал. А в реальной таблице с "+". REQUERY можно не делать, если у тебя Грид или любой другой контрол приявязан с View. Можно ему просто сделать refresh(). |
| Автор: Arien 20.3.2006, 16:43 |
| Получается ошибка "Field ID is read-only". Оно пытается обновить поле id в таблице cadres, а это поле автоинкремент. Что сделать, чтобы оно не лезло к этому полю? (Само собой, я изменяю значение другого поля) Кстати, насчёт грида. Если его обновить (refresh) - никаких изменений. Данные из связанной таблицы подставляются только после requery, но при этом активной становится другая запись. Это ещё полбеды, нужно, чтобы отдел можно было выбрать из комбо (названия отделов в таблице departments). То есть отдел можно выбрать или по номеру, или по названию. |
| Автор: MFoxer 27.3.2006, 01:35 |
| Arien, код в студию. Приведи полный скрипт по формированию таблиц , вьюху и как ты и что там сбрасываешь ? Я примерно сделал так же как у тебя, все проходид на ура и в 3 и 5 режиме. Правда такой галиматьей как автоинкримент я не балаюсь. Лучьше самомоу написать NewID(), что-то типа этого. |
| Автор: Arien 27.3.2006, 10:42 | ||
Привожу код, который FoxPro нагенерил самостоятельно в Stored Procedures:
Таблицы и связи создавались через Project Manager, могу поискать этот код в Command, но смысла особо не вижу. В таблице main три индекса: один ID - Primary, и два Regular: depart_act и depart_dec, которые относятся к id отделов (фактического и формального). В таблице departments один Primary индекс - ID. Он связан один-ко-многим з регулярными индексами таблицы Main. Если работать с browse этого view, при заполнении номера отдела название из таблицы departments тоже не подставляется, пока не было явного requery. Может быть, дело в Referential Integrity связей? Там везде стоит Ignore, если меняю, база не открывается (".dbc internal consistency error" или что-то вроде этого). |
| Автор: MFoxer 28.3.2006, 23:37 |
| Блин Зачем ты вообще пользуешься для поддержания ссылочной целостности фоксовским визардом. Делай все руками, меньше проблем будет. Удачи. |