sambomb Posted January 17, 2011 Report Share Posted January 17, 2011 Olá, gostaria de sugestões de como adicionar um campo a uma tabela, atualmente eu crio uma temporária com o campos que eu preciso e rodo a antiga repassando as informações para a tabela nova(temporária) depois eu renomeio os arquivos para a temporária ficar com o nome da original e apago a original. O único problema desse método é que é muito demorando dependendo o tamanho da tabela, exemplo: Tenho uma tabela que com 150mil registros demora quatro horas com um computador bom e trabalhando localmente, sendo que tem clientes que tem mais de 1 milhão de registros na tabela e um computador bem mais lento, e ainda por cima trabalhando em rede... Preciso desse procedimento para tratar DBF com ADS/CDX IMPORTANTE - NÃO POSSO USAR APPEND FROM!id=red>id=size5> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Editado por - sambomb on 21/01/2011 08:34:43 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 17, 2011 Author Report Share Posted January 17, 2011 Olá, gostaria de sugestões de como adicionar um campo a uma tabela, atualmente eu crio uma temporária com o campos que eu preciso e rodo a antiga repassando as informações para a tabela nova(temporária) depois eu renomeio os arquivos para a temporária ficar com o nome da original e apago a original. O único problema desse método é que é muito demorando dependendo o tamanho da tabela, exemplo: Tenho uma tabela que com 150mil registros demora quatro horas com um computador bom e trabalhando localmente, sendo que tem clientes que tem mais de 1 milhão de registros na tabela e um computador bem mais lento, e ainda por cima trabalhando em rede... Preciso desse procedimento para tratar DBF com ADS/CDX IMPORTANTE - NÃO POSSO USAR APPEND FROM!id=red>id=size5> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Editado por - sambomb on 21/01/2011 08:34:43 Quote Link to comment Share on other sites More sharing options...
emotta Posted January 17, 2011 Report Share Posted January 17, 2011 Sendo DBF a unica maneira que voce pode melhorar a performance é não dar COMMIT a cada registro gravado, ou seja, grava sem dar commit. Isso caso já nao o faça. Acredito que em DBF não existe outra maneira. Abraço, Eduardo Motta citação:Olá, gostaria de sugestões de como adicionar um campo a uma tabela, atualmente eu crio uma temporária com o campos que eu preciso e rodo a antiga repassando as informações para a tabela nova(temporária) depois eu renomeio os arquivos para a temporária ficar com o nome da original e apago a original. O único problema desse método é que é muito demorando dependendo o tamanho da tabela, exemplo: Tenho uma tabela que com 150mil registros demora quatro horas com um computador bom e trabalhando localmente, sendo que tem clientes que tem mais de 1 milhão de registros na tabela e um computador bem mais lento, e ainda por cima trabalhando em rede... Preciso desse procedimento para tratar DBF com ADS/CDX SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted January 17, 2011 Report Share Posted January 17, 2011 Se eu entendi a pergunta... LOCAL lExiste //-> Para criar um novo campo em um banco de dados IF FILE( "TERMINAL.DBF" ) lExiste := .F. USE TERMINAL ALIAS TERMINAL EXCLUSIVE NEW cAlias := ALIAS() FOR nConta := 1 TO (cAlias)->(fCount()) IF (cAlias)->(FieldName(nConta)) = "TIPODESOM" lExiste := .T. EXIT ENDIF NEXT //-> Nao existe o campo, TIPODESOM vai criar IF .NOT. lExiste //->Avisa e Vai Pedir a Senha Master AVISO_DE_ATUALIZACAO_DO_BANCO() //-> ESTA EM FUNCOES.PRG DBCLOSEALL() USE TERMINAL ALIAS TERMINAL EXCLUSIVE NEW COPY TO TERMICOP.DBF DBCLOSEALL() oText:SetText( " Processando, Aguarde... Criando TERMINAL.DBF " ) DbCreate( "TERMINAL.DBF", { { "SERIALHD", "C", 15, 00 }, ; { "TERMINAL", "N", 05, 00 }, ; { "TAMANCUPOM", "C", 01, 00 }, ; { "SUPRIMECAB", "C", 01, 00 }, ; { "PORTALEITO", "C", 01, 00 }, ; { "PORTADOECF", "C", 01, 00 }, ; { "VERSAOECF", "C", 01, 00 }, ; { "PORTABALAN", "C", 01, 00 }, ; { "PORTAGAVET", "C", 01, 00 }, ; { "ABRIRGAVET", "C", 20, 00 }, ; { "PORTAIMPCH", "C", 01, 00 }, ; { "MODIMPCHEQ", "C", 01, 00 }, ; { "MODELOECF", "C", 01, 00 }, ; { "MTELAPAGTO", "C", 01, 00 }, ; { "TEFDISCADO", "C", 01, 00 }, ; { "TOTTERMINA", "N", 03, 00 }, ; { "LEITBALANC", "C", 01, 00 }, ; { "MODELBALAN", "C", 01, 00 }, ; { "DESCMAXIMO", "N", 05, 02 }, ; { "IMPALIQUOT", "C", 01, 00 }, ; { "PERM4PRECO", "C", 01, 00 }, ; { "VLMAXTROCO", "N", 06, 02 }, ; { "IMPROUTMIC", "C", 01, 00 }, ; { "IMPQTDECOP", "N", 01, 00 }, ; { "IMPCUPITEM", "C", 01, 00 }, ; { "SUPCODPROD", "C", 01, 00 }, ; { "PULARLINHA", "N", 02, 00 }, ; { "VELOCBALAN", "C", 04, 00 }, ; { "NAOCOMPCUP", "C", 01, 00 }, ; { "TECLAREDUZ", "C", 01, 00 }, ; { "TIPODESOM", "C", 01, 00 }, ; { "VALMAXSANG", "N", 12, 02 } } ) DbCloseAll() USE TERMINAL ALIAS TERMINAL EXCLUSIVE NEW APPEND FROM TERMICOP.DBF INDEX ON Field->TERMINAL TAG TERMINAL TO TERMINAL FOR !DELETED() DbCloseAll() ENDIF ENDIF ou //-> Para criar um novo campo em um banco de dados IF FILE( "SECAO.DBF" ) lExiste := .F. cAlias := ALIAS() FOR nConta := 1 TO (cAlias)->(fCount()) IF (cAlias)->(FieldName(nConta)) = "PEDIDOS" lExiste := .T. EXIT ENDIF NEXT IF !lExiste //DBCREATE() //->ETC //FERASE("CARTOES.DBF") DbCreate( "CARTOES.DBF", { { "CODIGO", "C", 06, 00 }, ; { "BANCO", "C", 05, 00 }, ; { "BANCODESCR", "C", 25, 00 }, ; { "DESCRICAO", "C", 50, 00 }, ; // NOVO { "CART_DESCR", "C", 30, 00 }, ; { "CART_TAXA", "N", 05, 00 }, ; { "CART_PRAZO", "N", 02, 00 }, ; { "CART_TIPO", "C", 10, 00 } } ) ENDIF ENDIF id=code>id=code> João Santos - São Paulo. kmt_karinha@pop.com.br joao@pleno.com.br Fone: (11) 3106-2832 / 8243-5632 - TIM FWH 2.7 - xHARBOUR WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 17, 2011 Author Report Share Posted January 17, 2011 Kapiaba, pelo visto vc entendeu só o tÃtulo... Isso que vc falou é o que eu já faço... Que é abrir a tabela e repassar as informações, mas ao invés de usar APPEND FROM eu utilizo replace mesmo, por causa de alterações na estrutura como aumentar/diminuir um campo, trocar tipos, colocar valores padrões nos campos novos... Sei que existe uma forma, o DBW consegue alterar a estrutura em alguns segundas ao invés de horas... SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 17, 2011 Report Share Posted January 17, 2011 Uma dica que pode ajudar. Para fazer a transicao crie o DBF temporario sem INDICE e abra o DBF origem sem INDICE também. Sem isso e sem COMMIT o tempo que conseguir acredito que é o melhor possivel. Crie o indice depois que acabar toda a importacao. Quanto ao DBW ele deve fazer a mudança em baixo nivel, talvez seja possivel implementar isso em xHarbour mas aà terá que se alterar a RDD. Abraço, Eduardo Motta citação:Kapiaba, pelo visto vc entendeu só o tÃtulo... Isso que vc falou é o que eu já faço... Que é abrir a tabela e repassar as informações, mas ao invés de usar APPEND FROM eu utilizo replace mesmo, por causa de alterações na estrutura como aumentar/diminuir um campo, trocar tipos, colocar valores padrões nos campos novos... Sei que existe uma forma, o DBW consegue alterar a estrutura em alguns segundas ao invés de horas... SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 17, 2011 Author Report Share Posted January 17, 2011 Nem o temporário nem o original tem indice, quando eu vou alterar a estrutura é logo após deletar os indices(CDX), alguem tem outra sugestão? Alguma função em C, algo do gênero... SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
roberio Posted January 17, 2011 Report Share Posted January 17, 2011 ola Samir tenho uma rotina no menu(refazer TODOS os banco de dados). tenho varios dbf com mais de 100.000 registro com appe from refaço todos dbfs nao leva mais que 3min... ex.com poucos campos If lLogic If File( oApp:cDir_000+"cona.dbf" ) Ferase(oApp:cDir_000+'CONA_OLD.DBF') FRename(oApp:cDir_000+'CONA.DBF', oApp:cDir_000+'CONA_OLD.DBF') If lCdx Ferase(oApp:cDir_000+'CONA.CDX') Endif lPath000:=.t. Else Ferase(oApp:cDir_002+'CONA_OLD.DBF') FRename(oApp:cDir_002+'CONA.DBF', oApp:cDir_002+'CONA_OLD.DBF') If lCdx Ferase(oApp:cDir_002+'CONA.CDX') Endif lPath000:=.f. Endif Endif If !File( oApp:cDir_000+"cona.dbf" ) If !File( oApp:cDir_002+"cona.dbf" ) aCampos := {} aAdd( aCampos , { "cod_cona" , "C" , 03 , 0 } ) aAdd( aCampos , { "con_cona" , "C" , 10 , 0 } ) aAdd( aCampos , { "nom_cona" , "C" , 30 , 0 } ) aAdd( aCampos , { "usu_cona" , "C" , 08 , 0 } ) aAdd( aCampos , { "tim_cona" , "C" , 16 , 0 } ) dbCreate( Iif(lPath000, oApp:cDir_000, oApp:cDir_002)+"cona.dbf" , aCampos , "DBFCDX" ) EndIf EndIf If lLogic dbSelectArea( "0" ) if !netuse("Cona.dbf",.t.,1,"Cona") MsgStop("Base de dados Cona.dbf está sendo usado em modo exclusivo"+CRLF+"por favor tente mais tarde", "Alerta!!") DbCloseAll() return nil endif If lPath000 Appen from (oApp:cDir_000)+"Cona_Old" Else Appen from (oApp:cDir_002)+"Cona_Old" Endif Endif *---------------------------------------------- CADASTRO DE VEND ------------------------------------------ id=code>id=code>4 horas você ta de brincadeira né? oApp:cDir_??? = path dos arquivos Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 18, 2011 Author Report Share Posted January 18, 2011 citação:ola Samir tenho uma rotina no menu(refazer TODOS os banco de dados). tenho varios dbf com mais de 100.000 registro com appe from refaço todos dbfs nao leva mais que 3min... ex.com poucos campos If lLogic If File( oApp:cDir_000+"cona.dbf" ) Ferase(oApp:cDir_000+'CONA_OLD.DBF') FRename(oApp:cDir_000+'CONA.DBF', oApp:cDir_000+'CONA_OLD.DBF') If lCdx Ferase(oApp:cDir_000+'CONA.CDX') Endif lPath000:=.t. Else Ferase(oApp:cDir_002+'CONA_OLD.DBF') FRename(oApp:cDir_002+'CONA.DBF', oApp:cDir_002+'CONA_OLD.DBF') If lCdx Ferase(oApp:cDir_002+'CONA.CDX') Endif lPath000:=.f. Endif Endif If !File( oApp:cDir_000+"cona.dbf" ) If !File( oApp:cDir_002+"cona.dbf" ) aCampos := {} aAdd( aCampos , { "cod_cona" , "C" , 03 , 0 } ) aAdd( aCampos , { "con_cona" , "C" , 10 , 0 } ) aAdd( aCampos , { "nom_cona" , "C" , 30 , 0 } ) aAdd( aCampos , { "usu_cona" , "C" , 08 , 0 } ) aAdd( aCampos , { "tim_cona" , "C" , 16 , 0 } ) dbCreate( Iif(lPath000, oApp:cDir_000, oApp:cDir_002)+"cona.dbf" , aCampos , "DBFCDX" ) EndIf EndIf If lLogic dbSelectArea( "0" ) if !netuse("Cona.dbf",.t.,1,"Cona") MsgStop("Base de dados Cona.dbf está sendo usado em modo exclusivo"+CRLF+"por favor tente mais tarde", "Alerta!!") DbCloseAll() return nil endif If lPath000 Appen from (oApp:cDir_000)+"Cona_Old" Else Appen from (oApp:cDir_002)+"Cona_Old" Endif Endif *---------------------------------------------- CADASTRO DE VEND ------------------------------------------ id=code>id=code>4 horas você ta de brincadeira né? oApp:cDir_??? = path dos arquivos id=quote>id=quote>Não posso fazer com append from devido a algumas rotinas que utilizo no replace e pelo fato do append não tratar alterações nos campos já existentes, como por exemplo diminuir um campo numérico, trocar um campo de caracter para numérico, adicionar um valor padrão, etc.... SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted January 18, 2011 Report Share Posted January 18, 2011 Ola samir, este tempo de 4 horas esta fora do normal, aqui faço da seguinte forma, passo de um banco para outro usando append from, depois tenho um controle de versões,neste controle de versão as vezes preciso tb usar o replace all, tipo qdo troco campo numerico para caracter, ou vice versa, em alguns casos de campos novos existe algum valor default que é o caso que vc sitou acima, mais so para vc ter uma ideia fiz um teste aqui com banco de 450 milregistro, levou 3:27 entre dar um append from, e depois passar o banco inteiro com replace, qq coisa posta a parte de seu codigo aqui, com certeza ficara bem mais facil para alguém poder lhe ajudar... Abraços Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1 FWH 9.12,XHARBOUR 1.2,ADS 9.0 Quote Link to comment Share on other sites More sharing options...
cpbart Posted January 18, 2011 Report Share Posted January 18, 2011 Ola, desde os tempos do clipper faço da seguinte forma: Uma Matriz contento os campos da base {"NOME", "C", 35,0},; {"EST", "C", 2,0}},; "TABELA IBGE DE MUNICIPIOS",; {{"CADMUN->CODIGO", "CADMUN01"},; {"CADMUN->NOME", "CADMUN02"}}})id=code>id=code>Tenho uma função especifica para gerenciar base de dados, com ele posso adicionar campos, reidenxar e packear a base, teste ai p ver se te serve Codigo: //cPati = Path dos Indices //Modo = 1 - Checar Existencia Base de Dados e Estrutura //Modo = 2 - Reindexar Tabelas //Modo = 3 - Packear Tabelas Function Config_Arq(aDbfs, Modo) If !lIsDir(cPath) lMkDir(cPath) EndIf IF !lIsdir(cPati) lMkDir(cPati) EndIf For nConta = 1 to Len(aDbfs) If Modo = 1 If !File(cPath+aDbfs[nConta][1]+".DBF") aEstru := aDbfs[nConta][2] DbCreate(cPath+aDbfs[nConta][1], aEstru) Close Databases EndIf aArq := aDbfs[nConta][1] aEstru := aDbfs[nConta][2] aInd := aDbfs[nConta][4] Use (cPath+aArq) Alias (aArq) EXCLUSIVE IF NetErr() Return EndIF aVerif := DbStruct() // aInd := aDbfs[nConta][4] Close DataBases IF Len(aVerif) <> Len(aEstru) cOldNome := cPath+aArq cOldNome2 := cPath+aArq+".FPT" cNovoNome := cPath+"TEMP" cNovoNom2 := cPath+"TEMP" cNovoNome2 := cPath+"TEMP.FPT" Use (cOldNome) Alias (aArq) New Exclusive Copy All to (cNovoNome) Close (aArq) Ferase(cOldNome+".dbf") Ferase(cOldNome+".fpt") DbCreate(cPath+aDbfs[nConta][1], aEstru) Close Databases Use (cPath+aArq) Alias (aArq) New Exclusive Do While .T. IF (aArq)->(Flock()) __dbApp(cNovoNome ,{ },,,,,.F.,"DBFCDX") (aArq)->(DbUnlock()) Exit Else Loop EndIF EndDo Close Databases FErase(cNovoNome) For nContaI = 1 To Len(aInd) aIndex := aInd[nContaI][2] aCampo := aInd[nContaI][1] Use (cPath+aArq) Alias (aArq) New If (aArq)->(Flock()) Ferase(cPati+aIndex+".cdx") MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" ) EndIf (aArq)->(DbUnlock()) Close (aArq) Next EndIf ElseIf Modo = 3 aArq := aDbfs[nConta][1] Use (cPath+aArq) Alias (aArq) EXCLUSIVE IF NetErr() Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede") Return EndIF If (aArq)->(Flock()) Pack EndIf (aArq)->(Dbunlock()) Close (aArq) aArq := aDbfs[nConta][1] aEstru := aDbfs[nConta][2] Use (cPath+aArq) Alias (aArq) New aVerif := DbStruct() aInd := aDbfs[nConta][4] Close DataBases IF Len(aVerif) <> Len(aEstru) cOldNome := cPath+aArq+".DBF" cOldNome2 := cPath+aArq+".FPT" cNovoNome := cPath+"TEMP.DBF" cNovoNome2 := cPath+"TEMP.FPT" Frename(cOldNome, cNovoNome) If File(cOldNome2) Frename(cOldNome2, cNovoNome2) EndIf DbCreate(cPath+aDbfs[nConta][1], aEstru) Close Databases Use (cPath+aArq) Alias (aArq) New Append From (cNovoNome) Close Databases FErase(cNovoNome) aInd := aDbfs[nConta][4] aIndex := aInd[nConta][2] aCampo := aInd[nConta][1] Use (cPath+aArq) Alias (aArq) New If (aArq)->(Flock()) Ferase(cPati+aIndex+".cdx") MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" ) EndIf (aArq)->(DbUnlock()) Close (aArq) EndIf EndIf aInd := aDbfs[nConta][4] nContaI = 1 If Modo = 1 For nContaI = 1 to Len(aInd) If !File(cPati+aInd[nContaI][2]+".cdx") aIndex := aInd[nContaI][2] aCampo := aInd[nContaI][1] aArq := aDbfs[nConta][1] Use (cPath+aArq) Alias (aArq) EXCLUSIVE IF NetErr() Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede") Return EndIF If (aArq)->(Flock()) Ferase(cPati+aIndex+".cdx") MsgMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" ) EndIf (aArq)->(DbUnlock()) Close (aArq) EndIf Next ElseiF Modo = 2 .Or. Modo = 3 For nContaI = 1 to Len(aInd) aIndex := aInd[nContaI][2] aCampo := aInd[nContaI][1] aArq := aDbfs[nConta][1] Use (cPath+aArq) Alias (aArq) EXCLUSIVE IF NetErr() Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede") Return EndIF If (aArq)->(Flock()) Ferase(cPati+aIndex+".cdx") MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" ) EndIf (aArq)->(DbUnlock()) Close (aArq) Next EndIf Next Return id=code>id=code>clipper 5.3d, fw 2.4 / xharb 0.99.70 simplex, fwh 7.05, Pellesc , Work , MySql Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 19, 2011 Author Report Share Posted January 19, 2011 @cpbart Você também usa Append from... e eu não posso utilizar append from... citação:Ola samir, este tempo de 4 horas esta fora do normal, aqui faço da seguinte forma, passo de um banco para outro usando append from, depois tenho um controle de versões,neste controle de versão as vezes preciso tb usar o replace all, tipo qdo troco campo numerico para caracter, ou vice versa, em alguns casos de campos novos existe algum valor default que é o caso que vc sitou acima, mais so para vc ter uma ideia fiz um teste aqui com banco de 450 milregistro, levou 3:27 entre dar um append from, e depois passar o banco inteiro com replace, qq coisa posta a parte de seu codigo aqui, com certeza ficara bem mais facil para alguém poder lhe ajudar... Abraços Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1 FWH 9.12,XHARBOUR 1.2,ADS 9.0 id=quote>id=quote>Luiz, vi que vc usa ADS tb... eu to com o ADS 8.1 Tenho aqui 66 campos na tabela de 150 mil registros, e já consegui reduzir para 2:30 Eu alterei meu comando replace para gravar um código MD5 por registro pra poder atender ao requisito do PAF de tratar alterações manuais, então preciso usar o replace mesmo... Segue o código: **************************************************************************** Function ModStruct( aMods, poMeter, poText ) **************************************************************************** * Modificar a estrutura de uma tabela * Parâmetros: aMods * {cTipoMod,;//"DROP" para remover e "MOD" para modificar/adicionar * aStruct ,;//Matriz com a estrutura nova para o campo * bEval} //Bloco a ser validado ao repassar o campo * Retorno: * Autor: Samir Abreu * 4/12/2010 - 11:55:43 **************************************************************************** Local i := 0, nScan := 0, cNomeDbf := "", cTipoMod := "",; cTimeIni := Time(), aLog := {}, bCode Local cInitTime := Time(), cNewTime := "", nReg := 0 Local nSecPassado := 0, nCalcReg := 0, nSec := 0 Private aStruct := DbStruct(), aOldStruct := DbStruct(), aValues := {},; aEvals := {}, nCOntador := 1, aAux := {}, cAlias := Alias() Private P_aMods := {} Default poMeter := oMeter, poText := oText //-- Verificar modificações necessárias poText:SetText( "Verificando modificações necessárias" ) poMeter:nTotal := Len(aMods) For i := 1 to Len(aMods) poMeter:Set( i ) cTipoMod := aMods[i,1] If Empty(cTipoMod) cTipoMod := "" end //-- Pesquisar o nome do campo na estrutura nScan := aScan(aStruct, {|x| x[1] == aMods[i,2,1]} ) //-- Verificar o tipo de modificação a ser feita if cTipoMod = "MOD" //-- Adição/Modificação do campo //-- Verificar se é adição If nScan = 0 //-- Adicionar a estrutura de referência aAdd(aStruct,aMods[i,2]) //-- Modificação else //-- Modificar a estrutura de referência aStruct[nScan] := aMods[i,2] end //-- Remoção de campo elseif cTipoMod = "DROP" //-- Remoção do campo //-- Se o campo existe, remove da estrutura de referência If nScan > 0 aDel(aStruct,nScan) aSize(aStruct,Len(aStruct)-1) end end end //-- Criar tabela temporária com o formato correto poText:SetText( "Criando arquivo temporário" ) while .T. cNomeDbf := "T"+strtran(Time(),":") //-- Nome para o arq. temporario if !file(cNomeDbf+".DBF") DbCreate(pDir + cNomeDbf+".DBF",aStruct) //-- Cria o temp. com a nova estrut. exit end Msg("Tentando criar temp " + cNomeDbf + ".DBF .") end DbCreate(pDir+cNomeDbf,aStruct) //-- Abrir a tabela temporária If !Net_Use(cNomeDbf,,"E") Msg("Erro ao abrir o arquivo temporário") Return .T. end //-- Realizar validações e verificar repasses necessários poText:SetText( "Verificando validações/repasses necessários" ) poMeter:nTotal := Len(aOldStruct) //-- Rodar a estrutura antiga verificando os campos a serem repassados For i := 1 to Len(aOldStruct) poMeter:Set( i ) //-- Pesquisar na lista da nova estrutura o nome do campo da tabela antiga nScan := aScan(aStruct,{|X| x[1] == aOldStruct[i,1] }) //-- Verificar se o campo foi removido If nScan > 0 //-- Verificar se os campos são compativeis If (aStruct[nScan,2] == aOldStruct[i,2] .And.; aStruct[nScan,3] >= aOldStruct[i,3] .And.; aStruct[nScan,4] >= aOldStruct[i,4]) //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( ) } ) aAdd(aAux, { nScan,i, cAlias } ) else //-- Caso seja uma redução de caracter executa uma validação //-- automática para pegar apenas os caracteres a esquerda If (aStruct[nScan,2] = "C" .And. aOldStruct[i,2] = "C") //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( .T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) end end end End //-- Zerar variáveis para não gerar valores errados nScan := 0 i := 0 //-- Verificar validações passadas por parâmetro For i := 1 to Len(aMods) //-- Verificar se foi passado o parâmetro de validação If Len(aMods) >= 3 //-- Verificar preenchimentoe do parâmetro If !Empty(aMods[i,3]) //-- Verificar se é um bloco válido If ValType(aMods[i,3]) = "B" //aAdd(aEvals, aMods[i,3]) aAdd(aEvals, {|| RepInfo( .F.,.T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) //-- Verificar se é um bloco a ser criado elseIf ValType( &(aMods[i,3]) ) = "B" aAdd(aEvals, &(aMods[i,3]) ) //-- Caso não seja passa como valor fixo else //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( .F.,.T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) end end end end //-- Gravar o parâmetro em uma váriavel private para dar visibilidade P_aMods := aMods //-- Repassar as informações para a tabela auxiliar Select(cAlias) #IFDEF __ADSACTIVE__ ActiveDialog():SetText( "Efetuando repasses da tabela "+cAlias ) #ENDIF //-- Rodar toda a tabela original Count to poMeter:nTotal DbGoTop() cInitTime := Time() While !Eof() nReg := RecNo() poMeter:Set( nReg ) //-- Adicionar um registro na tabela auxiliar Select(cNomeDbf) AddRec() //-- Iniciar o contador para ser usado no repasse nContador := 1 //-- Roda todos os repasses necessários For i := 1 to Len(aEvals) //-- Verificar se é um bloco de código válido If ValType( aEvals ) = "B" bCode := aEvals //-- Verificar se é um bloco de código a ser verificado elseif ValType( &( aEvals ) ) = "B" bCode := &( aEvals ) end //-- Se for a ultima validação If i = Len(aEvals) //-- Liberar a função de gravar MD5 lTravaMD5 := .F. //-- Validar o bloco de código Eval( bCode ) //-- Desabilitar a função de gravar o MD5 lTravaMD5 := .T. else //-- Validar o bloco de código Eval( bCode ) end end //-- Realizar a verificação a cada 5 segundos If nSec != Secs(Time()) //-- Gravar o novo tempo nSec := Secs(Time()) If Mod(nSec,5) = 0 //-- Calcular o tempo restante nSecPassado := Secs( ElapTime( cInitTime, Time( ) ) ) nCalcReg := (poMeter:nTotal / nReg ) nCalcReg := ( nSecPassado * nCalcReg ) - nSecPassado nCalcReg := Round( nCalcReg, 0 ) If nCalcReg = 0 nCalcReg++ end cNewTime := TString( nCalcReg ) //-- Exibir a mensagem com o tempo e número de registros poText:SetText("Previsão: " + cNewTime +; " | Registro: "+UT( nReg ) + " de " +Ut( poMeter:nTotal ) ) end end //-- Ir para o próximo registro da tabela original Select(cAlias) DbSkip() end DbCommitAll() lTravaMD5 := .F. //-- Fechar a tabela original e temporária para fazer a troca Select(cAlias) DbCloseArea() Select(cNomeDbf) DbCloseArea() //-- Apagar a original fErase(pDir+cAlias+".DBF") //-- Renomear a auxiliar para o nome da original fRename(pDir+cNomeDbf+".DBF", pDir+cAlias+".DBF") If !Net_Use(cAlias) Msg("Erro ao abrir o arquivo repassado") Return .F. end #IFDEF __ADSACTIVE__ ActiveDialog():SetText( "Efetuando repasses da tabela "+cAlias ) #ENDIF //-- Gravar log de tempo #IFDEF __TRADE__ If File("C:\Tempo.txt") CreateTxt("C:\Tempo.txt", MemoRead("C:\Tempo.txt")+CRLF+; "Data=" + Dtoc( Date() ) +; " |Alias=" + cAlias +" | Ini="+cTimeIni+; " | Fim=" + Time( ) +" | Tot="+ElapTime(cTimeIni,Time())) else CreateTxt("C:\Tempo.txt",; "Data=" + Dtoc( Date() ) +; " |Alias=" + cAlias + " | Ini="+cTimeIni+; " | Fim=" + Time( ) + " | Tot="+ElapTime( cTimeIni, Time( ) ) ) end #ENDIF Return .T. /**************************************************************************/ id=code>id=code>Segue o exemplo de alteração na tabela de referência: **************************************************************************** static procedure StruPedidos(oMeter,oText,plRede) **************************************************************************** local cAlias := Alias(), aFields := {}, lRepassar:= .f. barra("Aguarde, verificando a estrutura do " + cAlias +" ...") if fieldpos("LOTE") = 0 .Or. FieldInfo("LOTE",3) != 20 aAdd(aFields,{"MOD",{"LOTE","C",20,0}}) End if fieldpos("FILIAL") = 0 aAdd(aFields,{"MOD",{"FILIAL","C",03,0}}) End if fieldpos("COMISSAO") = 0 aAdd(aFields,{"MOD",{"COMISSAO","N",06,2}}) End if fieldpos("CONTEXP") <= 0 aAdd(aFields,{"MOD",{"CONTEXP","N",06,0},1}) end if fieldpos("DATAEXP") > 0 aAdd(aFields,{"DROP",{"DATAEXP"}}) End if fieldpos("Q_BAIXA") <= 0 aAdd(aFields,{"MOD",{"Q_BAIXA","N",9,3}}) end if fieldpos("DEVOLVIDO") <= 0 aAdd(aFields,{"MOD",{"DEVOLVIDO","N",9,3}}) end if FieldInfo("DEVOLVIDO",3) != 9 .or. FieldInfo("DEVOLVIDO",4) != 3 aAdd(aFields,{"MOD",{"DEVOLVIDO","N",9,3}}) end if fieldinfo("DESCO",3) = 5 aAdd(aFields,{"MOD",{"DESCO","N",6,2}}) endif if fieldpos("PARC") <= 0 aAdd(aFields,{"MOD",{"PARC","C",4,0}}) end if fieldpos("COMI_PARC") <= 0 aAdd(aFields,{"MOD",{"COMI_PARC","D",8,0}}) end if fieldpos("PARCEIRO") > 0 aAdd(aFields,{"DROP",{"PARCEIRO"}}) End if fieldpos("PARCECOMI") > 0 aAdd(aFields,{"DROP",{"PARCECOMI"}}) End if fieldpos("BXAESTOQ") <= 0 aAdd(aFields,{"MOD",{"BXAESTOQ","C",1,0}}) end if fieldpos("MOTPERCON") <= 0 aAdd(aFields,{"MOD",{"MOTPERCON","C",3,0}}) end if fieldpos("NRSERIEFAB") <= 0 aAdd(aFields,{"MOD",{"NRSERIEFAB","C",20,0}}) End if fieldpos("ALIQUOTA") <= 0 aAdd(aFields,{"MOD",{"ALIQUOTA","C",4,0}}) end if fieldpos("UN") <= 0 aAdd(aFields,{"MOD",{"UN","C",2,0}}) end if fieldpos("NR_LOCAL") <= 0 aAdd(aFields,{"MOD",{"NR_LOCAL","N",6,0}}) end if fieldpos("ATUSERV") <= 0 aAdd(aFields,{"MOD",{"ATUSERV","C",1,0}}) end if fieldpos("DECVRPRO") <= 0 aAdd(aFields,{"MOD",{"DECVRPRO","N",1,0}}) end if fieldpos("SERVICOPRO") <= 0 aAdd(aFields,{"MOD",{"SERVICOPRO","C",1,0}}) end if fieldpos("PRLIQUIDO") <= 0 aAdd(aFields,{"MOD",{"PRLIQUIDO","N",12,2}}) end if fieldpos("ALIQ_IND") <= 0 aAdd(aFields,{"MOD",{"ALIQ_IND","C",2,0}}) end if fieldpos("CCF") > 0 aAdd(aFields,{"DROP",{"CCF"}}) End if fieldpos("COO") <= 0 aAdd(aFields,{"MOD",{"COO","N",6,0}}) end if fieldpos("ACRESCIMO") <= 0 aAdd(aFields,{"MOD",{"ACRESCIMO","N",6,2}}) end if fieldpos("SEQUENCIA") > 0 .Or. fieldpos("SEQCUPOM") > 0 if fieldpos("SEQCUPOM") > 0 aAdd(aFields,{"DROP",{"SEQCUPOM"}}) aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0},{||PEDIDOS->SEQCUPOM}}) elseif fieldpos("SEQUENCIA") > 0 aAdd(aFields,{"DROP",{"SEQUENCIA"}}) aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0},{||PEDIDOS->SEQUENCIA}}) end End if fieldpos("SEQCUPFIS") <= 0 aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0}}) End if fieldpos("PRCUSTO") <= 0 aAdd(aFields,{"MOD",{"PRCUSTO","N",12,2}}) end if fieldpos("APLIPROMO") <= 0 aAdd(aFields,{"MOD",{"APLIPROMO","C",01,0}}) end if fieldpos("SERVICO") <= 0 aAdd(aFields,{"MOD",{"SERVICO","C",06,0}}) end if fieldpos("TAXA") <= 0 aAdd(aFields,{"MOD",{"TAXA","N",06,3}}) end if fieldpos("SINAL") <= 0 aAdd(aFields,{"MOD",{"SINAL","N",12,2}}) end if fieldpos("APLIATAC") <= 0 aAdd(aFields,{"MOD",{"APLIATAC","C",01,0}}) end if fieldpos("ENTSTATUS") <= 0 aAdd(aFields,{"MOD",{"ENTSTATUS","C",10,0},{||"IGNORADO"}}) end if fieldpos("CODENTREGA") <= 0 aAdd(aFields,{"MOD",{"CODENTREGA","C",06,0},{||"000000"}}) end if fieldpos("QTDENTREGA") <= 0 aAdd(aFields,{"MOD",{"QTDENTREGA","N",09,3}}) end if fieldpos("ENTREGUES") <= 0 aAdd(aFields,{"MOD",{"ENTREGUES","N",09,3}}) end if FieldInfo("CLIENTE",3) == 4 aAdd(aFields,{"MOD",{"CLIENTE","C",05,0},{||SZero(CLIENTE,5) }}) end if fieldpos("RESERVA") <= 0 aAdd(aFields,{"MOD",{"RESERVA","N",10,3}}) end if fieldpos("DESCOFIM") <= 0 aAdd(aFields,{"MOD",{"DESCOFIM","C",01,0}}) end if fieldpos(CAMPOMD5) <= 0 aAdd(aFields,{"MOD",{CAMPOMD5,"C",32,0},"{||GeraMd5Reg()}"}) end if fieldpos("CONTMOVECF") <= 0 aAdd(aFields,{"MOD",{"CONTMOVECF","C",10,0}}) //-- Contador do movimento ecf endif if fieldpos("NRSERIE") = 0 aAdd(aFields,{"MOD",{"NRSERIE","C",20,0}}) endif if fieldpos("IAT") = 0 aAdd(aFields,{"MOD",{"IAT","C",1,0}}) endif if fieldpos("MFADIC") = 0 aAdd(aFields,{"MOD",{"MFADIC","C",1,0}}) endif if fieldpos("ECFMODELO") = 0 aAdd(aFields,{"MOD",{"ECFMODELO","C",20,0}}) endif if fieldpos("ECFNRUSU") = 0 aAdd(aFields,{"MOD",{"ECFNRUSU","N",2,0}}) endif if Len(aFields) > 0 ModStruct( aFields, oMeter, oText ) end barra() return nil id=code>id=code> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02 id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Editado por - sambomb on 19/01/2011 09:01:36 Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Então a principal razao da demora é o processo do MD5. Tente nao calcular o MD5, só criar o campo, veja que vai cair pela metade a demora. citação:@cpbart Você também usa Append from... e eu não posso utilizar append from... citação:Ola samir, este tempo de 4 horas esta fora do normal, aqui faço da seguinte forma, passo de um banco para outro usando append from, depois tenho um controle de versões,neste controle de versão as vezes preciso tb usar o replace all, tipo qdo troco campo numerico para caracter, ou vice versa, em alguns casos de campos novos existe algum valor default que é o caso que vc sitou acima, mais so para vc ter uma ideia fiz um teste aqui com banco de 450 milregistro, levou 3:27 entre dar um append from, e depois passar o banco inteiro com replace, qq coisa posta a parte de seu codigo aqui, com certeza ficara bem mais facil para alguém poder lhe ajudar... Abraços Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1 FWH 9.12,XHARBOUR 1.2,ADS 9.0 id=quote>id=quote>Luiz, vi que vc usa ADS tb... eu to com o ADS 8.1 Tenho aqui 66 campos na tabela de 150 mil registros, e já consegui reduzir para 2:30 Eu alterei meu comando replace para gravar um código MD5 por registro pra poder atender ao requisito do PAF de tratar alterações manuais, então preciso usar o replace mesmo... Segue o código: **************************************************************************** Function ModStruct( aMods, poMeter, poText ) **************************************************************************** * Modificar a estrutura de uma tabela * Parâmetros: aMods * {cTipoMod,;//"DROP" para remover e "MOD" para modificar/adicionar * aStruct ,;//Matriz com a estrutura nova para o campo * bEval} //Bloco a ser validado ao repassar o campo * Retorno: * Autor: Samir Abreu * 4/12/2010 - 11:55:43 **************************************************************************** Local i := 0, nScan := 0, cNomeDbf := "", cTipoMod := "",; cTimeIni := Time(), aLog := {}, bCode Local cInitTime := Time(), cNewTime := "", nReg := 0 Local nSecPassado := 0, nCalcReg := 0, nSec := 0 Private aStruct := DbStruct(), aOldStruct := DbStruct(), aValues := {},; aEvals := {}, nCOntador := 1, aAux := {}, cAlias := Alias() Private P_aMods := {} Default poMeter := oMeter, poText := oText //-- Verificar modificações necessárias poText:SetText( "Verificando modificações necessárias" ) poMeter:nTotal := Len(aMods) For i := 1 to Len(aMods) poMeter:Set( i ) cTipoMod := aMods[i,1] If Empty(cTipoMod) cTipoMod := "" end //-- Pesquisar o nome do campo na estrutura nScan := aScan(aStruct, {|x| x[1] == aMods[i,2,1]} ) //-- Verificar o tipo de modificação a ser feita if cTipoMod = "MOD" //-- Adição/Modificação do campo //-- Verificar se é adição If nScan = 0 //-- Adicionar a estrutura de referência aAdd(aStruct,aMods[i,2]) //-- Modificação else //-- Modificar a estrutura de referência aStruct[nScan] := aMods[i,2] end //-- Remoção de campo elseif cTipoMod = "DROP" //-- Remoção do campo //-- Se o campo existe, remove da estrutura de referência If nScan > 0 aDel(aStruct,nScan) aSize(aStruct,Len(aStruct)-1) end end end //-- Criar tabela temporária com o formato correto poText:SetText( "Criando arquivo temporário" ) while .T. cNomeDbf := "T"+strtran(Time(),":") //-- Nome para o arq. temporario if !file(cNomeDbf+".DBF") DbCreate(pDir + cNomeDbf+".DBF",aStruct) //-- Cria o temp. com a nova estrut. exit end Msg("Tentando criar temp " + cNomeDbf + ".DBF .") end DbCreate(pDir+cNomeDbf,aStruct) //-- Abrir a tabela temporária If !Net_Use(cNomeDbf,,"E") Msg("Erro ao abrir o arquivo temporário") Return .T. end //-- Realizar validações e verificar repasses necessários poText:SetText( "Verificando validações/repasses necessários" ) poMeter:nTotal := Len(aOldStruct) //-- Rodar a estrutura antiga verificando os campos a serem repassados For i := 1 to Len(aOldStruct) poMeter:Set( i ) //-- Pesquisar na lista da nova estrutura o nome do campo da tabela antiga nScan := aScan(aStruct,{|X| x[1] == aOldStruct[i,1] }) //-- Verificar se o campo foi removido If nScan > 0 //-- Verificar se os campos são compativeis If (aStruct[nScan,2] == aOldStruct[i,2] .And.; aStruct[nScan,3] >= aOldStruct[i,3] .And.; aStruct[nScan,4] >= aOldStruct[i,4]) //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( ) } ) aAdd(aAux, { nScan,i, cAlias } ) else //-- Caso seja uma redução de caracter executa uma validação //-- automática para pegar apenas os caracteres a esquerda If (aStruct[nScan,2] = "C" .And. aOldStruct[i,2] = "C") //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( .T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) end end end End //-- Zerar variáveis para não gerar valores errados nScan := 0 i := 0 //-- Verificar validações passadas por parâmetro For i := 1 to Len(aMods) //-- Verificar se foi passado o parâmetro de validação If Len(aMods) >= 3 //-- Verificar preenchimentoe do parâmetro If !Empty(aMods[i,3]) //-- Verificar se é um bloco válido If ValType(aMods[i,3]) = "B" //aAdd(aEvals, aMods[i,3]) aAdd(aEvals, {|| RepInfo( .F.,.T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) //-- Verificar se é um bloco a ser criado elseIf ValType( &(aMods[i,3]) ) = "B" aAdd(aEvals, &(aMods[i,3]) ) //-- Caso não seja passa como valor fixo else //-- Adicionar na lista de validações e gravar os valores //-- atuais das variáveis na matriz auxiliar aAdd(aEvals, {|| RepInfo( .F.,.T. ) } ) aAdd(aAux, { nScan,i, cAlias } ) end end end end //-- Gravar o parâmetro em uma váriavel private para dar visibilidade P_aMods := aMods //-- Repassar as informações para a tabela auxiliar Select(cAlias) #IFDEF __ADSACTIVE__ ActiveDialog():SetText( "Efetuando repasses da tabela "+cAlias ) #ENDIF //-- Rodar toda a tabela original Count to poMeter:nTotal DbGoTop() cInitTime := Time() While !Eof() nReg := RecNo() poMeter:Set( nReg ) //-- Adicionar um registro na tabela auxiliar Select(cNomeDbf) AddRec() //-- Iniciar o contador para ser usado no repasse nContador := 1 //-- Roda todos os repasses necessários For i := 1 to Len(aEvals) //-- Verificar se é um bloco de código válido If ValType( aEvals ) = "B" bCode := aEvals //-- Verificar se é um bloco de código a ser verificado elseif ValType( &( aEvals ) ) = "B" bCode := &( aEvals ) end //-- Se for a ultima validação If i = Len(aEvals) //-- Liberar a função de gravar MD5 lTravaMD5 := .F. //-- Validar o bloco de código Eval( bCode ) //-- Desabilitar a função de gravar o MD5 lTravaMD5 := .T. else //-- Validar o bloco de código Eval( bCode ) end end //-- Realizar a verificação a cada 5 segundos If nSec != Secs(Time()) //-- Gravar o novo tempo nSec := Secs(Time()) If Mod(nSec,5) = 0 //-- Calcular o tempo restante nSecPassado := Secs( ElapTime( cInitTime, Time( ) ) ) nCalcReg := (poMeter:nTotal / nReg ) nCalcReg := ( nSecPassado * nCalcReg ) - nSecPassado nCalcReg := Round( nCalcReg, 0 ) If nCalcReg = 0 nCalcReg++ end cNewTime := TString( nCalcReg ) //-- Exibir a mensagem com o tempo e número de registros poText:SetText("Previsão: " + cNewTime +; " | Registro: "+UT( nReg ) + " de " +Ut( poMeter:nTotal ) ) end end //-- Ir para o próximo registro da tabela original Select(cAlias) DbSkip() end DbCommitAll() lTravaMD5 := .F. //-- Fechar a tabela original e temporária para fazer a troca Select(cAlias) DbCloseArea() Select(cNomeDbf) DbCloseArea() //-- Apagar a original fErase(pDir+cAlias+".DBF") //-- Renomear a auxiliar para o nome da original fRename(pDir+cNomeDbf+".DBF", pDir+cAlias+".DBF") If !Net_Use(cAlias) Msg("Erro ao abrir o arquivo repassado") Return .F. end #IFDEF __ADSACTIVE__ ActiveDialog():SetText( "Efetuando repasses da tabela "+cAlias ) #ENDIF //-- Gravar log de tempo #IFDEF __TRADE__ If File("C:\Tempo.txt") CreateTxt("C:\Tempo.txt", MemoRead("C:\Tempo.txt")+CRLF+; "Data=" + Dtoc( Date() ) +; " |Alias=" + cAlias +" | Ini="+cTimeIni+; " | Fim=" + Time( ) +" | Tot="+ElapTime(cTimeIni,Time())) else CreateTxt("C:\Tempo.txt",; "Data=" + Dtoc( Date() ) +; " |Alias=" + cAlias + " | Ini="+cTimeIni+; " | Fim=" + Time( ) + " | Tot="+ElapTime( cTimeIni, Time( ) ) ) end #ENDIF Return .T. /**************************************************************************/ id=code>id=code>Segue o exemplo de alteração na tabela de referência: **************************************************************************** static procedure StruPedidos(oMeter,oText,plRede) **************************************************************************** local cAlias := Alias(), aFields := {}, lRepassar:= .f. barra("Aguarde, verificando a estrutura do " + cAlias +" ...") if fieldpos("LOTE") = 0 .Or. FieldInfo("LOTE",3) != 20 aAdd(aFields,{"MOD",{"LOTE","C",20,0}}) End if fieldpos("FILIAL") = 0 aAdd(aFields,{"MOD",{"FILIAL","C",03,0}}) End if fieldpos("COMISSAO") = 0 aAdd(aFields,{"MOD",{"COMISSAO","N",06,2}}) End if fieldpos("CONTEXP") <= 0 aAdd(aFields,{"MOD",{"CONTEXP","N",06,0},1}) end if fieldpos("DATAEXP") > 0 aAdd(aFields,{"DROP",{"DATAEXP"}}) End if fieldpos("Q_BAIXA") <= 0 aAdd(aFields,{"MOD",{"Q_BAIXA","N",9,3}}) end if fieldpos("DEVOLVIDO") <= 0 aAdd(aFields,{"MOD",{"DEVOLVIDO","N",9,3}}) end if FieldInfo("DEVOLVIDO",3) != 9 .or. FieldInfo("DEVOLVIDO",4) != 3 aAdd(aFields,{"MOD",{"DEVOLVIDO","N",9,3}}) end if fieldinfo("DESCO",3) = 5 aAdd(aFields,{"MOD",{"DESCO","N",6,2}}) endif if fieldpos("PARC") <= 0 aAdd(aFields,{"MOD",{"PARC","C",4,0}}) end if fieldpos("COMI_PARC") <= 0 aAdd(aFields,{"MOD",{"COMI_PARC","D",8,0}}) end if fieldpos("PARCEIRO") > 0 aAdd(aFields,{"DROP",{"PARCEIRO"}}) End if fieldpos("PARCECOMI") > 0 aAdd(aFields,{"DROP",{"PARCECOMI"}}) End if fieldpos("BXAESTOQ") <= 0 aAdd(aFields,{"MOD",{"BXAESTOQ","C",1,0}}) end if fieldpos("MOTPERCON") <= 0 aAdd(aFields,{"MOD",{"MOTPERCON","C",3,0}}) end if fieldpos("NRSERIEFAB") <= 0 aAdd(aFields,{"MOD",{"NRSERIEFAB","C",20,0}}) End if fieldpos("ALIQUOTA") <= 0 aAdd(aFields,{"MOD",{"ALIQUOTA","C",4,0}}) end if fieldpos("UN") <= 0 aAdd(aFields,{"MOD",{"UN","C",2,0}}) end if fieldpos("NR_LOCAL") <= 0 aAdd(aFields,{"MOD",{"NR_LOCAL","N",6,0}}) end if fieldpos("ATUSERV") <= 0 aAdd(aFields,{"MOD",{"ATUSERV","C",1,0}}) end if fieldpos("DECVRPRO") <= 0 aAdd(aFields,{"MOD",{"DECVRPRO","N",1,0}}) end if fieldpos("SERVICOPRO") <= 0 aAdd(aFields,{"MOD",{"SERVICOPRO","C",1,0}}) end if fieldpos("PRLIQUIDO") <= 0 aAdd(aFields,{"MOD",{"PRLIQUIDO","N",12,2}}) end if fieldpos("ALIQ_IND") <= 0 aAdd(aFields,{"MOD",{"ALIQ_IND","C",2,0}}) end if fieldpos("CCF") > 0 aAdd(aFields,{"DROP",{"CCF"}}) End if fieldpos("COO") <= 0 aAdd(aFields,{"MOD",{"COO","N",6,0}}) end if fieldpos("ACRESCIMO") <= 0 aAdd(aFields,{"MOD",{"ACRESCIMO","N",6,2}}) end if fieldpos("SEQUENCIA") > 0 .Or. fieldpos("SEQCUPOM") > 0 if fieldpos("SEQCUPOM") > 0 aAdd(aFields,{"DROP",{"SEQCUPOM"}}) aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0},{||PEDIDOS->SEQCUPOM}}) elseif fieldpos("SEQUENCIA") > 0 aAdd(aFields,{"DROP",{"SEQUENCIA"}}) aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0},{||PEDIDOS->SEQUENCIA}}) end End if fieldpos("SEQCUPFIS") <= 0 aAdd(aFields,{"MOD",{"SEQCUPFIS","N",3,0}}) End if fieldpos("PRCUSTO") <= 0 aAdd(aFields,{"MOD",{"PRCUSTO","N",12,2}}) end if fieldpos("APLIPROMO") <= 0 aAdd(aFields,{"MOD",{"APLIPROMO","C",01,0}}) end if fieldpos("SERVICO") <= 0 aAdd(aFields,{"MOD",{"SERVICO","C",06,0}}) end if fieldpos("TAXA") <= 0 aAdd(aFields,{"MOD",{"TAXA","N",06,3}}) end if fieldpos("SINAL") <= 0 aAdd(aFields,{"MOD",{"SINAL","N",12,2}}) end if fieldpos("APLIATAC") <= 0 aAdd(aFields,{"MOD",{"APLIATAC","C",01,0}}) end if fieldpos("ENTSTATUS") <= 0 aAdd(aFields,{"MOD",{"ENTSTATUS","C",10,0},{||"IGNORADO"}}) end if fieldpos("CODENTREGA") <= 0 aAdd(aFields,{"MOD",{"CODENTREGA","C",06,0},{||"000000"}}) end if fieldpos("QTDENTREGA") <= 0 aAdd(aFields,{"MOD",{"QTDENTREGA","N",09,3}}) end if fieldpos("ENTREGUES") <= 0 aAdd(aFields,{"MOD",{"ENTREGUES","N",09,3}}) end if FieldInfo("CLIENTE",3) == 4 aAdd(aFields,{"MOD",{"CLIENTE","C",05,0},{||SZero(CLIENTE,5) }}) end if fieldpos("RESERVA") <= 0 aAdd(aFields,{"MOD",{"RESERVA","N",10,3}}) end if fieldpos("DESCOFIM") <= 0 aAdd(aFields,{"MOD",{"DESCOFIM","C",01,0}}) end if fieldpos(CAMPOMD5) <= 0 aAdd(aFields,{"MOD",{CAMPOMD5,"C",32,0},"{||GeraMd5Reg()}"}) end if fieldpos("CONTMOVECF") <= 0 aAdd(aFields,{"MOD",{"CONTMOVECF","C",10,0}}) //-- Contador do movimento ecf endif if fieldpos("NRSERIE") = 0 aAdd(aFields,{"MOD",{"NRSERIE","C",20,0}}) endif if fieldpos("IAT") = 0 aAdd(aFields,{"MOD",{"IAT","C",1,0}}) endif if fieldpos("MFADIC") = 0 aAdd(aFields,{"MOD",{"MFADIC","C",1,0}}) endif if fieldpos("ECFMODELO") = 0 aAdd(aFields,{"MOD",{"ECFMODELO","C",20,0}}) endif if fieldpos("ECFNRUSU") = 0 aAdd(aFields,{"MOD",{"ECFNRUSU","N",2,0}}) endif if Len(aFields) > 0 ModStruct( aFields, oMeter, oText ) end barra() return nil id=code>id=code> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02 id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Editado por - sambomb on 19/01/2011 09:01:36 id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 19, 2011 Author Report Share Posted January 19, 2011 emotta Eu já removi o calculo por campo, agora faço uma vez por registro apenas, com isso reduzi de 4:00 para 2:30 Essa é a parte que eu faço isso: Essa variavel lTravaMD5 é publica e quando ta com o valor verdadeiro ele não executa o comando para calcular o MD5 //-- Se for a ultima validação If i = Len(aEvals) //-- Liberar a função de gravar MD5 lTravaMD5 := .F. //-- Validar o bloco de código Eval( bCode ) //-- Desabilitar a função de gravar o MD5 lTravaMD5 := .T. else //-- Validar o bloco de código Eval( bCode ) end id=code>id=code> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Voce pode me mandar o codigo fonte da funcao ADDREC ? Tenho 2 sugestões que podem ajudar: - Na atualizacao da barra de progresso vc executa de 5 em 5 registros. Aumente para 100 (Mod(nSec,100) = 0) - Use FIELDPUT para gravar em vez do replace comum. Pois internamente na RDD ele tem que localizar o "numero" do campo e daà gravar. Se voce passar FIELDPUT direto ele nao tera o trabalho de localizar o campo, pois voce ja vai mandar o numero do campo diretamente no 1o parametro. Essas duas dicas poderão reduzir o tempo mas nao acredito que baixará muito assim, mas são alteracoes simples e vale a pena fazer o teste. abraço citação:emotta Eu já removi o calculo por campo, agora faço uma vez por registro apenas, com isso reduzi de 4:00 para 2:30 Essa é a parte que eu faço isso: Essa variavel lTravaMD5 é publica e quando ta com o valor verdadeiro ele não executa o comando para calcular o MD5 //-- Se for a ultima validação If i = Len(aEvals) //-- Liberar a função de gravar MD5 lTravaMD5 := .F. //-- Validar o bloco de código Eval( bCode ) //-- Desabilitar a função de gravar o MD5 lTravaMD5 := .T. else //-- Validar o bloco de código Eval( bCode ) end id=code>id=code> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 19, 2011 Author Report Share Posted January 19, 2011 Eduardo eu atualizo de 5 em 5 SEGUNDOS não registros... E internamente no RDD ele faz o seguinte: Alias:_FIELD := xVal SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Realmente, bati o olho e imaginei isso mas nao me atendeu que voce faz pelos segundos. Quanto ao procedimento interno na RDD ele nao faz isso não. Contrui uma RDD para acessar BTRIEVE usando o USRRDD e o processo de localizacao de campo é sempre pelo número. Veja nos exemplos do USRRDD que voce vai ver. Se tiver mais paciencia poderá ver no codigo em C da RDD DBFCDX. A classe TDATABASE faz o que voce disse, mas é uma classe não tem nada haver com RDD. Caso eu tenha alguma ideia lhe aviso. abraço citação:Eduardo eu atualizo de 5 em 5 SEGUNDOS não registros... E internamente no RDD ele faz o seguinte: Alias:_FIELD := xVal SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Samir, quanto a questão do REPLACE ou FIELDPUT o ganho foi minimo. Fiz um teste rapido pra gerar 10 milhoes de registro de o ganho foi de apenas 2 segundos. Usando replace o melhor tempo foi 112 e usando fieldpos foi 110. A tabela tinha apenas 2 campos, por isso acho que foi rapido. Abraço EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 19, 2011 Author Report Share Posted January 19, 2011 Tinha até colocado errado... aqui um exemplo de como fica no PPO um replace meu: VerMd5Reg(); _FIELD->EDESCRICAO := cEDescricao; a1b2c3 := IIF( "EDESCRICAO" == "MRDE5G",nil,GeraMD5Reg() ) Obs1: Eu utilizo ADS Obs2: Eu modifiquei a tradução do replace para ele executar uma função antes e uma após o replace SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Samir, no PPO fica assim mas nao quer dizer que a RDD trata assim. Para saber só no fonte da RDD pra ver como ela realmente trata o buffer dos campos nas tabelas, como falei, quando fiz a RDD usando USRRDD era por NUMERO. Fiz vários testes com DBFCDX, RMDBFCDX, SIX, DBFCDX e nenhuma teve melhora significativa. Abraço citação:Tinha até colocado errado... aqui um exemplo de como fica no PPO um replace meu: VerMd5Reg(); _FIELD->EDESCRICAO := cEDescricao; a1b2c3 := IIF( "EDESCRICAO" == "MRDE5G",nil,GeraMD5Reg() ) Obs1: Eu utilizo ADS Obs2: Eu modifiquei a tradução do replace para ele executar uma função antes e uma após o replace SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 19, 2011 Author Report Share Posted January 19, 2011 Eduardo, como não tenho o fonte do RDD do ADS, acredito que tenho que me guiar pelo PPO, pois ele é o mais perto do objeto final que consigo chegar SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 19, 2011 Report Share Posted January 19, 2011 Não, o codigo gerado em PPO em nada TRADUZ como é feito internamente pela RDD. Se voce desejar e também quando tiver um tempo veja os exemplos de uso da USRRDD. É uma estrutura basica de como funciona internamente uma rdd, é bem legal e o codigo é xHarbour que estamos acostumados. Abraço e se conseguir algo fora daqui por favor, poste a solucao, o que voce precisa acho que muitos aqui (inclusive eu) preciso também. Eduardo Motta citação:Eduardo, como não tenho o fonte do RDD do ADS, acredito que tenho que me guiar pelo PPO, pois ele é o mais perto do objeto final que consigo chegar SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 21, 2011 Author Report Share Posted January 21, 2011 @Emotta, onde encontro os prgs? Ainda aguardando outras dicas... que NÃO USE APPEND FROMid=red>id=size5> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert Quote Link to comment Share on other sites More sharing options...
emotta Posted January 21, 2011 Report Share Posted January 21, 2011 Baixe os fontes do xHarbour e veja USRRDD.PRG Na página do xharbour.org tem um link para baixar os fontes, tem também via CVS mas eu nunca usei. abraço, citação:@Emotta, onde encontro os prgs? Ainda aguardando outras dicas... que NÃO USE APPEND FROMid=red>id=size5> SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black>"Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 21, 2011 Author Report Share Posted January 21, 2011 Achei o comando AddField() mas ainda não consegui identificar os arquivos necessários para a função ser usada corretamente. SamirSSabreu@gmail.com samirabreu@hotmail.com Skype: SamirAbreu xHarbour 1.1.0 + FwXh 8.02id=black> "Acreditar é mais fácil do que pensar: Daà existem muito mais crentes do que pensadores.†Bruce Calvert 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.