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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Marcio_Carneiro
Usuário Nível 2
Usuário Nível 2
Mensagens: 70
Registrado em: 07 Abr 2008 15:37
Localização: Santo Antônio de Pádua - RJ

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

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Marcio_Carneiro
Usuário Nível 2
Usuário Nível 2
Mensagens: 70
Registrado em: 07 Abr 2008 15:37
Localização: Santo Antônio de Pádua - RJ

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

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Marcio_Carneiro
Usuário Nível 2
Usuário Nível 2
Mensagens: 70
Registrado em: 07 Abr 2008 15:37
Localização: Santo Antônio de Pádua - RJ

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

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Responder