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. LeandroSantos

    LeandroSantos Membro Participativo

    Sim isso é normal, o progress faz um rollback da tranzação, mas voce pode tratar isso.
    Código:
    Find first <tabela> exclusive-lock no-error no-wait.
    if not avail <tabela> then do:
       if locked <tabela> then 
          message  "Registro em uso por outro usuario." view-as alert-box.
       else
          message "Não cadastrado." view-as alert-box.
       return.
    end.
    
  2. DFResmer

    DFResmer Membro Participativo

    Estou fazendo uma alteração em uma tabela, mas acontece o seguinte erro com os outros usuários...
    O comando para gravar na tabela que estou utilizando é o seguinte:

    def buffer bf_Magenda for MAGENDA.
    FOR EACH MAGENDA WHERE MAGENDA.seqage = h-seq NO-LOCK .
    find bf_Magenda where rowid(bf_Magenda) = rowid(MAGENDA) exclusive-lock no-error.
    ASSIGN MAGENDA.dtaemi = h-dtanov
    MAGENDA.horini = INT(h-hora_ini)
    MAGENDA.horfin = INT(h-hora_fin).
    END.

    Mas mesmo assim ele trava com outros usuários.... e percebi uma coisa pior ainda, se eu modificar vários registros, todos os registros que foram morificados outro usuário se tentar modificar também ele trava, para destravar o primeiro usuário que fes as alterações tem que sair do sistema todo.....
    Como posso resolver isto?

    Já tentei também com assim:

    FIND MAGENDA WHERE MAGENDA.seqage = h-seq EXCLUSIVE-LOCK NO-ERROR.
    ASSIGN MAGENDA.dtaemi = h-dtanov
    MAGENDA.horini = INT(h-hora_ini)
    MAGENDA.horfin = INT(h-hora_fin).

    Também dá o mesmo problema.
  3. DFResmer

    DFResmer Membro Participativo

    Será que pode ser também por eu não ter definido uma chave primária e única? defini apenas a chave primária Magenda.seqlan, mas não defini uma chave única.
  4. joelscampos

    joelscampos Membro Participativo

    Esperimenta assim:

    Código:
    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. 
    
    PROCEDURE pr-update:
    
        find bf_Magenda where rowid(bf_Magenda) = rowid(MAGENDA) exclusive-lock no-error.
        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.
    
    Esse negocio de prender os registros tem a ver com o contexto de um bloco.
    No exemplo acima, o find com exclusive-lock ficou dentro do bloco representado pela procedure, e o release libera o registro ao fim do bloco.

    Acho que assim vai resolver.
  5. joelscampos

    joelscampos Membro Participativo

    e pode dar um up assim:

    Código:
    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. 
    
    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.
    
  6. DFResmer

    DFResmer Membro Participativo

    não consegui criar a procedure por que já estou dentro de uma procedure... aí tentei fazer sem aprocedure e colocar o realese, continuou travado.

Compartilhe esta Página