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

SergKis: nbatocanin пишет: я не использую MiniGUI MiniGUI это, как пример, подключенного блока кода сортировки (туда\обратно) массива по dblclick на колонку, организовать такое у себя, мне думается не очень сложно. буду скопировать всю таблицу можно копировать узкую запись (не все колонки, а нужные для сортировки) а потом показывать все колонки по ссылке (recno)

Andrey: nbatocanin пишет: Поэтому мне нужен индекс по функции. Когда не используется LetoDB, решение очень простое: cExp := "SumPar(p_id)" INDEX ON &cExp TO (cTmp) Да делай что предлагают ! Это же просто: Pasha пишет: Свои пользовательские функции можно самому добавить в source\server\server.prg перед сборкой сервера. Это касается простых функций. Если функции при этом выполняют какие-то выборки из других рабочих областей, вопрос конечно сложнее. nbatocanin пишет: FUNC KomName (p_id) SELECT Komerc SEEK p_id cName := Komerc->k_name SELECT Partner RETURN cName Для этой функции можно сделать по другому: FUNC KomName (cAlias,p_id) Local nSel := SELECT() //SELECT Komerc Select(cAlias) SEEK p_id cName := Komerc->k_name SELECT(nSel) RETURN cName

nbatocanin: можно копировать узкую запись (не все колонки, а нужные для сортировки) а потом показывать все колонки по ссылке (recno) Я уже пытался это решениеи, оно работает: SELECT (::cTmp) ZAP [pre2]SELECT (::cAlias) Order ("") GO TOP WHILE !Eof() x := &cExp (::cTmp)->(DBAppend()) (::cTmp)->t_rec := RecNo() (::cTmp)->t_val := x SKIP END DO SELECT (::cTmp) SET RELATION TO t_rec INTO (::cAlias) GO TOP [/pre2] Но, с этим решением возникает проблема фильтров других рабочих зон. Например: SET FILTER TO Upper(Partner->p_naziv) == "XY TRADE"

Andrey: nbatocanin пишет: Кроме того, эти таблицы могут быть очень большими (50.000+), не знаю как быстро это решение работает. Это очень маленькие базы для LetoDB. Я тестировал на 5 млн. записей и приводил свои тесты: Сделал тестовый пример. Алгоритм простой - выборка из базы по SEEK и суммирование по 7 полям и запись этих 7 полей в локальную базу на компе пользователя. Итого 13 раз нужно просчитать по базе. База 100 000 записей с мемо-полями: 120 Мб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:01:10 2) локальная LETO - 00:01:11 3) интернет LETO - 00:04:37 Если база считается интернет + LETO, иногда подвисает при записи в локальную базу результатов. Странно всего 7 полей записать, а подвисает так что в окне программы пишет (программа не отвечает). Может и не там происходит подвисание. База 1 000 000 записей с мемо-полями: 1,2 Гб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:06:38 2) локальная LETO - 00:06:35 3) интернет LETO - 00:34:45 Если база считается интернет + LETO, то постоянно подвисает при записи результатов. При суммировании строка показывается (мастер+ кода) быстро. Убрал лишний вывод на экран. Наверно тормоза МиниГуи были из-за него. Теперь скорость просто чумовая: База 100 000 записей с мемо-полями: ~120 Мб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:00:00 2) локальная LETO - 00:00:01 3) интернет LETO - 00:01:49 База 1 000 000 записей с мемо-полями: ~1,2 Гб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:00:06 2) локальная LETO - 00:00:09 3) интернет LETO - 00:11:32 Открыть в TBROWSE миллион записей из базы, которая находиться неизвестно где (на просторах интернета) - это просто пипец (как говорит Аллочка из Универа) Вывод: связка Harbour + LetoDB + MiniGui - отличная вещь в работе. Это при том, что используется простой старый алгоритм, без переделки под Leto ! Тестирование АЛГОРИТМА-2 только для LETO. База в интернете, сервер - Leto DB Server v.2.15b3 Суммирование по 7 полям - 13 раз, т.е. обращение к серверу производиться всего 13 раз. Расчет по базе 100 000 записей (~120 Мб) - 00:00:01 Расчет по базе 1 000 000 записей (~1,2 Гб) - 00:00:08 Для сравнения, расчет по локальной базе из 1 000 000 записей на DBFCDX - 6 сек. Тестирование АЛГОРИТМА-3 только для LETO. База в интернете, сервер - Leto DB Server v.2.15b3m1 (m1-моя модификация) Расчёт по базе происходит на сервере, клиенту возвращается результат через массив. Расчет по базе на сервере 100 000 записей (~120 Мб) - 00:00:00 Расчет по базе на сервере 1 000 000 записей (~1,2 Гб) - 00:00:05 Для сравнения, расчет по АЛГОРИТМУ-1 по локальной базе из 1 000 000 записей на DBFCDX - 6 сек. Сделал еще отдельный тест на сервере 5 000 000 записей (~5,9 Гб) База в интернете, сервер - Leto DB Server v.2.15b3m1 Расчёт по АЛГОРИТМУ-2 - 00:00:34 Расчёт по АЛГОРИТМУ-3 - 00:00:26 Для сравнения, расчет по АЛГОРИТМУ-1 по локальной базе (локальный комп) из 5 000 000 записей на DBFCDX - 00:15:17 Пример здесь - https://cloud.mail.ru/public/DPUw/QtKxEiyro

Dima: Andrey пишет: Для этой функции можно сделать по другому: FUNC KomName (cAlias,p_id) Local nSel := SELECT() //SELECT Komerc Select(cAlias) SEEK p_id cName := Komerc->k_name SELECT(nSel) RETURN cName Можно же проще однако. Плохая практика указывать явно Select а затем делать Seek (ИМХО) [pre2] FUNC KomName (cAlias,p_id) Local ret:="" if (cAlias)->(Dbseek( p_id )) ret := (cAlias)->k_name endif RETURN ret [/pre2]

Haz: Dima пишет: Можно же проще однако. можно еще [pre2] cRet := if( (cAlias)->(Dbseek( p_id )), (cAlias)->k_name ,'' ) [/pre2] или [pre2] cRet := (cAlias)->( if( Dbseek( p_id ), F->k_name ,'' )) [/pre2]

Dima: Haz пишет: можно еще Можно :) Я чисто написал что бы ясно было товарищу из Болгарии и товарищу с Дмитрова.

Haz: Dima пишет: Я чисто написал что бы ясно было тоже кстати не люблю явное указание SELECT не знаю почему но всегда использую (cAlias)-> может потому что не нужно помнить в какой рабочей области живем сейчас

Dima: Haz пишет: может потому что не нужно помнить в какой рабочей области живем сейчас Аналогично !

nbatocanin: Функция KomName не важна, я писал только в качестве примера. Мне нужна функция, которая может быть использована в INDEX ON. Pasha пишет: Свои пользовательские функции можно самому добавить в source\server\server.prg перед сборкой сервера. Это касается простых функций. Если функции при этом выполняют какие-то выборки из других рабочих областей, вопрос конечно сложнее. Как это работает? Я изменил server.prg и добавил простую функцию TEST которая возвращает "Abc" (добавил ту же функцию на клиенте). Это работает. Но, как Паша написал, когда я пытаюсь получить доступ к базе данных, сервер отвечает с ошибкой: Breakdown at: 2016.05.13 22:42:19 Unrecoverable error 6005: Exception error:%s

nbatocanin: Вот как я решил проблему (упрощенно): - создал p_tmp (C5) в таблице Partneri. - Создан TMP на станции через драйвер DBFNTX. Эта таблица имеет два поля: t_val (C40), t_rec (N10), INDEX ON t_val. Программа вычисляет значение выражения для каждой строки, затем написал результат у tabelu TMP. [pre2]SELECT ("Partneri") GO TOP WHILE !Eof() Tmp->(DBAppend()) Tmp->t_rec := RecNo() Tmp->t_val := Upper(&cExp) SKIP END DO SELECT Tmp GO TOP n := 1 WHILE !Eof() Partneri->(DBGoto(Tmp->t_rec)) Partneri->p_tmp := HB_NumToHex (n++,5) SKIP END DO SELECT Partneri INDEX ON p_tmp TAG "TmpPar" TO (cTmp) [/pre2] Я заметил, что есть ошибкa в команде INDEX ON (DBFNTX): INDEX ON p_tmp TO (cTmp) Команда работает, если cTmp = "test". Но если cTmp = "//192.168.99.10:2807/App/test", то команда не работает. INDEX ON p_tmp TAG "test" TO (cTmp) Всегда работает.

Andrey: nbatocanin пишет: Команда работает, если cTmp = "test". Но если cTmp = "//192.168.99.10:2807/App/test", то команда не работает. Попробуй делать индексный файл без пути к нему. Просто cTmp := "test" Для индексов не нужно указывать путь "//192.168.99.10:2807/App/". Я не указываю пути к индексу.

nbatocanin: Попробуй делать индексный файл без пути к нему. Просто cTmp := "test" Для индексов не нужно указывать путь "//192.168.99.10:2807/App/". Я не указываю. Так работать, но мне нужно указывать путь, индекс находится в другом директорию. INDEX ON TAG "xy"... всегда работает.

Andrey: nbatocanin пишет: Так работать, но мне нужно указывать путь, индекс находится в другом директорию. Этот вопрос уже к разработчикам Leto. Хотя зачем делать индексы в другой директории ? Это же не локальная или не сетевая программа... Небольшое ограничение Leto. Привыкнуть просто и всё !

nbatocanin: Это временный индекс, я не хочу мешать с другими данными.

Andrey: nbatocanin пишет: Это временный индекс, я не хочу мешать с другими данными. Кто мешает его удалять при выходе из программы или после использования ? Я удаляю при выходе из своей программы.

Haz: Andrey пишет: Я удаляю при выходе из своей программы. Лучше удалять при входе, так гарантированно удалится весь мусор если даже прога слетела аварийно. или двойная проверка - при выходе и при входе

Dima: Лучше делать MEM: базу для этих случаев .

nbatocanin: Лучше делать MEM: базу для этих случаев . MEM таблицы имеют ограничение около 500-600,000. Кроме того, мне нужен Letodb индекс. Я думаю, что это невозможно.

Dima: nbatocanin пишет: Кроме того, мне нужен Letodb индекс Тогда да , MEM не подходит. Насчет ограничения MEM .... стресс тест я ему не устраивал , пока все работает ровно. А откуда такая инфа про ограничение в около 500-600,000 (я так понял записей) ?



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