Форум » Clipper » Странные ошибки ! » Ответить

Странные ошибки !

Виталий: Не стого ни с сего возникают непредсказуемые ошибки при компиляции кода . Траблы заключаются в том что компилятор выкидывает на совершенно нормальных строках ошибки вроде неправильного синтаксиса и т д . Странно - но куски кода уже не менялись там несколько лет . Собственно что-то в модуле правлю - но не там где ошибка .... Выгружаю из памяти NG.EXE - и всё становится нормально . Код ЕХЕшника уже под 1 мег . Блинкер 7 CLIPPER 5.3 .... Что скажут ГУРУ ? Следующая ошибка - уже видно где-то я недосмотрел или не дочитал : Есть индекс CDX и вот иногда (пока не выяснил) выскакивает что-то вроде - "повреждены данные" .... это когда пытаюсь изненить какое-то поле - например логическое значение ...

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

Dima: Основной памяти не хватает для компиляции при загруженном NG скорее всего. Юзай weg - Expert Guide. Norton Guide Reader For Windows http://www.davep.org/norton-guides/ http://www.davep.org/norton-guides/WEGSetup.exe

Pager: Это ерунда! Вот когда начнет писать memory overbloker, тогда придеться помучиться: дробить PRG, уменьшать количество definoв, задавать rmakeу дополнительные параметры /XS /XW....

saulius: ... или отправиться к xHarbour, как Patric Виталий, "повреждены данные": подробнее: система, сеть, среда...


Виталий: saulius Могу скинуть на мыло кусочек кода с описанием - может поможешь ? А ошибка - _DBFCDX/8006 - Обнаружено разрушение данных . Вкратце : && Так я организую индексный файл USE "JROPT" ALIAS "LANJROPT" && Открыли журнал ОПТОВЫХ ПРОДАЖ INDEX ON CODE TAG CODE TO ("LANJROPT") FOR !DELETED() && код товара INDEX ON DATEP TAG DATEP TO ("LANJROPT") FOR !DELETED() && дата продажи INDEX ON OPTCODE TAG OPTCODE TO ("LANJROPT") FOR !DELETED() && код оптовика INDEX ON DATEP TAG DATEPU TO ("LANJROPT") FOR !DELETED() UNIQUE && все даты продаж (для быстрого меню ДАТЫ) INDEX ON OPL TAG OPL TO ("LANJROPT") FOR !DELETED() && Олачено/нет INDEX ON STR(OPTCODE,5,0)+DTOC(DATEP) TAG DPROD TO ("LANJROPT") FOR !DELETED() UNIQUE && все уникальные даты для каждого клиента - для меню КЛИЕНТ->ДАТА INDEX ON X_KASSE TAG XKASSE TO ("LANJROPT") FOR !DELETED() && номера кассовых чеков INDEX ON OPTCODE TAG OPTNEOPL TO ("LANJROPT") FOR (!DELETED() .AND. !OPL ) && по кодам клиентов только НЕОПЛАЧЕННОГО ТОВАРА SET INDEX TO ("LANJROPT") ********************************** && Убиваю стандартный обработчик ошибок bErrorHandler:={|oError| MyError(oError) } bLastHandler:=ERRORBLOCK(bErrorHandler) SELECT TABLE && Тут у нас список товара на оплату && CODE:N:6 - код товара && DAT:D:8 - дата продажи GO TOP DO WHILE !EOF() && пробегаем по списку на оплату S_C:=CODE && Код товара S_D:=DAT && Дата SELECT LANJROPT SET ORDER TO SET ORDER TO TAG OPTCODE && На индекс КЛИЕНТЫ SET SCOPE TO (KLIENT) && Видим только нужного GO TOP DO WHILE !EOF() && Пробегаем по данным нашему клиенту && МЕТКА-1 IF DATEP=S_D .AND. CODE=S_C .AND. !OPL .AND. OPTCODE=KLIENT && товар соответствует ?? RLOCK() NEOPL:=(KOL*CENA)-SUMOPL && Неоплаченная сумма для этой детали XX:=OST_DEN-NEOPL IF XX<0 && Денег на оплату меньше, чем нужно REPLACE LANJROPT->OPL WITH .F. && признак что не до конца оплачен REPLACE DOPL WITH DATE() && дата оплаты REPLACE SUMOPL WITH SUMOPL+OST_DEN && прибавляем денюжки к тому что уже могло быть New_OPL:=New_OPL+OST_DEN && Сумма уже разнесенная OST_DEN:=0 && Нет больше денег DBUNLOCK() ELSE && Денег на оплату этой позиции хватает && Проверяем нужно-ли оплачивать полностью или нет REPLACE DOPL WITH DATE() && Дата оплаты DOB:=(KOL*CENA)-SUMOPL && Добавленная сумма REPLACE SUMOPL WITH SUMOPL+DOB OST_DEN:=OST_DEN-DOB && Уменьшим остаток денег на сумму добавленных денег New_OPL:=NEW_OPL+DOB && Добавили сумму на сумму добавленных денег && МЕТКА-2 REPLACE LANJROPT->OPL WITH .T. && Признак что эта позиция оплачена полностью ENDIF EXIT && раз этот товар проплатили && значит нефиг искать дальше ENDIF SELECT LANJROPT && Ищем дальше SKIP ENDDO SELECT TABLE && Следующая деталька на оплату SKIP ENDDO ************************* вот тут если в алиасе LANJROPT сделать какие-либо движения (SKIP,GO TOP , DBCLOSEAREA()...) - возникает ошибка : _DBFCDX/8006 Обнаружено разрушение данных:OPL Я предполагаю что когда вошли в оплату (МЕТКА-1) по условию : !OPL - тоесть признак что товар не оплачен - а затем в теле делаем изменение этого флага (МЕТКА-2) и вываливается .

Dima: Pager пишет: Это ерунда! тогда как это объяснить ? Виталий пишет: Выгружаю из памяти NG.EXE - и всё становится нормально

Виталий: Видать что-то там в памяти мешает - может переменные какие "накладываются" ? Но это ошибки скорее системные . Меня интересует тема - как убрать [ОШИБКА _DBFCDX/8006 ]?

SergeJa: 1. после создания CDX ОБЯЗАТЕЛЬНО закрыть DBF - это относится ко всем CDX-драйверам 2. CDX в 5.3 кривые. лучше пользовать 5.2e + Six (или xHarbour)

Виталий: Попробую - но вроде я так и делаю ! Дело в том что создание индекса - рано утром при первом пуске .... да и другие станции в сети НИЧЕГО не создают - а все равно вылетает . И именно при изменении ЛОГИЧЕСКОГО поля ....

Виталий: А дрова у меня не DBFCDX а именно COMIX : _DBFCDX

saulius: Виталий, в ветке ELSE (где МЕТКА-2) невижу DBUNLOCK()

Виталий: Я просто порезал текст - там действительно небыло DBUNLOCK() . Я поставил - всё равно "ошибается" ! Блин - надоело мне заглушки выставлять на ERROR ! Стек жрёт !

SergeJa: а строить индекс по DTOC - неправильно. надо пользовать DTOS _Date_Format_ меняется - и кирдык. UNIQUE индексы также неприменимы (обсуждалось уж на форуме).

saulius: Виталий, Можно сделать кусок программы и локально получить стабильную ошибку ? Надо выяснить суть проблеммы. Какие заглушки ?

Виталий: Заглушки - это в смысле перехват ошибок на процедуру польщователя ... Кстати а что там про UNIQUE ??? Неприменимы в смысле когда ? Если вместе с логическим полем (составной индекс) или как ? По поводу построения DTOC-DTOS - у меня в программе формат ДАТЫ не меняется .... извините - 10 лет работает

SergeJa: PROC main FIELD qq dbCreate( "test1", {{'qq','C',10,0}}) use test1 aEval( Array(5),{|_1,_2| _1 := StrZero(_2,10), ; __dbAppend(), Field->qq := _1, ; __dbAppend(), Field->qq := _1 }) index on qq to test1 UNIQUE FOR !DELETED() dbGoTop() dbDelete() // удаляю запись 1 (qq == '0000000001') // замечу, что есть запись 2 (qq == '0000000001') dbEval({|| QOut(Field->qq) }) // где '0000000001' от 2-й записи? return

SergeJa: PROC main FIELD qq LOCAL i SET DELETED OFF dbCreate( "test1", {{'qq','C',10,0}}) use test1 aEval( Array(5),{|_1,_2| _1 := StrZero(_2,10), ; __dbAppend(), Field->qq := _1, ; __dbAppend(), Field->qq := _1 }) index on qq to test1 UNIQUE FOR !DELETED() index on qq to test2 UNIQUE ADDITIVE dbGoTop() dbDelete() // удаляю запись 1 (qq == '0000000001') // замечу, что есть запись 2 (qq == '0000000001') For i := 1 to 2 ? OrdSetFocus(i) dbEval({|| QOut(Field->qq), QQOut(STR(RecNo())+IIF(Deleted(),' Deleted','')) }) Next return

Виталий: SergeJa И что из твоего кода ? Когда делаю удаление - привычка SKIP(0) ....

SergeJa: Про SKIP(0) не понял. 10 лет программе? Мой тестик запусти. Sapienti sat.

Виталий: SKIP(0) - иногда чтоб рефрешик был записей ... Моя программулинка уже с 1995 года крутится .... начиналось с 5.0 и дошло до 5.3 . Думал уйти в винду ... да появился PageScript ... и пришлось остаться .... Про тестик расскажи поподробнее - а то не понял что где должно показать ?

SergeJa: рефреш бессмысленен в данном случае. для сборки теста сохранить мой примерчик в qqq.prg и ... clipper qqq.prg /m/n/a/w rtlink fi qqq ------- результат 0000000002 3 0000000003 5 0000000004 7 0000000005 9 0000000001 1 Deleted 0000000002 3 0000000003 5 0000000004 7 0000000005 9 ---- Диагноз уникальным индескам ставь сам. В анамнезе: после удаления записи данные индекса не соответствуют желаемым. Надеюсь, что твоя программа не обслуживает нужды стратегических объектов (живу я на северо-западе РФ :) ). Успехов!



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