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 := strzero(codigo,5)+Nome
index on &cQuery tag 1

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.

Código: Selecionar todos

index on strzero(codigo,5)+Nome tag 1
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....