quarta-feira, 15 de fevereiro de 2012

Meter em index



Com certeza tem algo melhor e mais adequado, mas quebra o galho.

**------------------------------------------------------------------------------**
**  Finalidade  :   Gerar Indices de arquívos DBC/NTX
**  Autor       :   S.A.Oliveira
** Atualizado : 17/09/2011  17:15:00
**------------------------------------------------------------------------------**
    FUNCTION Indices_DBC()
    #include 'fivewin.ch'
**------------------------------------------------------------------------------**
    PRIVATE oBotIndices[3],NoEscIndices:=.f.
    PRIVATE Msg1_Indices:="Atenção !!!"
    PRIVATE Msg2_Indices:="Este procedimento deve ser feito em modo exclusivo."
    PRIVATE Msg3_Indices:=Space(40)
    PRIVATE Msg4_Indices:=Space(40)
    PRIVATE nTotal:=0,nTot:=0,gTot:=0,nReg:=0,iReg:=0, iTotal
    nTot:=Len(DIRECTORY(nDir+"\ARQUIVOS\*.DBC"))
    gTot:=Len(DIRECTORY(gDir+"\ARQUIVOS\*.DBC"))

    AbreArquivo(nDir,"ARQLFS","LFS",0,.T.)
    LFS->(OrdSetFocus(2))
    IF(LFS->(DBSeek(CToD('13/10/2011'))))
        WHILE(LFS->(!Eof()))
            IF(LFS->a_notlfs < 1000000)
                WHILE(LFS->(!RLock())) ; ENDDO
                LFS->a_notlfs:=LFS->a_notlfs + 1000000
                LFS->(DBUnlock())
            ENDIF
            LFS->(DBSkip(1))
        ENDDO
    ENDIF
    LFS->(DBCommit())
    FechaAlias("LFS")

DEFINE DIALOG oDlgIndices RESOURCE "_TELA_INDICES" OF oWnd
              oDlgIndices:lTransparent:=.F.
              oDlgIndices:lHelpIcon:=.f.
              oDlgIndices:oFont:=oPub:fNorm11
              oDlgIndices:SetColor(oPub:CorPreto,oPub:CorDlg)

    REDEFINE SAY ID 100 OF oDlgIndices FONT oPub:fBCour22 COLOR oPub:CorDlg,oPub:CorAzulT
    REDEFINE SAY ID 103 OF oDlgIndices FONT oPub:fNorm11  COLOR oPub:CorPreto,oPub:CorDlg
    REDEFINE SAY ID 105 OF oDlgIndices FONT oPub:fNorm11  COLOR oPub:CorPreto,oPub:CorDlg
    REDEFINE SAY OMsg1_Indices VAR Msg1_Indices ID 101 OF oDlgIndices FONT oPub:fBCour22 COLOR oPub:CorVermelho,oPub:CorDlg UPDATE
    REDEFINE SAY OMsg2_Indices VAR Msg2_Indices ID 102 OF oDlgIndices FONT oPub:fBCour14 COLOR oPub:CorAzul    ,oPub:CorDlg UPDATE
    REDEFINE SAY OMsg3_Indices VAR Msg3_Indices ID 104 OF oDlgIndices FONT oPub:fBCour13 COLOR oPub:CorPreto   ,oPub:CorDlg UPDATE
    REDEFINE SAY OMsg4_Indices VAR Msg4_Indices ID 106 OF oDlgIndices FONT oPub:fBCour13 COLOR oPub:CorPreto   ,oPub:CorDlg UPDATE

    REDEFINE METER oMeter  VAR nReg TOTAL nTotal ID 201 OF oDlgIndices FONT oPub:fBCour13 COLOR oPub:CorDlg,oPub:CorPreto BARCOLOR oPub:CorAzulT,oPub:CorBranco UPDATE
    REDEFINE METER oMeter1 VAR iReg TOTAL nTotal ID 202 OF oDlgIndices FONT oPub:fBCour13 COLOR oPub:CorDlg,oPub:CorPreto BARCOLOR oPub:CorAzulT,oPub:CorBranco UPDATE
    REDEFINE BUTTONBMP oBotIndices[1] ID 501 OF oDlgIndices ACTION(ReindexarArquivos(1))
    REDEFINE BUTTONBMP oBotIndices[3] ID 503 OF oDlgIndices ACTION(NoEscIndices:=.T.,oDlgIndices:END())

ACTIVATE DIALOG oDlgIndices CENTER Valid(noEscIndices)
SysWait(0.05)
RETURN(NIL)

**----------------------------------------------------------**
       STATIC FUNCTION ReindexarArquivos(Arg1)
**----------------------------------------------------------**
IF(!MsgNoYes("Confirma gerar novos indices ?","Atenção"))
    oBotIndices[3]:SetFocus()
    RETURN(.T.)
ENDIF
ARQ:=DIRECTORY(nDir+"\ARQUIVOS\*.I*")
cIndices:=LEN(ARQ)
FOR X = 1 TO cIndices
    IF(FErase(nDir+"\ARQUIVOS\"+ARQ[x,1]) <> 0)
        Msgstop("Arquivo em uso por outro processo.","Atenção")
        RETURN(.F.)
    ENDIF
NEXT

ARQ:=DIRECTORY(gDir+"\INDICES\*.I*")
cIndices:=LEN(ARQ)
FOR X = 1 TO cIndices
    IF(FErase(gDir+"\INDICES\"+ARQ[x,1]) <> 0)
        Msgstop("Arquivo em uso por outro processo.","Atenção")
        RETURN(.F.)
    ENDIF
NEXT

t1:=Time()
Msg1_Indices:="Aguarde !!!"                              ; OMsg1_Indices:Refresh()
Msg2_Indices:="Este procedimendo levará alguns minutos." ; OMsg2_Indices:Refresh()
Msg3_Indices:=""                                         ; OMsg3_Indices:Refresh()
oBotIndices[1]:Disable()
oBotIndices[3]:Disable()

oMeter:nTotal:=nTot+gTot
ReindexarArquivosEfetivo()
t2:=Elaptime(t1,Time())
oBotIndices[3]:Enable()
oBotIndices[3]:SetText("Finalizar")            ; oBotIndices[3]:Enable()
Msg1_Indices:="Concluído !!!"                  ; OMsg1_Indices:Refresh()
Msg2_Indices:="Tempo decorrido: "+Subs(t2,1,8) ; OMsg2_Indices:Refresh()
Msg3_Indices:=""                               ; OMsg3_Indices:Refresh()
Msg4_Indices:=""                               ; OMsg4_Indices:Refresh()

RETURN(.T.)

**----------------------------------------------------------**
    STATIC FUNCTION ReindexarArquivosEfetivo()
**----------------------------------------------------------**

**--[ Cabeçalho nota de entrada ]--** OK
    IF(!File(nDir+"\ARQUIVOS\ARQCFE.I01"))
        DBUseArea(.T.,"DBFNTX",(nDir+"\ARQUIVOS\ARQCFE.DBC"),,.F.,.F.)
        Msg3_Indices:="Nota Entrada - Cabec"    ; OMsg3_Indices:Refresh()
        Msg4_Indices:="Controle"                ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"a_ctrcfe",(nDir+"\ARQUIVOS\ARQCFE.I01"))
        Msg4_Indices:="Fornecedor/Data"         ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"Str(a_forcfe)+Descend(DToS(a_entcfe))",(nDir+"\ARQUIVOS\ARQCFE.I02"))
        Msg4_Indices:="Fornecedor/Nº Nota"      ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"Str(a_forcfe)+Str(a_notcfe)",(nDir+"\ARQUIVOS\ARQCFE.I03"))
        Msg4_Indices:="Data Entrada"            ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"a_entcfe",(nDir+"\ARQUIVOS\ARQCFE.I04"))
        Msg4_Indices:="Código Fornecedor"       ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"a_forcfe",(nDir+"\ARQUIVOS\ARQCFE.I05"))
        Msg4_Indices:="Fornecedor/Nota/Data"    ; OMsg4_Indices:Refresh() ; BuildIndex(oMeter1,"Str(a_forcfe)+Str(a_notcfe)+DToS(a_entcfe)",(nDir+"\ARQUIVOS\ARQCFE.I06"))
        nReg+=1 ; oMeter:Refresh()
        DBCloseArea()
    ENDIF
RETURN(.T.)

*--------------------------------------------------------*
* meter para indices do sistemas                         *
*------------------------------- ------------------------*
   STATIC Function BuildIndex(qMeter,cVar,cInd)
*--------------------------------------------------------*
   qMeter:nTotal:=LastRec() //*5

   INDEX ON &cVar TO &cInd ;
        EVAL ( qMeter:Set( RecNo()),SysRefresh() ) EVERY 5000
        qMeter:Set(LastRec())
        qMeter:Refresh()
   Return(.T.)