Comparar Dos Estructuras

Post Reply
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Comparar Dos Estructuras

Post 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.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Comparar Dos Estructuras

Post 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.
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: Comparar Dos Estructuras

Post 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
Post Reply