Page 1 of 1

Comparar Dos Estructuras

Posted: Fri Jul 03, 2015 5:42 pm
by leandro
Buenas Tardes para Todos

Lo que pasa es que he estado intentando comparar las estructuras de dos dbf... lo que pasa es que requiero importar información de un dispositivo móvil. Pero pues antes de realizar el proceso debo comparar que por los menos las dos dbf tenga la estructtura correcta. Lo he intentado de la siguiente manera. Pero Siempre me dice que son diferentes. Que hago mal?

Code: Select all

IF FILE (".\dbfs\lamsys\corte.DBF")
  USE ".\dbfs\lamsys\corte" ALIAS d_maestr NEW EXCLUSIVE
  SELE d_maestr
  vEst1 := dbstruct()
  xbrowse(vEst1)
  d_maestr->(DBCloseArea())
ENDIF

vGruta:=cGetFile("*.dbf","Seleccione Archivo")
If !Empty(vGruta)
  If !FILE (vGruta)
    MsgAlert("Archivo No Encontrado"+CRLF+;
             "Intente Nuevamente",oLamcla:mDato)
  Else
    USE &vGruta ALIAS d_corte NEW EXCLUSIVE
    SELE d_corte
    vEst2 := dbstruct()
    xbrowse(vEst2)
    if vEst1==vEst2
      msginfo("Correcto")
    else
      MsgAlert("Dbf Incorrecta, La estructura No"+CRLF+;
               "Coincide Intente Nuevamente",oLamcla:mDato)
    endif
    d_corte->(DBCloseArea())
  Endif
Endif
 
Es mas muestro en pantalla las dos estructuras con un xbrowse() y veo que son exactamente iguales.

Re: Comparar Dos Estructuras

Posted: Fri Jul 03, 2015 6:01 pm
by hmpaquito
Dos cosas,

Primero. Los arrays (tablas, matrices, arreglos, etc), su contenido, *no* se compara con ninguno de los operadores de comparacion. El operador de comparacion aplicado a arrays creo que devuelve .f. si las dos variables no son el mismo array. Para comparar dos arrays, su contenido, hay que "bajar", con una funcion de comparacion (recursiva) a sus elementos. Es probable que aqui en el foro haya alguna.

Segundo. Yo tendria en cuenta que _ pueden no estar en el mismo orden, tambien que pueden no tener la misma longitud de campo, que por ejemplo en numericos puede no ser ningun problema. Tambien contemplaria la posibilidad de que en _ no importa que _ no existan en las dos tablas: se copiarian solo los que si existieran: ello posibilitaria un margen para no tener que tener todo actualizado al dia. Evidentemente no hablo de campos clave.

Un saludo.

Re: Comparar Dos Estructuras

Posted: Sat Jul 04, 2015 1:07 pm
by RSalazarU
Leandro:

yo uso la siguiente funcion para casos similares

Code: Select all

//-----------------------------------------------------------------//
Function aIgual(a1,a2,lExact)
//compara 2 arreglos a1 y a2
//lExact=.T. => LEN(a1)=LEN(a2)
//lExact=.F. => LEN(a1)puede ser <= LEN(a2) y solo comparamos hasta LEN(a1)
local i, lIgual := .T.

   default lExact := .F.

   if valtype(a1)="A" .AND. valtype(a2)="A"

      if LEN(a1)==LEN(a2) .OR. (!lExact .AND. LEN(a1) < LEN(a2)) //si lExact=.F. solo comparamos hasta LEN(a1)
         for i=1 to len(a1)
            if valtype(a1[i])="A"
               if !aIgual(a1[i],a2[i],lExact)
                  lIgual := .F.
              exit
           endif
            else
               if !(a1[i]==a2[i])
                  lIgual := .F.
              exit
               endif
            endif
         next
      else
         lIgual := .F.
      endif
   else
      lIgual := .F.
   endif

return lIgual
 
Espero te sirva.

Atentamente,

Rolando
Cochabamba, Bolivia