FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Copiado a toda máquina !
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Copiado a toda máquina !
Posted: Fri Mar 23, 2012 05:44 PM
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 :-)

** 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 (fw): Select all Collapse
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.
Posts: 389
Joined: Mon Oct 13, 2008 11:26 AM
Re: Copiado a toda máquina !
Posted: Fri Mar 23, 2012 06:33 PM

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
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Copiado a toda máquina !
Posted: Mon Mar 26, 2012 12:09 PM
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 (fw): Select all Collapse
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

Continue the discussion