Форум » [x]Harbour » Помогите советом начинающему... » Ответить

Помогите советом начинающему...

Urri: Тут вот надумал переползти на xHarbour. Возникла следующая проблема: имена всех функций и подпрограмм дополняются префиксом HB_FUN_. А можно ли этого избежать так, чтобы остались родные, начальные имена. У меня весь софт построен на скриптах, в которых уже стоят вызовы функций и процедур по привычным, родным именам. И перелопатить везде в 5000 текстовых файлах-скриптах вызовы функций и поменять на новые - задача крайне утомительная с непонятной перспективой на успех.

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

Лукашевский: Urri пишет: Среди параметров hb_gtinfo не удалось найти нужных Посмотри, как это у меня сделано, вдруг поможет. Хотя не факт, что это самый лучший вариант, - тоже пара тем тут на форуме обсуждалась по этому вопросу. if HB_GTVERSION() == "WVT" wint = HB_GtInfo(GTI_DESKTOPWIDTH) v_all = HB_GtInfo(GTI_DESKTOPHEIGHT) HB_GtInfo(GTI_FONTNAME, "Lucida Console") HB_GtInfo(GTI_FONTSIZE, IIF(v_all > 800, 34, IIF(v_all > 640, 18, 16))) HB_GtInfo(GTI_FONTWIDTH, IIF(wint > 1024, 16, IIF(wint > 800, 12, 9))) else SetConsoleDisplayMode(1) && в полноэкранный режим SetMode(25, 80) endif

Urri: alkresin пишет: Возможно, вы установили слишком большой шрифт, оно не помещается целиком на экране и отсюда такие фокусы ... Шрифт нормальный, после дергания окна по экрану в новом положении все выглядит аккуратно, я бы даже сказал красиво... Даже и неясно чего это такое поведение при запуске... Еще всплыла проблема... Благодаря советам alkresin заработали было в ADS SQL-запросы к dbf таблицам. Я очень от этого порадовался, т.к. весьма расчитывал на эту возможность в связке xHarbour & ADS. Однако выяснилось, что все хорошо работало в тестовом примере (до открытия баз данных задачи), а после открытия выдает AdsCreateSqlStatement( ,2 )=.f. После закрытия баз - все опять работает нормально. Что это за козни такие и как с этим бороться?

alkresin: Urri пишет: После закрытия баз - все опять работает нормально. Что это за козни такие и как с этим бороться? Было бы проще ответить на этот вопрос, если б вы составили небольшой пример, который легко было бы воспроизвести - чтобы там нужная база создавалась.


Urri: *-------------------------------------- procedure main request DBFCDX,DBFNTX Request Ads ? curdir_() ? AdsSetServerType(1) ? AdsIsServerLoaded('g:\') ? AdsConnect("g:\") rddSetDefault('ADSCDX') select(100) if !AdsExecuteSqlDirect( "SELECT * FROM rab\street WHERE kod<=20" ) ? "AdsExecuteSqlDirect - error" endif ? Reccount() Вот такой текст тестовой программы. Вообще не работает. curdir_() возвращает g:\rab\ ? AdsSetServerType(1) 0 ? AdsIsServerLoaded('g:\') 1 ? AdsConnect("g:\") .t. После этого "AdsExecuteSqlDirect - error" В g:\rab\ имеется примитивная база street.dbf с тремя полями kod n(4),naim c(20),kolic n(6) Не работает также и для remote сервера если поменять g: на m: и в AdsSetServerType(1) поставить параметром 2. Самое интересно то, что этот тестовый пример, запущенный через мой интерпретатор - работает. Удивительно до невозможности. Но потом и интерпретаторе, если открыть обычным клипперовским способом любую базу - перестает работать. Закроешь все - снова работает. Даже отдельное закрытие алиаса ADSSQL не помогает

alkresin: А куда потерялся AdsCreateSqlStatement() ??? Запустил ваш пример в таком виде: PROCEDURE main LOCAL arr := { { "KOD","N",4,0 }, { "NAIM","C",20,0 } } REQUEST DBFCDX, DBFNTX REQUEST Ads ? CurDir() ? AdsSetServerType( 1 ) ? AdsIsServerLoaded( 'c:\' ) ? AdsConnect( "c:\" ) rddSetDefault( 'ADSCDX' ) dbCreate( "c:\street.dbf", arr ) use ("c:\street.dbf") append blank replace kod with 12,naim with "12" append blank replace kod with 30,naim with "30" dbCloseArea() SELECT( 100 ) IF !AdsCreateSqlStatement( , 2 ) ? "Cannot create SQL statement" ENDIF IF !AdsExecuteSqlDirect( "SELECT * FROM street WHERE kod<=20" ) ? "AdsExecuteSqlDirect - error" ENDIF ? RecCount() RETURN Nil Все работает. Кстати, прошу вас в дальнейшем приводить примеры именно в таком виде, готовом к исполнению, не предлагая создать таблицу где-то в rab/ - чтобы можно было, не теряя времени, скопировать его в prg и запустить.

k_dima: to alkresin: Есть ли возможность подключить в RDDADS функцию AdsSetString , чтобы использовать подстановку параметров в запросе ? http://devzone.advantagedatabase.com/dz/webhelp/Advantage9.0/mergedProjects/ace/api3/adspreparesql.htm

Pasha: Вызов AdsSet* можно добавить и самому #pragma BEGINDUMP #include "hbapi.h" #include "rddads.h" HB_FUNC( ADSSETSTRING ) { AdsSetString( hb_parnl(1), hb_parc(2), hb_parc(3), hb_parclen(3) ); } #pragma ENDDUMP Хотя этот wrapper можно добавить и в rddads

Urri: Добрый день, уважаемые... alkresin пишет: А куда потерялся AdsCreateSqlStatement() ??? Есть в реальном примере, честное слово. Не знаю как вывалился в моем вопросе... Извиняюсь... В том виде, в котором вы прислали подкорректированный мой пример, и у меня запустилось. Только вот после того, как я между строками dbclosearea() и select(100) добавил строки select 0 use c:\street начало вываливаться сообщение AdsExecuteSqlDirect - error Т.е. получается: если я работаю с .DBF файлом в обычном клипперовском смысле и мне в какой-то момент нужно по нему сделать какую-то выборку соответствующий алиас нужно закрывать а потом снова открывать??? А если с этой таблицей параллельно работают другие пользователи на сети - то работает... Неожиданно однако... alkresin пишет: Кстати, прошу вас в дальнейшем приводить примеры именно в таком виде, готовом к исполнению, не предлагая создать таблицу где-то в rab/ - чтобы можно было, не теряя времени, скопировать его в prg и запустить. Признаю свою ошибку и извиняюсь. Категорически обещаю исправиться... Благодарю за вашу помощь и внимание к моим проблемам.

k_dima: Cпасибо, добавил в проект. Cтранно, что никому больше не нужен был вызов этой функции, хотя она включена только для 9 версии ADS.

alkresin: Urri пишет: Только вот после того, как я между строками dbclosearea() и select(100) добавил строки select 0 use c:\street начало вываливаться сообщение AdsExecuteSqlDirect - error Т.е. получается: если я работаю с .DBF файлом в обычном клипперовском смысле и мне в какой-то момент нужно по нему сделать какую-то выборку соответствующий алиас нужно закрывать а потом снова открывать??? Вы же открыли таблицу в exclusive режиме... Попробуйте use c:\street shared

Urri: alkresin пишет: Вы же открыли таблицу в exclusive режиме... Попробуйте use c:\street shared Да, спасибо, так получилось. В пердыдущих своих попытках работать с SQL в больших проектах у меня тоже не получалось, хотя там все базы открываются в режиме shared. А теперь и там получается, наверное, следуя вашим советам, сделал что-то правильно и успех достигнут. Нужно теперь будет подробнее изучить ADS'овский SQL: читал, что имеются существенные ограничения. Но все-равно - прогресс, а то вызывать FOXPRO для получения выборок и итогов, для чего вся база тащется по сети, уже достало. Еще раз спасибо за терпение и внимание.

Urri: Добрый день. Пытаюсь активно работать с SQL запросами. То радуюсь, то расстраиваюсь. Сейчас такая проблема: если записать where prz_pdc='Дт', то не отбирает, русские буквы не понимает. В программе есть операторы REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU866 hb_SetCodepage( "RU866" ) В настройках ADSLOCAL.CFG ; ANSI Character Set ANSI_CHAR_SET=RUSSIAN ; OEM/Localized Character Set OEM_CHAR_SET=RUSSIAN Сервере для remote такие параметры установлены и тоже не работает отбор. Замена 'Дт' DOS кодировки на Windows к положительному результату не приводит. Что делать, подскажите

Pasha: Urri пишет: Что делать, подскажите При старте программы надо указать: AdsSetCharType( 2, .t. )

Urri: Pasha пишет: При старте программы надо указать: AdsSetCharType( 2, .t. ) Такой оператор уже имеется в программе, но не помогает.

Pasha: Urri пишет: Такой оператор уже имеется в программе, но не помогает. А функции upper/lower для полей БД правильно работают ? В качестве теста русских строк в sql-операторах можно выполнить такую команду update table1 set field1 = 'А' where RecID = :nRecID и затем проверить, правильно ли записываются русские символы

Urri: В качестве теста выполнял команды sql="update abonent\dbf\street set unaim='АБВГДЕ'" Что в DOS кодировке, что в Windows кодировке записывало в базу полную фигню sql="update abonent\dbf\street set unaim=upper(naim)" Также в базу записывает фигню. Но если в цикле программно пробежаться и сделать такое присвоение с использованием встроенной ф-ции upper - все нормально получается. И что это означает?

Urri: Urri пишет: Pasha пишет: цитата: При старте программы надо указать: AdsSetCharType( 2, .t. ) С этой ф-цией программа работает нормально, но не работает SQL запрос в том виде как я писал. Убрал вызов этой ф-ции - заработал SQL запрос, но многое другое поломалось. Вот же незадача... И как с этим бороться?

Pasha: Urri пишет: И как с этим бороться? Тогда причина понятна. Не буду вдаваться в подробности, надо в модуле rddads\adsfunc.c в функции HB_FUNC( ADSEXECUTESQLDIRECT ) строку char * pucStmt = hb_adsOemToAnsi( hb_parc( 1 ), hb_parclen( 1 ) ); заменить на char * pucStmt = hb_parc( 1 ); и пересобрать rddads.lib

Urri: Ура. Заработало. Павел, большое спасибо. Выручил, как всегда...

Pasha: Не можете проверить, правильно ли работают функции AdsPrepareSQL AdsVerifySql содержащие строковые константы с русскими симолами ? Если нет, в этих функциях надо сделать подобную замену Вызов hb_adsOemToAnsi добавлялся, так как ace делает неявную перекодировку строк ansi -> oem, полагая, что получает строки в кодировке ansi, что не так Получается в этих функциях по крайней мере ace 8 такую перекодировку не выполняет, значит, вызов hb_adsOemToAnsi не нужен



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