28 de noviembre de 2005

Comparar dos registros

El siguiente código muestra tres formas de comparar los valores de dos registros, en el mismo cursor o en dos cursores con la misma estructura.

1) Creando un objeto con SCATTER NAME por cada registro a ser comparado, hacemos la comparación mediante la función COMPOBJ(). El comando SCATTER incluye una completa flexibilidad para detallar un grupo específico de campos, incluyendo o excluyendo campos Memo o General.

2) Con la función CURSORTOXML() generando una cadena XML por cada registro a ser comparado, hacemos luego una simple comparación de cadenas entre ambas. CURSORTOXML() no soporta personalizar la lista de campos.

3) Generando un "checksum" con la función SYS(2017) por cada registro a ser comparado, SYS(2017) incluye una completa flexibilidad para detallar un grupo específico de campos, incluyendo o excluyendo campos Memo o General. De las tres técnicas, esta es mucho mas rápida y fácil de codificar, pero es probablemente la menos conocida de las tres. Note que SYS(2017) fue agregado a VFP antes de VFP8, pero fue mejorado en VFP8 para manejar cadenas grandes.

TRY
  USE (_Samples+"Northwind\Customers") IN 0
CATCH
ENDTRY
IF NOT USED("Customers")
  MESSAGEBOX("No se pudo abrir la tabla Customers en _Samples",16,"Aviso")
  RETURN
ENDIF

******************************************
*  Comparar objetos
******************************************
LOCAL loFirstRecord, loSecondRecord
SELECT Customers
LOCATE 
SCATTER MEMO NAME loFirstRecord
SKIP
SCATTER MEMO NAME loSecondRecord
IF COMPOBJ(loFirstRecord,loSecondRecord)
  MESSAGEBOX("Los registros son iguales",48,"Aviso")
 ELSE
  MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF

******************************************
*  Comparar XML
******************************************
ERASE FirstRecord.XML
ERASE SecondRecord.XML
SELECT Customers
LOCATE 
CURSORTOXML("Customers","FirstRecord.XML",1,512,1)
SKIP
CURSORTOXML("Customers","SecondRecord.XML",1,512,1)
IF FILETOSTR("FirstRecord.XML") == FILETOSTR("SecondRecord.XML")
  MESSAGEBOX("Los registros son iguales",48,"Aviso")
 ELSE
  MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF
ERASE FirstRecord.XML
ERASE SecondRecord.XML

******************************************
*  Comparar SYS(2017)
******************************************
LOCAL lnFirstRecord, lnSecondRecord
SELECT Customers
LOCATE 
lnFirstRecord = SYS(2017,"",0,3)
SKIP 
lnSecondRecord = SYS(2017,"",0,3)
IF lnFirstRecord = lnSecondRecord
  MESSAGEBOX("Los registros son iguales",48,"Aviso")
 ELSE
  MESSAGEBOX("Los registros son distintos",48,"Aviso")
ENDIF

USE IN Customers
RETURN

VFP Tips & Tricks - Drew Speedie

No hay comentarios. :

Publicar un comentario