Jump to content
Fivewin Brasil

Como adicionar um campo a uma tabela?


sambomb

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

dentinho.jpg?rnd=0.830315402649066

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=black>

"Acreditar é mais fácil do que pensar: Daí existem muito mais crentes do que pensadores.†Bruce Calvert

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

@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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

@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

Link to comment
Share on other sites

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.02

id=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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...