quinta-feira, 28 de novembro de 2013

Programa destinado a efetuar uma leitura dentro das VSTs para retornar o total de acessos que ocorreram nas bases de dados conectadas


/*
vst1.p
Programa destinado a efetuar uma leitura dentro das VSTs para retornar
o total de acessos que ocorreram nas bases de dados conectadas.
*/

def temp-table tt-dados no-undo
    field cod-base   as char format "x(20)" label "BaseDados"
    field cod-tab    as char format "x(32)" label "Tabela"
    field num-Create as integer format "zzzzzzzz9" label "Criados"
    field num-read   as integer format "zzzzzzzz9" label "Lidos"
    field num-update as integer format "zzzzzzzz9" label "Atualizados"
    field num-delete as integer format "zzzzzzzz9" label "Eliminados"
    index codigo is primary cod-base cod-tab.

DEF TEMP-TABLE tt-bancos NO-UNDO
    FIELD beused        AS LOG FORMAT "Sim/Nao"
    FIELD nome          AS CHAR
    FIELD numero        AS INT
    INDEX codigo IS PRIMARY numero nome.

def var i-cont as integer no-undo.
def var l-proc as logical init no no-undo.
def var i-ini  as integer no-undo.
def var i-fim  as integer no-undo.
def var i-dif  as integer no-undo.
def var c-coment as char no-undo label "Comentarios"
                    view-as editor scrollbar-vertical 
                                   size 65 by 5.
def var c-arq  as char format "x(70)" no-undo label "Arquivo".


DEF VAR l-exit         AS LOG NO-UNDO.
DEF BUTTON button-ok AUTO-GO LABEL "Ok".
DEF BUTTON button-cancela AUTO-GO LABEL "Sair".

DEF BUTTON button-desmarcatodos AUTO-GO LABEL "DESMARCA TODOS".

DEF BUTTON button-marcatodos AUTO-GO LABEL "MARCA TODOS".


DEFINE QUERY myquery FOR tt-bancos.

DEF browse mybrowser QUERY myquery 
     DISPLAY tt-bancos.beused  LABEL "Monitorar esta base"
             tt-bancos.nome    LABEL "Banco"
     WITH 10 DOWN SIZE 34 BY 15 CENTERED TITLE " Selecione os bancos ".

DEFINE FRAME myframe
     mybrowser              AT ROW 02 COL 12
     button-ok              AT ROW 18 COL 2
     button-cancela         AT ROW 18 COL 8
     button-desmarcatodos   AT ROW 18 COL 16
     button-marcatodos      AT ROW 18 COL 38
     WITH CENTERED SIDE-LABELS AT ROW 2 COLUMN 2 WIDTH 58 THREE-D
          VIEW-AS DIALOG-BOX.
    
ON MOUSE-SELECT-DBLCLICK OF mybrowser
DO:
    IF tt-bancos.beused 
    THEN ASSIGN tt-bancos.beused = no.
    ELSE ASSIGN tt-bancos.beused = YES.
    
    OPEN QUERY myquery FOR EACH tt-bancos.    

END.

ON CHOOSE OF button-cancela
DO:
    ASSIGN l-exit = YES.
END.

ON CHOOSE OF button-desmarcatodos
DO:
    FOR EACH tt-bancos:
        ASSIGN tt-bancos.beused = NO.
    END.

    OPEN QUERY myquery FOR EACH tt-bancos.    
END.

ON CHOOSE OF button-marcatodos
DO:
    FOR EACH tt-bancos:
        ASSIGN tt-bancos.beused = YES.
    END.

    OPEN QUERY myquery FOR EACH tt-bancos.    
END.

ON "shift-f1" anywhere do:
    message "O Monitor de acessos esta Ativado..." skip(2)
            "Para Iniciar a contagem, use SHIFT + F5" skip
            "Para Finalizar a amostragem, use SHIFT + F6"
            view-as alert-box.
END.

on  "shift-f5" anywhere do:
    if  l-proc = yes then do:
        message "O contador ja foi ativado !"
                view-as alert-box error.
        return no-apply.
    end.
    for each tt-dados exclusive-lock:
        delete tt-dados.
    end.

    /* criando lista de bancos */
    EMPTY TEMP-TABLE tt-bancos.

    repeat i-cont = 1 to num-dbs:
        CREATE tt-bancos.
        ASSIGN tt-bancos.beused = YES
               tt-bancos.nome   = ldbname(i-cont)
               tt-bancos.numero = i-cont.
    END.

    OPEN QUERY myquery FOR EACH tt-bancos.    
    ENABLE mybrowser WITH FRAME myframe.

    ENABLE button-ok
           button-cancela
           button-marcatodos
           button-desmarcatodos WITH FRAME myframe.
    
    ASSIGN l-exit = NO.
    WAIT-FOR CHOOSE OF button-ok OR
             CHOOSE OF button-cancela.
    HIDE FRAME myframe NO-PAUSE.

    IF NOT l-exit 
    THEN DO:
        repeat i-cont = 1 to num-dbs:
            IF CAN-FIND(tt-bancos WHERE
                        tt-bancos.numero = i-cont AND
                        tt-bancos.beused = NO)
            THEN NEXT.
    
            create alias dictdb for database value(ldbname(i-cont)).
/*            run c:\backup\fnt\vsts\monitaces2.p (input "Inicio", input-output table tt-dados). */
            run C:\Temp\vst2.p (input "Inicio", input-output table tt-dados).
        end.
    
        MESSAGE "Bancos Prontos!!!" VIEW-AS ALERT-BOX INFORMATION.
    
        assign l-proc = yes
               i-ini  = time.
    END.
    ELSE APPLY "ENDKEY" TO THIS-PROCEDURE.
end.


on  "shift-f6" anywhere do:
    if  l-proc = no then do:
        message "Inicialize o contador primeiro com SHIFT + F2"
                view-as alert-box error.
        return no-apply.
    end.
    run pi-mostra-dados.
end.

on stop, window-close anywhere do:
    if l-proc 
    then run pi-mostra-dados.
END.

WAIT-FOR ENDKEY OF THIS-PROCEDURE.

/*
do  on error undo, leave
    on stop undo, leave
    on quit undo, leave:
    run men/men902za.p.
end.

quit.
*/

procedure pi-mostra-dados:
    def var c-base as char format "x(30)" no-undo label "Base de dados"
                      view-as combo-box inner-lines 6.
    def var c-lista  as char no-undo.
    def var c-inic   as char no-undo label "Inicio".
    def var c-term   as char no-undo label "Termino".
    def var c-dife   as char no-undo label "Tempo".
    def var l-tipo   as logical no-undo label "Utiliza Filtro por Base" init no
                        view-as toggle-box.

    def query qr-dad for tt-dados.

    def browse br-dad query qr-dad display
        tt-dados.cod-tab
        tt-dados.num-read
        tt-dados.num-create
        tt-dados.num-update
        tt-dados.num-delete
        tt-dados.cod-base
        with separators 10 down width 92.
    
    def button bt-ok    label "Ok"       size 10 by 1 auto-go.
    DEF BUTTON bt-files LABEL "Arquivos" SIZE 10 BY 1.
    def button bt-imp   label "Imprime"  size 10 by 1.
    def button bt-canc  label "Cancela"  size 10 by 1 auto-endkey.

    pause 0 before-hide.

    def frame f-dados
        l-tipo at 3 
        c-base at 3
        br-dad at 3
        c-inic at 3 c-term c-dife skip(.5)
        bt-ok  at 3 bt-imp
        with three-d side-labels view-as dialog-box title "Analise de Acessos"
             size 98 by 16.
    
    def frame f-imp
        c-coment at 3
        c-arq    at 3 skip(.5)
        bt-ok    at 3
        bt-canc  
        bt-files
        with three-d side-labels view-as dialog-box title "Impressao"
             size 88 by 09.

    assign i-fim = time
           i-dif = abs(i-fim - i-ini).
    assign c-inic = string(i-ini, "HH:MM:SS")
           c-term = string(i-fim, "HH:MM:SS")
           c-dife = string(i-dif, "HH:MM:SS").
    repeat i-cont = 1 to num-dbs:
        
        IF CAN-FIND(tt-bancos WHERE
                    tt-bancos.numero = i-cont AND
                    tt-bancos.beused = NO)
        THEN NEXT.
        
        create alias dictdb for database value(ldbname(i-cont)).
        run C:\Temp\vst2.p (input "Final", input-output table tt-dados).
        if  can-find(first tt-dados
            where tt-dados.cod-base = trim(ldbname(i-cont))) then do:
            assign c-lista = c-lista 
                           + (if  c-lista <> "" then "," else "")
                           + ldbname(i-cont).
        end.
    end.
    
    if  length(trim(c-lista)) = 0 then do:
        message "Nao houveram acessos a base de dados neste programa !"
                view-as alert-box information.
        return.
    end.

    assign c-base:list-items = c-lista
           c-base            = entry(1, c-lista).

    on  value-changed of l-tipo in frame f-dados do:
        close query qr-dad.
        assign l-tipo.
        assign c-base:sensitive = l-tipo.
        if  c-base:sensitive = yes then do:
            apply "value-changed" to c-base.
        end.
        else do:
            open query qr-dad for each tt-dados no-lock
                 by tt-dados.num-read descending
                 by tt-dados.cod-base
                 by tt-dados.cod-tab.
        end.
    end.

    on  value-changed of c-base in frame f-dados do:
        close query qr-dad.
        open query qr-dad for each tt-dados no-lock
             where tt-dados.cod-base = trim(c-base:screen-value in frame f-dados)
             by tt-dados.num-read descending
             by tt-dados.cod-base
             by tt-dados.cod-tab.
    end.

    ON choose OF bt-files IN FRAME f-imp
    DO:
        SYSTEM-DIALOG GET-FILE c-arq.
        RETURN.
    END.

    on  choose of bt-imp do:
        def buffer btt-dados for tt-dados.
        assign c-arq = "C:\TMP\.txt".
               /* session:temp-directory + "MA" + replace(string(i-ini, "HH:MM:SS"), ":","") + ".txt". */

        disp c-coment
             c-arq
             with frame f-imp.
        update c-coment
               c-arq
               bt-files
               bt-ok
               bt-canc
               with frame f-imp.
        if  length(trim(c-arq)) = 0 then do:
            return no-apply.
        end.
        output to value(c-arq).
        disp c-coment skip
             with frame f-tempos side-labels 1 down width 132.
        put unformatted skip(1)
            "Inicio: " c-inic space(5)
            "Termino: " c-term space(5)
            "Tempo: " c-dife skip(1).
        for each btt-dados no-lock
            by btt-dados.num-read descending
            by btt-dados.cod-base
            by btt-dados.cod-tab:
            disp btt-dados.cod-base  
                 btt-dados.cod-tab   
                 btt-dados.num-read  
                 btt-dados.num-Create
                 btt-dados.num-update
                 btt-dados.num-delete
                 with down frame f-rel no-attr-space width 132.
            down with frame f-rel.
        end.
        output close.
    end.
    
    enable l-tipo
           br-dad
           bt-ok
           bt-imp
           with frame f-dados.

    disp l-tipo
         c-base 
         c-inic 
         c-term 
         c-dife 
         with frame f-dados.

    apply "value-changed" to l-tipo in frame f-dados.

    update l-tipo
           br-dad
           bt-ok
           bt-imp
           with frame f-dados.

    assign l-proc = no.
end procedure.

/* fim */

/* 
vst2.p
Programa destinado a efetuar uma leitura dentro das VSTs para retornar
o total de acessos que ocorreram nas bases de dados conectadas.
*/

def temp-table tt-dados no-undo
    field cod-base   as char format "x(20)" label "BaseDados"
    field cod-tab    as char format "x(32)" label "Tabela"
    field num-Create as integer format "zzzzzzzz9" label "Criados"
    field num-read   as integer format "zzzzzzzz9" label "Lidos"
    field num-update as integer format "zzzzzzzz9" label "Atualizados"
    field num-delete as integer format "zzzzzzzz9" label "Eliminados"
    index codigo is primary cod-base cod-tab.

def var c-msg  as char    format "x(50)" no-undo.

def input param c-opcao as char no-undo.
def input-output param table for tt-dados.

pause 0 before-hide.

def frame f-msg1
    c-msg no-label
    with no-labels 1 down three-d view-as dialog-box title "Processando...".
def frame f-msg2
    c-msg no-label
    with no-labels 1 down three-d view-as dialog-box title "Totalizando...".

if  c-opcao = "inicio" then do:
    for each dictdb._tablestat no-lock
        by dictdb._tablestat._tablestat-read 
        descending:
    
        find dictdb._file 
            where dictdb._file._file-num = dictdb._tablestat._tablestat-id 
            no-lock no-error.
        if  not avail dictdb._file then 
            next.
        
        disp "Base -> " + trim(ldbname("dictdb")) + "..." @ c-msg with frame f-msg1.
        
        create tt-dados.
        assign tt-dados.cod-base   = trim(ldbname("dictdb"))
               tt-dados.cod-tab    = dictdb._file._file-name
               tt-dados.num-create = dictdb._tablestat._tablestat-create
               tt-dados.num-read   = dictdb._tablestat._tablestat-read
               tt-dados.num-update = dictdb._tablestat._tablestat-update
               tt-dados.num-delete = dictdb._tablestat._tablestat-delete.
    end.
end.
if  c-opcao = "Final" then do:
    for each dictdb._tablestat no-lock
        by dictdb._tablestat._tablestat-read 
        descending:
    
        find dictdb._file 
            where dictdb._file._file-num = dictdb._tablestat._tablestat-id 
            no-lock no-error.
        if  not avail dictdb._file then 
            next.
        
        disp "Base -> " + trim(ldbname("dictdb")) + "..." @ c-msg with frame f-msg2.

        find first tt-dados
            where tt-dados.cod-base = trim(ldbname("dictdb"))
            and   tt-dados.cod-tab  = dictdb._file._file-name
            exclusive-lock no-error.
        if  not avail tt-dados then do:
            create tt-dados.
            assign tt-dados.cod-base   = trim(ldbname("dictdb"))
                   tt-dados.cod-tab    = dictdb._file._file-name
                   tt-dados.num-create = dictdb._tablestat._tablestat-create
                   tt-dados.num-read   = dictdb._tablestat._tablestat-read
                   tt-dados.num-update = dictdb._tablestat._tablestat-update
                   tt-dados.num-delete = dictdb._tablestat._tablestat-delete.
        end.
        else do:
            assign tt-dados.num-create = abs(abs(tt-dados.num-create) - abs(dictdb._tablestat._tablestat-create))
                   tt-dados.num-read   = abs(abs(tt-dados.num-read)   - abs(dictdb._tablestat._tablestat-read))
                   tt-dados.num-update = abs(abs(tt-dados.num-update) - abs(dictdb._tablestat._tablestat-update))
                   tt-dados.num-delete = abs(abs(tt-dados.num-delete) - abs(dictdb._tablestat._tablestat-delete)).
        end.
    end.

    for each tt-dados exclusive-lock:
        if   tt-dados.num-create = 0
        and  tt-dados.num-read   = 0
        and  tt-dados.num-update = 0 
        and  tt-dados.num-delete = 0 then do:
            delete tt-dados.
        end.
    end.
end.

hide frame f-msg1.
hide frame f-msg2.

/* fim */




Nenhum comentário:

Postar um comentário