Автор | Сообщение |
Andrey
|
| постоянный участник
|
Пост N: 4156
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.05.15 22:44. Заголовок: Вопросы новичка...
Взял последнюю версию с "Новая страница с бинарниками", установил на 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
|
| постоянный участник
|
Пост N: 983
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.05.16 17:13. Заголовок: nbatocanin пишет: я ..
nbatocanin пишет: MiniGUI это, как пример, подключенного блока кода сортировки (туда\обратно) массива по dblclick на колонку, организовать такое у себя, мне думается не очень сложно. цитата: | буду скопировать всю таблицу |
| можно копировать узкую запись (не все колонки, а нужные для сортировки) а потом показывать все колонки по ссылке (recno)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4922
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.05.16 17:39. Заголовок: nbatocanin пишет: П..
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
|
| |
Пост N: 78
Зарегистрирован: 06.05.14
|
|
Отправлено: 13.05.16 17:41. Заголовок: можно копировать узк..
цитата: | можно копировать узкую запись (не все колонки, а нужные для сортировки) а потом показывать все колонки по ссылке (recno) |
| Я уже пытался это решениеи, оно работает: SELECT (::cTmp) ZAP 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 Но, с этим решением возникает проблема фильтров других рабочих зон. Например: SET FILTER TO Upper( Partner->p_naziv) == "XY TRADE"
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4923
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.05.16 17:46. Заголовок: nbatocanin пишет: К..
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
|
| |
Пост N: 5650
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.05.16 17:52. Заголовок: Andrey пишет: Для э..
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 (ИМХО) FUNC KomName (cAlias,p_id) Local ret:="" if (cAlias)->(Dbseek( p_id )) ret := (cAlias)->k_name endif RETURN ret
|
|
|
Haz
|
| |
Пост N: 965
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.05.16 20:35. Заголовок: Dima пишет: Можно ж..
Dima пишет: можно еще cRet := if( (cAlias)->(Dbseek( p_id )), (cAlias)->k_name ,'' ) или cRet := (cAlias)->( if( Dbseek( p_id ), F->k_name ,'' ))
|
|
|
Dima
|
| |
Пост N: 5651
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.05.16 20:48. Заголовок: Haz пишет: можно ещ..
Haz пишет: Можно :) Я чисто написал что бы ясно было товарищу из Болгарии и товарищу с Дмитрова.
|
|
|
Haz
|
| |
Пост N: 966
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.05.16 20:53. Заголовок: Dima пишет: Я чисто..
Dima пишет: цитата: | Я чисто написал что бы ясно было |
| тоже кстати не люблю явное указание SELECT не знаю почему но всегда использую (cAlias)-> может потому что не нужно помнить в какой рабочей области живем сейчас
|
|
|
Dima
|
| |
Пост N: 5652
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.05.16 21:22. Заголовок: Haz пишет: может по..
Haz пишет: цитата: | может потому что не нужно помнить в какой рабочей области живем сейчас |
| Аналогично !
|
|
|
nbatocanin
|
| |
Пост N: 79
Зарегистрирован: 06.05.14
|
|
Отправлено: 13.05.16 23:47. Заголовок: Функция KomName не в..
Функция 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
|
| |
Пост N: 80
Зарегистрирован: 06.05.14
|
|
Отправлено: 15.05.16 16:32. Заголовок: Вот как я решил проб..
Вот как я решил проблему (упрощенно): - создал p_tmp (C5) в таблице Partneri. - Создан TMP на станции через драйвер DBFNTX. Эта таблица имеет два поля: t_val (C40), t_rec (N10), INDEX ON t_val. Программа вычисляет значение выражения для каждой строки, затем написал результат у tabelu TMP. 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) Я заметил, что есть ошибк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
|
| постоянный участник
|
Пост N: 4928
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.05.16 00:26. Заголовок: nbatocanin пишет: К..
nbatocanin пишет: цитата: | Команда работает, если cTmp = "test". Но если cTmp = "//192.168.99.10:2807/App/test", то команда не работает. |
| Попробуй делать индексный файл без пути к нему. Просто cTmp := "test" Для индексов не нужно указывать путь "//192.168.99.10:2807/App/". Я не указываю пути к индексу.
|
|
|
nbatocanin
|
| |
Пост N: 81
Зарегистрирован: 06.05.14
|
|
Отправлено: 16.05.16 02:01. Заголовок: Попробуй делать инде..
цитата: | Попробуй делать индексный файл без пути к нему. Просто cTmp := "test" Для индексов не нужно указывать путь "//192.168.99.10:2807/App/". Я не указываю. |
| Так работать, но мне нужно указывать путь, индекс находится в другом директорию. INDEX ON TAG "xy"... всегда работает.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4929
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.05.16 11:18. Заголовок: nbatocanin пишет: Т..
nbatocanin пишет: цитата: | Так работать, но мне нужно указывать путь, индекс находится в другом директорию. |
| Этот вопрос уже к разработчикам Leto. Хотя зачем делать индексы в другой директории ? Это же не локальная или не сетевая программа... Небольшое ограничение Leto. Привыкнуть просто и всё !
|
|
|
nbatocanin
|
| |
Пост N: 82
Зарегистрирован: 06.05.14
|
|
Отправлено: 16.05.16 13:48. Заголовок: Это временный индекс..
Это временный индекс, я не хочу мешать с другими данными.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4930
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.05.16 15:34. Заголовок: nbatocanin пишет: Э..
nbatocanin пишет: цитата: | Это временный индекс, я не хочу мешать с другими данными. |
| Кто мешает его удалять при выходе из программы или после использования ? Я удаляю при выходе из своей программы.
|
|
|
Haz
|
| |
Пост N: 968
Зарегистрирован: 20.02.11
|
|
Отправлено: 16.05.16 15:42. Заголовок: Andrey пишет: Я уда..
Andrey пишет: цитата: | Я удаляю при выходе из своей программы. |
| Лучше удалять при входе, так гарантированно удалится весь мусор если даже прога слетела аварийно. или двойная проверка - при выходе и при входе
|
|
|
Dima
|
| |
Пост N: 5657
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.05.16 15:53. Заголовок: Лучше делать MEM: ба..
Лучше делать MEM: базу для этих случаев .
|
|
|
nbatocanin
|
| |
Пост N: 83
Зарегистрирован: 06.05.14
|
|
Отправлено: 16.05.16 16:13. Заголовок: Лучше делать MEM: ба..
цитата: | Лучше делать MEM: базу для этих случаев . |
| MEM таблицы имеют ограничение около 500-600,000. Кроме того, мне нужен Letodb индекс. Я думаю, что это невозможно.
|
|
|
Dima
|
| |
Пост N: 5659
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.05.16 16:20. Заголовок: nbatocanin пишет: К..
nbatocanin пишет: цитата: | Кроме того, мне нужен Letodb индекс |
| Тогда да , MEM не подходит. Насчет ограничения MEM .... стресс тест я ему не устраивал , пока все работает ровно. А откуда такая инфа про ограничение в около 500-600,000 (я так понял записей) ?
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|