Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление данных в View, Обновляются только после закрытия формы 
:(
    Опции темы
Arien
Дата 14.3.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2006

Репутация: нет
Всего: нет



Ситуация следующая: данные из двух связанных таблиц собраны в view, которое на форме представлено grid'ом. Таблица "Отделы" связана с таблицей "Кадры" один-ко-многим. При добавлении или редактировании записи в view название отдела из таблицы "Отделы" подставляется только после закрытия формы. При этом данные в таблице "Кадры" обновляются корректно. Подскажите, как заставить данные в view обновляться раньше.
PM MAIL   Вверх
MFoxer
Дата 14.3.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 18.1.2006

Репутация: -1
Всего: нет



Local View имеет режим буферизации №3.
= TableUpdate ("View"...) пробовать не пробовали ? ( далее смотреть help )
Для начала приведите код вашего View, Вы же делали его либо "рукмми" , либо через коструктор представлений, а там есть возможностьего просмотра.
И как вы закрываете формы и как вы оперируете данными - View, все равно. Есть каталог ( таблицы матер- слейв) из низ создан View, настроено ключевое поле и обновляемые поля. Вот и все. Приведите код представления, чтобы не аоду разводить , а сказать Вам,где вы ошиблись.



PM MAIL   Вверх
Arien
Дата 15.3.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2006

Репутация: нет
Всего: нет



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.)


PM MAIL   Вверх
MFoxer
Дата 17.3.2006, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 18.1.2006

Репутация: -1
Всего: нет



На первый взгляд, ошибок я не вижу.
Значит делаем так:

Код
Select VIEW
REQUERY("VIEW")  && В начале работы с данными сделаем обновление VIEW


После этой команды курсор на логически 1 записи в твоем VIEW. Именно
логической, так как в этом режиме ты еще можешь создавать для VIEW индекс,
в 5 режиме не можешь.
Допустим ты перешел на логическую запись 5 ( не RECNO() ! ), выбрал руками, поиском или иным другим механизмом тобой реализованным. Тебе нужно данные обновить.
Это делается так, к примеру:

Код
Local lo_Obj 
Select VIEW
Scatter Name lo_Obj memo && ТУт у тебя все записи строчки, доступные как  объект
With lo_Obj
  .Caption  = "Caption-Test"
  .Comment = "Comment -Test"
EndWith
Gather Name lo_Obj  && А тут сбросили новые записи в буфер(!) не в таблицу


Теперь обязательно (!) нужно сбросить буфер в таблицы ( потому как 3 режим- это строчная буферизация):

Самое простое решение, такое:

Код
SELECT VIEW
Local llUpdate
Local  Array laError(1) && Тут будут хранится параметры ошибки, номер, сообщение и прочее если она произойдет при обновлении
llUpdate = TABLEUPDATE(.F.,.T.,"VIEW")
IF !llUpdate
     AERROR( laError ) && Туту laError  стал из 7 элементов, в каждом информация об ошибке,                                         &&где когда , в какой строчке ну и так далее, можешь просмотреть ее.
? "Ошибка обновления"  && Это может произойти допустим из-за тригеров, laError тебе "все скажет"
Else
? "ВСЕ ОК"
Endif

Теперь освежим VIEW новыми данными:
Код
Select VIEW
REQUERY("VIEW")



PM MAIL   Вверх
Arien
Дата 17.3.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2006

Репутация: нет
Всего: нет



У объекта lo_Obj нет таких свойств, как Caption и Comment. Так что до error'а AERROR( laError ) вообще не доходит smile. И ещё: если делаю REQUERY("VIEW") активной становится другая запись таблицы, получается надо отслеживать и возвращать на место?

PM MAIL   Вверх
MFoxer
Дата 18.3.2006, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 18.1.2006

Репутация: -1
Всего: нет



Ну так для примера возьми что есть:
Код

Local lo_Obj 
Select VIEW
Scatter Name lo_Obj memo
With lo_Obj
.tel_home = "Test1"
.passport = "Test2"
EndWith
Gather Name lo_Obj


И еще , не шути вот с этим:
Код
DBSetProp(ThisView+".tel_home","Field","Caption",[B]"???. ???."[/B])

Как я понимаю, для удобство читабельности в Browse. Забудь о нем. Есть GRID.
Должно быть:
Код
DBSetProp(ThisView+".tel_home","Field","Caption",[B]"tel_home"[/B])


REQUERY("VIEW") - верно, другая. А отслеживать у тебя не получиться. В буфере они лежать с "-", а в таблице с "+". Для примера, добавь в буфер запись и верни ее Recno(). = -1 и так далее с пометрокй операции что ты делал. А в реальной таблице с "+".
REQUERY можно не делать, если у тебя Грид или любой другой контрол приявязан с View.
Можно ему просто сделать refresh().


PM MAIL   Вверх
Arien
Дата 20.3.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2006

Репутация: нет
Всего: нет



Получается ошибка "Field ID is read-only". Оно пытается обновить поле id в таблице cadres, а это поле автоинкремент. Что сделать, чтобы оно не лезло к этому полю? (Само собой, я изменяю значение другого поля)

Кстати, насчёт грида. Если его обновить (refresh) - никаких изменений. Данные из связанной таблицы подставляются только после requery, но при этом активной становится другая запись. Это ещё полбеды, нужно, чтобы отдел можно было выбрать из комбо (названия отделов в таблице departments). То есть отдел можно выбрать или по номеру, или по названию.

Это сообщение отредактировал(а) Arien - 20.3.2006, 17:08
PM MAIL   Вверх
Cashey
Дата 22.3.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 13
Всего: 60



Цитата(Arien @ 20.3.2006, 16:43 Найти цитируемый пост)
Получается ошибка "Field ID is read-only". Оно пытается обновить поле id в таблице cadres, а это поле автоинкремент. Что сделать, чтобы оно не лезло к этому полю?

Вот это, например:
Код

SELECT VIEW
SCATTER memvar
RELEASE m.id
APPEND BLANK
GATHER memvar



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
MFoxer
Дата 27.3.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 18.1.2006

Репутация: -1
Всего: нет



Arien, код в студию. Приведи полный скрипт по формированию таблиц , вьюху и как ты и что там сбрасываешь ? Я примерно сделал так же как у тебя, все проходид на ура и в 3 и 5 режиме. Правда такой галиматьей как автоинкримент я не балаюсь. Лучьше самомоу написать NewID(), что-то типа этого.

PM MAIL   Вверх
Arien
Дата 27.3.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2006

Репутация: нет
Всего: нет



Привожу код, который FoxPro нагенерил самостоятельно в Stored Procedures:
Код

**__RI_HEADER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_HEADER**
procedure RIDELETE
local llRetVal
llRetVal=.t.
 IF (ISRLOCKED() and !deleted()) OR !RLOCK()
    llRetVal=.F.
  ELSE
    IF !deleted()
      DELETE
      IF CURSORGETPROP('BUFFERING') > 1
       =TABLEUPDATE()
      ENDIF
    ENDIF not already deleted
  ENDIF
  UNLOCK RECORD (RECNO())
  llRetVal=pnerror=0
RETURN llRetVal

procedure RIUPDATE
lparameters tcFieldName,tcNewValue,tcCascadeParent
local llRetVal
llRetVal=.t.
 IF ISRLOCKED() OR !RLOCK()
    llRetVal=.F.
  ELSE
    IF EVAL(tcFieldName)<>tcNewValue
      PRIVATE pcCascadeParent
      pcCascadeParent=upper(iif(type("tcCascadeParent")<>"C","",tcCascadeParent))
      REPLACE (tcFieldName) WITH tcNewValue
      IF CURSORGETPROP('BUFFERING') > 1
       =TABLEUPDATE()
      ENDIF
    ENDIF values don't already match
  ENDIF it's locked already, or I was able to lock it
  UNLOCK RECORD (RECNO())
  llRetVal=pnerror=0
return llRetVal

procedure rierror
parameters tnErrNo,tcMessage,tcCode,tcProgram
local lnErrorRows,lnXX
lnErrorRows=alen(gaErrors,1)
if type('gaErrors[lnErrorRows,1]')<>"L"
  dimension gaErrors[lnErrorRows+1,alen(gaErrors,2)]
  lnErrorRows=lnErrorRows+1
endif
gaErrors[lnErrorRows,1]=tnErrNo
gaErrors[lnErrorRows,2]=tcMessage
gaErrors[lnErrorRows,3]=tcCode
gaErrors[lnErrorRows,4]=""
lnXX=1
do while !empty(program(lnXX))
  gaErrors[lnErrorRows,4]=gaErrors[lnErrorRows,4]+","+;
  program(lnXX)
  lnXX=lnXX+1
enddo
gaErrors[lnErrorRows,5]=pcParentDBF
gaErrors[lnErrorRows,6]=pnParentRec
gaErrors[lnErrorRows,7]=pcParentID
gaErrors[lnErrorRows,8]=pcParentExpr
gaErrors[lnErrorRows,9]=pcChildDBF
gaErrors[lnErrorRows,10]=pnChildRec
gaErrors[lnErrorRows,11]=pcChildID
gaErrors[lnErrorRows,12]=pcChildExpr
return tnErrNo


PROCEDURE riopen
PARAMETERS tcTable,tcOrder

LOCAL lcCurWkArea,lcNewWkArea,lnInUseSpot,lnOccurs,lnOccurance
lnInUseSpot=0
lnOccurs = OCCURS(UPPER(tcTable)+"*",UPPER(pcRIcursors))
FOR lnOccurance = 1 TO lnOccurs
    lnInUseSpot=ATC(tcTable+"*",pcRIcursors,lnOccurance)
    IF ISDIGIT(SUBSTR(pcRIcursors,lnInUseSpot-1,1)) OR;
         EMPTY(SUBSTR(pcRIcursors,lnInUseSpot-1,1))
        EXIT
    ENDIF
    lnInUseSpot=0
ENDFOR

IF lnInUseSpot=0
  lcCurWkArea=select()
  SELECT 0
  lcNewWkArea=select()
  IF NOT EMPTY(tcOrder)
    USE (tcTable) AGAIN ORDER (tcOrder) ;
      ALIAS ("__ri"+LTRIM(STR(SELECT()))) share
  ELSE
    USE (tcTable) AGAIN ALIAS ("__ri"+LTRIM(STR(SELECT()))) share
  ENDIF
  if pnerror=0
    pcRIcursors=pcRIcursors+upper(tcTable)+"?"+STR(SELECT(),5)
  else
    lcNewWkArea=0
  endif something bad happened while attempting to open the file
ELSE
  lcNewWkArea=val(substr(pcRIcursors,lnInUseSpot+len(tcTable)+1,5))
  pcRIcursors = strtran(pcRIcursors,upper(tcTable)+"*"+str(lcNewWkArea,5),;
    upper(tcTable)+"?"+str(lcNewWkArea,5))
  IF NOT EMPTY(tcOrder)
    SET ORDER TO (tcOrder) IN (lcNewWkArea)
  ENDIF sent an order
  if pnerror<>0
    lcNewWkArea=0
  endif something bad happened while setting order
ENDIF
RETURN (lcNewWkArea)


PROCEDURE riend
PARAMETERS tlSuccess
local lnXX,lnSpot,lcWorkArea
IF tlSuccess
  END TRANSACTION
ELSE
  SET DELETED OFF
  ROLLBACK
  SET DELETED ON
ENDIF
IF EMPTY(pcRIolderror)
  ON ERROR
ELSE
  ON ERROR &pcRIolderror.
ENDIF
FOR lnXX=1 TO occurs("*",pcRIcursors)
  lnSpot=atc("*",pcRIcursors,lnXX)+1
  USE IN (VAL(substr(pcRIcursors,lnSpot,5)))
ENDFOR
IF pcOldCompat = "ON"
    SET COMPATIBLE ON
ENDIF
IF pcOldDele="OFF"
  SET DELETED OFF
ENDIF
IF pcOldExact="ON"
  SET EXACT ON
ENDIF
IF pcOldTalk="ON"
  SET TALK ON
ENDIF
do case
  case empty(pcOldDBC)
    set data to
  case pcOldDBC<>DBC()
    set data to (pcOldDBC)
endcase
RETURN .T.


PROCEDURE rireuse
* rireuse.prg
PARAMETERS tcTableName,tcWkArea
pcRIcursors = strtran(pcRIcursors,upper(tcTableName)+"?"+str(tcWkArea,5),;
  upper(tcTableName)+"*"+str(tcWkArea,5))
RETURN .t.

********************************************************************************
procedure __RI_UPDATE_departments
** "Referential integrity update trigger for" departments
LOCAL llRetVal
llRetVal = .t.
PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
PRIVATE pcParentExpr,pcChildExpr
STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
STORE 0 TO pnParentRec,pnChildRec
IF _triggerlevel=1
  BEGIN TRANSACTION
  PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
  pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
  pcOldTalk=SET("TALK")
  SET TALK OFF
  pcOldDele=SET("DELETED")
  pcOldExact=SET("EXACT")
  pcOldCompat=SET("COMPATIBLE")
  SET COMPATIBLE OFF
  SET DELETED ON
  SET EXACT OFF
  pcRIcursors=""
  pcRIwkareas=""
  pcRIolderror=ON("error")
  pnerror=0
  ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
  IF TYPE('gaErrors(1)')<>"U"
    release gaErrors
  ENDIF
  PUBLIC gaErrors(1,12)
  pcOldDBC=DBC()
  SET DATA TO ("CADRES")
ENDIF first trigger
LOCAL lcParentID && parent's value to be sought in child
LOCAL lcOldParentID && previous parent id value
LOCAL lcChildWkArea && child work area handle returned by riopen
LOCAL lcChildID && child's value to be sought in parent
LOCAL lcOldChildID && old child id value
LOCAL lcParentWkArea && parentwork area handle returned by riopen
LOCAL lcStartArea
lcStartArea=select()
llRetVal=.t.
lcParentWkArea=select()
SELECT (lcParentWkArea)
pcParentDBF=dbf()
pnParentRec=recno()
lcOldParentID=OLDVAL("ID")
pcParentID=lcOldParentID
pcParentExpr="ID"
lcParentID=ID
IF lcParentID<>lcOldParentID
  lcChildWkArea=riopen("main")
  IF lcChildWkArea<=0
    IF _triggerlevel=1
      DO riend WITH .F.
    ENDIF at the end of the highest trigger level
    SELECT (lcStartArea)
    RETURN .F.
  ENDIF not able to open the child work area
  pcChildDBF=dbf(lcChildWkArea)
  SELECT (lcChildWkArea)
  SCAN FOR DEPART_ACTUAL=lcOldParentID
    pnChildRec=recno()
    pcChildID=DEPART_ACTUAL
    pcChildExpr="DEPART_ACTUAL"
    IF NOT llRetVal
      EXIT
    ENDIF && not llretval
    llRetVal=riupdate("DEPART_ACTUAL",lcParentID,"DEPARTMENTS")
  ENDSCAN get all of the main records
  =rireuse("main",lcChildWkArea)
  IF NOT llRetVal
    IF _triggerlevel=1
      DO riend WITH llRetVal
    ENDIF at the end of the highest trigger level
    SELECT (lcStartArea)
    RETURN llRetVal
  ENDIF
ENDIF this parent id changed
SELECT (lcParentWkArea)
pcParentDBF=dbf()
pnParentRec=recno()
lcOldParentID=OLDVAL("ID")
pcParentID=lcOldParentID
pcParentExpr="ID"
lcParentID=ID
IF lcParentID<>lcOldParentID
  lcChildWkArea=riopen("main")
  IF lcChildWkArea<=0
    IF _triggerlevel=1
      DO riend WITH .F.
    ENDIF at the end of the highest trigger level
    SELECT (lcStartArea)
    RETURN .F.
  ENDIF not able to open the child work area
  pcChildDBF=dbf(lcChildWkArea)
  SELECT (lcChildWkArea)
  SCAN FOR DEPART_DECREE=lcOldParentID
    pnChildRec=recno()
    pcChildID=DEPART_DECREE
    pcChildExpr="DEPART_DECREE"
    IF NOT llRetVal
      EXIT
    ENDIF && not llretval
    llRetVal=riupdate("DEPART_DECREE",lcParentID,"DEPARTMENTS")
  ENDSCAN get all of the main records
  =rireuse("main",lcChildWkArea)
  IF NOT llRetVal
    IF _triggerlevel=1
      DO riend WITH llRetVal
    ENDIF at the end of the highest trigger level
    SELECT (lcStartArea)
    RETURN llRetVal
  ENDIF
ENDIF this parent id changed
IF _triggerlevel=1
  do riend with llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
** "End of Referential integrity Update trigger for" departments
********************************************************************************
**__RI_FOOTER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_FOOTER**


Таблицы и связи создавались через 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" или что-то вроде этого).
PM MAIL   Вверх
MFoxer
Дата 28.3.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 18.1.2006

Репутация: -1
Всего: нет



Блин smile Утомил ты меня. Напиши письмо на [email protected], я тебе вышлю пример с описанием.
Зачем ты вообще пользуешься для поддержания ссылочной целостности фоксовским визардом. Делай все руками, меньше проблем будет.
Удачи.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Foxpro/Clipper/Dbase"
MoLeX

Запрещается!

1. Публиковать ссылки для чисто рекламных целей.

2. Оффтопить, флеймить, говорить не культурно.

Пожалуйста, адекватно задавайте свой вопрос. Тема должна создаваться с названием характеризующем Вашу проблему.

Задавайте вопросы правильно - как спросите, так вам и ответят.

Разрешено!

Давать ссылки на статьи, обзоры, если это не нарушает первый пункт правил.

Задавая вопрос, давайте нужную информацию касающуюся Вашей проблемы. Этим вы ускорите полезные ответы.

P.S. Размещение рекламы будет строго наказываться!



Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MoLeX

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Foxpro/Clipper/Dbase | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.