Copiado a toda máquina !

Post Reply
hmpaquito
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Copiado a toda máquina !

Post by hmpaquito »

Vamos a intentar poner aquí un pequeño artículo, de unas pocas entregas, de un proceso que se repite mucho en los programas. La cosa va por la optimización del código enseñándole a pensar, al código digo :shock:

** Según posterior comentario de sambomb, modifico un poco el bucle para que no sea equivalente
a un simple COPY FILE o un APPEND FROM y asi poder ver mejor la situación donde aplicar el sistema.
Teniendo un bucle tal que así:

Code: Select all | Expand


SELECT (cAli)
SET SOFTSEEK ON
SEEK cClave1
SET SOFTSEEK OFF
DO WHILE !Eof()  .AND. Campo1 >= cClave1 .AND. Campo1 <= cClave2
   IF Campo2 == "x"
       SKIP
       LOOP
   ENDIF
   SELECT (cAliTmp)
   APPEND BLANK
   REPLACE Campo1 WITH (cAli)-> Campo1,;
                 Campo2 WITH (cAli)-> Campo2,;
                 Campo3 WITH (cAli)-> Campo3,;
                 Campo4 WITH (cAli)-> Campo4
   SELECT (cAli)
   SKIP
ENDDO
 


Tratariamos, 1º de hacerlo data driven, 2º hacerlo seguro y 3º darle velocidad.
Seguiremos.
Last edited by hmpaquito on Sat Mar 24, 2012 8:00 am, edited 1 time in total.
User avatar
sambomb
Posts: 388
Joined: Mon Oct 13, 2008 11:26 am
Location: Itaocara - RJ - Brasil

Re: Copiado a toda máquina !

Post by sambomb »

Se vai copiar TODO o banco de dados, use um copy file e depois de um pack(se necessário)
Email: SamirSSabreu@gmail.com
xHarbour 1.2.3 + Fwhh 20.2
hmpaquito
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Copiado a toda máquina !

Post by hmpaquito »

Pues siguiendo con lo que traiamos....

Ahora lo que hacemos es hacer un copiado data driven, es decir, se copiarán los campos, bien todos, bien sólo los que le digamos.
Utilizaremos una función para tal menester, así tenemos el proceso más encapsulado.


Code: Select all | Expand

SELECT (cAli)
SET SOFTSEEK ON
SEEK cClave1
SET SOFTSEEK OFF
DO WHILE !Eof()  .AND. Campo1 >= cClave1 .AND. Campo1 <= cClave2
   IF Campo2 == "x"
       SKIP
       LOOP
   ENDIF
   SELECT (cAliTmp)
   APPEND BLANK
   CopiaRegistro(cAli, Alias(), {"Campo1", "Campo2", "Campo3", "Campo4"})
   SELECT (cAli)
   SKIP
ENDDO


// aIncluir/ aExcluir.- Array con campos a incluir/ excluir de la copia del registro !!
FUNCTION CopiaRegistro(cAliOri, cAliDes, aIncluir, aExcluir)
Local nFCount:= (cAliDes)-> (FCount())
Local nPosOri
Local cCampo
Local nI

IF aIncluir != NIL
   FOR nI:= 1 TO Len(aIncluir)
      aIncluir[nI]:= Upper(aIncluir[nI])
   NEXT
ENDIF
IF aExcluir != NIL
   FOR nI:= 1 TO Len(aExcluir)
      aExcluir[nI]:= Upper(aExcluir[nI])
   NEXT
ENDIF

FOR nI:= 1 TO nFCount
   cCampo:= (cAliDes)-> (FieldName(nI))
   IF aIncluir != NIL .AND. Ascan(aIncluir, cCampo) == 0  
      LOOP
   ENDIF
   IF aExcluir != NIL .AND. Ascan(aExcluir, cCampo) >  0  
      LOOP
   ENDIF

   nPosOri:= (cAliOri)-> ( FieldPos(cCampo))
   IF nPosOri != 0
      (cAliDes)-> ( FieldPut(nI, (cAliOri)-> (FieldGet(nPosOri))))
   ENDIF
NEXT
RETURN NIL

 
Post Reply