NicaFox.
Como ya varios companeros han comentado, pasar como string las fechas a una consulta SQL es con mucho la forma menos recomendable de pasar valores tipo fecha (o cualquier otro tipo de valor, puestos al caso) a una consulta SQL.
La forma correcta y recomendable es pasar los valores como PARAMETROS, usando directamente la variable que contiene el valor, precedido por el signo ?. Aplicando a tu caso seria:
lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>='?ldDesde AND fecha<=?ldHasta'"
SQLEXEC(wConecion, lcSQL,"prueba")
Cuando tu pasas un parametro tipo DATE a una consulta SQL, y lo usas para compararlo contra una expresion DATETIME en SQL Server, el mismo servidor le anade la informacion faltante de hora (con 00:00:00) al valor tipo DATE recibido. Si no quisieras confiarte en esto, siempre puedes usar DTOT():
ldDesde = DTOT(Thisform.txtDesde.Value)
ldHasta = DTOT(Thisform.txtHasta.Value)
Finalmente, la unica consideracion que hay que tomar, en el caso especifico de una comparacion por rango de fecha, es que la hora de la fecha HASTA debe ser 23:59:59 en lugar de 00:00:00. Una vez mas, esto es perfectamente posible desde VFP sin hacer uso de la concateniacion:
ldHasta = DTOT(THISFORM.txtHasta.Value + 1) - 1
Basicamente lo que hacemos es sumarle un dia a la fecha hasta, convertir el valor a fecha hora y luego restarle un segundo para terminar en la fecha hasta original, pero con la hora 23:59:59.
El argumento principal a favor de pasar los parametros tipo DATE o DATETIME como valores fecha y no como cadenas, es que de esta forma dejamos que sea el driver ODBC el que se encargue de convertir esa fecha a un valor que sea entendible para el servidor de datos. Al hacerlo como concatenacion, logramos que funcione en ESE servidor, pero no hay garantia de que seguira funcionando si se cambia el tipo de base de datos a utilizar.
Saludos
Victor Espina