Форум » LetoDB, HbNetio. » Вопросы новичка... » Ответить

Вопросы новичка...

Andrey: Взял последнюю версию с "Новая страница с бинарниками", установил на Win2008 Server, чуток помучился с портом... Собрал на МиниГуи+BCC 551 - \MiniGui\batch\hbmk2.bat rddleto.hbp Получил rddleto.lib - 131072 байт - правильный ли размер ? И еще Warning-и лезут: lib\.hbmk\win\bcc\rddsys.c: source\client\letocl.c: source\client\leto1.c: source\client\letomgmn.c: source\common\blowfish.c: source\common\common_c.c: source\common\hbip.c: TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation /P32 lib\rddleto.lib -+ lib\.hbmk\win\bcc\rddsys.obj -+ lib\.hbmk\win\bcc\letocl.obj -+ lib\.hbmk\win\bcc\leto1.obj -+ lib\.hbmk\win\bcc\letomgmn.obj -+ lib\.hbmk\win\bcc\blowfish.obj -+ lib\.hbmk\win\bcc\common_c.obj -+ lib\.hbmk\win\bcc\hbip.objWarning: 'rddsys' not found in library Warning: 'letocl' not found in library Warning: 'leto1' not found in library Warning: 'letomgmn' not found in library Warning: 'blowfish' not found in library Warning: 'common_c' not found in library Warning: 'hbip' not found in library Так должно быть или нет ? Вопрос сразу напрашивается с путями - как писать правильно "\" или "/" : Local cPathServer := "//127.0.0.1:2812/" cPathServer := cPathServer +"DATE_TEST_PATH\test.dbf" Помню что где то обсуждали, а результат не запомнил...

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

nbatocanin: Здравствуйте! Есть ли способ, чтобы определить текущее nUser для Leto_MgKill(nUser)? Я хочу использовать Leto_MgKill для всех пользователей, но я не хочу, чтобы "убить" активного пользователя. Спасибо, Ненад

Pasha: Функция leto_mgGetUsers возвращает массив с параметрами пользователей: ip-адрес, имя хоста, название приложения. В этом массиве можно найти свои параметры. Это способ, конечно же, ненадежен, так как с одного и того же хоста одно и тоже приложение можно запустить не один раз. Другой способ: сделать на сервере udf-функцию: Function UDF_UserNumber(nUserStru) Return nUserStru и вызывать ее с клиента посредством leto_UDF("UDF_UserNumber") Этот способ не очень красив. Можно, конечно, добавить номер клиента в качестве еще одного элемента массива, возвращаемого функцией leto_mgGetInfo, чтобы номер клиента можно было бы получить штатными средствами letodb

nbatocanin: Было бы хорошо, чтобы сделать функцию Leto_GetCurrentID(). Я использую следующую процедуру: aInfo := Leto_MgGetUsers() FOR i := 1 TO Len(aInfo) Leto_MGKill (aInfo[i,1]) NEXT Это работает, потому что Leto_MGKill не убить текущего пользователя.

alex_II: Не могу в условии индексации использовать пользовательскую функцию. Можно ли обойти это ограничение? UDF-функцию также не видит

Pasha: Индексация происходит на сервере, так что клиентские пользовательские функции там недоступны. Надо добавить эту функцию как раз м модуль udf, причем не как static function, а как function. Тогда эта функция будет видна.

alex_II: как static я функцию не описываю вот udf модуль: #include "dbinfo.ch" #include "set.ch" #ifdef __LINUX__ #define DEF_SEP '/' #define DEF_CH_SEP '\' #else #define DEF_SEP '\' #define DEF_CH_SEP '/' #endif FUNCTION UDF_Init() SET AUTORDER TO 1 RETURN NIL FUNCTION UDF_Metka(nUserStru, cClientAlias) LOCAL rc := .F. LOCAL cArea := Alias() LOCAL cServerAlias := leto_Alias(nUserStru, cClientAlias) dbSelectArea(cServerAlias) DBGoTop() DBSeek(cArea->ls) rc := Found() dbSelectArea(cArea) RETURN rc в логе получаю сообщение: 16.11.2015 14:57:25: Error BASE/1001 Undefined function: LETO_UDF Arguments: ( [ 1] = Type: C Val: UDF_Metka, [ 2] = Type: C Val: amt)

Pasha: Если в условии for команды index on используется пользовательская функция, то ее надо просто добавить в модуль hrb, причем без параметра nUserStru. В условии for ее надо просто вызвать, не задействуя механизм leto_udf. Пример: index on .. tag .. to .. for Pole=MyFunc() сама функция: function myfunc ... return ...

alex_II: Понял, буду пробовать Спасибо

alex_II: Pasha пишет: просто добавить в модуль hrb Поспешил написать что всё понятно Что это и где этот модуль?

Pasha: Надо создать файл letoudf.prg, скомпилировать его с параметром -gh, и получившийся модуль letoudf.hrb скопировать в папку, где находится сервер letodb.exe. Сервер при старте загружает этот модуль. Но я тут заметил, что пользовательская функция обращается к другим рабочим областям. Тогда так просто ее написать не получится.

Pasha: Добавил функцию leto_ClientID() для получения nUserStru на сервере Таким образом, функцию для индексации for можно сделать в udf-модуле примерно так: FUNCTION UDF_Metka(cClientAlias) LOCAL nUserStru := leto_ClientID() LOCAL cServerAlias := leto_Alias(nUserStru, cClientAlias) LOCAL xIs := Field->Is RETURN (cServerAlias)->(DBSeek(xls))

alex_II: Pasha пишет: Добавил функцию leto_ClientID() Спасибо за помощь Буду пробовать

nbatocanin: Паша, это может быть использовано в SET FILTER на сервере?

Pasha: Да. Функция leto_ClientID() возвращает nUserStru клиента, в потоке которого она выполняется. Затем этот nUserStru можно использовать для других функций.

Andrey: Всем привет ! Как на сервере LetoDB сделать подключение к базам работающим в режиме файл-сервера ? Т.е. базы открыты другими программами в режиме SHARED. Хочу сделать функцию для LetoDB в letoudf.prg, чтобы функция открывала чужие базы, что-то подсчитала и передавала результат через массив, для программы расчета.

Pasha: Andrey пишет: Как на сервере LetoDB сделать подключение к базам работающим в режиме файл-сервера ? Т.е. базы открыты другими программами в режиме SHARED. Хочу сделать функцию для LetoDB в letoudf.prg, чтобы функция открывала чужие базы, что-то подсчитала и передавала результат через массив, для программы расчета. Надо открывать такие файлы обычной командой use ... via DBFCDX new shared выборку делать обычными командами skip/seek/etc по окончанию выборки не забыть закрыть. А еще лучше все файлы открывать через letodb, даже локально на сервере. Это будет эффективнее, да и вопроса такого не возникнет, как совмещать.

Andrey: Pasha пишет: А еще лучше все файлы открывать через letodb, даже локально на сервере. Это будет эффективнее, да и вопроса такого не возникнет, как совмещать. Согласен. Только есть уже работающие 7 программ которые открывают эти файлы (переделывать их... ну просто головная боль). Мне нужен режим совместимости для новой программы с LetoDB и старыми программами.

Andrey: Открываю коннект к базе: nConnection := LETO_CONNECT( cPathServer ) .... nConnection = 1 Открываю таблицу и остаюсь в ней. Далее в другой программе делаю другой коннект (пути одинаковы пока, потом будут разные) nConnection := LETO_CONNECT( cPathServer ) nConnection тоже равен 1 !!! Так должно быть ? Или я что-то не допонимаю.... А как сделать чтобы nConnection были разными ?

PSP: Andrey пишет: Так должно быть ? Еще эта функция вернёт -1, если сервер недоступен. Это её основное (и, имхо, единственное) назначение: определить доступность сервера. Но ты можешь посмотреть исходники. Мне, если честно, лень)))

Andrey: PSP пишет: Еще эта функция вернёт -1, если сервер недоступен. Это её основное (и, имхо, единственное) назначение: определить доступность сервера. Но ты можешь посмотреть исходники. Мне, если честно, лень))) Да я знаю что при -1 сервер недоступен. Я просто считал, что если один коннект уже есть, то следующий должен быть 2. А этого нет. Если я делаю LETO_DISCONNECT(nConnection), то программа падает с виндовой ошибкой. Так как nConnection одинаков. Пробовал делать LETO_SETCURRENTCONNECTION( nConnection ) - без толку. Возвращает тоже 1. Т.е. как сделать, чтобы новый коннект был другим ? nConnection := LETO_CONNECT( cPathServer , ....) IF nConnection > 0 LETO_SETCURRENTCONNECTION( nConnection ) nI := LETO_GETCURRENTCONNECTION() MsgDebug(TIME() + " " + HB_NtoS(nI) + " - connect" ) ???



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