Форум » LetoDB, HbNetio. » Leto DB Server (продолжение 9) » Ответить

Leto DB Server (продолжение 9)

Dima: Продолжаем тут

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

sashaBG: У меня отработало правильно как у тебя Паша но у меня LetoDB версии /* $Id: Changelog,v 1.350.2.133 2013/11/22 10:09:31 ptsarenko Exp $ */

Pasha: Жалуются на проблему в LetoDB c CVS. У меня и с последней версией тест отрабатывает нормально. В чем проблема, и почему ее не удается воспроизвести - пока непонятно.

sashaBG: Хорошо попробую CVS версию У меня дома есть два компа попробую и через сеть


sashaBG: Слил последнее из CVS . Скомпилировал тест указывая на адрес моего рутера , затащил тест на одном сервере к которому имею remote доступ и зпустил тест от туда . Все сработало

Pasha: Похоже, надо внести изменение в протокол для выполнение команд блокировки. Тест ниже демонстрирует, что dbfcdx при выполнении rlock/flock/dbrlock перечитывает запись. Необходимо запустить 2 экземпляра программы. Такое же поведение показывает и Ads Думается, что в letodb вместе с результатом команд блокировки надо передавать и текущую запись. proc main Field f1 request dbfcdx rddSetDefault( "DBFCDX" ) cls if ! File("test.dbf") dbCreate("test", {{"C1", "C", 10, 0}, {"F1", "N", 10, 0}}) endif use test new shared if RecCount() == 0 dbAppend() endif ? F1 while inkey(0) # 27 ? 'Before lock', F1 if rlock() // dbRlock(RecNo()), or flock() ? 'After lock', F1 F1 ++ dbUnlock() dbCommit() ? 'After commit', F1 endif enddo use retu

kia: Pasha пишет: Просьба собрать и запустить такой тест: У меня не gpf а штатная ошибка dos error 32. Запускаю сервер и тест на одном компе - win7. Сервер - с cvs последний, клиент - предпоследний. И сервер и клиент с доработками, поэтому может быть и нет gpf. Ошибка возникает из-за повторного вызова dbCreate(cPath + "test.dbf", {{"C1", "C", 10, 0}, {"N1", "N", 10, 0}}) т.к. leto_File(cPath + "test.dbf") == .f. (не находит ранее созданный файл) Ошибка возникает в двух случаях (из-за настроек в letodb.ini) : - если EnableFileFunc = 0 (что логично); - если не задан DataPath, или задан типа DataPath = / Причина думаю где-то в функции (letodb\source\server\letofunc.c line 3275 ) void leto_filef( PUSERSTRU pUStru, const char* szData ) Проверил из под дебагера В строке 3304 hb_snprintf( szData1, 16, "+%s;", ( hb_spFile( szFile, NULL ) )? "T" : "F" ); при вызове hb_spFile если не задан DataPath или DataPath = / и возникает ошибка szFile == "test.dbf\000..." а если задан то (например DataPath =\_leto.tst) szFile == "\_leto.tst\test.dbf\000..." и функция hb_spFile возвращает T - все ок. Похоже, при не заданном пути, файл ищется где-то в текущем каталоге а не там где файл. Надеюсь мой тест поможет разобраться. Спасибо за работу!

sashaBG: Паша Мне очень нравится функция leto_groupby , хотелось бы ее использовать и под DBFCDX но не смог "Выковырять" из изходниках LetoDB Очень быстро работает :)

Pasha: Я, кстати, так и делаю. У меня есть локальный вариант для GroupBy, и я для dbfcdx его и использую. Как раз в самой функции выполняется эта проверка. Функция оптимизирована, часть кода написана на С, так что работает быстро. Мне пришлось убрать/заменить некоторые свои функции, чтобы собрать эту функцию. Именно этот вариант я не проверял, но надеюсь, что он рабочий: http://gfile.ru/a4Je0

sashaBG: Спасибо Попробую !

sashaBG: Паша а как можно сделать Группу составную например: aDvig := LETO_GROUPBY('sme+ska', 'debit,kredit') срабарывает (массив загружается) но потом при следующем обращении к серверу или зависает программа или сервер падает в логе letodb_1.log вот ето: 24.03.2014 00:32:15: Error BASE/1004 No exported method: EVAL Arguments: ( [ 1] = Type: U) a в letodb_crash.log : в конце ------------------------------------------------------------------------ User: 127.0.0.1 SAVOVS ccw.Exe Command: open следующая команда у меня открывает другой файл на сервере а так: aDvig := LETO_GROUPBY('sme', 'debit,kredit') работает но мне нужна составная группа

sashaBG: Паша вот такой тест отработал как надо procedure main() REQUEST DBFCDX RDDSETDEFAULT( "DBFCDX" ) Set AUTOPEN ON use dvig new set order to "sme+ska" aGroup:=dbGroupBy(, , {||sme+ska}, "debit,kredit") ?Len(aGroup) DBCloseArea() return а без блока возвращает пустой массив я в _groupby.prg сделал такую замену //xKey := if((nPos := FieldPos(cGroup)) # 0, nPos, cGroup) xKey := if((nPos := FieldPos(cGroup)) # 0, nPos, GetBlock(cGroup)) так работает и когда группа единичная 'sme' когда составна я тоже 'sme+ska'

Pasha: Если в качестве фильтра передавать блок кода, то отрабатывает локальный вариант, а не leto_GroupBy А при повторном вызове leto_GroupBy действительно не срабатывает. Разбираюсь, причина пока непонятна.

Pasha: Разобрался, вечером выложу исправление

sashaBG: Работает Супер Быстро! Задачка была обработать 2,5 млн записей для отчета , старый алгоритм работал 20 мин. а спомощию leto_groupby и dbgroupby всего 16 секунд Спасибо Паша !

SergKis: Pasha Попробовал в Leto в работе новые поля типа + и ^ (сборка сервера с RddInfo( RDDI_TABLETYPE, DB_DBF_VFP )). Сервер понимает и заполняет эти поля ok!, а клиент нет. После dbStruct() эти поля типа 'U'. Это лечится ? Версия hb 2.0, Leto /* $Id: readme_rus.txt,v 1.12 2011/04/19 16:04:58 ptsarenko Exp $ */

Pasha: Сделал, вечером скину на CVS

Srdjan: Меня зовут Срджьан Я новичок в использовании LetoDB. В чем разница между dbSeek и LetoDBSeek?

Pasha: dbSeek - это вызов операции seek для харбора, один из методов rdd LETO LetoDBSeek - это реализация вызова операции seek на языке С. С помощью LetoDBSeek можно разрабатывать клиенты для LetoDB для других языков программирования, не только для харбора. Функция харбора dbSeek как раз выполняет операцию seek через вызов LetoDBSeek

Srdjan: Я пошел олл старую программу Clipper с водителем SIX3 на день letoDB. Все прекрасно работает, но у меня есть одна проблема, когда клиент покидает программу с Alt-C других покупателей иногда блока (нужно остановить программу с Ctrl-Alt-Del). Я добавил следующий код: #define K_ALTC 302 SETCANCEL(.F.) SET KEY K_ALTC TO AltC() EXIT PROCEDURE ZavrsiRad() CLOSE ALL leto_disconnect() RETURN PROCEDURE AltC() CLOSE ALL leto_disconnect() QUIT RETURN Что вы думаете?

Srdjan: Есть ли это программный код: #xtranslate Sx_SetScope(<a>,<b>) => ordScope( <a>,<b> ) #xtranslate Sx_SetScope(<a>,) => ordScope( <a>, ) #xtranslate Sx_ClrScope() => (ordScope(0,),ordScope(1,)) n := Sifre->( LastRec() ) a1 := Array( n ) a2 := Array( n ) aFill( a1, 0 ) aFill( a2, 0 ) RobMat->( OrdSetFocus( 'Datum' ) ) RobMat->( Sx_SetScope( 0, dOd ), Sx_SetScope( 1, dDo ), dbGoTop() ) WHILE !RobMat->( EOF() ) IF LEFT(RobMat->Dokument,1)=='H' .AND. RobMat->Sifra<>0 .AND. RobMat->Radnik==nVoz .AND. RobMat->Magacin == 1 a2[ RobMat->Sifra ] += RobMat->Ulaz a1[ RobMat->Sifra ] += RobMat->Izlaz END RobMat->( dbSkip() ) END с следующий код программы: RobMat->( OrdSetFocus( 'Datum' ) ) a:=RobMat->( LETO_GROUPBY("Sifra", "Ulaz, Izlaz", "LEFT(Dokument,1)=='H' .AND. Sifra<>0 .AND. Radnik=="+ALLTRIM(STR(nVoz,5,0))+" .AND. Magacin == 1", dOd, dDo) )



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