Uso de letodb
Enviado: 14 Jun 2024 17:48
Boa tarde.
Deu certo, consegui colocar os índices temporários na memória, até aí resolveu 50% do meu problema, arquivos temporários lixos que ficavam na pasta e tinha que ficar limpando direto, blz resolvido, nada de índices no disco fixo só na memória.
Segue o código em tanto para LETO como DBFCDX
Agora uma informação:
Achei que iria melhorar a velocidade colocando em memória, mas não resolveu.
Uma tabela de registro (produtos) buscando os dados nas tabelas das filiais relacionado cerca de 13 tabelas, para uma quantidade de registros de cerca de 8.000 de produtos cadastrados leva de 210 a 230 segundos para gravar no temporário o que se torna muito para quem esta puxando os dados todos, isto tratando de puxar a tabela toda de uma só vez, tanto faz em LETO e em memória o temporário como em DBFCDX em memória ou em DBFCDX em disco fixo, já em ARRAY este processo cai para cerca de 100 segundos, 50% de ganho na velocidade para capturar em temporários para mostrar na tela e manipular.
Em ARRAY, só peguei os dados, não editei pq não tenho um editor para MATRIZ.
Bom, não sei se pesquiso de forma errada ou ultrapassada, se existe algo diferente para ganho de velocidade, vi algo como SCOPE() só não consegui entender, ou seja, não utilizo SCOPE() no meu sistema.
Segue abaixo o um pedaço do trecho de pesquisa de produtos.
Basicamente seria o codigo acima, bem limpo mas mesmo assim leva muito tempo para buscar a tabela toda de todas as lojas.
O que eu gostaria é de alguma forma rápida de pesquisa semelhante a SQL.
Pensei em abrir vazio e a pesquisa em threads para ir carregando o temporário, isto tomando uns cuidados de bloquear alterações enquanto não estiver totalmente carregada, seria a melhor forma?
Grato
Um abraço.
Deu certo, consegui colocar os índices temporários na memória, até aí resolveu 50% do meu problema, arquivos temporários lixos que ficavam na pasta e tinha que ficar limpando direto, blz resolvido, nada de índices no disco fixo só na memória.
Segue o código em tanto para LETO como DBFCDX
Código: Selecionar todos
DbCreate("mem:"+"&LArquivo.",Campos,cDriver,.T.)
NewIndexFile(Chave ,cD_Tempo,"mem:"+LArquivo,aOd,.F.,,"MEMAREA") //INDEX ON
USE "mem:"+LArquivo ALIAS &LArquivo. //abre o arquivo exclusivo
DbSetIndex("mem:"+LArquivo) //indexa todos os indices
Achei que iria melhorar a velocidade colocando em memória, mas não resolveu.
Uma tabela de registro (produtos) buscando os dados nas tabelas das filiais relacionado cerca de 13 tabelas, para uma quantidade de registros de cerca de 8.000 de produtos cadastrados leva de 210 a 230 segundos para gravar no temporário o que se torna muito para quem esta puxando os dados todos, isto tratando de puxar a tabela toda de uma só vez, tanto faz em LETO e em memória o temporário como em DBFCDX em memória ou em DBFCDX em disco fixo, já em ARRAY este processo cai para cerca de 100 segundos, 50% de ganho na velocidade para capturar em temporários para mostrar na tela e manipular.
Em ARRAY, só peguei os dados, não editei pq não tenho um editor para MATRIZ.
Bom, não sei se pesquiso de forma errada ou ultrapassada, se existe algo diferente para ganho de velocidade, vi algo como SCOPE() só não consegui entender, ou seja, não utilizo SCOPE() no meu sistema.
Segue abaixo o um pedaço do trecho de pesquisa de produtos.
Código: Selecionar todos
Static Procedure New_BuscaProduto(oModo)
ShowWait(,,"Selecionando registros...")
DbSelectArea("CEST0300") //seleciono o principal aberto da loja
DbGoTop()
If Left(wMerc,2)#"99".And.SubStr(wMerc,3,2)#"99".And.Right(wMerc,3)=="999"
DbSeek(Left(wMerc,4),.T.)
ElseIf Left(wMerc,2)#"99".And.Right(wMerc,5)=="99999"
DbSeek(Left(wMerc,2),.T.)
ElseIf wMerc#"9999999"
DbSeek(wMerc)
EndIf
While (!Eof()).And.If(Left(wMerc,2)#"99".And.SubStr(wMerc,3,2)#"99".And.Right(wMerc,3)=="999",Left(CODIGO,4)==Left(wMerc,4),;
If(Left(wMerc,2)#"99".And.Right(wMerc,5)=="99999",Left(CODIGO,2)==Left(wMerc,2),;
If(wMerc#"9999999",CODIGO==wMerc,.T.))).And.wSaida=.F.
wSaida:=ExitSeek()
ShowWaitProc()
If (oGRUPO =="9999".Or.GRUPO ==oGRUPO).And.;
(oSUBGRUPO=="9999".Or.SUBGRUPO==oSUBGRUPO).And.;
(oMARCA =="9999".Or.MARCA ==oMARCA).And.;
(oMODELO =="9999".Or.MODELO ==oMODELO).And.;
(oLINHA =="9999".Or.LINHA ==oLINHA).And.;
(oCLASSE =="9999".Or.CLASSE ==oCLASSE)
CEMP0000->(DbGoTop())
While CEMP0000->(!Eof())
wSaida:=ExitSeek()
ShowWaitProc()
If If(o_Acao=6,CEMP0000->C_LOJA==wFilial,(wGEco=="99999999".Or.Left(CEMP0000->E_CGC,8)==wGEco).And.If(wLoja=="0001",.T.,wLoja==CEMP0000->C_LOJA))
hE_CGC:=Left(CEMP0000->E_CGC,8)
fP :=CEMP0000->C_LOJA
v_Merc:=CEST0300->CODIGO
a_Area:="C300"+fP
w_vTXT:=fP + " - " +v_Merc + " - " + CEST0300->DESCRICAO
If o_Busca=.T. .And. (o_Acao=1 .Or. If(o_Acao=2,a_Area->P_VALOR>0,If(o_Acao=3,a_Area->DESCONTO>0,If(b_Acao=1,a_Area->BASICO="B",If(b_Acao=2,a_Area->BASICO#"B",If(b_Acao=3,.T.,If(c_Acao=1,a_Area->E_AT$" S",If(c_Acao=2,a_Area->E_AT=="N",If(c_Acao=4,ChkInC(),.T.)))))))))
If If(o_Acao=6.And.v_Acao=1,a_Area->ATUAL>0,.T.)
(File1Tmp)->(DbAppend())
(File1Tmp)->LOJA :=fP
(File1Tmp)->UF :=CEMP0000->E_UF
(File1Tmp)->E_CGC :=hE_CGC
(File1Tmp)->CODIGO :=(a_Area)->CODIGO
(File1Tmp)->TICADO :=" "
(File1Tmp)->E_AT :=(a_Area)->E_AT
......demais campos necessarios
EndIf
EndIf
EndIf
EndIf
CEMP0000->(DbSkip(1))
End
EndIf
DbSkip(1)
End
CloseWindow()
Return Nil
O que eu gostaria é de alguma forma rápida de pesquisa semelhante a SQL.
Pensei em abrir vazio e a pesquisa em threads para ir carregando o temporário, isto tomando uns cuidados de bloquear alterações enquanto não estiver totalmente carregada, seria a melhor forma?
Grato
Um abraço.