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

erro: Registro de históricos de setores não esta' disponível

Discussão em 'Progress 4GL' iniciado por syclone, Abril 19, 2009.

  1. syclone

    syclone Sem Pontuação

    Eu tenho uma tabela (histor_setor) onde armazeno o histórico dos setores com seus campos.. mas ela não tem nenhum registro "ainda".. e quando eu rodo esse programinha pra inserir um registro pela primeira vez (f2) ele abre o programa.. eu preencho todos os campos da tabela.. e no ultimo campo quando dou um enter ele aparece um erro:

    ** Registro histórico dos setores não esta' disponível. (91)

    OBS: esse código abaixo valida todos os campos e não deixa o usuário informar uma "empresa" que não exista na tabela cft_empresa por exemplo.

    Código:
    DEF VAR v_empresa LIKE cft_histor_setor.cdn_empresa NO-UNDO.
    DEF VAR v_setor LIKE cft_histor_setor.cod_setor NO-UNDO.
    DEF VAR v_estab LIKE cft_histor_setor.cdn_estab NO-UNDO.
    DEF VAR v_funcionario LIKE cft_histor_setor.cdn_funcionario NO-UNDO.
    DEF VAR v_data_inic LIKE cft_histor_setor.dat_inic_histor NO-UNDO.
    DEF VAR v_data_term LIKE cft_histor_setor.dat_term_histor NO-UNDO.
    
    /* ---------------- */
    
    MESSAGE "Informar um código de empresa válido." VIEW-AS ALERT-BOX.
    UPDATE v_empresa.
    FIND cft_empresa NO-LOCK
        WHERE cft_empresa.cdn_empresa = v_empresa NO-ERROR.
    IF NOT AVAIL cft_empresa THEN DO:
        MESSAGE "Empresa inexistente." VIEW-AS ALERT-BOX.
        LEAVE.
    END.
    
    /* ------------------- */
    
    MESSAGE "Informar um código de estabelecimento válido." VIEW-AS ALERT-BOX.
    UPDATE v_estab.
    FIND cft_estabelecimento NO-LOCK
        WHERE cft_estabelecimento.cdn_estab = v_estab AND
        cft_estabelecimento.cdn_empresa = v_empresa NO-ERROR.
    IF NOT AVAIL cft_estabelecimento THEN DO:
        MESSAGE "Estabelecimento inexistente." VIEW-AS ALERT-BOX.
        LEAVE.
    END.
    
    /* ------------------- */
    
    MESSAGE "Informar um código de funcionário válido." VIEW-AS ALERT-BOX.
    UPDATE v_funcionario.
    FIND cft_funcionario NO-LOCK
        WHERE cft_funcionario.cdn_estab = v_estab AND
        cft_funcionario.cdn_empresa = v_empresa AND
        cft_funcionario.cdn_funcionario = v_funcionario NO-ERROR.
    IF NOT AVAIL cft_funcionario THEN DO:
        MESSAGE "Funcionario inexistente." VIEW-AS ALERT-BOX.
        LEAVE.
    END.
    
    /* ------------------ */
    
    MESSAGE "Informar um código de setor válido." VIEW-AS ALERT-BOX.
    UPDATE v_setor.
    IF v_setor = "" THEN DO:
        MESSAGE "Setor em branco." VIEW-AS ALERT-BOX INFO BUTTONS OK.
        LEAVE.
    END.
    FIND cft_funcionario NO-LOCK
        WHERE cft_funcionario.cdn_estab = v_estab AND
        cft_funcionario.cdn_empresa = v_empresa AND
        cft_funcionario.cdn_funcionario = v_funcionario AND
        cft_funcionario.cod_setor = v_setor NO-ERROR.
    IF NOT AVAIL cft_funcionario THEN DO:
        MESSAGE "Setor inexistente." VIEW-AS ALERT-BOX.
        LEAVE.
    END.
    
    /* ------------------- */
    
    MESSAGE "Informar uma data inicial válida." VIEW-AS ALERT-BOX.
    UPDATE v_data_inic.
    IF v_data_inic = ? THEN DO:
        MESSAGE "Data inicial em branco." VIEW-AS ALERT-BOX INFO BUTTONS OK.
        LEAVE.
    END.
    FIND cft_histor_setor EXCLUSIVE-LOCK WHERE
        cft_histor_setor.cdn_empresa = v_empresa AND
        cft_histor_setor.cdn_estab   = v_estab AND
        cft_histor_setor.cdn_funcionario = v_funcionario AND
        cft_histor_setor.cod_setor = v_setor NO-ERROR.
        IF AVAIL cft_histor_setor THEN
            IF cft_histor_setor.dat_inic_histor < v_data_inic AND
            cft_histor_setor.dat_term_histor > v_data_inic THEN DO:
                MESSAGE "Data inicial dentro de um período já cadastrado." VIEW-AS ALERT-BOX INFO BUTTONS OK.
                LEAVE.
    END.
    
    
    /* -------------------- */
    
    MESSAGE "Informar uma data final válida." VIEW-AS ALERT-BOX INFO BUTTONS OK.
    UPDATE v_data_term.
    IF v_data_term = ? THEN DO:
        MESSAGE "Data final em branco." VIEW-AS ALERT-BOX INFO BUTTONS OK.
        LEAVE.
    END.
    FIND cft_histor_setor EXCLUSIVE-LOCK WHERE
        cft_histor_setor.cdn_empresa = v_empresa AND
        cft_histor_setor.cdn_estab   = v_estab AND
        cft_histor_setor.cdn_funcionario = v_funcionario AND
        cft_histor_setor.cod_setor = v_setor NO-ERROR.
        IF AVAIL cft_histor_setor THEN
            IF cft_histor_setor.dat_inic_histor < v_data_term AND
               cft_histor_setor.dat_term_histor > v_data_term THEN DO:
                    MESSAGE "Data final dentro de um período já cadastrado." VIEW-AS ALERT-BOX INFO BUTTONS OK.
                    LEAVE.
            END.
    
    /* --------------------- */
    
    IF v_data_term < v_data_inic THEN DO:
        MESSAGE "Data final menor que data inicial." VIEW-AS ALERT-BOX INFO BUTTONS OK.
        LEAVE.
    END.
    
    /* --------------------- */
    
               
    CREATE cft_histor_setor.
    ASSIGN cft_histor_setor.cdn_empresa = v_empresa
                   cft_histor_setor.cdn_estab   = v_estab
                   cft_histor_setor.cdn_funcionario = v_funcionario
                   cft_histor_setor.cod_setor = v_setor
                   cft_histor_setor.dat_inic_histor = v_data_inic
                   cft_histor_setor.dat_term_histor = v_data_term.
    MESSAGE "Registro incluido com sucesso!" VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    Ai eu fiz um teste.. criei um outro programinha assim só pra inserir um registro qualquer manualmente antes pra depois usar esse programa acima (o grande) e deu.. não apareceu mais aquele erro

    Código:
    create cft_histor_setor.
    update cft_histor_setor.
    Incluí um registro qualquer com todos os campos "0" menos as datas.. ai depois eu rodei esse outro programa (grande) e funciona.. mas pq isso.. ele não deixa eu incluir um registro se a tabela estiver vazia??
  2. atila.cm

    atila.cm Membro Participativo

    Caro syclone:

    No fonte que voce anexou vão encontrei falhas, pode ser que a tabela tenha algum VALIDATE nos campos de data que podem estar causando o erro.
    Tente utilizar o DEBUG para localizar exatamento onde é enviada a mensagem de erro.

    Abraços

    Atila.cm@hotmail.com
  3. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Anexe aqui o DF das tabelas que constam nesta rotina, vou criar um banco de dados local e verificar, mas posso adiantar uma coisa:

    01) Quando você for fazer uma leitura de tabela apenas para validação, não utilize o FIND, utilize o CAN-FIND, para perfomance é bem melhor.

    Exemplo: Ao inves de:

    Código:
    FIND cft_estabelecimento NO-LOCK
        WHERE cft_estabelecimento.cdn_estab = v_estab AND
        cft_estabelecimento.cdn_empresa = v_empresa NO-ERROR.
    IF NOT AVAIL cft_estabelecimento THEN DO:
        MESSAGE "Estabelecimento inexistente." VIEW-AS ALERT-BOX.
    
    use o seguinte:
    Código:
    IF NOT CAN-FIND(FIRST cft_estabelecimento NO-LOCK
                    WHERE cft_estabelecimento.cdn_estab = v_estab 
                         AND cft_estabelecimento.cdn_empresa = v_empresa NO-ERROR.) THEN DO:
        MESSAGE "Estabelecimento inexistente." VIEW-AS ALERT-BOX.
    
    Outro detalhe, ao invés de colocar somente FIND coloque FIND FIRST.

    Você está usando:
    Código:
    FIND cft_histor_setor EXCLUSIVE-LOCK WHERE
        cft_histor_setor.cdn_empresa = v_empresa AND
        cft_histor_setor.cdn_estab   = v_estab AND
        cft_histor_setor.cdn_funcionario = v_funcionario AND
        cft_histor_setor.cod_setor = v_setor NO-ERROR.
        IF AVAIL cft_histor_setor THEN
    
    Percebe que está informando um EXCLUSIVE-LOCK, ou seja travando o registro onde somente está sendo usado para leitura? Faça da seguinte maneira:

    Código:
    IF CAN-FIND(FIRST cft_histor_setor NO-LOCK 
                WHERE cft_histor_setor.cdn_empresa      = v_empresa 
                  AND cft_histor_setor.cdn_estab        = v_estab  
                  AND cft_histor_setor.cdn_funcionario  = v_funcionario 
                  AND cft_histor_setor.cod_setor        = v_setor
                  AND cft_histor_setor.dat_inic_histor  < v_data_inic 
                  AND cft_histor_setor.dat_term_histor  > v_data_inic) THEN DO:
        MESSAGE "Data inicial dentro de um período já cadastrado." VIEW-AS ALERT-BOX INFO BUTTONS OK.
        LEAVE.
    END.
    
    Faça estas alterações e não funcionando, me envie os DF das tabelas.
  4. syclone

    syclone Sem Pontuação

    É que esse é um exercício onde só posso usar comandos aprendidos.. não aprendi o can-find, então eu uso o find (independente se perde performance.. essas coisas..)..

    fiz as alterações.. aquele EXCLUSIVE foi erro meu mesmo.. é que eu alterei ele de lugar onde ANTES ele incluia um registro, por isso eu usava o exclusive, e agora eu mudei o FIND de lugar e esqueci de alterrar para NO-LOCK...

    E mudei nas validações todos os FINDs pra FIND FIRST...

    O meu programa tá funcionando perfeitamente.. as validações tudo certinho.. já fiz vários testes.. só que..
    minha pergunta é o seguinte.. pq quando vou inserir o PRIMEIRO registro na tabela cft_histor_setor por esse programa ele dá esse erro:

    ** Registro histórico dos setores não esta' disponível. (91)

    Mas se já tiver um registro ele não dá nenhum erro.
    ???
  5. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Não era para dar o erro... faça o que solicitei, envie-no o DF destas tabelas, para verificar e fazer o load e testar a rotina aqui.
  6. TrombiniSP

    TrombiniSP Membro Participativo

    Caros,

    Acho que o erro não está no ultimo bloco de código e sim no seguinte trecho:

    Código:
    FIND cft_histor_setor EXCLUSIVE-LOCK WHERE
        cft_histor_setor.cdn_empresa = v_empresa AND
        cft_histor_setor.cdn_estab   = v_estab AND
        cft_histor_setor.cdn_funcionario = v_funcionario AND
        cft_histor_setor.cod_setor = v_setor NO-ERROR.
        IF AVAIL cft_histor_setor THEN
            IF cft_histor_setor.dat_inic_histor < v_data_term AND
               cft_histor_setor.dat_term_histor > v_data_term THEN DO:
                    MESSAGE "Data final dentro de um período já cadastrado." VIEW-AS ALERT-BOX INFO BUTTONS OK.
                    LEAVE.
            END.
    
    O ocorre aqui é se o seu FIND retornar mais de um registo o atributo NO-ERROR inibe a mensagem que indica que dois ou mais registros foram encontrados. Como foram encontrados registros o programa entra no bloco IF AVAIL cft_histor_setor THEN...

    Dentro deste bloco vc tenta acessar dados da tabela e aqui ele mostra o erro pois na verdade o Progress não tem nada no buffer.

    Esta foi uma análise muito superficial e partindo do principio que depois que vc embutiu a clausula FIRST o problema desapareceu.

    Grato.

Compartilhe esta Página