Форум » [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

Dima: Haz пишет: а для версий ниже предлагается самописная Спасибо. Но не понял как ее конвертнуть в Habrour

Haz: Dima пишет: Но не понял как ее конвертнуть в Habrour аналогично хотя можно порыть тут the last 6 chars of a rowid is the physical recno in base64 code.

Dima: Haz пишет: хотя можно порыть тут the last 6 chars of a rowid is the physical recno in base64 code. Писал выше что пробовал hb_base64Decode(right(rowid,6)) , но это не то так как на выходе получаем далеко не цифры


Haz: После Decode64 скорее всего получим cBinary который нужно скормить еще какой нить BIN2I() ... будут цифры но опять не те ((((

Dima: кормил всем BIN2* все мимо

Haz: Вот сюда корми FUNCTION Decode64(cCode) **************************************************************************** STATIC cString := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" LOCAL nStevec LOCAL nReturn := 0 LOCAL nLen := Len(cCode) IF Empty(cCode) .OR. Valtype(cCode)=='U' ; RETURN 0 ; ENDIF FOR nStevec := 1 TO nLen nReturn := nReturn*64 + (At(Substr(cCode, nStevec,1), cString)-1) NEXT RETURN nReturn Взято тут http://nntp-archive.sybase.com/nntp-archive/action/article/%3C4550525e@solutions.advantagedatabase.com%3E

Dima: а вот это прям в десятку

Dima: красота и relation по recno() пашет set relation to Decode64(right(ADSSQL->rowid,6)) into volvo есть 2 вопроса 1. Если у меня база VOLVO все же открыта и в ней открыты индексы то SQL запрос будет выполнятся быстрее или ему индексы не нужны ? Серверный фильтр если находит подходящий индекс под условие фильтра то ставится мгновенно. 2. SQL запрос в зависимости от условия может ставится некоторое время. Можно ли какой то индикатор повесить что бы юзер видел что прога не висит. База 5 лимонов записей и SQL запрос может быть не простым.

Haz: Dima пишет: есть 2 вопроса 1 при построении SQL во всю используются индексы, ADS рекомендует их использовать для увеличения скорости. 2 на счет индикатора не в курсе , когдато давно вроде видел ... но не уверен Время зависти от наличия нужных индексов , 5 лимонов это максимум пара секунд если структура баз правильная. Вообще ADS в этом плане - очень шустрый

Dima: Понял. Спасибо. Пробнул юзануть вот так но ни че не кажет индикатор AdsRegCallback( {| nPercent |outputstuff( nPercent,xxyy) } ) AdsExecuteSqlDirect(sQlStr) AdsClrCallback() где xxyy lastrec() из VOLVO Придется вешать лейбу - выполняется SQL запрос

Dima: Еще вопросец. Как из SQL выборки удалить ряд записей ?

Haz: Dima пишет: Как из SQL выборки удалить ряд записей или фильтром или физически и из таблицы тоже фильтром можно так добавить виртуальное поле , установить его в true и фильтровать по нему. в не нужных это поле скинуть в false и фильтр их скроет вот пример запроса - виртуальное поле s по умолчанию выставлено в true select true as s, adsdemoat.* from adsdemoat

Dima: Haz

Dima: Последний вопрос на сегодня ;) если ручками набирать запрос то он выглядит так SELECT ROWID,indeks FROM volvoAT WHERE indeks Like '%LM%' А если использовать переменную в операторе LIKE то как правильно написать ? Скажем CC:="LM" , как этот СС туда правильно вставить ? Что то не пашет у меня. Разобрался ! CC:="LM" SQLSTR:="SELECT ROWID,indeks FROM volvoAT WHERE indeks Like "+"'"+'%'+CC+'%'+"'"

Dima: Haz пишет: фильтром можно так добавить виртуальное поле , установить его в true и фильтровать по нему. имеется в виду какой фильтр , серверный , обычный или есть какой то SQL-ий ? Haz пишет: в не нужных это поле скинуть в false и фильтр их скроет ADS пишет что таблица только для чтения при попытке записи в поле S На DBdelete() та же реакция естественно. ЗЫ Извини что напрягаю ;)

Haz: Dima пишет: Извини что напрягаю да ерунда, пока дома сижу Dima пишет: только для чтения точно не учел ((( в данном случае таблица только чтение можно использовать тот же RowID с перестроением SQL по типу select rowid, adsdemoat.* from adsdemoat where rowid not in ('B8vqUvAAAAAEAAAAAB', 'B8vqUvAAAAAEAAAAAC') где B8vqUvAAAAAEAAAAAB и B8vqUvAAAAAEAAAAAС rowId которые надо скрыть построив sql алиас ADSSQL можно пересоздать а Browse:RefreshAll по идее должно сработать не проверял (( или AdsSetAof по RowId делать PS т.к. добавили псевдостолбец - курсор будет опять ридонли еще вариант - создать массив из номеров Recno которые нужно спрятать и фильтровать по нему - тогда курсор будет редактируемый ЗЫ ушел гулять с ребенком )

Dima: На ночь глядя вопрос возник ;) Я смотрел твой пример и тот что есть в CONTRIB\RDDADS и какое то время проводил эксперименты. Пришел к выводу что перед тем как сделать SQL запрос нужно сделать вот так. [pre2] use VOLVO shared new // можно не открывать но у меня в задаче эта база открыта hh:=nil if !hb_FileExists(cDictionary) // для каждого юзера создаем свой словарик ADSDDCREATE( cDictionary,, "Словарь данных ADSDEMO" ) AdsDDaddTable( "volvoAT", cpath+"volvo.dbf", "" ) AdsDDCreateUser(, "Guest", "" , "Пользователь Guest" ) *adsConnection() // похоже это не нужно *AdsDisconnect() // похоже это не нужно endif IF !adsConnect60( cDictionary, 0, "Guest", '', 7,@hh ) ? "Ошибка подключения к словарю данных " ENDIF Эта конструкция работает , или я в чем то не прав ?! [/pre2]

Haz: Dima пишет: *adsConnection() // похоже это не нужно *AdsDisconnect() // похоже это не нужно в данном случае не надо и все работает, это кусок из моего кода где сначала логинюсь к словарю с админскими, создаю базы и индексы , а потом дисконнект и далее коннест под простым юзером

Dima: Haz пишет: PS т.к. добавили псевдостолбец - курсор будет опять ридонли даже без добавления оного она все равно READ ONLY. Все виды выборок у меня укладываются в одну строку , кроме одной. В которой нужно по коду товара выбрать остатки из другой базы и показывать только то что есть в остатке. То есть по сути убрать (отфильтровать) не нужные записи а оно во как READ ONLY и USER функцию мою я так понимаю SQL запрос не поймет. Идейка пришла. Я ведь могу сделать COPY TO с условием FOR во временную MEM: базу и уже по ней ходить. Ан нет в MEM: базу не получится , тормознул . Можно просто выбрать из запроса нужные записи и метнуть их в MEM: базу и по ней ходить.

Haz: может быть readonly потому что таблица по которой делаешь запрос уже расшарена и открыть ? Dima пишет: могу сделать COPY TO лучше сразу в SQL прописать SELECT * INTO #TmpBase FROM ... WHERE ... создасться временная ( в памяти если указан знак # и на диске если напишем просто TempBase без # ) таблица TmpBase и по ней можно тоже выполнять запрос SELECT * FROM #TempBase ... Примерно так cSql := 'SELECT Client_Code INTO #CLIENTS FROM Orders GROUP BY Client_Code' SQL(, cSql ) // моя функция , если алиас не указан , используется "TMP" , а после выполнения TMP->(DbcloseArea()) cSql := 'SELECT Client_Code FROM #CLIENTS' SQL( 'SQL_CLIENTS', cSql ) Потом, когда база не нужна ее нужно убить cSql := "DROP TABLE #CLIENTS" SQL(,cSql)



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