Página 1 de 1

Lentidão em rotina de acesso/gravação

Enviado: 25 Fev 2016 22:00
por Marcio_Carneiro
Olá, amigos
Migrei a pouco tempo um prg clipper para o harbour, e agora em alguns clientes reclamam de um certo "retardo" na gravação/finalização em rede.
Ele basicamente faz um order no arquivo para pegar o próximo número da nota, que é composto por ano/sequencial.
Depois faz um append from, e até liberar o edit para imprimir o comprovante.
O executável clipper era metade do tamanho do executável harbour, mas o resto é a mesma rotina.
Somente usava uma lib freetslice. Algum opinião do amigos seria de muita ajuda.
O banco é dbf, e o arquivo índice ntx. No caso de um cliente o arquivo vendas é grande.

Código: Selecionar todos

 Do Aguarde With "Cadastrando os dados da Venda"

    Select VENDAS
    Set Order To 4
    Go Bottom

    If (Year(hoje) = Year(data))
      vnumero = Novo_Codigo("numero", vnumero, .F.)
    Else
      Set Filter To Year(hoje) = Year(data)
      vnumero = Novo_Codigo("numero", vnumero, .F.)
      Set Filter To
    EndIf

    Set Order To 1

    Select PLANO_VENDA
    If (LastRec() # 1)
      Replace All numero With Ven_Numero(vnumero) + "-" + SubStr(numero, 1, 2), ;
          cliente With vcliente
    Else
      Replace numero With Ven_Numero(vnumero) + "-", ;
          cliente With vcliente
    EndIf
    Close

    Select CONT_REC
    Set Order To 1
    Append From &arqplano
    If (Len(baixar) # 0)
      Seek Ven_Numero(vnumero) + "-" + baixar
      If (.Not. CR_Baixa(valor, hoje, .T., vplano_conta, LePDV()))
        Mens("Nao foi poss¡vel dar baixa na 1¦ presta‡ao agora.|Aguarde e tente novamente.", 19)
      EndIf
    EndIf

    Select TMP
    Replace All numero With Ven_Numero(vnumero), cliente With vcliente
    Go Top

    If (tipo_venda # 3)
      Do While (.Not. Eof())
        If (PRODUTOS -> contr_est # "N")
          If (quantidade > PRODUTOS -> estoque1)
            Select TRANSF_EST
            Append Blank
            Replace produto With PRODUTOS -> codigo, origem With "2", ;
                destino With "1", data With hoje, descricao With "VENDA N§ " + vnumero, ;
                quantidade With TMP -> quantidade - PRODUTOS -> estoque1, ;
                PRODUTOS -> estoque2 With PRODUTOS -> (estoque1 + estoque2) - TMP -> quantidade, ;
                PRODUTOS -> estoque1 With 0
            Select TMP
          Else
            Replace PRODUTOS -> estoque1 With PRODUTOS -> estoque1 - quantidade
          EndIf
        EndIf
        Skip
      EndDo
    EndIf

    Close
    Select HIST_VENDA
    Append From (arqitens)

    Select VENDAS
    NovoRegistro()
    Replace numero With vnumero, documento With vdocumento, ;
        cliente With vcliente, vendedor With vvendedor, data With hoje, ;
        total With vvalor_total, plano With vplano,plano_if with Planos->plano_if,;
        entregue With venda_entregue

* Observe que este ‚ o valor total da venda e nao com o plano.

    Commit
    UnLock All

    Rest_Aguarde()

    i_comprov= "S"
    i_plano = "S"
    i_priparc = "S"
    i_duplicata = "S"
    i_cupom="N"

    If (PLANOS -> parcelas = 1)
      i_plano = "N"
      Select PARCELAS
      Seek vplano + "01"
      If (dias = 0)
        i_priparc = "N"
        i_duplicata = "N"
      EndIf
    Else
      Select PARCELAS
      Seek vplano + "01"
      If (dias = 0)
        i_priparc = "N"
      EndIf
    EndIf

    Init_Edit(5)

    Inc_Edit("Lista para Entrega ======>", "i_comprov", "!", "VSimNao()")
Se tiverem alguma sugestão seria importante

Lentidão em rotina de acesso/gravação

Enviado: 25 Fev 2016 22:15
por JoséQuintas
Começar revendo esta parte:

Código: Selecionar todos

If (Year(hoje) = Year(data))
      vnumero = Novo_Codigo("numero", vnumero, .F.)
Else
      Set Filter To Year(hoje) = Year(data)
      vnumero = Novo_Codigo("numero", vnumero, .F.)
      Set Filter To
EndIf
Mais rápido indexar por Str( Year( Data ), 4 ) + Str( Numero, 6 )

E poderia encontrar o número usando algo parecido com isto:

Código: Selecionar todos

SET SOFTSEEK ON
SEEK Str( Year( Date() ) + 1, 4 )
SKIP -1
IF Year( Date() ) == Year( Data )
   nNumero := Numero + 1
ELSE
   nNumero := 1
ENDIF
SET SOFTSEEK OFF
Se é que um GOTO BOTTOM já não resolve.

Também tem o SET SCOPE, que é muito mais rápido que SET FILTER.

Lentidão em rotina de acesso/gravação

Enviado: 26 Fev 2016 21:43
por Marcio_Carneiro
Obrigado pela atenção.
Já está indexado por esta chave , o set order to 4, vai para este índice.

Acho que a demora em rede, deve ser por causa deste append from que dou na forma de pagamento,
onde registro as parcelas da forma de pagamento. Desconfio que o Windows analise isto.

Lentidão em rotina de acesso/gravação

Enviado: 27 Fev 2016 09:10
por JoséQuintas
Difícil ajudar mais sem entender o porquê de cada parte, ou quantos registros são tratados em cada parte.
Verifique qual das rotinas trabalha com mais registros.
Outra opção é acompanhar a execução pelo debug.

Lentidão em rotina de acesso/gravação

Enviado: 27 Fev 2016 16:10
por Marcio_Carneiro
Mais uma vez obrigado pela atenção.

Fui no cliente para ver o problema, é realmente fica muito lento,
até mesmo a impressão final do comprovante pára no meio e espera não sei o quê, e depois de longos segundos volta a imprimir.

A primeira parte, pega o último número e acrescenta um.

A segunda parte, faz um append from no arquivo de contas receber de um arquivo temporário criado na venda, com as parcelas do pagamento.

Depois, busca no cadastro de produtos os itens e altera a quantidade.

Atualiza o histórico de vendas e o cadastro de vendas

E finaliza para impressão.

O arquivo tem mais de 40.000 registros de vendas e o de produtos deve ter 16.000.
O que me deixa boquiaberto é como um programa compilado em clipper é mais rápido do que o harbour?
Porque a impressão pára no meio?
Como faço debugo no Hmg, que é onde compilo o prg?
Um abraço

Lentidão em rotina de acesso/gravação

Enviado: 27 Fev 2016 19:42
por JoséQuintas
A impressão deve ser outra coisa.
Caso o programa não avise, o Windows aguarda a continuação do relatório antes de liberar.

Clipper é DOS, Harbour é Windows.
Há diferenças entre DOS e Windows, impressora é uma delas.

Lentidão em rotina de acesso/gravação

Enviado: 01 Mar 2016 15:27
por Itamar M. Lins Jr.
Ola!
O que me deixa boquiaberto é como um programa compilado em clipper é mais rápido do que o harbour?
O harbour é mais rápido do que o clipper, não por ser harbour, mas porque é 32 ou 64 bits. O clipper roda 16Bits.
Existe também a configuração de como o windows cuida da abertura e gravação dos arquivos, optimisc_looking...
Não informou os dados das estações, servidor etc...
Em todo caso, tem um bug no win98 que deixa as telas bem lentas.
Comparando qualquer comando do Clipper leitura e escrita usando RDD DBF o harbour é muito mais rápido, com o LINUX é mais rápido ainda do que no windows.
Quanto a demora da impressão, favor postar seu código.

Muitos desses testes com DBF, já foram feitos pela comunidade...Se está mais lento do que no clipper pode ser no win98..., mas são as telas...

http://www.dataaccess.com/whitepapers/o ... ching.html

Saudações,
Itamar M. Lins Jr.