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

Dica Programa para Analisar Codigo Progress

Discussão em 'Progress 4GL' iniciado por fdantas, Maio 4, 2017.

  1. fdantas

    fdantas Administrator Moderador

    O OR da pra pegar facil, o problema é que a ferramenta esta em php e nao tem uma base Progress para eu verificar os indices. Mas vou tentar pensar em alguma alternativa. Brigadao Brow
  2. ds201

    ds201 Membro Participativo

    Boa noite

    Segue o código com o BEGINS comentad0.

    Sds

    Código:
    /*--- Procedure valida tabela tecn-mi para o CC "03000" --------------------------------------------------*/
    procedure proc_valida_cc_03000:
       assign
          v-num-reg-lidos = 0
          i-aux           = 0.
    
       put
          '*--- 25: Valida tabela tecn-mi para o CC "03000". -----------------------------------------------------------*'
          skip
          '*---     Esta analise ‚ valida para qualquer dia. Veja: MI0104. ---------------------------------------------*'
          skip.
    
       /*
       Nota:
       1 - A liga‡Æo entre o "C¢digo do t‚cnico / MI" e "Funcion rio / HR" e bem fr gil).
       2 - A leitura podera apresentar falhas. Considere este bloco mais como um Aviso.
       */
    
       /*--- S¢ chama h-acomp quando On-line ---*/
       if i-num-ped-exec-rpw = 0 then do: /*--- On-line ---*/
          assign i-aux           = i-aux           + 1.
          assign v-num-reg-lidos = v-num-reg-lidos + 1.
    
          if i-aux >= 12 then do:
             process events.
             run pi-acompanhar in h-acomp(input "Fase 27/46  " + trim(string(v-num-reg-lidos,">,>>>,>>>,>>9"))).
             assign i-aux = 0.
          end.
       end.
    
       run mrcsp/mrcs001b.p (input-output table tt-func-mrn). /*--- Carrega temp-table "tt-func-mrn" ---*/
    
       for each tecn-mi
          where tecn-mi.sit-tecn = 1 /*--- T‚cnico ATIVO ---*/
          no-lock:
    
          /*--- S¢ chama h-acomp quando On-line ---*/
          if i-num-ped-exec-rpw = 0 then do: /*--- On-line ---*/
             assign i-aux           = i-aux           + 1.
             assign v-num-reg-lidos = v-num-reg-lidos + 1.
    
             if i-aux >= 24 then do:
                process events.
                run pi-acompanhar in h-acomp(input "Fase 28/46  " + trim(string(v-num-reg-lidos,">,>>>,>>>,>>9"))).
                assign i-aux = 0.
             end.
          end.
    
          /*--- Decide se o t‚cnico ‚ funcion rio da MRN ---*/
          assign l-func-mrn = no.
    
          find tt-func-mrn /*--- Esta leitura e propensa a FALHAS ---*/
             where tt-func-mrn.cod-funcionario = substr(tecn-mi.cd-tecnico, 1, (length(tecn-mi.cd-tecnico) - 1) ) and /*--- Ajusta tamanho da chave do MI ---*/
                   tt-func-mrn.nome-trunc      = substr(tecn-mi.nome-compl, 1, 4)                                     /*--- Pega uma parte do nome ---*/
             use-index i-func-mrn
             no-lock
             no-error.
    
          if avail tt-func-mrn then do:
             assign l-func-mrn = yes.
          end.
    /*
          /*--- Teste 1 - T‚cnico x CC - Funcion rio MRN no CC "03000" ---*/
          if l-func-mrn        = yes     and      /*---  funcion rio da MRN ---*/
             tecn-mi.cc-codigo = "03000" then do: /*--- O CC "03000" ‚ somente para Terceiros ---*/
             assign l-imprime = yes.
             put
                'Tabela "Tecn-mi" com Centro de custo Incompat¡vel. '
                ' T‚cnico: '  tecn-mi.cd-tecnico
                ' CCusto: '   tecn-mi.cc-codigo
                skip
                ' Nome_MI: '  tecn-mi.nome-compl
                skip
                ' Nome_HR: '  tt-func-mrn.nome
                skip
                ' Msg: O t‚cnico ‚ funcion rio da MRN e est  lotado no CC "03000" na Tabela de T‚cnicos. O CC "03000" ‚ somente para TERCEIROS'
                skip
                ' [Veja: MI0104].'
                skip(1).
          end.
    
          /*--- Teste 2 - T‚cnico x CC - Funcion rio Terceiro fora do CC "03000" ---*/
          if l-func-mrn        =  no      and      /*---  terceiro ---*/
             tecn-mi.cc-codigo <> "03000" then do: /*--- O CC "03000" ‚ obrigatorio para Terceiros ---*/
             assign l-imprime = yes.
             put
                'Tabela "Tecn-mi" com Centro de custo Incompat¡vel. '
                ' T‚cnico: '  tecn-mi.cd-tecnico
                ' CCusto: '   tecn-mi.cc-codigo
                skip
                ' Nome_MI: '  tecn-mi.nome-compl
                skip
                ' Msg: O t‚cnico ‚ terceiro e nÆo est  lotado no CC "03000" na Tabela de T‚cnicos. O CC "03000" ‚ obrigat¢rio para TERCEIROS'
                skip
                ' [Veja: MI0104].'
                skip(1).
          end.
          /**/
         
          */
       end.
    
    /*
       /*--- Verifica se o c¢digo do t‚cnico termina em ZERO [Isto ‚ para evitar chaves duplicadas] ---*/
       if tt-param.usuario = "SS001" then do:
          for each tecn-mi
             where tecn-mi.sit-tecn = 1 /*--- T‚cnico ATIVO ---*/
             no-lock:
    
             process events.
    
             /*--- Filtra ---*/
             if substr(tecn-mi.cd-tecnico, (length(tecn-mi.cd-tecnico)), 1) = "0" then do:
                next.
             end.
    
             /*--- Imprime mensagem ---*/
             assign l-imprime = yes.
             put
                '*** SS001 *** AVISO: O c¢digo do t‚cnico deve terminar com ZERO na tabela "Tecn-mi". '
                ' T‚cnico: ' tecn-mi.cd-tecnico
                ' Nome: '    caps(tecn-mi.nome-compl) format "x(37)"
                skip(1).
          end.
       end.
    */
    /*
       /*--- Verifica se h  colisÆo de chaves sob a ¢tica do HCM ---*/
       for each tt-func-mrn
          no-lock:
    
          process events.
    
          /*--- Filtra ---*/
          find tecn-mi
             where tecn-mi.sit-tecn   = 1                                and /*--- T‚cnico ATIVO ---*/
                   tecn-mi.cd-tecnico begins tt-func-mrn.cod-funcionario
             no-error.
    
          if not ambiguous(tecn-mi) then do:
             next.
          end.
    
          /*--- Imprime mensagem ---*/
          assign l-imprime = yes.
          put
             '*** SS001 *** AVISO: O c¢digo do t‚cnico est  DUPLICADO na tabela "Tecn-mi" (pois o HCM ignora a ultima posi‡Æo da chave). '
             ' T‚cnico: ' tt-func-mrn.cod-funcionario
             skip(1).
       end.
    */
    
       run PI-tempo_gasto.
    end procedure.
    
    fdantas curtiu isso.
  3. ds201

    ds201 Membro Participativo

    Boa noite

    Muitos programadores não entendem bem como o Progress usa os índices.
    Um erro muito comum surge quando há a necessidade de incluir um novo teste no WHERE do for each ou find.
    O programador coloca o novo campo em uma posição qualquer, geralmente no começo do teste, e invalida o bom uso do índice.
    Já vi muitos fontes em que o programador escolheu o melhor índice, mas colocou os testes fora de ordem e o programa ficou lento.

    Aqui onde trabalho mais da metade dos problemas de lentidão estão relacionados a índices.
    Sem falar que um índice mal escolhido eleva bastante o trafego de dados na rede.

    Se for possível desenvolver regras abrangentes sobre esta assunto, isto será muito útil para todos nos.

    Sds
    fdantas curtiu isso.
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    como o fdantas comentou, como a ferramenta dele está em PHP, complica um pouco para validação de indices, pois o PHP não conhece o seu banco de dados, no minimo teria que receber os .df para fazer essa analise, se fosse uma ferramenta feita em progress, quem sabe conseguiria chegar proximo para esse tipo de analise, a totvs a um tempo atras adotou umas regras que simplesmente acabou com performance, pararam de indicar o nome do indice deixando que o progress escolha o melhor para o momento, por experiencia eu já sei que o progress escolhe errado e não estão mais usando "no-lock", também estão deixando que o progress decida se é no-lock, exclusive-lock, não sei se acontece com vcs, mas estou tendo um indice alto de usuario travando usuario até mesmo em relatorios, porque num for each que deveria ser no-lock, por um assign bobo qualquer dentro do loop, o progress marca como exclusive-lock, dai outro usuario entra pra consultar a mesma tabela e trava tudo, e não estou falando de especificos, estou falando de produto padrão, os programas deles.
    fdantas curtiu isso.
  5. Agnaldo

    Agnaldo Membro Ativo

    Faz uma compilação do programa com xref (referencia cruzada).
    O arquivo gerado pode ser usado para mostrar o uso (ou não) dos indices.

    No caso @fdantas, voce poderia pedir qual o arquivo Progress (.p, .w, etc) e qual o xref dele, caso tenha.
    Caso tenha, voce pode montar algum parser sobre o xref e enriquecer o teu analisador.
    fdantas curtiu isso.
  6. fdantas

    fdantas Administrator Moderador

    Essa parte do XREF já estamos fazendo Agnaldo, assim que tiver pronto aviso aqui, obrigado pela ajuda

Compartilhe esta Página