Форум » [x]Harbour » Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка" » Ответить

Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"

Sergy: Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: [more]Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_ENVPARAM' referenced from D:\HB\TRADE100.OBJ Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced from D:\HB\TRADE226.OBJ Error: Unresolved external '_HB_FUN_DISKFREE' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_BIOSDATE' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONTICK' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_FT_IAMIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_KEYSEND' referenced from D:\HB\TRADE200.OBJ 1) Так понимаю, это ошибки из-за того, что не находятся некоторые функции из активно используемых CT3/Nanforum Toolkit ? Что делать с ними ? Отказываться ? Или есть заменители ? Error: Unresolved external '_HB_FUN_STACKFREE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCTOT' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCTOT' referenced from D:\HB\TRADE200.OBJ 2) Это - ошибки из-за вызовов встроенных в Blinker функций, без них легко обойтись в принципе... Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced from D:\HB\TRADE208.OBJ Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' referenced from D:\HB\TRADE206.OBJ Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced from D:\HB\TRADE220.OBJ Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' referenced from D:\HB\TRADE221.OBJ 3) А вот это - самое странное - это мои функции, причем некоторые из них вызываются многократно из других модулей. Например ApplyCargoChanges является STATIC в самом модуле TRADE221 - почему линковщик ее не видит, наряду с парой Apply... других ? SelectStocks активно используется в других модулях - но там линкер почему-то ошибок не видит... [/more] Help, please - что делать и куды бечь ?

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

SergKis: Sergy пишет:теперь курсор не сдвигается с места после установки запятой так я делал замену, не вставку, а для упр. позицией каретки служит oGet:pos += 1 или как надо

Sergy: SergKis пишет: так я делал замену, не вставку, а для упр. позицией каретки служит oGet:pos += 1 или как надо Спасибо просто "мой кунг-фу недостаточно хорош" (с) - не силен я в классах.

Sergy: Вопрос. Вот есть такой код: USE (dx+"mail") INDEX (dx+"mail"),(dx+"mail2") NEW // <<< строка 81 IF NETERR() CLOSE mail SELECT(area) RETURN {area,FALSE,FALSE} ENDIF Возникает ошибка: Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD Вызов из ORDLISTADD(0) Вызов из DBSETINDEX(0) Вызов из OPENMAIL(81) ... Судя по ошибке, dbf открылся, а ntx - нет. Переменная dx совершенно точно к этому моменту определена и существует. Подобный код в Clipper всегда работал и не вызывал ни единой проблемы. Что тут может быть в данном случае ? Как в Harbour однозначно определять успех/неуспех открытия индексов ?


Pasha: Sergy пишет: Судя по ошибке, dbf открылся, а ntx - нет. Наоборот, не открылся dbf, и попытка при этом открыть индекс Причину ищите. Или dbf файл не найден, или что-то связанное с монопольным доступом к нему

Sergy: Pasha пишет: Наоборот, не открылся dbf Вот еще поймал, на другой машине: Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD Вызов из ORDLISTADD(0) Вызов из DBSETINDEX(0) Вызов из IP_LOAD(734) ... USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW // строка 734 local_dir точно существует, ipricev.dbf открылся: Open Tables: 1. BUYPRICE 2. PRICE 3. RESERV 4. AMOUNT 5. AMIMAGE 6. IPRICEV что-то связанное с монопольным доступом к нему В первом примере 100% shared доступ (база с сообщениями - постоянна изменяющаяся, в общем доступе на сервере). Во втором - локальная, справочник, монопольный.

PSP: IPRICEV - это переменная?

Andrey: Sergy пишет: USE (dx+"mail") INDEX (dx+"mail"),(dx+"mail2") NEW // <<< строка 81 Сделай все поочередно: // Блок обработки ошибки bOldError := ERRORBLOCK( {|e| OpenDBF(e, bOldError)} ) BEGIN SEQUENCE USE (dx+"mail") ALIAS MAIL NEW SHARED RECOVER MSG( "Не могу открыть БД " + dx+"mail" + " !" RETURN( .F. ) END SEQUENCE BEGIN SEQUENCE ORDLISTADD( dx+"mail" ) ORDLISTADD( dx+"mail2" ) RECOVER MSG( " Индекс " + dx+"mail не найден ! RETURN( .F. ) END SEQUENCE

Sergy: PSP пишет: IPRICEV - это переменная? вот тут: USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW текстовая переменная в списке OpenTables - алиас открытой области/ Его формирует автоматом обработчик ошибок перед завершением программы.

Sergy: Andrey пишет: Сделай все поочередно: во всей программе ? Дело в том, что определенной логики в возникновении данного явления никак найти не могу. Тот-же пример с mail вообще вызывается на каждой машине сети каждые 2-3 минуты (для проверки наличия новых писем) - все работает, хоть бы хны... Вопрос в другом - почему не отрабатывает NETERR() ???

Andrey: Sergy пишет: во всей программе ? Нет. Где вылетает ! Так проще будет тебе понять.

Sergy: Блин, нафига тогда нужен NETERR() ?

petr707: USE (local_dir+IPRICEV) ... EXCLUSIVE NEW 1) перед USE - можно проверить на возможность EXCLUSIVE if enable_excl(local_dir+IPRICEV)// функцию легко создать use endif А еще лучше - переопределить команду USE под свою задачу , примеров много есть 2) Явное указание ALIAS xxx - лучше неявного 3) После USE - также проверить - состоялся ли USE .. alias xxxx if select(xxx)>0 endif 4)NETERR() - ловит не все проблемы открытия таблицы

Sergy: petr707 пишет: А еще лучше - переопределить команду USE под свою задачу , примеров много есть Можно тут по-подробнее плиз ?

PSP: Sergy , попробуй задать alias отличный от имени переменной IPRICEV. К примеру, IPV Что будет?

petr707: Смотрим \include\std.ch и переделываем функцию в описании команды на свою, подключаем к проекту свой redefine.ch если добавите в самом переопределении к обслуживанию USE служебные нагрузки( Public масссивы, переменные, статусы таблиц и прочее) то же нужно сделать и с командами CLOSE и т.д. ниже - только иллюстрация возможности - замена функции DBUSEAREA на NETUSE Внутри NETUSE конечно также есть DbUSEAREA, только еще дополнительная сервисная обертка для обработки ошибок,разнесения блокировок, логирования и прочее.. Этот вариант - когда нет задачи менять PRG-код и можно достичь цели переопределением команд включением еще одного include redefine.ch Обертка может быть и в PRG-коде, но тогда - нужно переписывать все вызовы в PRG-коде. =====\include\std.ch========= #command USE <(db)> [VIA <rdd>] [ALIAS <a>] [<nw: NEW>] ; [<ex: EXCLUSIVE>] [<sh: SHARED>] [<ro: READONLY>] ; [CODEPAGE <cp>] [INDEX <(index1)> [, <(indexN)>]] => ; dbUseArea( <.nw.>, <rdd>, <(db)>, <(a)>, ; if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.> [, <cp>] ) ; [; dbSetIndex( <(index1)> )] ; [; dbSetIndex( <(indexN)> )] ========== redefine.ch============= #command USE <(db)> ; [VIA <rdd>] ; [ALIAS <a>] ; [<new: NEW>] ; [<ex: EXCLUSIVE>] ; [<sh: SHARED>] ; [<ro: READONLY>] ; ; =>if !netuse ( ; <(db)>, <(a)>,if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), ; <.new.>,<.ro.> ; ,5,1," Неудачная попытка открытия таблицы. Повторить? " ; ); ; quit ;; endif

Pasha: Вопрос же простой, как 5 копеек. Все описано в ng по клипперу. Sergy пишет: Блин, нафига тогда нужен NETERR() ? Используется в 2-х случаях. Для append пропустим, это не наш случай. Для use не генерируется исключение, когда файл не открыт по причине того, что он либо уже открыт монопольно другим процессом, либо при попытке открыть его монопольно, когда он уже открыт другим процессом в режиме разделения. Вместо этого устанавливается значение для neterr() Команда use ... index ... Это не одна команда, а две или более: открытие файла, и затем открытие одного или более индексов для уже открытого файла. Причем успешность открытия индекса зависит от успешности выполнения use. Такую команду можно использовать, если есть гарантированная уверенность в успешности открытия файла. Если такой уверенности нет, то надо использовать проверку neterr. Прямо как в примере из ng: USE Customer SHARED NEW IF !NETERR() SET INDEX TO CustNum, CustOrders, CustZip ELSE ? "Файл уже используется другим пользователем" ENDIF Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive.

Dima: Pasha пишет: Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive. +1

Sergy: Pasha пишет: Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive. Вы меня совсем уж за придурка не держите плиз. больше 15 лет разработки и поддержания именно этой задачи. В сети сидят одновременно 20-30 юзеров, которые работали на Clipper задаче. Но медленно. В EXCLUSIVE открывается локальный файл со справочником, который редко меняется (имена, цены, контрагенты). Целиком берется и целиком сливается с сервера в локальную папку. Дальше строится локальный индекс и открывается в ESXCLUSIVE. Первый пример (с mail.dbf) - способ открытия по умолчанию, т.е. SHARED (тк в самом начале программы установка SET EXCLUSIVE OFF). Второй - аналогичная ситуация, но файл - локальный и открывается монопольно. И не может быть открыт никаким другим процессом. Это временная таблица, которая будет стерта при выходе. Поэтому вопрос пока открыт: почему с переходом на Harbour стали возникать ошибки такого рода: Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD

Sergy: PSP пишет: попробуй задать alias отличный от имени переменной IPRICEV. К примеру, IPV Что будет? сделал по другому - убрал нахрен переменную IPRICEV и тупо вписал: USE (local_dir+"ipricev") INDEX (local_dir+"ipricev") EXCLUSIVE NEW посмотрим, что будет. Пока с вероятностью 50/50 возникает ошибка. :(

Dima: Sergy пишет: USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW Попробуй жестко указывать ALIAS , что то было у меня похожее ЗЫ USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) ALIAS TEMPBASE EXCLUSIVE NEW



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