1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Travando Tabela Multiusuários

Discussão em 'Progress 4GL' iniciado por DFResmer, Setembro 12, 2011.

  1. joelscampos

    joelscampos Membro Participativo

    Código:
    RUN pr-sua-procedure.
    
    PROCEDURE pr-sua-procedure:
    
        def buffer bf_Magenda for MAGENDA.
    
        FOR EACH MAGENDA WHERE MAGENDA.seqage = h-seq NO-LOCK .
            RUN pr-update.
            /*nao sei se o registro MAGENDA estará disponível, pois foi feito o release no buffer bf_Magenda*/
        END. 
    
    END PROCEDURE. /*pr-sua-procedure*/
    
    
    PROCEDURE pr-update:
    
        find bf_Magenda where rowid(bf_Magenda) = rowid(MAGENDA) exclusive-lock NO-WAIT no-error.
        /*se estiver bloqueado, fica tentando até conseguir, e nao mostra a msg de registro com bloqueio para o usuario*/
        DO WHILE LOCKED bf_Magenda:
    
            find bf_Magenda where rowid(bf_Magenda) = rowid(MAGENDA) exclusive-lock NO-WAIT no-error.
    
        END. /*WHILE LOCKED bf_Magenda*/
        ASSIGN MAGENDA.dtaemi = h-dtanov 
               MAGENDA.horini = INT(h-hora_ini)
               MAGENDA.horfin = INT(h-hora_fin).
        RELEASE bf_Magenda. /*acho que a cada vez que sai dessa procedure o registro é liberado*/
    
    END PROCEDURE. /*pr-update*/
    
  2. LFBuozi

    LFBuozi Membro Participativo

    Bom dia, primeiro vamos fazer uma revisão nestes códigos.
    No caso do for each, como você vai fazer a alteração na magenda e não no buffer, a magenda é que leva o exclusive-lock e o código fica como está abaixo:
    Código:
    DEF BUFFER bf_Magenda FOR MAGENDA.
    FOR EACH MAGENDA WHERE MAGENDA.seqage = h-seq EXCLUSIVE-LOCK .
        /* FIND bf_Magenda WHERE ROWID(bf_Magenda) = ROWID(MAGENDA) NO-LOCK NO-ERROR. */ /*na verdade este buffer não é necessário neste código*/
        ASSIGN MAGENDA.dtaemi = h-dtanov
               MAGENDA.horini = INT(h-hora_ini)
               MAGENDA.horfin = INT(h-hora_fin).
    END.
    
    Já no caso do find, é necessário verificar se ele realmente achou o registro antes da alteração e, após alterar, você pode somente fazer o find current com no-lock, esta linha só serve para liberar o registro com exclusive-lock, veja:
    Código:
    FIND FIRST MAGENDA WHERE MAGENDA.seqage = h-seq EXCLUSIVE-LOCK NO-ERROR.
    IF AVAIL MAGENDA THEN DO:
        ASSIGN MAGENDA.dtaemi = h-dtanov
               MAGENDA.horini = INT(h-hora_ini)
               MAGENDA.horfin = INT(h-hora_fin).
        FIND CURRENT MAGENDA NO-LOCK NO-ERROR.
    END.
    Não sei se é isso o que precisa, mas achei importante destacar neste caso.
  3. joelscampos

    joelscampos Membro Participativo

    Olha, eu também pensava assim e quebrei a cabeça bastante quando tive que lidar a primeira vez com esses bloqueios, por isso vou insistir um pouco para tentar ajudar :)

    Se o find current com no-lock resolve, então se você executar o trecho abaixo em dois editores ao mesmo tempo, o registro ficará disponível no momento aparecer a msg "registro liberado":

    Código:
    FIND FIRST tabela-qualquer EXCLUSIVE-LOCK NO-ERROR.
    IF AVAIL tabela-qualquer THEN DO:
        MESSAGE "achou e mantém o registro em bloqueio" VIEW-AS ALERT-BOX.
    
        FIND CURRENT tabela-qualquer NO-LOCK NO-ERROR.
    END.
    
    
    MESSAGE "registro liberado" VIEW-AS ALERT-BOX.
    
    
  4. DFResmer

    DFResmer Membro Participativo

    Boa Tarde,
    A sua ajuda me ajudou muito, mas ainda está travando, mas acho que é por outro motivo, eu fis os testes no meu computador e não travou, mas travou depois de compilado para o usuário.
    Eu abri dois editores no banco multiusuários, executei os 2 programas ao mesmo tempo, fiz várias alterações e nenhum travou, depois copilei e atualizei para os usuários, no primeiro teste ele já travou, um dos usuários saiu do programa, o outro continuou travado, então o usuário usuário saiu de tudo, aí ele liberou....

    ?
  5. joelscampos

    joelscampos Membro Participativo

    Posta o código como ficou... talvez consigamos ver alguma coisa...
  6. DFResmer

    DFResmer Membro Participativo

    No momento da alteração o código ficou desta forma:

    Código:
    FIND FIRST MAGENDA WHERE MAGENDA.seqage = h-seq EXCLUSIVE-LOCK NO-ERROR.
    IF AVAIL MAGENDA THEN DO:
        ASSIGN MAGENDA.dtaemi = h-dtanov
               MAGENDA.horini = INT(h-hora_ini)
               MAGENDA.horfin = INT(h-hora_fin).
        FIND CURRENT MAGENDA NO-LOCK NO-ERROR.
    END.
    
    O programa copilado ficou com este nome Magenda.r, para chamar este programa, eu criei um menu principal que usa o seguinte código para chamá-lo:

    Código:
    RUN 'C:\Compro\Exec\Magenda.r'.
    
    O engraçado que executei o programa copilado direto sem ser chamado pelo menu principal e não trava....

    O que pode estar acontecendo?

Compartilhe esta Página