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