STATIC lLetoConnect := .F. FUNCTION MAIN() LOCAL cTable, cAlias, nSkip, hBrowse LOCAL cFileDbf .... IF ! myConnnect() RETURN NIL ENDIF cFileDbf := cPathLocal + "test866.dbf" cTable := cPathServer+"test1251.dbf" cAlias := "TEST_1251" // ------ я выношу проверку и создание таблиц в отдельный модуль aStru := { ; { "FIO" , "C", 25, 0 }, ; { "STATUS" , "C", 10, 0 }, ; { "CLASS" , "C", 4, 0 }, ; { "ID" , "+", 4, 0 } ; } aIndex := { ; {'FIO', 'UPPER(FIO)', .F.} ; } IF ! file(cFileDbf) // ... // создаем файл cFileDbf !!! // ... ENDIF IF ! Table_Create( cTable, aStru, aIndex) MsgStop('Table not create :'+ chr(10))+cTable, 'ERROR') RETURN NIL ENDIF // ------ IF ! Table_Open(cTable, cAlias, .T.) MsgStop('Table not open :'+ chr(10))+cTable, 'ERROR') RETURN NIL ENDIF DEFINE WINDOW Form_6 ; ... @ 55, 10 BROWSE Browse_1 WIDTH 575 HEIGHT 130 ; HEADERS { '№№', 'ФИО/FIO', 'Статус/Status', 'Класс/Class' } ; WORKAREA &cAlias ; WIDTHS { 60, 280, 110, 100 } ; FIELDS {"ID", "FIO", "STATUS", "CLASS"} ; FONT "Tahoma" SIZE 10 BOLD ; BACKCOLOR aGrColor ; DYNAMICFORECOLOR { fColor , fColor, fColor, fColor } ; DYNAMICBACKCOLOR { fColor2, fColor2, fColor2, fColor2 } // ставим размер skip buffer (можно в on init это сделать) hBrowse := Form_6.Browse_1.Handle // GetControlHandle("Browse_1", ThisWindow.Name) nSkip := ListViewGetCountPerPage(hBrowse) // строк на browse ( cAlias )->( LETO_SETSKIPBUFFER( nSkip ) ) // // ... END WINDOW ... RETURN NIL /////////////////////////////////////////////////////////////////////////// FUNC myConnect() LOCAL nRes IF ( leto_Connect( cPathServer ) ) == - 1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN cMsg := "Login failed to LetoDB" ELSEIF nRes == LETO_ERR_RECV cMsg := "Recv Error to LetoDB" ELSEIF nRes == LETO_ERR_SEND cMsg := "Send Error to LetoDB" ELSE cMsg := "No connection to LetoDB" ENDIF MsgStop( cMsg , "Error" ) RETURN .F. ENDIF lLetoConnect := .T. // connect есть RETURN .T. /////////////////////////////////////////////////////////////////////////// FUNC Table_Open( cTable, cAlias, lShared ) // открываем таблицу LOCAL lRet IF ! lLetoConnect; RETURN .F. ENDIF Default lShared := .T. lRet := UseArea( cTable, cAlias, lShared, 'LETO') IF lRet .and. OrdCount() > 0 // есть индекс подключаем OrdSetFocus(1) dbGotop() ENDIF RETURN lRet /////////////////////////////////////////////////////////////////////////// FUNC Table_Create( cTable, aStru, aIndex ) // создание таблицы LOCAL lTable, cPath, cFile, cExt, cTag, cKey, lUnique, i,j,k IF ! lLetoConnect; RETURN .F. ENDIF hb_FNameSplit(cTable, @cPath, @cFile, @cExt) IF empty(cExt); cTable += '.dbf' ENDIF lTable := leto_file(cTable) IF ! lTable leto-fErase(cPath+cFile+'.cdx') dbCreate(cTable, aStru, 'LETO', .T., "") // можно задать алиас вместо "" IF hb_IsArray(aIndex) k := len(aIndex) FOR i := 1 TO k cTag := aIndex[ i ][1] // Tag Name cKey := aIndex[ i ][2] // Tag Key lUnq := aIndex[ i ][3] // Tag Unique OrdCreate( , cTag, cKey, &( "{||" + cKey + "}" ), lUnq ) NEXT ENDIF dbCloseArea() lTable := .T. ENDIF RETURN lTable FUNC Dbf_2_Table( cFileDbf, cTable, lZap ) // load dbf 866 в таблицу LOCAL nInp, nKol, nCnt, nDel, nAdd, i, k LOCAL nLenRec, nMaxBuf, nKolBuf IF ! file(cFileDbf) MsgStop('File not found !'+chr(10)+cFileDbf, "ERROR") RETURN .F. ENDIF USE ( cFileDbf ) ALIAS TEMP866 CODEPAGE "RU866" VIA "DBFCDX" //NEW SHARED IF ! Used() MsgStop('File not open !'+chr(10)+cFileDbf, "ERROR") RETURN .F. ENDIF nInp := select() IF ! Table_Open(cTable, , .T.) // exclusive ( nInp )->( dbClosearea() ) MsgStop('Table not open !'+chr(10)+cTable, "ERROR") RETURN .F. ENDIF IF OrdCount() > 0 // есть индекс отключаем OrdSetFocus(0) dbGotop() ENDIF IF ! empty(lZap) // очистим таблицу ZAP ENDIF k := fCount() - 1 // последнее поле (ID) не учитываем - заполняет rdd // таблица LETO открыта exclusive nLenRec := RecSize()+1 // длина записи передаваемой на сервер (Как считать ?) = кол-ву символов полей в БД ? nKolBuf := 1000 // кол-во записей в буфере транзакции nMaxBuf := (nKolBuf+1) * nLenRec // размер буфера транзакции nKol := 0 // счетчик записей для транзакции nCnt := 0 // общий счетчик записей nDel := 0 // счетчик удаленных nAdd := 0 // счетчик реально добавленных // текущий alias это LETO таблица - // ------ здесь уст. начальную позицию бегунка - индикатора leto_BeginTransaction(nMaxBuf) DO WHILE ! ( nInp )->( EOF() ) IF nKol >= nKolBuf nKol := 0 IF leto_InTransaction(); leto_CommitTransaction() ENDIF // ------ здесь меняем позицию бегунка - индикатора DO EVENTS // ------ leto_BeginTransaction(nMaxBuf) ENDIF nCnt++ nKol++ dbAppend() IF ! NetErr() nAdd++ FOR i := 1 TO k // из ( nInp )-> .... переносим данные Fields FieldPut( i, ( nInp )->FieldGet(i) ) NEXT IF ( nInp )->( deleted() ) // на входе запись удаленная dbDelete() nDel++ ENDIF ENDIF ( nInp )->dbSkip(1) ENDDO IF leto_InTransaction(); leto_CommitTransaction() ENDIF dbCommit() dbGotop() IF OrdCount() > 0 // есть индекс REINDEX OrdSetFocus(1) dbGotop() ENDIF ( nInp )->( dbCloseArea() ) // ------ здесь завершаем позицию бегунка - индикатора Form_6.Browse_1.Refresh RETURN .T. /////////////////////////////////////////////////////////////////////////// FUNC UseArea( cFile, cAls, lShare, cRdd, nWhl ) // Открыть таблицу или DBF LOCAL w := 10, lRet, oError, bOldError, lAuto, lLeto LOCAL cPth, cFil, cExt IF hb_IsNumeric(nWhl) .and. nWhl > 0; w := nWhl ENDIF IF ! hb_IsChar(cRdd); cRdd := RddSetDefault() ENDIF lLeto := ( cRdd == 'LETO' ) IF lLeto; lAuto := Set( _SET_AUTOPEN, .T. ) ENDIF select 0 IF empty(cAls) .or. ! hb_IsChar(cAls) // алиас не задан - формируем сами hb_FNameSplit(cFile, @cPth, @cFil, @cExt) cAls := upper(cFil) IF select(cAls) > 0; cAls := '_XYZ_'+hb_ntos(select()) ENDIF ENDIF IF ! hb_IsLogical(lShare); lShare := .T. ENDIF NetErr( .F. ) bOldError := ErrorBlock({ |oErr| break(oErr) }) DO WHILE w-- > 0 BEGIN SEQUENCE lRet := DbUseArea(.F., cRdd, cFile, cAls, lShare, .F.) RECOVER USING oError lRet := .F. END SEQUENCE IF lRet .AND. ! NetErr() lRet := Used() EXIT ENDIF hb_IdleSleep(0.2) ENDDO ErrorBlock( bOldError ) IF lLeto; Set( _SET_AUTOPEN, lAuto ) ENDIF RETURN lRet
|