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
Moderador: Moderadores
-
wanderson5
- Usuário Nível 1

- Mensagens: 1
- Registrado em: 28 Jul 2022 23:08
- Localização: CAPINÓPOLIS
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
PERFORMANCE LOOP EM DBF EM REDE
Olá!
Até barra de progresso podemos fazer. Essa dai é fichinha... É a mesma coisa do SQL.
veja ai:
Podemos em ultimo caso usar funções do lado do servidor... E muitas outras coisas.
Saudações,
Itamar M. Lins Jr.
Como não ?não permite usar funcoes exemplo : index on strzero(codigo,5)+Nome tag 1 to teste.cdx ,
Até barra de progresso podemos fazer. Essa dai é fichinha... É a mesma coisa do SQL.
veja ai:
Código: Selecionar todos
cQuery := strzero(codigo,5)+Nome
index on &cQuery tag 1Có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()
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
PERFORMANCE LOOP EM DBF EM REDE
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.
Outra coisa.
Se "codigo" e "nome" forem nome de fields(campos do dbf) nem precisa usar da forma que falei.
Código: Selecionar todos
index on strzero(codigo,5)+Nome tag 1Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- carlaoonline
- Usuário Nível 3

- Mensagens: 190
- Registrado em: 24 Ago 2014 22:38
- Localização: Porto Alegre-RS
PERFORMANCE LOOP EM DBF EM REDE
Bom dia!
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...
Se não aceitar, tenta assim (mas não sei pq as vezes só aceita assim com uma segunda variável, me quebrei muito ...)
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
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 ...
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...
- carlaoonline
- Usuário Nível 3

- Mensagens: 190
- Registrado em: 24 Ago 2014 22:38
- Localização: Porto Alegre-RS
PERFORMANCE LOOP EM DBF EM REDE
...
enquanto eu estava preparando a resposta, o Itamar postou acima sem que eu tenha visto antes....
enquanto eu estava preparando a resposta, o Itamar postou acima sem que eu tenha visto antes....