On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





Пост N: 86
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 18:47. Заголовок: Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"


Добрый день, уважаемые коллеги.

Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении.

Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!"
Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило.
Возникли ошибки на этапе линковки:

Скрытый текст

Help, please - что делать и куды бечь ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 285 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


постоянный участник




Пост N: 235
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.13 20:22. Заголовок: Sergy пишет:теперь к..


Sergy пишет:
 цитата:
теперь курсор не сдвигается с места после установки запятой


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

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 221
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.08.13 20:46. Заголовок: SergKis пишет: так ..


SergKis пишет:

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


Спасибо

просто "мой кунг-фу недостаточно хорош" (с) - не силен я в классах.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 227
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 10:10. Заголовок: Вопрос. Вот есть та..


Вопрос.

Вот есть такой код:

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 однозначно определять успех/неуспех открытия индексов ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2955
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 10:21. Заголовок: Sergy пишет: Судя п..


Sergy пишет:

 цитата:
Судя по ошибке, dbf открылся, а ntx - нет.



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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 229
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 10:24. Заголовок: Pasha пишет: Наобор..


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 доступ (база с сообщениями - постоянна изменяющаяся, в общем доступе на сервере).
Во втором - локальная, справочник, монопольный.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 910
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.13 10:47. Заголовок: IPRICEV - это переме..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2946
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.13 11:04. Заголовок: Sergy пишет: USE (d..


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


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 230
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 11:37. Заголовок: PSP пишет: IPRICEV ..


PSP пишет:

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


вот тут:
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW
текстовая переменная

в списке OpenTables - алиас открытой области/ Его формирует автоматом обработчик ошибок перед завершением программы.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 231
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 11:43. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделай все поочередно:


во всей программе ?

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

Вопрос в другом - почему не отрабатывает NETERR() ???

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2947
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.13 11:51. Заголовок: Sergy пишет: во все..


Sergy пишет:

 цитата:
во всей программе ?


Нет. Где вылетает !
Так проще будет тебе понять.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 232
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 12:06. Заголовок: Блин, нафига тогда н..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 20
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 26.08.13 12:29. Заголовок: Допустимость и успешность USE EXCLUSIVE - можно и нужно проверять


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() - ловит не все проблемы открытия таблицы


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 233
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 12:33. Заголовок: petr707 пишет: А ещ..


petr707 пишет:

 цитата:
А еще лучше - переопределить команду USE под свою задачу , примеров много есть



Можно тут по-подробнее плиз ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 911
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.13 12:46. Заголовок: Sergy , попробуй зад..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 21
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 26.08.13 14:17. Заголовок: Команда USE - иллюстрация


Смотрим \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


Спасибо: 1 
ПрофильЦитата Ответить
Администратор




Пост N: 2956
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 14:21. Заголовок: Вопрос же простой, к..


Вопрос же простой, как 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.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3465
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 14:30. Заголовок: Pasha пишет: Мораль..


Pasha пишет:

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


+1

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 234
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 16:18. Заголовок: Pasha пишет: Мораль..


Pasha пишет:

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



Вы меня совсем уж за придурка не держите плиз. больше 15 лет разработки и поддержания именно этой задачи. В сети сидят одновременно 20-30 юзеров, которые работали на Clipper задаче. Но медленно.

В EXCLUSIVE открывается локальный файл со справочником, который редко меняется (имена, цены, контрагенты). Целиком берется и целиком сливается с сервера в локальную папку.
Дальше строится локальный индекс и открывается в ESXCLUSIVE.

Первый пример (с mail.dbf) - способ открытия по умолчанию, т.е. SHARED (тк в самом начале программы установка SET EXCLUSIVE OFF).
Второй - аналогичная ситуация, но файл - локальный и открывается монопольно. И не может быть открыт никаким другим процессом. Это временная таблица, которая будет стерта при выходе.

Поэтому вопрос пока открыт: почему с переходом на Harbour стали возникать ошибки такого рода:

Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD




Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 235
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 16:22. Заголовок: PSP пишет: попробуй..


PSP пишет:

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



сделал по другому - убрал нахрен переменную IPRICEV и тупо вписал:

USE (local_dir+"ipricev") INDEX (local_dir+"ipricev") EXCLUSIVE NEW

посмотрим, что будет. Пока с вероятностью 50/50 возникает ошибка. :(

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3468
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 16:25. Заголовок: Sergy пишет: USE (l..


Sergy пишет:

 цитата:
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW


Попробуй жестко указывать ALIAS , что то было у меня похожее

ЗЫ
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) ALIAS TEMPBASE EXCLUSIVE NEW

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 285 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 403
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет