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
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.