Página 1 de 1
PERFORMANCE LOOP EM DBF EM REDE
Enviado: 28 Jul 2022 23:25
por wanderson5
Estou precisando melhorar a performace do loop em rede nos dbfs , tentei usar o letodb , mas no meu sistema eu tenho varios indices que uso funções como campo e no letodb não permite usar funcoes exemplo : index on strzero(codigo,5)+Nome tag 1 to teste.cdx , gostaria de adquirir o RMDBFCDX para testar a velocidade dos loops dos dbf em rede , ou alguma aplicação ou biblioteca como sqlrdd , mediador usando dbf.
Se tiver como auxiliar ou me prestar consultoria .
Wanderson Medeiros da Silva
e-mail
sintrampontal@gmail.com
WhatsApp: (34)99953-1534
skype: wanderson.medeiros5
PERFORMANCE LOOP EM DBF EM REDE
Enviado: 29 Jul 2022 10:01
por Itamar M. Lins Jr.
Olá!
não permite usar funcoes exemplo : index on strzero(codigo,5)+Nome tag 1 to teste.cdx ,
Como não ?
Até barra de progresso podemos fazer. Essa dai é fichinha... É a mesma coisa do SQL.
veja ai:
Código: Selecionar todos
cQuery := " dtos(vencimento) >= '"+dtos(inicio)+"' .and. dtos(vencimento) <= '"+dtos(fim)+"' .and. empty(pagamento) "
OrdBy := "cliente + dtos(vencimento) + cod_venda"
re->(ordSetFocus(1))
tRec := re->(OrdKeyCount())
oBar := HProgressBar():NewBox( "Processando, "+lTrim(str(nRec,9))+" De "+lTrim(str(tRec,9))+" Registro(s)",,,350,,tRec)
Index on &OrdBy Tag re100 for &cQuery temporary additive eval {||oBar:Step(),.T.}
oBar:Close()
Podemos em ultimo caso usar funções do lado do servidor... E muitas outras coisas.
Saudações,
Itamar M. Lins Jr.
PERFORMANCE LOOP EM DBF EM REDE
Enviado: 29 Jul 2022 10:05
por Itamar M. Lins Jr.
Olá!
Outra coisa.
Se "codigo" e "nome" forem nome de fields(campos do dbf) nem precisa usar da forma que falei.
Da forma como está funciona.
Saudações,
Itamar M. Lins Jr.
PERFORMANCE LOOP EM DBF EM REDE
Enviado: 29 Jul 2022 10:09
por carlaoonline
Bom dia!
wanderson5 escreveu: index on strzero(codigo,5)+Nome tag 1 to teste.cdx
Uso o LetoDbf do Elch e ele aceita dessa forma citada, DESDE QUE a variável "codigo" e "nome" sejam campos, caso não for dai terá que substituir ela e mandar já com o valor em forma de string pois o servidor não enxerga as variáveis do lado do cliente SEM UMA PROGRAMAÇÃO ESPECÍFICA PARA ISSO.
Faz uma tentativa com o Right ao inves do StrZero e usa macrosubstituição para ver se vinga...
Código: Selecionar todos
N_CAMPO="Right("+CHR(34)+"00000"+CHR(34)+"+alltrim(Str(numero)),5)+nome"
Index on &N_CAMPO ...
Se não aceitar, tenta assim (mas não sei pq as vezes só aceita assim com uma segunda variável, me quebrei muito ...)
Código: Selecionar todos
N_CAMPO="Right("+CHR(34)+"00000"+CHR(34)+"+alltrim(Str(numero)),5)+nome"
AAA=N_CAMPO
Index on &AAA ...
Veja um trecho do meu código que funciona normal com LetoDbf, são partes do código, apenas pra ter uma ideia da macrosubstituição que uso
Código: Selecionar todos
.
. Aqui vai a lista de campos para todos os arquivos do sistema.....
.
ARQ_DBF = "CAIXA"
DECLARE VETOR1[ 29 ]
DECLARE VETOR2[ 29 ]
VETOR1[ 01 ] = "DATA_PG"
VETOR1[ 02 ] = "MOVIMENTO"
VETOR1[ 03 ] = "IDT"
VETOR1[ 04 ] = "VALOR_FIN"
VETOR1[ 05 ] = "PARCELA"
VETOR1[ 06 ] = "MV"
VETOR1[ 07 ] = "FORMA_PG"
VETOR1[ 08 ] = "FORNECEDOR"
VETOR1[ 09 ] = "VENCIMENTO"
VETOR1[ 10 ] = "COD"
VETOR1[ 11 ] = "DOC"
VETOR1[ 12 ] = "CT"
VETOR1[ 13 ] = "PEDIDO"
VETOR1[ 14 ] = "EMISSAO"
VETOR1[ 15 ] = "Q_REG"
VETOR1[ 16 ] = "GRUPO"
VETOR1[ 17 ] = "VALOR_INI"
VETOR1[ 18 ] = "FIRMA"
VETOR1[ 19 ] = "Q_PAG"
VETOR1[ 20 ] = "OK"
VETOR1[ 21 ] = "TP_LANC"
VETOR1[ 22 ] = "REF"
VETOR1[ 23 ] = "OBS1" // -> TEM CONDICAO OBS1+OBS2+OBS3+OBS4+OBS5+OBS6+OBS7+OBS8
VETOR1[ 24 ] = "DESC_EM"
VETOR1[ 25 ] = "INCLUSAO" // -> TEM CONDICAO LEFT(INCLUSAO,8) -> SO A DATA DA INCLUSAO
VETOR1[ 26 ] = "CTPG_N_PG" // -> TEM CONDICAO
VETOR2[ 26 ] = "VENCIMENTO"
VETOR1[ 27 ] = "GRUPO_TP2" // -> TEM CONDICAO TP_LANC=2
VETOR2[ 27 ] = "GRUPO"
VETOR1[ 28 ] = "EMISS_IDT" // -> TEM CONDICAO FOR COD=2 .OR. COD=3
VETOR2[ 28 ] = "DTOS(EMISSAO)+STR(IDT)"
VETOR1[ 29 ] = "IDT_EMISS" // -> TEM CONDICAO FOR COD=2 .OR. COD=3
VETOR2[ 29 ] = "STR(IDT)+DTOS(EMISSAO)"
INDEXAR(...) // Aqui manda indexar um arquivo por vez em um loop
//-----------------------------------------------------------------
//-----------------------------------------------------------------
Function Indexar ...
//-----------------------------------------------------------------
.
.
.
FOR F = 1 TO Len( VETOR1 ) // Quantidade de campos a indexar em cada ARQ_DBF ...)
N_TAG = VETOR1[ F ]
// VETOR1 é o campo e o nome da tag
// Se VETOR2 não for vazio, então ele será o(s) campo(s) a serem indexados e vetor1 a tag
N_CAMPO = IF( Empty( VETOR2[ F ] ), VETOR1[ F ], VETOR2[ F ] )
DO CASE
CASE ARQ_DBF = "CAIXA" .AND. VETOR1[ F ] = "INCLUSAO"
AAA=N_CAMPO // <<===== Tive que usar uma segunda variável pq direto dá erro...(não sei pq)
INDEX ON LEFT(&AAA,8) TAG &N_TAG TO &ARQ_DBF FOR !Deleted() EVAL MVA() EVERY AA
CASE ARQ_DBF = "CAIXA" .AND. (VETOR1[ F ] = "EMISS_IDT" .OR. VETOR1[ F ] = "IDT_EMISS") // Usado na listagem de vales, para listar apenas os COD=2 ou COD=3 que sao vales.
INDEX ON &N_CAMPO TAG &N_TAG TO &ARQ_DBF FOR !Deleted() .AND. (COD=2 .OR. COD=3) EVAL MVA() EVERY AA
CASE ARQ_DBF = "CT_FERIAS" .AND. VETOR1[ F ] = "OBS"
INDEX ON UPPER(OBS1+OBS2+OBS3) TAG &N_TAG TO &ARQ_DBF FOR !Deleted() EVAL MVA() EVERY AA
CASE ARQ_DBF = "CAIXA" .AND. VETOR1[ F ] = "OBS1"
INDEX ON UPPER(OBS1+OBS2+OBS3+OBS4+OBS5+OBS6+OBS7+OBS8) TAG &N_TAG TO &ARQ_DBF FOR !Deleted() EVAL MVA() EVERY AA
CASE ARQ_DBF = "CAIXA" .AND. VETOR1[ F ] = "CTPG_N_PG" // Contas a pagar nao pagas e TP_LANC=2 significa que o lancamento veio do contas a pagar e nao do fluxo de caixa
INDEX ON &N_CAMPO TAG &N_TAG TO &ARQ_DBF FOR !Deleted() .AND. EMPTY(DATA_PG) .AND. TP_LANC=2 EVAL MVA() EVERY AA
CASE ARQ_DBF = "CAIXA" .AND. VETOR1[ F ] = "GRUPO_TP2" // Contas a pagar nao pagas e TP_LANC=2 significa que o lancamento veio do contas a pagar e nao do fluxo de caixa
INDEX ON &N_CAMPO TAG &N_TAG TO &ARQ_DBF FOR !Deleted() .AND. TP_LANC=2 EVAL MVA() EVERY AA
... demais CASES para os outros arquivos DBF...
PERFORMANCE LOOP EM DBF EM REDE
Enviado: 29 Jul 2022 10:10
por carlaoonline
...
enquanto eu estava preparando a resposta, o Itamar postou acima sem que eu tenha visto antes....