Prezados amigos , eu fiz uma pergunta para ao Antônio Linares referente ao acesso lento dos dbf´s na rede Windows ,em especial quando e realizado um loop, dentro de outro loop em uma mesmo dbf pelo meu sistema compilado em fivewin 22.03/xharbour 1.2.3/BCC 7.3 em rede Windows 7/10/11 PRO , ele me disse isso seria devido a rede do Windows a execução sistema em local e muito rápido , ja na rede e extremamente lenta , exemplo no pc local 7-10 segundos , na rede 7-10 minutos. se alguem tiver uma solução e mas a solução de usar parte desses dados em web como no MOD_HARBOUR tenho interesse de adquirir essa solução
Fiz uma tentativa no LETO e obtive uma melhora de 7-10 minutos para 1 minuto , mas tive muito problema na utilização do leto em relação a indexação dos arquivos que tem relacionamento com outro arquivo como set relation.
Se alguem tiver uma solução em xharbour ou C para eu possa compilar no meu sistema , tenho interesse de adquirir essa solução.
FUNCTION TESTE
LOCAL oPan
PUBLIC cPasta
PUBLIC cServer
PUBLIC cCOMP
cPasta := ".\dados"
cServ := Space(1)
cCOMP := "01/2021" // Space(7)
REQUEST LETO
RDDSETDEFAULT( "LETO" )
IF IsExeRunning( "letodb.exe" )
RETURN MsgStop( "O programa servidor já está aberto neste computador!", "Impossível Continuar!" )
ELSE
ShellExecute( 0, "open", "letodb.exe",,, )
MsgInfo( "Sistema Leto em Atividade" )
ENDIF
cServer:="//192.168.1.165:2812/"
/*
IF LETO_CONNECT(cServer)==-1
MsgStop( "Não possivel conectar com o Servidor " + cServer )
ELSE
MsgStop( "Conecção Concluida com Sucesso com Servidor "+ cServer )
ENDIF
*/
leto_disconnect()
nConect := Leto_Connect( cServer, "", "",, 200 )
if nConect=-1
nRes:=Leto_connect_Err()
if nRes == 2
MsgStop("Falha ao logar",5)
elseif nRes==4
MsgStop("Falha ao conectar",5)
elseif nRes==5
MsgStop("Falha de envio",5)
else
MsgStop("Erro ao conectar -1 "+str(nres,5),3)
end
else
MsgInfo( "conectou" )
end
if MsgGet( "Informar"," Digite <ENTER> p/ Servidor : ", @cServ,;
".\bitmaps\computer7.bmp" )
IF !Empty(cServ)
cPasta := "\\servidor\c\rededb\dados"
ENDIF
ENDIF
if MsgGet( "Informar"," Competencia 99/9999 : ", @cCOMP,;
".\bitmaps\calend10.bmp" )
ENDIF
// IF Empty( cServ )
// cServer := "//127.0.0.1:2812/REDEDB/DADOS"
// ELSE
// cServer := "//" + cPath + Iif( Right(cPath,1) $ "/\", "", "/" )
// ENDIF
//SET DEFAULT TO &(ALLTRIM(cPasta))
// MsgStop (" Caminho dos Arquivos - " + cPasta )
oPan := SWPanelWindow( "Aguarde Inicializando...." )
SYSREFRESH()
cTIME:= TIME()
// IF empty(cServ)
// cServer:=""
// ENDIF
MsgStop( cServer )
/*
// RddSetDefault("RMDBFCDX")
// DBSETDRIVER("RMDBFCDX")
MsgInfo( "-"+(cSERVER + "MULTIFUN"+"-") )
cPath = "C:\REDEDB"
aArq ="MULTIFUN" // - contém o nome do arquivo DBF
cDbf =".DBF" // - extensao
cCaminho = "//192.168.1.165:2812/multifun.dbf"
cAlias = "MULTIFUN"
SELECT 1
dbUseArea( .F.,DBSETDRIVER(), cCaminho, cAlias,.F.,.F.)
// cPath = Caminho do LetoDB
//aArq - contém o nome do arquivo DBF
*/
//cSERVER = cSERVER + "dados/"
? (cSERVER + "MULTIFUN")
//SELECT 1
USE (cSERVER + "MULTIFUN.DBF") NEW //SHARED
INDEX ON COD_AVUL TAG TAG_001 TO IND001
INDEX ON NOMFUN TAG TAG_002 TO IND002
DBSETINDEX("IND001")
SELECT 2
USE (cSERVER + "ARQSIND.DBF") NEW // SHARED
SELECT 3
USE (cSERVER + "MULTIEMP.DBF") NEW //SHARED
INDEX ON CODEMP TAG TAG_003 TO IND003
DBSETINDEX("IND003")
SELECT 4
USE (cSERVER + "ARQBOLET.DBF") NEW //SHARED
INDEX ON COD_AVUL+COD_EMPRES+MES_REF+DTOS(DT_BOLETIM) TAG TAG_004 TO IND004 TEMPORARY
DBSETINDEX("IND004")
SELECT 5
USE (cSERVER + "ESOCEVEN.DBF") NEW //SHARED
INDEX ON CODI_INSCR+COD_EVENTO TAG TAG_005 TO IND005
DBSETINDEX("IND005")
SELECT 7
USE (cSERVER + "ARQPRODE.DBF") NEW //SHARED
INDEX ON COD_PRODES TAG TAG_007 TO IND007
SELECT 8
USE (cSERVER + "MULTISER.DBF") NEW //SHARED
INDEX ON CODSER TAG TAG_008 TO IND008
SELECT 9
USE (cSERVER + "RETIDO.DBF") NEW //SHARED
SELECT 10
USE (cSERVER + "ARQMES.DBF") NEW //SHARED
cCompetencia:="01/2021"
cStr="Tempo Abertura de DBFs: " + Transf(ElapTime(cTime,TIME()),"@k 99:99:99")
SWPanelRefresh( oPan, cStr )
inkey(1)
SWPanelClose( oPan )
? 'Tempo da leitura dos registros: ' + CRLF +;
ElapTime(cTime,TIME()) + CRLF +;
NETNAME()
SELECT MULTIFUN
MULTIFUN->(DBSETORDER(1))
MULTIFUN->(DBGOTOP())
MULTIFUN->(DBSEEK("00132"))
? MULTIFUN->NOMFUN , MULTIFUN->CODFUN
SELECT 1
MULTIFUN->(DBSETORDER(1))
MULTIFUN->(DBGOTOP())
MULTIFUN->(DBSEEK("38251"))
TESTA_PROCESSO_01(cCompetencia)
RETURN NIL
FUNCTION TESTA_PROCESSO_01(cCompetencia)
LOCAL aRet := {}
LOCAL dData
LOCAL nSele := Select()
LOCAL cAvulso
LOCAL cField, nLen
LOCAL oMes,oEmp,oAvu
LOCAL oPan, aCargo, cAno,lAllOk, nPos, aTemp, a
// LOCAL cComp
LOCAL nConti:=0
LOCAL nContador :=0
LOCAL nContador2:=0
local lEnd := .f.
PUBLIC cComp
PUBLIC cMesANO
oPan := SWPanelWindow( "Função Testa Processo 01 - DBF ...." )
cMesAno :="01/2021"
dData := Ctod( "15/"+cMesAno )
cAno := Right( cMesAno,4 )
cCompetencia := "01/2021" // cMonth( dData )+"/"+cAno
// oMes := oTree:Add( cCompetencia,0 ) // Item Raiz do tree
cField := Upper( "MOV_"+Substr(cCompetencia,1,3) )
// MsgStop( cCompetencia )
// "SWPanelRefresh( oPan, "Abrindo movimento..." )
aReport := {} // eroni - para o relatorio
cComp := Substr(cMesAno,1,2) + Substr(cMesAno,6,2)
// SELECT RETIDO
// RETIDO->(DBSETORDER(8))
// RETIDO->(OrdScope( 0, NIL ) )
// RETIDO->(OrdScope( 1, NIL ) )
// RETIDO->(OrdScope( 0, cComp+"00001"+"0001"+"001" ) )
// RETIDO->(OrdScope( 1, cComp+"99999"+"9999"+"999" ) )
// RETIDO->(DBGOTOP())
// xbrowse()
cTime :=TIME()
SELECT RETIDO
Index On COD_AVUL+COD_EMPRES+COD_PRODES TAG TEMP_1 FOR (Deleted() == .F. .AND. MES_ANO == "0121" ) TO RET_TEMP TEMPORARY
DbSetIndex( "RET_TEMP" )
RETIDO->(DBGOTOP())
DO WHILE !EOF()
ncontador++
SKIP
ENDDO
? 'Tempo da leitura dos registros: ' + CRLF +;
ElapTime(cTime,TIME()) + CRLF +;
NETNAME() + CRLF +;
ALLTRIM(STR(nContador)) +' Total Registros Filtrados'
nContador:=0
// xbrowse()
// Index On COD_AVUL+COD_EMPRES+COD_PRODES TAG TEMP_1 FOR (Deleted() == .F. .AND. MES_ANO == cComp ) TO RET_TEMP TEMPORARY
// DbSetIndex( "RET_TEMP" )
DbSetIndex( "RET_TEMP" )
RETIDO->(DBGOTOP())
DO WHILE !EOF()
SYSREFRESH()
cAvulso := RETIDO->Cod_Avul
// oAvu := oMes:Add( cAvulso+"-"+NOMEFUNC( cAvulso ),1 ) // item nivel 1 do tree
aTemp := {}
DO WHILE cAvulso == RETIDO->Cod_Avul .AND. !EOF()
SYSREFRESH()
aCargo := {}
nCont := 1
lAllOk := .T.
cEmpresa := RETIDO->COD_EMPRES
nConti=nConti+1
SWPanelRefresh( oPan,"Calculando....Qtde= "+"("+ Strzero(nconti,5) +")" +" Codigo Trab.: "+ RETIDO->COD_AVUL )
DO WHILE cAvulso == RETIDO->Cod_Avul .AND. cEmpresa == RETIDO->COD_EMPRES // .AND. !EOF()
SYSREFRESH()
nContador++
nValor := RETIDO->IMPOSTO //_Verif_Movimen_Esoc(cMesAno)
aDados := _PegaDadosEnviados( "S-1200",cEmpresa, cAvulso,RETIDO->COD_PRODES,@lAllOk,nValor, ,NomeFunc( cAvulso ), NomeProv(cEmpresa), cComp )
AADD( aCargo, aDados )
AADD( aReport, aDados )// eroni - para o relatorio
// If Mod(nContador,100)==0 // ALTEREI AQUI
// ThreadSleep(1)
// EndIf
Retido->(dbSkip())
ENDDO
// SKIP -1
// oEmp := oAvu:Add( cEmpresa+"-"+RetornaNomeEmpresa( cEmpresa ),IF( lAllOk,2,3 ) ) // Item nivel 2 do tree
//oEmp:Cargo := aCargo
// Totalizar os valores por codprodes de todas as empresas e atualizar situação
FOR a := 1 to Len( aCargo )
SYSREFRESH()
nContador2++
IF Upper( Alltrim(aCargo[ a,4 ])) <> "CONFIRMADO"
aCargo[ a,4 ] := "PREPARADO"
ENDIF
IF ( nPos := Ascan( aTemp,{|x,y| x[5] == aCargo[ a,5 ] } ) ) > 0
aTemp[ nPos,7 ] += aCargo[ a,7 ] // valor
aTemp[ nPos,4 ] := aCargo[ a,4 ] // situação
ELSE
AADD( aTemp,{ aCargo[ a,1 ],aCargo[a,2],aCargo[ a,3 ],aCargo[ a,4 ],aCargo[ a,5 ],aCargo[ a,6 ],aCargo[ a,7 ] } )
ENDIF
NEXT a
// Retido->(dbSKIP())
ENDDO
// oAvu:Cargo := aTemp
// Retido->(dbSKIP())
ENDDO
SWPanelClose( oPan )
? 'Tempo da leitura dos registros: ' + CRLF +;
ElapTime(cTime,TIME()) + CRLF +;
NETNAME() + CRLF +;
ALLTRIM(STR(nContador)) + ' Total de Registros Processados ' + CRLF +;
ALLTRIM(STR(nContador2)) + ' Total de Registros Processados ' + CRLF +;
ALLTRIM(STR(nConti)) +' Total Trabalhadores'
RETURN NIL
STATIC FUNCTION _PegaDadosEnviados( cRegistro,cEmpresa, cAvulso, cCodProDes, lConfirmado, nValor, dDataPagto,cNomeTrab,cNomeProv, cComp )
LOCAL aRet
LOCAL nSele := Select()
LOCAL cSeek, nOrdem
//? cAvulso , cRegistro , cAvulso+cRegistro
DEFAULT dDataPagto := ""
// MsgStop( cComp )
IF Empty( cEmpresa )
nOrdem := 1 // 4
cSeek := cAvulso + cRegistro
//? "Ordem 1"
ELSE
nOrdem := 7 // 2
cSeek := Padr( Alltrim(cEmpresa)+ Alltrim( cAvulso ) ,14 )+ cRegistro
ENDIF
SELECT ESOCEVEN
DBSETINDEX("IND005")
// ESOCEVEN->( DBSETORDER( nOrdem ) )
ESOCEVEN->( DBGOTOP() )
// ? cSeek
IF ESOCEVEN->( DBSEEK( cSeek ) )
aRet := { cEmpresa,cAvulso,ESOCEVEN->CHA_EVENTO,ESOCEVEN->SIT_EVENTO, cCodProDes,RetornaNomeRubrica( cCodProDes ), nValor, dDataPagto,cNomeTrab,cNomeProv }
IF Upper(Alltrim( ESOCEVEN->SIT_EVENTO )) <> "CONFIRMADO"
lConfirmado := .F.
ENDIF
ELSE
aRet := { cEmpresa,cAvulso,Space(36),"PREPARADO", cCodProDes,RetornaNomeRubrica( cCodProDes ), nValor,dDataPagto,cNomeTrab,cNomeProv }
lConfirmado := .F.
ENDIF
Select( nSele )
RETURN( aRet )
FUNCTION RetornaNomeEmpresa( cCodigo )
LOCAL nSele := Select()
LOCAL cNome := Space(40)
SELECT MULTIEMP
MULTIEMP->(DBSETORDER(1))
MULTIEMP->(DBGOTOP())
IF MULTIEMP->(DBSEEK(STRZERO(VAL(cCodigo),4)))
cNome := MULTIEMP->NOMEMP
ENDIF
Select( nSele )
RETURN( cNome )
//----------------------------------------------------------------------------//
FUNCTION RetornaNomeRubrica( cCodigo )
LOCAL nSele := Select()
LOCAL cNome := Space(40)
SELECT ARQPRODE
ARQPRODE->(DBSETORDER(1))
// ARQPRODE->(DBGOTOP())
IF ARQPRODE->(DBSEEK(STRZERO(VAL(cCodigo),3)))
cNome := ARQPRODE->DES_PRODES
ENDIF
Select( nSele )
RETURN( cNome )
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
Function NomeFunc(oCod)
Local MyDb, nRet
nRet := space(40)
MyDb:= Select()
SELECT MULTIFUN
MULTIFUN->(DBSETORDER(1))
if MULTIFUN->(DbSeek(oCod) )
nRet:=Alltrim(MULTIFUN->NOMFUN)
endif
Select(MyDb)
Return nRet
//--------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNCTION NomeProv(cCodigo)
LOCAL nSele := Select()
LOCAL cEmpresa := STRZERO(VAL(cCodigo),3)
SELECT ARQPRODE
ARQPRODE->(DBSETORDER(1))
if ARQPRODE->(Dbseek(cEmpresa))
cEmpresa:=ARQPRODE->DES_PRODES
else
cEmpresa:=SPACE(30)
endif
Select( nSele )
RETURN(cEmpresa)
//----------------------------------------------------------------------------//
Contato: Wanderson
WathsApp 55-34-99953-1534 - skype: wanderson.medeiros5 - e-mail: sintrampontal@gmail.com