FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Comparar Dos Estructuras
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Comparar Dos Estructuras
Posted: Fri Jul 03, 2015 05:42 PM
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 (fw): Select all Collapse
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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Comparar Dos Estructuras
Posted: Fri Jul 03, 2015 06:01 PM

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 los campos 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 algunos casos no importa que los campos 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.

Posts: 211
Joined: Wed Jul 16, 2008 12:59 PM
Re: Comparar Dos Estructuras
Posted: Sat Jul 04, 2015 01:07 PM
Leandro:

yo uso la siguiente funcion para casos similares
Code (fw): Select all Collapse
//-----------------------------------------------------------------//
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

Continue the discussion