Deletar registro listado em browse

Discussão em 'Progress 4GL' iniciado por lucasiam, Maio 20, 2013.

  1. lucasiam

    lucasiam Membro Participativo

    Olá.
    Construí uma browse utilizando o "wizard" do AppBuilder, selecionando as tabelas, critérios "where" e tudo mais.
    Criei uma procedure que é executada quando o usuário clica com o botão direito sobre um registro listado na browse. Nessa procedure, o objetivo é capturar o registro corrente e deletá-lo da tabela.
    Como a browse foi feita com o "wizard", o appBuilder coloca a instrução "NO-LOCK" na query da browse, e aí o sistema exibe a mensagem: O registro está com status de NO-LOCK. Delete não está disponível. (335)
    Como posso contornar isso? Não gostaria de refazer a browse com freeform query.

    Segue o trecho de código da procedure.

    Código:
        /* movimento corrente */
        FIND CURRENT es-histvendas NO-ERROR.
    
        IF AVAIL es-histvendas THEN DO:
    
            /* pergunta */
            RUN utp\ut-msgs.r ( INPUT "show",
                                INPUT 27100,
                                INPUT "Deseja excluir o movimento?" + "~~" +
                                      "Movimento para o item: (" + es-histvendas.it-codigo + ") " + item.desc-item).
    
            IF RETURN-VALUE = "yes" THEN DO:
                /* deleta reg. */
                DELETE es-histvendas.
         
                /* atualiza grid */
                {&OPEN-QUERY-BR-HISTORICO}
            
            END.
    
        END.
    
  2. joelscampos

    joelscampos Membro Participativo

    E se vc fizer isso:

    Código:
     /* movimento corrente */
     FIND CURRENT es-histvendas NO-ERROR.
    
     IF AVAIL es-histvendas THEN DO:
    
         /* pergunta */
         RUN utp\ut-msgs.r ( INPUT "show",
                             INPUT 27100,
                             INPUT "Deseja excluir o movimento?" + "~~" +
                                   "Movimento para o item: (" + es-histvendas.it-codigo + ") " + item.desc-item).
    
         IF RETURN-VALUE = "yes" THEN DO:
             def buffer b-es-histvendas for es-histvendas.
             find b-es-histvendas exclusive-lock where rowid(b-es-histvendas) = rowid(es-histvendas) no-error.
             /* deleta reg. */
             DELETE b-es-histvendas.
      
             /* atualiza grid */
             {&OPEN-QUERY-BR-HISTORICO}
         
         END.
    
     END.
    
  3. jdchaves

    jdchaves Membro Participativo

    já tentou utilizar Temp-table?
  4. Mokwa

    Mokwa Membro Participativo

    Não sei se estou falando o obvio, mas parece que a solução é utilizar o find com EXCLUSIVE-LOCK.

    Código:
    FIND CURRENT es-histvendas EXCLUSIVE-LOCK NO-WAIT NO-ERROR.
    
    IF NOT AVAILABLE es-histvendas THEN DO:
       IF LOCKED es-histvendas THEN
           MESSAGE 'Registro esta sendo alterado por outro Usuario.' VIEW-AS ALERT-BOX ERROR BUTTONS OK.
       ELSE
           MESSAGE 'Registro excluido por outro Usuario.' VIEW-AS ALERT-BOX ERROR BUTTONS OK.
    
        RETURN NO-APPLY.
    END.
    
  5. lucasiam

    lucasiam Membro Participativo

    joelscampos, utilizei o buffer e deu certo. Muito obrigado.

    Mokwa, como o browse "herda" o NO-LOCK da query construída pelo Wizard do AppBuilder, acho que simplesmente usar o EXCLUSIVE-LOCK talvez não funcione. Mas vou fazer esse teste e já posto por aqui.

    De qualquer forma, obrigado a todos!!

Compartilhe esta Página