Форум » [x]Harbour » Как прицепится к ADS по сети ? » Ответить

Как прицепится к ADS по сети ?

Dima: Есть ADS 10.10 в настройках у него стоит порт 6262 Вот таким исходником пытаюсь к нему подрубиться. [pre2] #include "ads.ch" proc main REQUEST ADS rddSetDefault( "ADSCDX" ) SET SERVER REMOTE SET CHARTYPE TO OEM ? AdsConnect("MYSERVER") // .f. ? AdsConnect("//127.0.0.1/:6262") // .f. return [/pre2] ADS.INI в папке с прогой [pre2] [MYSERVER] LAN_IP=127.0.0.1 LAN_PORT=6262 [/pre2] Где мой косяк ?

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

Haz: Dima пишет: що за на фик AdsCreateSqlStatement( cAlias, 3 ) Дима, попозже ок ? полно дел по дому )

Dima: Haz OK подожду Переделал снова пример , результат нулевой [pre2] proc main #include "ads.ch" local hh local sQlStr REQUEST ADS rddSetDefault( "ADSCDX" ) REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) SET SERVER LOCAL AdsSetFileType(ADS_CDX) ? AdsConnect(".\") // .t. ? hh:=AdsConnection() // 17005400 use volvo new Select 0 ? AdsCreateSQLStatement("test",2) // .t. sQlStr:="SELECT * FROM VOLVO WHERE FIRMA=7" ? ADSVERIFYSQL(sQlStr) // .f. ? AdsExecuteSqlDirect(sQlStr) // .f. ? AdsGetLastError() // 7200 ? alias(),reccount() wait return [/pre2] ЗЫ чисто ради интереса попробовал работу функций типа SP_* , работают однако [pre2] cAlias := "cursor" cSql := "EXECUTE PROCEDURE sp_mgGetInstallInfo()" ADSCreateSQLStatement( cAlias,2 ) AdsExecuteSQLDirect( cSql ) While !(cAlias)->( eof() ) * ? (cAlias)->Username, (cAlias)->Address, (cAlias)->DictionaryUser ? (calias)->Version (cAlias)->( dbSkip() ) End [/pre2]

Haz: Дима почту скинь , часов в 9 отправлю пример работающий в конфу позже выложу PS. А пока - почему может не работать 1. Нужно создать словарь ADSDDCREATE( cDictionary,, "Словарь данных ADSDEMO" ) 2 создать пользователя AdsDDCreateUser(, "Guest", "" , "Пользователь Guest" ) 3 пихнуть в словарь базу AdsDDaddTable( "AdsDemoAT", "AdsDemoAT.dbf", "" ) 4 не использовать в запросе двойную ковычку " а только ' cSql := "SELECT * FROM AdsDemoAT WHERE LAST Like '%m%'" 5 цепляться к словарю adsConnect60( cDictionary, 0, "ADSSYS", '', 7, @hConnection ) и только потом запрос SQL


Dima: Да оно и без словаря работает. Вот в этой теме я смотрел примеры , там словарем и не пахнет http://clipper.borda.ru/?1-4-0-00000430-000-10001-0-1251195209

Haz: Dima пишет: ЗЫ почта улетело, в конфу позже

Dima: да получил , спасибо ! я полагал что и без словаря все должно работать...... ушел думать.

Dima: Haz я пожалуй выложу пример. [pre2] proc main #include "ads.ch" local sQlStr local cpath:=hb_CurDrive()+":\"+CurDir()+"\" local cDictionary:=cpath+"temp.add" REQUEST ADS rddSetDefault( "ADSCDX" ) REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) SET SERVER LOCAL AdsSetFileType(ADS_CDX) if !AdsConnect(cpath) ? "Не могу подключится к ADS" quit endif use VOLVO shared new // можно не открывать но у меня в задаче эта база открыта if !file(cDictionary) ADSDDCREATE( cDictionary,, "Словарь данных ADSDEMO" ) endif IF adsConnect60( cDictionary, 0, "ADSSYS", '', 7, ) * AdsDDCreateUser(, "Guest", "" , "Пользователь Guest" ) // и без нее работает AdsDDaddTable( "volvoAT", cpath+"volvo.dbf", "" ) ELSE ? "Ошибка подключения к словарю данных " ENDIF Select 0 AdsCreateSQLStatement(,2) sQlStr:="SELECT * FROM volvoAT WHERE indeks Like '%.44.07%'" ADSVERIFYSQL(sQlStr) AdsExecuteSqlDirect(sQlStr) ? alias(),reccount(),fcount() wait browse() return [/pre2] А как запросом получить и выбранные номера записей из базы VOLVO ?

Haz: Dima пишет: я пожалуй выложу пример. в случае с SQL вот это можно не писать if !AdsConnect(cpath) ? "Не могу подключится к ADS" quit endif т.к. подключаемся через словарь и путь есть в пути словаря use VOLVO shared new // можно не открывать но у меня в задаче эта база открыта открывать таблицу не надо вообще , сам долго не мог к этому привыкнуть ))) таблица - это то из чего делаем выборку и к ней доступ в SQL по имени и через словарь ( если таких словарей несколько ) а рабочая область получается в результате запроса - называется курсором , в зависимости от типа может быть редактируемой или толькочтение. Следовательно SHARED - тоже лишнее ( через сервер адс курсор и так всегда будет в режиме шары ) Если записывать значения в таблицу через UPDATE Volvo SET indeks = 100 то и Rlock() не требуется ( сервер сам все делает ) Если через (cAlias)->indeks := 100 - тогда Rlock() нужен Если коротко - то есть таблица и есть курсоры с нее , меняя значение в курсоре ( в раб области ) - меняем таблицу , или напрямую меняем таблицу без создания курсора ))) AdsDDCreateUser(, "Guest", "" , "Пользователь Guest" ) // и без нее работает работает потому что в примере использовал системного пользователя ADSSYS - у него права админа а так словарю можно нарезать пользователей и дать им разные права на таблицы , разные пароли на вход и т.д. Dima пишет: А как запросом получить и выбранные номера записей из базы VOLVO ? в адс через запрос есть только ROWID , Recno() через запрос вроде не получить. я в таблицах использую поле ID типа autoinc ( нагляднее чем ROWID ). А зачем список номеров записей нужен , уверен есть варианты запроса через ROWID PS. Если работать со словарями - оч. рекомендую поставить бесплатную Advantage Architect для управления базами

Dima: Haz пишет: А зачем список номеров записей нужен например если в выборке я нашел нужную мне запись и нажав на ней ВВОД оказался бы на нужной записи в базе VOLVO что то типа VOLVO->(dbgoto(ADSSQL->recs RECNO() из VOLVO))

Haz: Dima пишет: что то типа VOLVO->(dbgoto(ADSSQL->recs RECNO() из VOLVO)) так сработает - т.к. в курсоре есть RECNO() я в данном случае использую динамический поиск - т.е. перестраиваю курсор самой базы ( в твоем случае VOLVO ) под условие нужного SQL или через ADSSetFilter - тоже быстро

Dima: Haz пишет: так сработает - т.к. в курсоре есть RECNO() Да но это RECNO() не то. Допустим в результате SQL выборки попали 2 записи с RECNO() 5677 и 10000999 (из базы VOLVO). Как мне узнать эти RECNO в самой выборке ? Вот бы как то в выборку вставить колонку в которой будет RECNO() из базы VOLVO. В теории мне только эта колонка и нужна так как дальше я смогу по этой выборке ходить связав ее по RELATION c базой VOLVO

Dima: Haz пишет: или через ADSSetFilter - тоже быстро То же им пользуюсь но нужно в уже существующем фильтре выбрать вхождения строк в названия к примеру и это работает не так быстро как с SQL запросом

Haz: Recno в случае редактируемого покажет номер физической записи из таблицы , курсор - это как фильтр по таблице и в курсоре и в таблице Recno будет совпадать

Dima: не совпадают проверял так AdsExecuteSqlDirect(sQlStr) ? volvo->(recno()),ADSSQL->(recno()) // 1,1 adssql->(dbskip()) ? volvo->(recno()),ADSSQL->(recno()) // 1,2

Haz: Haz пишет: Вот бы как то в выборку вставить колонку в которой будет RECNO() из базы VOLVO. только изменить структуру базы , добавив везде поле ID тип Integer ( Autoinc нет в CDX )а в подчиненную еще и ID_MASTER тип Integer ( перекроить структуру и перезаполнить ID можно теми же запросами через ARC32.EXE )

Haz: Haz пишет: ? volvo->(recno()),ADSSQL->(recno()) // 1,1 adssql->(dbskip()) ? volvo->(recno()),ADSSQL->(recno()) // 1,2 так ты в вольво стоишь на месте а адсскуль - скипанул на единицу попробуй через запрос найти любую уникальную запись вольво и сравни recno по ней

Dima: я не про то ;) у ADSSQL свои recno() а в VOLVO свои. И мне нужно сидя в бровсе в ADSSQL при выходе из него оказаться на такой же записи как и в базе ADSSQL. То есть сидел я выборке на коде товара OC2187E-ERT то после выхода должен оказаться в базе VOLVO тоже на коде OC2187E-ERT

Haz: Dima пишет: у ADSSQL свои recno() а в VOLVO свои. ТОЧНО (((( тогда через ID или можно через ROWID попробовать через ROWID можно, но эта псевдоколонка должна быть определена явно , причем адс уверяет что это выход ))) End users and application developers can use rowids for several important functions: · Rowids are the fastest means of accessing particular rows. · Rowids can be used to see how a table is organized. · Rowids are unique identifiers for rows in a given table. В качестве минуса - нельзя строить запрос SELECT * , нужно с перечислением полей This pseudocolumn is not evident when listing the structure of a table by executing a SELECT * FROM . . . statement. However, each row's address can be retrieved with an SQL query using the reserved keyword ROWID as a column name, for example: второй минус RECNO() сначала придется поймать фильтром , а только потом GoTO ((((

Dima: почитал help DBDBDBTABTABBrXAAN The first six characters of the ROWID represent the database ID. It is based on the connection path. The next six characters of the ROWID represent the table ID. If the table is a database table, that is, a table that belongs to an Advantage Data Dictionary, the table ID represents the object ID of the table in the data dictionary. If the table does not belong to an Advantage Data Dictionary, the table ID is constructed using the name of the table file. The last six characters represent the record number of the row in the table. Получается что BrXAAN RECNO() из базы VOLVO , но как его к цифре привести не понял Как то так но это не все......... hb_base64Decode(right(rowid,6)) нужна функция что в целое переведет

Haz: Dima пишет: но как его к цифре Вот тут говорят с версии 11 уже есть функция , а для версий ниже предлагается самописная ((( - я ее расшифровать не смог ((( http://devzone.advantagedatabase.com/forum/questions/3311/select-record-by-rowid



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