DonJuan Posted September 30, 2011 Report Share Posted September 30, 2011 Estou enviando pra quem gosta de Sgdb e precisa de um backup prontinho pra jogar suas informações para um arquivo texto, podendo restaurar conforme queira /****************************************************************************** * Sistema .....: PROJETO_PRINCIPAL * Programa ....: BKPRST.PRG * Autor .......: ALESSANDRO * Sintese .....: RESP. PELA ADMIN. DO SISTEMA * Data ........: 5/29/2010 à s 6:38:50 PM * Revisado em .: 5/29/2010 à s 6:38:50 PM ******************************************************************************/ #include "SYSTEMA.CH" /*******************************************************************************/ STATIC aBase *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION BKPRST() *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens local oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle,aFONTE:={},aFONTE2:={}, aDat[ 2], oDat[ 2] LOCAL cSt_SUBMODULO:="Módulo de Backups", oBlbx LOCAL oMtr1,oMtr2,nPor1,nPor2, cSay1,cSay2, oSay1,oSay2 LOCAL oMtr3,oMtr4,nPor3,nPor4, cSay3,cSay4, oSay3,oSay4 aBase:={} FOR nX:=1 TO LEN(aMods) IF !EMPTY(aMods[nX,5]) AADD(aBase,{aMods[nX,1],aMods[nX,2],aMods[nX,3],aMods[nX,4],aMods[nX,5]}) ENDIF NEXT aDat[ 1]:=SPACE(255) aDat[ 2]:=SPACE(255) nPor1:=0 nPor2:=0 cSay1:="-" cSay2:="-" FOR nX:=1 TO LEN(aBase) IF SR_EXISTTABLE(aBase[nX,5]) cComm:= " SELECT * FROM "+aBase[nX,5]+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") AADD(aFONTE,{("*"),(aBase[nX,5]),(TB_ARQUIVO->(LASTREC())),(0)}) CLOSE TB_ARQUIVO ELSE MSGINFO(" ESTA TABELA NÃO EXISTE "+aBase[nX,5],"ATENÇÃO") ENDIF NEXT AADD(aFONTE2,{(""),(""),(0),(0)}) DEFINE DIALOG oDbkp RESOURCE "BACKUP" TITLE cSt_SUBMODULO FONT oFontSystem REDEFINE BITMAP ID 5000 RESOURCE "BANNER" OF oDbkp ADJUST REDEFINE SENSITIVE SAY oSS06 PROMPT cSt_SUBMODULO ID 5001 OF oDbkp FONT oFont_Banner01 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE SENSITIVE SAY oSS06 PROMPT cVersao_Sistema ID 5002 OF oDbkp FONT oFont_Banner02 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE FOLDER oFld ID 1000 OF oDbkp ; PROMPTS "Criar Backups","Restaurar Backups" ; DIALOGS "G_BACKUP","I_BACKUP" oBlbx := TXBrowse():New( oFld:aDialogs[1] ) oBlbx:CreateFromResource(100) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE BTNGET oDat[ 1] VAR aDat[ 1] ID 101 OF oFld:aDialogs[1]; ACTION (aDat[ 1] := cGetDir( "Selecione uma pasta ",".\odonto", CurDrive() + ":\" + GetCurDir() ),oDat[ 1]:REFRESH() ) REDEFINE SAY oSay1 VAR cSay1 ID 104 OF oFld:aDialogs[1] REDEFINE SAY oSay2 VAR cSay2 ID 105 OF oFld:aDialogs[1] REDEFINE METER oMtr1 VAR nPor1 TOTAL 100 ID 102 OF oFld:aDialogs[1] COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr2 VAR nPor2 TOTAL 100 ID 103 OF oFld:aDialogs[1] COLOR CLR_WHITE, CLR_BLACK REDEFINE BUTTON ID 10 OF oFld:aDialogs[1] ACTION IF(!EMPTY(aDat[ 1]),BACKUP_GERA(1,aFONTE, oMtr1, oMtr2, @nPor1, @nPor2, oSay1, oSay2, @cSay1, @cSay2,aDat ),MSGINFO("ESCOLHA UM LOCAL DE DESTINO PARA O BACLUP","ATENÇÃO")) REDEFINE BUTTON ID 20 OF oFld:aDialogs[1] ACTION oDbkp:End() CANCEL // 2 FOLHA DE RESTAURAÇÃO DE ARQUIVOS oBlbx := TXBrowse():New( oFld:aDialogs[2] ) oBlbx:CreateFromResource(100) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE2, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE BTNGET oDat[ 2] VAR aDat[ 2] ID 101 OF oFld:aDialogs[2]; ACTION (aDat[ 2] := cGetfile32("*.SQL | ", "Selecione o Arquivo de Backups",,.f.),BUSCA_BKP(aDat,@aFONTE2,oBlbx),oDat[ 2]:REFRESH() ) REDEFINE SAY oSay3 VAR cSay3 ID 104 OF oFld:aDialogs[2] REDEFINE SAY oSay4 VAR cSay4 ID 105 OF oFld:aDialogs[2] REDEFINE METER oMtr3 VAR nPor3 TOTAL 100 ID 102 OF oFld:aDialogs[2] COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr4 VAR nPor4 TOTAL 100 ID 103 OF oFld:aDialogs[2] COLOR CLR_WHITE, CLR_BLACK REDEFINE BUTTON ID 10 OF oFld:aDialogs[2] ACTION IF(!EMPTY(aDat[ 2]),BACKUP_GERA(2,aFONTE2, oMtr3, oMtr4, @nPor3, @nPor4, oSay3, oSay4, @cSay3, @cSay4,aDat ),MSGINFO("ESCOLHA UM LOCAL DE DESTINO PARA O BACLUP","ATENÇÃO")) REDEFINE BUTTON ID 20 OF oFld:aDialogs[2] ACTION oDbkp:End() CANCEL ACTIVATE DIALOG oDbkp CENTERED RETURN NIL *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION CHKBKP() *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens local oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle,aFONTE:={},aFONTE2:={}, aDat[ 2], oDat[ 2] LOCAL cSt_SUBMODULO:="Módulo de Backups", oBlbx LOCAL oMtr1,oMtr2,nPor1,nPor2, cSay1,cSay2, oSay1,oSay2 LOCAL oMtr3,oMtr4,nPor3,nPor4, cSay3,cSay4, oSay3,oSay4 IF Secs( TIME() ) >= Secs( cHorBkp ) .AND. DATE() > dDatBkp .AND. DIABKP()==.T. oTimer:Deactivate() aDat[ 1]:=ALLTRIM(cDesBkp) aDat[ 2]:=SPACE(255) nPor1:=0 nPor2:=0 cSay1:="-" cSay2:="-" FOR nX:=1 TO LEN(aBase) cComm:= " SELECT * FROM "+aBase[nX,5]+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") AADD(aFONTE,{("*"),(aBase[nX,5]),(TB_ARQUIVO->(LASTREC())),(0)}) CLOSE TB_ARQUIVO NEXT DEFINE DIALOG oDbkp RESOURCE "CHK_BACKUP" TITLE cSt_SUBMODULO FONT oFontSystem REDEFINE BITMAP ID 5000 RESOURCE "BANNER" OF oDbkp ADJUST REDEFINE SENSITIVE SAY oSS06 PROMPT cSt_SUBMODULO ID 5001 OF oDbkp FONT oFont_Banner01 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE SENSITIVE SAY oSS06 PROMPT cVersao_Sistema ID 5002 OF oDbkp FONT oFont_Banner02 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT oBlbx := TXBrowse():New( oDbkp ) oBlbx:CreateFromResource(1000) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE SAY oSay1 VAR cSay1 ID 101 OF oDbkp REDEFINE SAY oSay2 VAR cSay2 ID 103 OF oDbkp REDEFINE METER oMtr1 VAR nPor1 TOTAL 100 ID 102 OF oDbkp COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr2 VAR nPor2 TOTAL 100 ID 104 OF oDbkp COLOR CLR_WHITE, CLR_BLACK ACTIVATE DIALOG oDbkp NOWAIT CENTERED (BACKUP_GERA(1,aFONTE, oMtr1, oMtr2, @nPor1, @nPor2, oSay1, oSay2, @cSay1, @cSay2,aDat ),; MSGINFO("Backup ConcluÃdo","Atenção"),oDbkp:End(),; cCodiSQl:="UPDATE CONFIGURACAO SET DATBKP = '"+DTOS(DATE())+"'", apCode := SR_SQLParse( cCodiSQl ), oSql := SR_GetConnection(),; oSql:exec( SR_SQLCodeGen( apCode, {}, oSql:nSystemID ) ), dDatBkp:=DATE(), oTimer:activate() ) ELSE ENDIF RETURN NIL ********************************************************** STATIC FUNCTION DIABKP() ********************************************************** LOCAL lConcede:=.F. DO CASE CASE CtoDoW( CDoW( DATE() ) ) = 2 lConcede:=lSeg CASE CtoDoW( CDoW( DATE() ) ) = 3 lConcede:=lTer CASE CtoDoW( CDoW( DATE() ) ) = 4 lConcede:=lQua CASE CtoDoW( CDoW( DATE() ) ) = 5 lConcede:=lQui CASE CtoDoW( CDoW( DATE() ) ) = 6 lConcede:=lSex CASE CtoDoW( CDoW( DATE() ) ) = 7 lConcede:=lSab CASE CtoDoW( CDoW( DATE() ) ) = 1 lConcede:=lDom ENDCASE RETURN lConcede ********************************************************** STATIC FUNCTION BUSCA_BKP(aDat,aFONTE2,oBlbx) ********************************************************** LOCAL oTXT, cLinha, cTabela, aStrutura_OUT,nReg:=0, aTokens, nBd:=0 aFONTE2:={} aTokens := HB_ATokens( MEMOREAD(aDat[ 2]), Chr(10) , .F., .F. ) FOR i := 1 TO Len( aTokens ) IF SUBSTR(aTokens,1,3) == "TB-" .AND. cTabela <> StrTran( aTokens, "TB-" ) IF !EMPTY(cTabela) AADD(aFONTE2,{nBd,cTabela,nReg,0}) ENDIF nBd+=1 cTabela:=StrTran( aTokens, "TB-" ) nReg:=0 ENDIF IF SUBSTR(aTokens,1,3) == "RG-" nReg+=1 ENDIF NEXT AADD(aFONTE2,{nBd,cTabela ,nReg,0}) //AADD(aFONTE2,{(""),(cTabela),(nReg),(0)}) oBlbx:SetArray( aFONTE2, .t., ,{1,2,3,4} ) oBlbx:aCols[1]:cHeader := "-" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 25 oBlbx:aCols[2]:cHeader := "TABELA" oBlbx:aCols[2]:cEditPicture := "@!" oBlbx:aCols[2]:nDataStrAlign := AL_LEFT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[2]:nWiDTH := 150 oBlbx:aCols[3]:cHeader := "TOT REGISTRO" oBlbx:aCols[3]:cEditPicture := "@E 999,999,999" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER oBlbx:aCols[4]:cHeader := "STATUS" oBlbx:aCols[4]:cEditPicture := "@E 9" oBlbx:aCols[4]:nDataStrAlign := AL_RIGHT oBlbx:aCols[4]:nHeadStrAlign := AL_CENTER oBlbx:Refresh() RETURN NIL ********************************************************** STATIC FUNCTION BACKUP_GERA(nMOD,aFONTEx, oMtr1, oMtr2, nPor1, nPor2, oSay1, oSay2, cSay1, cSay2,aDat) ********************************************************** LOCAL nX:=0, nTot1, nTot2, nF1, nF2, nT1, nT2, cArquivo, lDel:=.F. ,cErros:="" LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens, aToken_Rg LOCAL oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle, cNome_Arquivo:=SPACE(255), lResp:=.F. nF1:=0; nF2:=0; nT1:=0; nT2:=0; nTot1:=LEN(aFONTEx); nTot2:=0 SysRefresh() IF nMOD == 1 FOR nX:=1 TO LEN(aFONTEx) cSay1:="Fazendo Cópia do Arquivo: "+aFONTEx[nX,2] oSay1:Refresh() nF1++ nPor1:=INT((nF1*100)/nTot1) IF nPor1<>nT1 oMtr1:Refresh() SysRefresh() nT1:=nPor1 ENDIF nF2:=0; nT2:=0; nTot2:=0 // IDENTIFICA A TABELA E FAZ UMA SELEÇÃO DA MESMA cArquivo:=aFONTEx[nX,2] cComm:= " SELECT * FROM "+cArquivo+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") // INICA O SCRIPT DO ARQUIVOS DE BACKUP E COPIA A ESTRUTURA DA TABELA cBACKUP+="TB-"+cArquivo+Chr(10) aStrutura_INI:={} FOR n := 1 TO TB_ARQUIVO->(FCount()) AEval( PEGAESTRUTURA( n, aFStruct,@cBACKUP,@aStrutura_INI ), {|x| TB_ARQUIVO->(QOut( x )) } ) NEXT // AQUI ELE PEGA OS REGISTROS E JOGA NO ARQUIVO nTot2:=TB_ARQUIVO->(LASTREC()) TB_ARQUIVO->(DBGOTOP()) DO WHILE TB_ARQUIVO->(!EOF()) cBACKUP+="RG-" FOR nI:=1 TO LEN(aStrutura_INI) IF nI == LEN(aStrutura_INI) cBACKUP+=IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="N",ALLTRIM(STR(TB_ARQUIVO->(FIELDGET(nI))) ),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="D",DTOS(TB_ARQUIVO->(FIELDGET(nI) )),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="L",IF( TB_ARQUIVO->(FIELDGET(nI)) == .T. ,"1","0") ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="M",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))) ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="C",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))),"") ))))+Chr(10) lResp:=.T. ELSE cBACKUP+=IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="N",ALLTRIM(STR(TB_ARQUIVO->(FIELDGET(nI))) ),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="D",DTOS(TB_ARQUIVO->(FIELDGET(nI) )),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="L",IF( TB_ARQUIVO->(FIELDGET(nI)) == .T. ,"1","0") ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="M",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))) ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="C", ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))),"") ))))+"|" ENDIF NEXT nF2++ cSay2:="Copiando Registro(s): "+str(nF2)+" de "+ALLTRIM(str(nTot2)) oSay2:Refresh() nPor2:=INT((nF2*100)/nTot2) IF nPor2<>nT2 oMtr2:Refresh() SysRefresh() nT2:=nPor2 ENDIF TB_ARQUIVO->(DBSKIP()) ENDDO CLOSE TB_ARQUIVO NEXT // FAZENDO A GRAVAÇÃO DA COPIA cNome_Arquivo:=aDat[1]+"\"+cNomTab+"_"+alltrim(cConnTipo)+"_BKP_"+SUBSTR(DTOC(DATE()),1,2)+"-"+SUBSTR(DTOC(DATE()),4,2)+"-"+SUBSTR(DTOC(DATE()),7,4)+"_"+SUBSTR(TIME(),1,2)+"-"+SUBSTR(TIME(),4,2)+"-"+SUBSTR(TIME(),7,2)+".SQL" //MemoWrit(ALLTRIM(cNome_Arquivo) , cBACKUP ) MemoWrit(ALLTRIM(cNome_Arquivo) , StrTran( cBACKUP, '"' ) ) // CHECANDO A INTEGRIDADE DO ARQUIVO oTXT:=TTxtFile():New( cNome_Arquivo ) while !oTXT:lEof cLinha:= oTXT:cLine IF SUBSTR(cLinha,1,3) <> "TB-" .AND. SUBSTR(cLinha,1,3) == "ES-" .AND. SUBSTR(cLinha,1,3) == "RG-" MSGINFO("ERRO" ) ENDIF oTXT:Skip(1) ENDDO oTXT:Close() cSay1:="Cópia Feita Com Sucesso. Arquivo : "+ALLTRIM(cNome_Arquivo) cSay2:="Registros Copiados Com Sucesso : " oSay1:Refresh() oSay2:Refresh() ELSEIF nMOD == 2 // ESTE MÓDULO É O DE RESTAURAÇÃO DO BACKUP SR_BeginTransaction() // TRY aTokens := HB_ATokens( MEMOREAD(aDat[ 2]), Chr(10) , .F., .F. ) FOR i := 1 TO Len( aTokens ) IF SUBSTR(aTokens,1,3) == "TB-" aStrutura_OUT:={} cTabela:=StrTran( aTokens, "TB-" ) lDel:=.T. cSay1:="Restaurando Cópia de Segurança: Arquivo "+cTabela oSay1:Refresh() nF1++ nPor1:=INT((nF1*100)/nTot1) IF nPor1<>nT1 oMtr1:Refresh() SysRefresh() nT1:=nPor1 ENDIF nF2:=0; nT2:=0; nTot2:=0 nTot2:=aFONTEx[nF1,3] ENDIF IF SUBSTR(aTokens,1,3) == "ES-" aToken_Rg := HB_ATokens( StrTran( aTokens, "ES-" ), "|", .F., .F. ) AADD(aStrutura_OUT, { aToken_Rg[1], aToken_Rg[2], VAL(aToken_Rg[3]), VAL(aToken_Rg[4]) } ) ENDIF IF SUBSTR(aTokens,1,3) == "RG-" IF SR_ExistTable( cTabela ) .AND. lDel==.T. SR_DropTable( cTabela ) DBCreate( cTabela, aStrutura_OUT, "SqlRdd" ) lDel:=.F. ENDIF aToken_Rg := HB_ATokens( StrTran( aTokens, "RG-" ), "|", .F., .F. ) SCRIPT_SALVARSQL2(1, cTabela, aStrutura_OUT,aToken_Rg,@cErros) nF2++ cSay2:="Copiando Registro(s): "+str(nF2)+" de "+ALLTRIM(str(nTot2)) oSay2:Refresh() nPor2:=INT((nF2*100)/nTot2) IF nPor2<>nT2 oMtr2:Refresh() SysRefresh() nT2:=nPor2 ENDIF ENDIF NEXT cSay1:="Aguarde... " cSay2:="Organizando Registros...: " oSay1:Refresh() oSay2:Refresh() VERIFICA_TABELAS(.T.) /* CATCH oErr MemoWrit("ERRO_BACKUP.LOG" , cErros ) SR_RollBackTransaction() MSGALERT("Ocorreram alguns erros durante o processo!"+CRLF+; "Para proteção do sistema e das informações,"+CRLF+; "esse processo será abortado."+CRLF+; +CRLF+CRLF+cErros+CRLF+CRLF+; "Comunique ao Suport o Problema" ,"Erro no Sistema") quit FINALLY SR_CommitTransaction() END */ ENDIF cSay1:="Cópia Restaurada Com Sucesso. " cSay2:="Registros Copiados Com Sucesso : " oSay1:Refresh() oSay2:Refresh() REG_AUDITOR(cUSU_LOGIN,"INICIOU","MOD. DE BACKUP E RESTAURAÇÃO",IF(nMOD==1,"BACKUP","RESTAURAR"),cNome_Arquivo) RETURN .T. //--//--// function Parse( cInput, cSep ) local cOutput local k DEFAULT cSep := ';' k := At( cSep, cInput ) if k > 0 cOutput := AllTrim( SubStr( cInput, 1, k-1 ) ) cInput := AllTrim( SubStr( cInput, k+1 ) ) else cOutput := Trim( cInput ) cInput := '' endif RETURN cOutput *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION PEGAESTRUTURA( nFieldPos, aFStruct,cBACKUP,aStrutura_INI ) aFStruct[DBS_NAME] := DbFieldInfo( DBS_NAME, nFieldPos ) aFStruct[DBS_TYPE] := DbFieldInfo( DBS_TYPE, nFieldPos ) aFStruct[DBS_LEN ] := DbFieldInfo( DBS_LEN , nFieldPos ) aFStruct[DBS_DEC ] := DbFieldInfo( DBS_DEC , nFieldPos ) AADD( aStrutura_INI, { aFStruct[DBS_NAME], aFStruct[DBS_TYPE]} ) cBACKUP+="ES-"+ALLTRIM(aFStruct[DBS_NAME])+"|"+ALLTRIM(aFStruct[DBS_TYPE])+"|"+ALLTRIM(STR(aFStruct[DBS_LEN]))+"|"+ALLTRIM(STR(aFStruct[DBS_DEC]))+Chr(10) RETURN aFStruct *************************************************************************** FUNCTION SCRIPT_SALVARSQL2(nTIPO, cBANCO, aCampos, aGets,cErros) *************************************************************************** LOCAL cSCRIPT:=SPACE(500), nI:=0 IF nTIPO == 1 IF ALLTRIM(cConnTipo) == "FIREBIRD" USE &(cBANCO) ALIAS &cBANCO VIA "SQLRDD" &cBANCO->(DBAPPEND()) SELECT &cBANCO FOR nI:=1 TO LEN(aGets) REPLACE &cBANCO->&(aCampos[nI,1]) WITH IF(aCampos[nI,2]="D",StoD( aGets[nI] ),; IF(aCampos[nI,2]="N",VAL(aGets[nI]),; IF(aCampos[nI,2]="C",TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]),; IF(aCampos[nI,2]="L",IF(VAL(aGets[nI])==1,.T.,.F.),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]) ) ) ) ) NEXT &cBANCO->(DBCOMMIT()) CLOSE &cBANCO ELSE cSCRIPT:="INSERT INTO "+cBANCO+" (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+aCampos[nI,1]+") " ELSE cSCRIPT+=" "+aCampos[nI,1]+", " ENDIF NEXT /* cSCRIPT+=" VALUES (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+SR_cDBValue( DataConvert(cDado, cType, n_Tam) IF(aCampos[nI,2]="D",IF(EMPTY(aGets[nI]),DTOS(DATE()),aGets[nI] ),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]) ) )+") " ELSE cSCRIPT+=" "+SR_cDBValue( IF(aCampos[nI,2]="D",IF(EMPTY(aGets[nI]),DTOS(DATE()),aGets[nI] ),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2])) )+", " ENDIF NEXT */ cSCRIPT+=" VALUES (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+SR_cDBValue( DataConvert(aGets[nI], aCampos[nI,2], aCampos[nI,3], aCampos[nI,1] ) )+") " ELSE cSCRIPT+=" "+SR_cDBValue( DataConvert(aGets[nI], aCampos[nI,2], aCampos[nI,3], aCampos[nI,1] ) )+", " ENDIF NEXT apCode := SR_SQLParse(cSCRIPT) oSql := SR_GetConnection() oSql:exec( SR_SQLCodeGen( apCode, {,,}, oSql:nSystemID ) ) ENDIF ENDIF cErros:=cSCRIPT RETURN cSCRIPT STATIC FUNCTION DataConvert(cDado, cType, n_Tam,cCampo) LOCAL cNewFormat := cDado, cNovo IF cType = "C" cNewFormat := TIRA_ACENTUACAO(cDado,cType) ELSEIF cType = "D" IF EMPTY(cDado) cNewFormat := DATE() ELSE cNewFormat := cDado ENDIF ELSEIF cType = "L" cNewFormat := cDado ELSEIF cType = "M" cNewFormat := cDado ELSEIF cType = "N" cNewFormat := cDado ENDIF RETURN(cNewFormat) FUNCTION TIRA_ACENTUACAO( cStr,nTIpo ) local cStrNew := "", nX cAcentos := {"'",'"',"´","`","\"} cLetras := {"" ,"" ,"" ,"" ,"_"} For nX := 1 TO LEN(cAcentos) cStrNew := StrTran(cStr, cAcentos[nX], cLetras[nX]) cStr := cStrNew Next Return( cStrNew ) Acesse: http://programafontefivewin.blogspot.com/ FHW 10.8, XHB1.2.1, PELLESC 6.5, XDEV 7.2, FASTREPORT, SQLRDD, MySql, Firebird, Postgres "MIGRE SEUS SISTEMAS EM CLIPPER PARA 32BITS COM BANCOS SQL" Editado por - DonJuan on 30/09/2011 14:40:41 Quote Link to comment Share on other sites More sharing options...
DonJuan Posted September 30, 2011 Author Report Share Posted September 30, 2011 Estou enviando pra quem gosta de Sgdb e precisa de um backup prontinho pra jogar suas informações para um arquivo texto, podendo restaurar conforme queira /****************************************************************************** * Sistema .....: PROJETO_PRINCIPAL * Programa ....: BKPRST.PRG * Autor .......: ALESSANDRO * Sintese .....: RESP. PELA ADMIN. DO SISTEMA * Data ........: 5/29/2010 à s 6:38:50 PM * Revisado em .: 5/29/2010 à s 6:38:50 PM ******************************************************************************/ #include "SYSTEMA.CH" /*******************************************************************************/ STATIC aBase *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION BKPRST() *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens local oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle,aFONTE:={},aFONTE2:={}, aDat[ 2], oDat[ 2] LOCAL cSt_SUBMODULO:="Módulo de Backups", oBlbx LOCAL oMtr1,oMtr2,nPor1,nPor2, cSay1,cSay2, oSay1,oSay2 LOCAL oMtr3,oMtr4,nPor3,nPor4, cSay3,cSay4, oSay3,oSay4 aBase:={} FOR nX:=1 TO LEN(aMods) IF !EMPTY(aMods[nX,5]) AADD(aBase,{aMods[nX,1],aMods[nX,2],aMods[nX,3],aMods[nX,4],aMods[nX,5]}) ENDIF NEXT aDat[ 1]:=SPACE(255) aDat[ 2]:=SPACE(255) nPor1:=0 nPor2:=0 cSay1:="-" cSay2:="-" FOR nX:=1 TO LEN(aBase) IF SR_EXISTTABLE(aBase[nX,5]) cComm:= " SELECT * FROM "+aBase[nX,5]+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") AADD(aFONTE,{("*"),(aBase[nX,5]),(TB_ARQUIVO->(LASTREC())),(0)}) CLOSE TB_ARQUIVO ELSE MSGINFO(" ESTA TABELA NÃO EXISTE "+aBase[nX,5],"ATENÇÃO") ENDIF NEXT AADD(aFONTE2,{(""),(""),(0),(0)}) DEFINE DIALOG oDbkp RESOURCE "BACKUP" TITLE cSt_SUBMODULO FONT oFontSystem REDEFINE BITMAP ID 5000 RESOURCE "BANNER" OF oDbkp ADJUST REDEFINE SENSITIVE SAY oSS06 PROMPT cSt_SUBMODULO ID 5001 OF oDbkp FONT oFont_Banner01 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE SENSITIVE SAY oSS06 PROMPT cVersao_Sistema ID 5002 OF oDbkp FONT oFont_Banner02 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE FOLDER oFld ID 1000 OF oDbkp ; PROMPTS "Criar Backups","Restaurar Backups" ; DIALOGS "G_BACKUP","I_BACKUP" oBlbx := TXBrowse():New( oFld:aDialogs[1] ) oBlbx:CreateFromResource(100) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE BTNGET oDat[ 1] VAR aDat[ 1] ID 101 OF oFld:aDialogs[1]; ACTION (aDat[ 1] := cGetDir( "Selecione uma pasta ",".\odonto", CurDrive() + ":\" + GetCurDir() ),oDat[ 1]:REFRESH() ) REDEFINE SAY oSay1 VAR cSay1 ID 104 OF oFld:aDialogs[1] REDEFINE SAY oSay2 VAR cSay2 ID 105 OF oFld:aDialogs[1] REDEFINE METER oMtr1 VAR nPor1 TOTAL 100 ID 102 OF oFld:aDialogs[1] COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr2 VAR nPor2 TOTAL 100 ID 103 OF oFld:aDialogs[1] COLOR CLR_WHITE, CLR_BLACK REDEFINE BUTTON ID 10 OF oFld:aDialogs[1] ACTION IF(!EMPTY(aDat[ 1]),BACKUP_GERA(1,aFONTE, oMtr1, oMtr2, @nPor1, @nPor2, oSay1, oSay2, @cSay1, @cSay2,aDat ),MSGINFO("ESCOLHA UM LOCAL DE DESTINO PARA O BACLUP","ATENÇÃO")) REDEFINE BUTTON ID 20 OF oFld:aDialogs[1] ACTION oDbkp:End() CANCEL // 2 FOLHA DE RESTAURAÇÃO DE ARQUIVOS oBlbx := TXBrowse():New( oFld:aDialogs[2] ) oBlbx:CreateFromResource(100) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE2, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE BTNGET oDat[ 2] VAR aDat[ 2] ID 101 OF oFld:aDialogs[2]; ACTION (aDat[ 2] := cGetfile32("*.SQL | ", "Selecione o Arquivo de Backups",,.f.),BUSCA_BKP(aDat,@aFONTE2,oBlbx),oDat[ 2]:REFRESH() ) REDEFINE SAY oSay3 VAR cSay3 ID 104 OF oFld:aDialogs[2] REDEFINE SAY oSay4 VAR cSay4 ID 105 OF oFld:aDialogs[2] REDEFINE METER oMtr3 VAR nPor3 TOTAL 100 ID 102 OF oFld:aDialogs[2] COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr4 VAR nPor4 TOTAL 100 ID 103 OF oFld:aDialogs[2] COLOR CLR_WHITE, CLR_BLACK REDEFINE BUTTON ID 10 OF oFld:aDialogs[2] ACTION IF(!EMPTY(aDat[ 2]),BACKUP_GERA(2,aFONTE2, oMtr3, oMtr4, @nPor3, @nPor4, oSay3, oSay4, @cSay3, @cSay4,aDat ),MSGINFO("ESCOLHA UM LOCAL DE DESTINO PARA O BACLUP","ATENÇÃO")) REDEFINE BUTTON ID 20 OF oFld:aDialogs[2] ACTION oDbkp:End() CANCEL ACTIVATE DIALOG oDbkp CENTERED RETURN NIL *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION CHKBKP() *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens local oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle,aFONTE:={},aFONTE2:={}, aDat[ 2], oDat[ 2] LOCAL cSt_SUBMODULO:="Módulo de Backups", oBlbx LOCAL oMtr1,oMtr2,nPor1,nPor2, cSay1,cSay2, oSay1,oSay2 LOCAL oMtr3,oMtr4,nPor3,nPor4, cSay3,cSay4, oSay3,oSay4 IF Secs( TIME() ) >= Secs( cHorBkp ) .AND. DATE() > dDatBkp .AND. DIABKP()==.T. oTimer:Deactivate() aDat[ 1]:=ALLTRIM(cDesBkp) aDat[ 2]:=SPACE(255) nPor1:=0 nPor2:=0 cSay1:="-" cSay2:="-" FOR nX:=1 TO LEN(aBase) cComm:= " SELECT * FROM "+aBase[nX,5]+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") AADD(aFONTE,{("*"),(aBase[nX,5]),(TB_ARQUIVO->(LASTREC())),(0)}) CLOSE TB_ARQUIVO NEXT DEFINE DIALOG oDbkp RESOURCE "CHK_BACKUP" TITLE cSt_SUBMODULO FONT oFontSystem REDEFINE BITMAP ID 5000 RESOURCE "BANNER" OF oDbkp ADJUST REDEFINE SENSITIVE SAY oSS06 PROMPT cSt_SUBMODULO ID 5001 OF oDbkp FONT oFont_Banner01 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT REDEFINE SENSITIVE SAY oSS06 PROMPT cVersao_Sistema ID 5002 OF oDbkp FONT oFont_Banner02 COLOR CLR_YELLOW ALIGN RIGHT TRANSPARENT oBlbx := TXBrowse():New( oDbkp ) oBlbx:CreateFromResource(1000) //oBlbx:bKeyDown :={|nKey| IIF(nKey==VK_RETURN,,)} //oBlbx:bChange :={|| SQLRefresh()} //oBlbx:bLDblClick:={|| INCLUIR(.T.,oBlbx,aDad)} //oBlbx:bRClicked :={|| MsgInfo("Teste") } oBlbx:bClrRowFocus := { || { CLR_BLACK, RGB(185,220,255) } } oBlbx:nMarqueeStyle := MARQSTYLE_HIGHLCELL // MARQSTYLE_HIGHLCELL //MARQSTYLE_HIGHLROW oBlbx:nColDividerStyle := 4 oBlbx:nRowDividerStyle := 4 oBlbx:lColDividerComplete := .F. oBlbx:lFooter := .F. oBlbx:nFreeze := 1 oBlbx:nHeaderLines := 1 oBlbx:nDataLines := 1 oBlbx:lHScroll := .T. // Barra Rolagem Horiz. oBlbx:lVScroll := .T. // Barra Rolagem vertical //oBlbx:bClrStd := {|| { CLR_BROWSE_TEXTO, IIF(((oBd_Espe)->(ORDKEYNO()))%2==0, CLR_BROWSE01, CLR_BROWSE02) } } oBlbx:bClrSelFocus := {|| { CLR_BROWSE_TEXTO_BARRA, CLR_BROWSE_BARRA } } oBlbx:SetArray( aFONTE, .t., ,{2,3,4} ) oBlbx:aCols[1]:cHeader := "TABELA" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 150 oBlbx:aCols[2]:cHeader := "TOT REGISTRO" oBlbx:aCols[2]:cEditPicture := "@E 999,999,999" oBlbx:aCols[2]:nDataStrAlign := AL_RIGHT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[3]:cHeader := "STATUS" oBlbx:aCols[3]:cEditPicture := "@E 9" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER REDEFINE SAY oSay1 VAR cSay1 ID 101 OF oDbkp REDEFINE SAY oSay2 VAR cSay2 ID 103 OF oDbkp REDEFINE METER oMtr1 VAR nPor1 TOTAL 100 ID 102 OF oDbkp COLOR CLR_WHITE, CLR_BLACK REDEFINE METER oMtr2 VAR nPor2 TOTAL 100 ID 104 OF oDbkp COLOR CLR_WHITE, CLR_BLACK ACTIVATE DIALOG oDbkp NOWAIT CENTERED (BACKUP_GERA(1,aFONTE, oMtr1, oMtr2, @nPor1, @nPor2, oSay1, oSay2, @cSay1, @cSay2,aDat ),; MSGINFO("Backup ConcluÃdo","Atenção"),oDbkp:End(),; cCodiSQl:="UPDATE CONFIGURACAO SET DATBKP = '"+DTOS(DATE())+"'", apCode := SR_SQLParse( cCodiSQl ), oSql := SR_GetConnection(),; oSql:exec( SR_SQLCodeGen( apCode, {}, oSql:nSystemID ) ), dDatBkp:=DATE(), oTimer:activate() ) ELSE ENDIF RETURN NIL ********************************************************** STATIC FUNCTION DIABKP() ********************************************************** LOCAL lConcede:=.F. DO CASE CASE CtoDoW( CDoW( DATE() ) ) = 2 lConcede:=lSeg CASE CtoDoW( CDoW( DATE() ) ) = 3 lConcede:=lTer CASE CtoDoW( CDoW( DATE() ) ) = 4 lConcede:=lQua CASE CtoDoW( CDoW( DATE() ) ) = 5 lConcede:=lQui CASE CtoDoW( CDoW( DATE() ) ) = 6 lConcede:=lSex CASE CtoDoW( CDoW( DATE() ) ) = 7 lConcede:=lSab CASE CtoDoW( CDoW( DATE() ) ) = 1 lConcede:=lDom ENDCASE RETURN lConcede ********************************************************** STATIC FUNCTION BUSCA_BKP(aDat,aFONTE2,oBlbx) ********************************************************** LOCAL oTXT, cLinha, cTabela, aStrutura_OUT,nReg:=0, aTokens, nBd:=0 aFONTE2:={} aTokens := HB_ATokens( MEMOREAD(aDat[ 2]), Chr(10) , .F., .F. ) FOR i := 1 TO Len( aTokens ) IF SUBSTR(aTokens,1,3) == "TB-" .AND. cTabela <> StrTran( aTokens, "TB-" ) IF !EMPTY(cTabela) AADD(aFONTE2,{nBd,cTabela,nReg,0}) ENDIF nBd+=1 cTabela:=StrTran( aTokens, "TB-" ) nReg:=0 ENDIF IF SUBSTR(aTokens,1,3) == "RG-" nReg+=1 ENDIF NEXT AADD(aFONTE2,{nBd,cTabela ,nReg,0}) //AADD(aFONTE2,{(""),(cTabela),(nReg),(0)}) oBlbx:SetArray( aFONTE2, .t., ,{1,2,3,4} ) oBlbx:aCols[1]:cHeader := "-" oBlbx:aCols[1]:cEditPicture := "@!" oBlbx:aCols[1]:nDataStrAlign := AL_LEFT oBlbx:aCols[1]:nHeadStrAlign := AL_CENTER oBlbx:aCols[1]:nWiDTH := 25 oBlbx:aCols[2]:cHeader := "TABELA" oBlbx:aCols[2]:cEditPicture := "@!" oBlbx:aCols[2]:nDataStrAlign := AL_LEFT oBlbx:aCols[2]:nHeadStrAlign := AL_CENTER oBlbx:aCols[2]:nWiDTH := 150 oBlbx:aCols[3]:cHeader := "TOT REGISTRO" oBlbx:aCols[3]:cEditPicture := "@E 999,999,999" oBlbx:aCols[3]:nDataStrAlign := AL_RIGHT oBlbx:aCols[3]:nHeadStrAlign := AL_CENTER oBlbx:aCols[4]:cHeader := "STATUS" oBlbx:aCols[4]:cEditPicture := "@E 9" oBlbx:aCols[4]:nDataStrAlign := AL_RIGHT oBlbx:aCols[4]:nHeadStrAlign := AL_CENTER oBlbx:Refresh() RETURN NIL ********************************************************** STATIC FUNCTION BACKUP_GERA(nMOD,aFONTEx, oMtr1, oMtr2, nPor1, nPor2, oSay1, oSay2, cSay1, cSay2,aDat) ********************************************************** LOCAL nX:=0, nTot1, nTot2, nF1, nF2, nT1, nT2, cArquivo, lDel:=.F. ,cErros:="" LOCAL X, cBACKUP:="", aFStruct[4], aStrutura_OUT, aStrutura_INI, cTabela, aTokens, aToken_Rg LOCAL oTXT, clinha := '', cAux:='', cArqTxt, nFileHandle, cNome_Arquivo:=SPACE(255), lResp:=.F. nF1:=0; nF2:=0; nT1:=0; nT2:=0; nTot1:=LEN(aFONTEx); nTot2:=0 SysRefresh() IF nMOD == 1 FOR nX:=1 TO LEN(aFONTEx) cSay1:="Fazendo Cópia do Arquivo: "+aFONTEx[nX,2] oSay1:Refresh() nF1++ nPor1:=INT((nF1*100)/nTot1) IF nPor1<>nT1 oMtr1:Refresh() SysRefresh() nT1:=nPor1 ENDIF nF2:=0; nT2:=0; nTot2:=0 // IDENTIFICA A TABELA E FAZ UMA SELEÇÃO DA MESMA cArquivo:=aFONTEx[nX,2] cComm:= " SELECT * FROM "+cArquivo+" ORDER BY SR_RECNO" EXECUTA_SQL(cComm,"TB_ARQUIVO") // INICA O SCRIPT DO ARQUIVOS DE BACKUP E COPIA A ESTRUTURA DA TABELA cBACKUP+="TB-"+cArquivo+Chr(10) aStrutura_INI:={} FOR n := 1 TO TB_ARQUIVO->(FCount()) AEval( PEGAESTRUTURA( n, aFStruct,@cBACKUP,@aStrutura_INI ), {|x| TB_ARQUIVO->(QOut( x )) } ) NEXT // AQUI ELE PEGA OS REGISTROS E JOGA NO ARQUIVO nTot2:=TB_ARQUIVO->(LASTREC()) TB_ARQUIVO->(DBGOTOP()) DO WHILE TB_ARQUIVO->(!EOF()) cBACKUP+="RG-" FOR nI:=1 TO LEN(aStrutura_INI) IF nI == LEN(aStrutura_INI) cBACKUP+=IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="N",ALLTRIM(STR(TB_ARQUIVO->(FIELDGET(nI))) ),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="D",DTOS(TB_ARQUIVO->(FIELDGET(nI) )),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="L",IF( TB_ARQUIVO->(FIELDGET(nI)) == .T. ,"1","0") ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="M",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))) ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="C",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))),"") ))))+Chr(10) lResp:=.T. ELSE cBACKUP+=IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="N",ALLTRIM(STR(TB_ARQUIVO->(FIELDGET(nI))) ),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="D",DTOS(TB_ARQUIVO->(FIELDGET(nI) )),; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="L",IF( TB_ARQUIVO->(FIELDGET(nI)) == .T. ,"1","0") ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="M",ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))) ,; IF(VALTYPE(TB_ARQUIVO->(FIELDGET(nI)))=="C", ALLTRIM(TB_ARQUIVO->(FIELDGET(nI))),"") ))))+"|" ENDIF NEXT nF2++ cSay2:="Copiando Registro(s): "+str(nF2)+" de "+ALLTRIM(str(nTot2)) oSay2:Refresh() nPor2:=INT((nF2*100)/nTot2) IF nPor2<>nT2 oMtr2:Refresh() SysRefresh() nT2:=nPor2 ENDIF TB_ARQUIVO->(DBSKIP()) ENDDO CLOSE TB_ARQUIVO NEXT // FAZENDO A GRAVAÇÃO DA COPIA cNome_Arquivo:=aDat[1]+"\"+cNomTab+"_"+alltrim(cConnTipo)+"_BKP_"+SUBSTR(DTOC(DATE()),1,2)+"-"+SUBSTR(DTOC(DATE()),4,2)+"-"+SUBSTR(DTOC(DATE()),7,4)+"_"+SUBSTR(TIME(),1,2)+"-"+SUBSTR(TIME(),4,2)+"-"+SUBSTR(TIME(),7,2)+".SQL" //MemoWrit(ALLTRIM(cNome_Arquivo) , cBACKUP ) MemoWrit(ALLTRIM(cNome_Arquivo) , StrTran( cBACKUP, '"' ) ) // CHECANDO A INTEGRIDADE DO ARQUIVO oTXT:=TTxtFile():New( cNome_Arquivo ) while !oTXT:lEof cLinha:= oTXT:cLine IF SUBSTR(cLinha,1,3) <> "TB-" .AND. SUBSTR(cLinha,1,3) == "ES-" .AND. SUBSTR(cLinha,1,3) == "RG-" MSGINFO("ERRO" ) ENDIF oTXT:Skip(1) ENDDO oTXT:Close() cSay1:="Cópia Feita Com Sucesso. Arquivo : "+ALLTRIM(cNome_Arquivo) cSay2:="Registros Copiados Com Sucesso : " oSay1:Refresh() oSay2:Refresh() ELSEIF nMOD == 2 // ESTE MÓDULO É O DE RESTAURAÇÃO DO BACKUP SR_BeginTransaction() // TRY aTokens := HB_ATokens( MEMOREAD(aDat[ 2]), Chr(10) , .F., .F. ) FOR i := 1 TO Len( aTokens ) IF SUBSTR(aTokens,1,3) == "TB-" aStrutura_OUT:={} cTabela:=StrTran( aTokens, "TB-" ) lDel:=.T. cSay1:="Restaurando Cópia de Segurança: Arquivo "+cTabela oSay1:Refresh() nF1++ nPor1:=INT((nF1*100)/nTot1) IF nPor1<>nT1 oMtr1:Refresh() SysRefresh() nT1:=nPor1 ENDIF nF2:=0; nT2:=0; nTot2:=0 nTot2:=aFONTEx[nF1,3] ENDIF IF SUBSTR(aTokens,1,3) == "ES-" aToken_Rg := HB_ATokens( StrTran( aTokens, "ES-" ), "|", .F., .F. ) AADD(aStrutura_OUT, { aToken_Rg[1], aToken_Rg[2], VAL(aToken_Rg[3]), VAL(aToken_Rg[4]) } ) ENDIF IF SUBSTR(aTokens,1,3) == "RG-" IF SR_ExistTable( cTabela ) .AND. lDel==.T. SR_DropTable( cTabela ) DBCreate( cTabela, aStrutura_OUT, "SqlRdd" ) lDel:=.F. ENDIF aToken_Rg := HB_ATokens( StrTran( aTokens, "RG-" ), "|", .F., .F. ) SCRIPT_SALVARSQL2(1, cTabela, aStrutura_OUT,aToken_Rg,@cErros) nF2++ cSay2:="Copiando Registro(s): "+str(nF2)+" de "+ALLTRIM(str(nTot2)) oSay2:Refresh() nPor2:=INT((nF2*100)/nTot2) IF nPor2<>nT2 oMtr2:Refresh() SysRefresh() nT2:=nPor2 ENDIF ENDIF NEXT cSay1:="Aguarde... " cSay2:="Organizando Registros...: " oSay1:Refresh() oSay2:Refresh() VERIFICA_TABELAS(.T.) /* CATCH oErr MemoWrit("ERRO_BACKUP.LOG" , cErros ) SR_RollBackTransaction() MSGALERT("Ocorreram alguns erros durante o processo!"+CRLF+; "Para proteção do sistema e das informações,"+CRLF+; "esse processo será abortado."+CRLF+; +CRLF+CRLF+cErros+CRLF+CRLF+; "Comunique ao Suport o Problema" ,"Erro no Sistema") quit FINALLY SR_CommitTransaction() END */ ENDIF cSay1:="Cópia Restaurada Com Sucesso. " cSay2:="Registros Copiados Com Sucesso : " oSay1:Refresh() oSay2:Refresh() REG_AUDITOR(cUSU_LOGIN,"INICIOU","MOD. DE BACKUP E RESTAURAÇÃO",IF(nMOD==1,"BACKUP","RESTAURAR"),cNome_Arquivo) RETURN .T. //--//--// function Parse( cInput, cSep ) local cOutput local k DEFAULT cSep := ';' k := At( cSep, cInput ) if k > 0 cOutput := AllTrim( SubStr( cInput, 1, k-1 ) ) cInput := AllTrim( SubStr( cInput, k+1 ) ) else cOutput := Trim( cInput ) cInput := '' endif RETURN cOutput *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION PEGAESTRUTURA( nFieldPos, aFStruct,cBACKUP,aStrutura_INI ) aFStruct[DBS_NAME] := DbFieldInfo( DBS_NAME, nFieldPos ) aFStruct[DBS_TYPE] := DbFieldInfo( DBS_TYPE, nFieldPos ) aFStruct[DBS_LEN ] := DbFieldInfo( DBS_LEN , nFieldPos ) aFStruct[DBS_DEC ] := DbFieldInfo( DBS_DEC , nFieldPos ) AADD( aStrutura_INI, { aFStruct[DBS_NAME], aFStruct[DBS_TYPE]} ) cBACKUP+="ES-"+ALLTRIM(aFStruct[DBS_NAME])+"|"+ALLTRIM(aFStruct[DBS_TYPE])+"|"+ALLTRIM(STR(aFStruct[DBS_LEN]))+"|"+ALLTRIM(STR(aFStruct[DBS_DEC]))+Chr(10) RETURN aFStruct *************************************************************************** FUNCTION SCRIPT_SALVARSQL2(nTIPO, cBANCO, aCampos, aGets,cErros) *************************************************************************** LOCAL cSCRIPT:=SPACE(500), nI:=0 IF nTIPO == 1 IF ALLTRIM(cConnTipo) == "FIREBIRD" USE &(cBANCO) ALIAS &cBANCO VIA "SQLRDD" &cBANCO->(DBAPPEND()) SELECT &cBANCO FOR nI:=1 TO LEN(aGets) REPLACE &cBANCO->&(aCampos[nI,1]) WITH IF(aCampos[nI,2]="D",StoD( aGets[nI] ),; IF(aCampos[nI,2]="N",VAL(aGets[nI]),; IF(aCampos[nI,2]="C",TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]),; IF(aCampos[nI,2]="L",IF(VAL(aGets[nI])==1,.T.,.F.),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]) ) ) ) ) NEXT &cBANCO->(DBCOMMIT()) CLOSE &cBANCO ELSE cSCRIPT:="INSERT INTO "+cBANCO+" (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+aCampos[nI,1]+") " ELSE cSCRIPT+=" "+aCampos[nI,1]+", " ENDIF NEXT /* cSCRIPT+=" VALUES (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+SR_cDBValue( DataConvert(cDado, cType, n_Tam) IF(aCampos[nI,2]="D",IF(EMPTY(aGets[nI]),DTOS(DATE()),aGets[nI] ),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2]) ) )+") " ELSE cSCRIPT+=" "+SR_cDBValue( IF(aCampos[nI,2]="D",IF(EMPTY(aGets[nI]),DTOS(DATE()),aGets[nI] ),TIRA_ACENTUACAO(aGets[nI],aCampos[nI,2])) )+", " ENDIF NEXT */ cSCRIPT+=" VALUES (" FOR nI:=1 TO LEN(aGets) IF nI==LEN(aGets) cSCRIPT+=" "+SR_cDBValue( DataConvert(aGets[nI], aCampos[nI,2], aCampos[nI,3], aCampos[nI,1] ) )+") " ELSE cSCRIPT+=" "+SR_cDBValue( DataConvert(aGets[nI], aCampos[nI,2], aCampos[nI,3], aCampos[nI,1] ) )+", " ENDIF NEXT apCode := SR_SQLParse(cSCRIPT) oSql := SR_GetConnection() oSql:exec( SR_SQLCodeGen( apCode, {,,}, oSql:nSystemID ) ) ENDIF ENDIF cErros:=cSCRIPT RETURN cSCRIPT STATIC FUNCTION DataConvert(cDado, cType, n_Tam,cCampo) LOCAL cNewFormat := cDado, cNovo IF cType = "C" cNewFormat := TIRA_ACENTUACAO(cDado,cType) ELSEIF cType = "D" IF EMPTY(cDado) cNewFormat := DATE() ELSE cNewFormat := cDado ENDIF ELSEIF cType = "L" cNewFormat := cDado ELSEIF cType = "M" cNewFormat := cDado ELSEIF cType = "N" cNewFormat := cDado ENDIF RETURN(cNewFormat) FUNCTION TIRA_ACENTUACAO( cStr,nTIpo ) local cStrNew := "", nX cAcentos := {"'",'"',"´","`","\"} cLetras := {"" ,"" ,"" ,"" ,"_"} For nX := 1 TO LEN(cAcentos) cStrNew := StrTran(cStr, cAcentos[nX], cLetras[nX]) cStr := cStrNew Next Return( cStrNew ) Acesse: http://programafontefivewin.blogspot.com/ FHW 10.8, XHB1.2.1, PELLESC 6.5, XDEV 7.2, FASTREPORT, SQLRDD, MySql, Firebird, Postgres "MIGRE SEUS SISTEMAS EM CLIPPER PARA 32BITS COM BANCOS SQL" Editado por - DonJuan on 30/09/2011 14:40:41 Quote Link to comment Share on other sites More sharing options...
Luiz Arruda (ICO) Posted September 30, 2011 Report Share Posted September 30, 2011 Luiz Arruda Corumbá-MS ico.corumba@gmail.com | http://www.facebook.com/profile.php?id=100000933378029 FiveWin 9.04 xHarbour PellesC Bcc Editado por - ico on 30/09/2011 17:34:32 Quote Link to comment Share on other sites More sharing options...
ZECA Posted September 30, 2011 Report Share Posted September 30, 2011 Boa tarde DonJuan!!! Esta rotina é muito boa para termos uma idéia de como fazer porque ela não funcional. Faltam o arquivo .CH e algumas funções estão ausentes. Muito Grato Sds José Carlos - ZECA fwh612(Free)-clipper52e-blinker 7.0 - six 3.02 - Windows XP Quote Link to comment Share on other sites More sharing options...
Anderson.OL Posted October 3, 2011 Report Share Posted October 3, 2011 Pq não usar o mysqldump ? Quote Link to comment Share on other sites More sharing options...
DonJuan Posted October 3, 2011 Author Report Share Posted October 3, 2011 citação:Boa tarde DonJuan!!! Esta rotina é muito boa para termos uma idéia de como fazer porque ela não funcional. Faltam o arquivo .CH e algumas funções estão ausentes. Muito Grato Sds José Carlos - ZECA fwh612(Free)-clipper52e-blinker 7.0 - six 3.02 - Windows XP id=quote>id=quote>Mande e-mail para mim que te mando o res e os chs necessários Acesse: http://programafontefivewin.blogspot.com/ FHW 10.8, XHB1.2.1, PELLESC 6.5, XDEV 7.2, FASTREPORT, SQLRDD, MySql, Firebird, Postgres "MIGRE SEUS SISTEMAS EM CLIPPER PARA 32BITS COM BANCOS SQL" Quote Link to comment Share on other sites More sharing options...
ZECA Posted October 3, 2011 Report Share Posted October 3, 2011 citação: citação:Boa tarde DonJuan!!! Esta rotina é muito boa para termos uma idéia de como fazer porque ela não funcional. Faltam o arquivo .CH e algumas funções estão ausentes. Muito Grato Sds José Carlos - ZECA fwh612(Free)-clipper52e-blinker 7.0 - six 3.02 - Windows XP id=quote>id=quote>Mande e-mail para mim que te mando o res e os chs necessários Acesse: http://programafontefivewin.blogspot.com/ FHW 10.8, XHB1.2.1, PELLESC 6.5, XDEV 7.2, FASTREPORT, SQLRDD, MySql, Firebird, Postgres "MIGRE SEUS SISTEMAS EM CLIPPER PARA 32BITS COM BANCOS SQL" id=quote>id=quote>Boa Noite!!! Ei-lo zeca_roque@hotmail.com. Creio de para funcionar faltam o prg com as funcoes, o arquivo ch e o arquivo res. Antecipadamente agradeço. Sds José Carlos - ZECA fwh612(Free)-clipper52e-blinker 7.0 - six 3.02 - Windows XP Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.