Форум » [x]Harbour » почему сбоит блокировка записи или что-то я пропустил ? » Ответить

почему сбоит блокировка записи или что-то я пропустил ?

Andrey: Пишу здесь, так как тему новую заводить не хочу. Вопрос такой - почему сбоит блокировка записи или что-то я пропустил ? Произвожу обработку базы в цикле (база открыта в режиме SHARED): [more] DO WHILE ABONENT->NN == nIDD // обработать список абонентов IF ABONENT->(RLock()) FOR nJ := 1 TO LEN(aField) // поля для добавления из другой БД FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) // строка 305 NEXT .......... DBUNLOCK() nRecWrt++ ELSE MsgInfo("Запись "+HB_NtoS(RECNO())+" в БД- "+Alias()+" заблокирована!") ENDIF SKIP ProcessMessages() // Чтобы форма НЕ замирала ENDDO [/more] Выдаёт ошибку где-то в конце обработки базы: На локальном компе работает отлично. А в сети свалилась.

Ответов - 29, стр: 1 2 All

Pasha: Как бы RLock() выдается для abonent, а FieldPut неизвестно для чего

Dima: Andrey пишет: FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) // строка 305 1. Уточни алиасом обе функции Andrey пишет: DBUNLOCK() 2. См. пункт 1 Andrey пишет: SKIP 3. См. пункт 2 4. DO WHILE ABONENT->NN == nIDD DO WHILE ABONENT->NN == nIDD .and. !ABONENT->(eof())

Andrey: Dima пишет: 1. Уточни алиасом обе функции Я выше делаю перед DO WHILE ABONENT->NN == nIDD SELECT ABONENT Из-за этого считаю что что не обязательно делать: ABONENT->DBUNLOCK() и ABONENT->SKIP Или нужно ?


Pasha: Тогда и необязательно делать abonent->(RLock()) Нам же не видно, что там стоит выше. И не видно, что в месте .............

Andrey: Pasha пишет: Нам же не видно, что там стоит выше. И не видно, что в месте ............. Каюсь, упустил при задании вопроса. Так в чём ошибка в коде у меня ? Почему вылетает с ошибкой ?

Dima: Andrey пишет: NEXT .......... DBUNLOCK() Andrey пишет: Что живет между NEXT и DBUNLOCK() ?

Andrey: Dima пишет: Что живет между NEXT и DBUNLOCK() ? Штук 5 присвоений типа: ABONENT->XXXX := ..... Потом вызов другой функции, где я делаю: LOCAL nSel:=SELECT(), nRec:=RECNO() .... SELECT( nSel ) RETURN xCode

Pasha: в рабочей области abonent текущая запись смещается ? Если дается фрагмент кода, то непонятно, что делается за этим фрагментом. Тогда на вопроc: Так в чём ошибка в коде у меня ? Почему вылетает с ошибкой ? дать ответ невозможно

Dima: Pasha пишет: в рабочей области abonent текущая запись смещается ? +1 По ходу с таким "кодом" подозреваю что где то сменилась и рабочая область , поэтому FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) будет выполнятся совсем не по abonent

Haz: А смотрю тут одни экстрасенсы тусуются , пытаясь дать ответ угадывая что там в коде и где Andrey пишет: Потом вызов другой функции, где я делаю: в итоге мы в 10 серии узнаем что там делается abonent->(dbGoTop())

Dima: Haz пишет: Andrey пишет: цитата: Потом вызов другой функции, где я делаю: Вероятно из нее вызывается еще какая то функция Andrey Давай весь код уже , если там не 2 гига сырцов

Andrey: Haz пишет: А смотрю тут одни экстрасенсы тусуются , пытаясь дать ответ угадывая что там в коде и где Аналогично... Сам иногда выступаю в его роли. Просмотрел ещё раз исходники - нет больше других рабочих областей. И abonent->(dbGoTop()) нигде не делаю. Поставил везде отладку, буду смотреть почему в сети отваливается. Код где вываливается не критична, ну тенденция мне НЕ НРАВИТЬСЯ. На терминалке в хХарборе никогда не было таких сетевых ошибок. В МиниГуи по другому - нужно перестраиваться и быть ОЧЕЕЕНННЬЬЬЬ внимательным... Сам натыкался на такие залёты...

Pasha: Думаю что там кода много, так что попробуем обойтись без него. Поэтому вкратце: Чтобы исключить ошибки lock require. надо: - успешно заблокировать нужную запись через RLock() - выполнять запись только в нужной рабочей области - если текущая запись в этой рабочей области сместилась, вернуть ее назад перед модификацией данных - не вызывать dbUnlock() в этой рабочей области - не выдавать rlock() на другой записи в этой области примерно так. Можно, конечно, еще постараться и получить lock requred другими способами, дальше распространяться не буду.

Pasha: Если ошибка происходит в среде hmg, то не может ли какой-нибудь контрол при получении или потере фокуса изменить текущую рабочую область ? Чтобы предохранится от этого, достаточно при обращении к рабочей области прамо указывать алиас.

Andrey: Pasha пишет: - если текущая запись в этой рабочей области сместилась, вернуть ее назад перед модификацией данных Скорее всего вот в этом у меня ошибка. Так как поля которые я в цикле заполняю - входят в индексное выражение. Но я нигде индекс не меняю... Хотя возникает другая непонятка - такой код под хХарбором работал без ошибок. Индекс - DbSetOrder(2) по ID номеру, т.е. по числу. Поля и значения aField[] входят в другие индексы 3,4 SELECT ABONENT DbSetOrder(2) SEEK nIDD IF !FOUND() //MsgLog("----- нет списка по ID=",nIDD) ELSE DO WHILE ABONENT->NN == nIDD IF ABONENT->(RLock()) FOR nJ := 1 TO LEN(aField) // поля для добавления из БД-DOGOVOR FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) NEXT ABONENT->ADRESPRN := ADRES2HMG() ABONENT->ADRESKEY := ADRES2KEY() ABONENT->TIMEVVOD := 0 ABONENT->( DbUnlock() ) nRecWrt++ ELSE MsgInfo("Запись "+HB_NtoS(RECNO())+" в БД- "+Alias()+" заблокирована!") ENDIF SELECT ABONENT SKIP ProcessMessages() // Чтобы форма НЕ замирала ENDDO ENDIF // !FOUND()

Andrey: Pasha пишет: Если ошибка происходит в среде hmg, то не может ли какой-нибудь контрол при получении или потере фокуса изменить текущую рабочую область ? Чтобы предохранится от этого, достаточно при обращении к рабочей области прамо указывать алиас. Да у меня эта ошибка в МиниГуи происходит. Там еще прелодер сидит при показе в цикле. Везде стоит явное указание на БАЗУ !

Pasha: Ну как бы не везде. В самой интересной строке: FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) // строка 305 как раз не стоит

Pasha: ProcessMessages() // Чтобы форма НЕ замирала может приводить к потере фокуса окном, получением его другим контролом, у которого что-то выполнится на bGotFocus. Я конечно точно не знаю, что там, но подобные вещи могут происходить.

Dima: Andrey пишет: ABONENT->ADRESPRN := ADRES2HMG() ABONENT->ADRESKEY := ADRES2KEY() Шо живет в этих функциях ?

Andrey: Pasha пишет: может приводить к потере фокуса окном, получением его другим контролом, у которого что-то выполнится на bGotFocus. Я конечно точно не знаю, что там, но подобные вещи могут происходить. Понятно.... Dima пишет: Шо живет в этих функциях ? Да я уже писал по них: чтение из других 2-х баз, с восстановлением SELECT(nSel). На хХарборе уже лет 7 как работало без сбоев. А тут перетащил в МиниГуи кусок и на тебе - засада. Может FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) - заменить на другой код ?

Pasha: типа так: abonent->( FIELDPUT( FIELDNUM(aField[nJ,1]),aField[nJ,2] ) )

Andrey: Спасибо !

Andrey: Вопрос не в тему... Как узнать длину индексного выражения из индексного файла ?

Dima: Andrey ? &(OrdKey()) ? "Length of &(OrdKey()) :" + Str( Len( &(OrdKey()) ) ) ? OrdKeyVal() ? "Length of OrdKeyVal() :" + Str( Len(OrdKeyVal()) )

Andrey: Спасибо !

Haz: Andrey пишет: Как узнать длину индексного выражения из индексного файла ? Уточню , все что сказал Дима справедливо при символьном ключе разумеется.

Dima: Haz пишет: справедливо при символьном ключе разумеется. +1 , но Андрей не уточнял есть вопрос к Андрею а для чего это тебе в задаче ?

Haz: Dima пишет: OrdKeyVal() может OrdKey() - возвращает именно индексное выражение а не значение ключа. Возвращает всегда строку. Но вот для чего получать его длину я не понял

Andrey: Haz пишет: Но вот для чего получать его длину я не понял Когда делаешь сборный индекс по адресу в разных задачах (старых и новых) уже и не помнишь как сделал ранее индексный файл. Типа "STR(KCITY,3)+STR(KSTREET,4)+UPPER(cNumHOUSE)+STR(NumKorp,4)+UPPER(cNumKvar)" А поставив проверку (длину индекса) - хоть видишь где сам напортачил.



полная версия страницы