Cambios de comportamiento de SQL SELECT en Visual FoxPro 8.0

Seleccione idioma Seleccione idioma
Id. de artículo: 813361 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe los cambios de comportamiento de ejecución de instrucción SQL SELECT en Microsoft Visual FoxPro 8.0 (VFP8). Este artículo explica por qué se han realizado estos cambios y cómo cambiar las instrucciones SELECT para evitar errores que pueden surgir debido a estos cambios de comportamiento de. Este artículo también contiene soluciones para estos errores.

Más información

Se realizan varios cambios al comportamiento de instrucción SQL SELECT en VFP8 comparado con versiones anteriores de Visual Fox Pro. Los cambios están diseñados para evitar datos ambiguos que devuelven las versiones anteriores de Visual FoxPro (VFP). Puede configurar este comportamiento. Por lo tanto, puede utilizar el modo de compatibilidad de Visual FoxPro 7.0, o Visual FoxPro 8.0 modo. El modo predeterminado es Visual FoxPro 8.0.

En las secciones siguientes se describen los cambios en las cláusulas de varias de las instrucciones SELECT .

Cambios en las cláusulas GROUP BY y HAVING

En VFP8, la cláusula GROUP BY enumera todos los campos en la lista campos de instrucción de SQL SELECT , excepto para aquellos campos que están contenidas en las funciones de agregado.

En versiones anteriores de VFP, no puede recibir el resultado que desea si la cláusula GROUP BY no contiene todos los campos que se mencionan en la instrucción SQL SELECT excepto para los campos contenidos en las funciones de agregado.

Considere el ejemplo siguiente:

Una tabla clientes contiene información sobre los clientes. Esta tabla contiene información como cliente, compañía, dirección, región y país. Puede haber más de un cliente de una región o país concreto. En versiones anteriores de VFP, si intenta seleccionar toda la información al cliente que se agrupa por país, el conjunto de resultados devuelve sólo un cliente registro por país. Este registro normalmente es el último registro de cliente en el orden de inserción.

Ejecutar la consulta siguiente en las versiones anteriores de VFP:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
SELECT * FROM Customer GROUP BY Country
este código se ejecuta correctamente y devuelve un registro de cliente por país. Esto puede no devolver la salida que desee porque esto devuelve a sólo un cliente por país y no tiene ningún control sobre el registro de cliente que se devuelve para un país determinado.

En VFP8, este tipo de instrucción SELECT produce un error. Si ejecuta esta instrucción SELECT en VFP8, recibirá el siguiente mensaje de error:
SQL: La cláusula GROUP BY es falta o no es válido.

Éste es el error 1807.

El código siguiente se ejecuta en VFP8 sin errores:
SELECT Count(*), Country FROM Customer GROUP BY Country
siguiente es otro ejemplo:
SELECT Region, Country FROM Customer GROUP BY Country
esta instrucción SELECT devuelve datos ambiguos en las versiones anteriores de VFP, (por ejemplo, devuelve un registro de región único para cada país). Esta instrucción SELECT también provoca el error 1807 en VFP8. Para devolver datos correctos, puede reescribir esta instrucción SELECT como sigue:
SELECT Region, Country FROM Customer GROUP BY Region, Country
si utiliza una cláusula HAVING junto con una cláusula GROUP BY, GROUP BY cláusula listas cada campo en la cláusula HAVING excepto para los campos que están contenidas en las funciones de agregado. Cualquier infracción de esta condición provoca la mensaje de error en VFP8 siguientes:
SQL: La cláusula HAVING no es válida.
Éste es el error 1803.

Nota Si no utiliza una cláusula GROUP BY y utilizar sólo un HAVING cláusula, esta condición no es aplicable. En el caso posterior, la cláusula HAVING comporta como una cláusula WHERE, mientras la instrucción SQL SELECT no contiene las funciones agregadas

El código siguiente utiliza una cláusula HAVING y genera un error en VFP8. Este código se ejecuta correctamente en versiones anteriores de VFP, sin embargo, podría no producir el resultado que desee.
SELECT  Count(*), Region, Country FROM  Customer GROUP BY Country HAVING NOT Empty(Region)
Esta instrucción SELECT no es muy eficaz porque puede haber más de una región de cada agrupación de país. El siguiente es el código corregido que se ejecuta correctamente en VFP8 y genera corregir resultados:
SELECT Count(*), Region, Country FROM  Customer GROUP BY Country, Region HAVING NOT Empty(Region)

Cambios en la cláusula DISTINCT


En VFP8, no puede utilizar la cláusula DISTINCT con campos Memo o General en una instrucción SQL SELECT . Si ejecuta una cláusula SELECT DISTINCT? cuando la lista de campos contiene uno o más campos Memo o General , recibirá el siguiente mensaje de error:
Operación no es válido para un campo Memo, general o imagen.
Éste es el error 34. Para evitar este error, incluya la expresión de campo Memo dentro de una función como la función PADR() o la función ALLTRIM() . Para obtener más información acerca de estas funciones, consulte la Ayuda de Microsoft Visual FoxPro.

Ejecutar el código siguiente en las versiones de VFP7 y VFP8 a comprobar el cambio:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
SELECT DISTINCT Title, Notes FROM Employee
en versiones anteriores de VFP, la instrucción SQL SELECT que se describe anteriormente en este artículo se ejecuta sin errores. Sin embargo, se omite el contenido de la Nota y los campos General . Recibirá un único registro para el título = 'Representante de ventas' en el ejemplo siguiente, aunque hay más de esos registros de la tabla empleados:
SELECT DISTINCT Title, Notes FROM Employee WHERE Title = 'Sales Representative'
este comportamiento puede conducir a resultados inesperados si los campos Memo los campos sólo no distintos en la lista SELECT , como en el caso anterior. Si no hay ningún campo de clave y tiene varios valores de campo de Nota donde los restantes valores de campo son distintos, normalmente recibirá los registros o apellidos de los campos Memo correspondiente a los otros valores de campo distintos.

SELECT ? UNION cambios

IN VFP8, no puede utilizar una cláusula SELECT de SELECT ? UNION con campos Memo o General en una instrucción SQL SELECT . Si ejecuta una cláusula SELECT de SELECT ? UNION cuando la lista de campos contiene uno o más campos Memo o General , recibirá el siguiente mensaje de error:
Operación no es válido para un campo Memo, general o imagen.
Éste es el error 34.

Esto ocurre porque la cláusula UNION agrega una cláusula DISTINCT implícita. Para evitar este error, puede utilizar la cláusula UNION ALL en lugar de la cláusula UNION.

Ejecutar el código siguiente en VFP7 y VFP8 para demostrar este cambio: ()
OPEN DATABASE Home()+'Samples\Data\Testdata'
SELECT Emp_id, Notes FROM Employee WHERE  Title = 'Sales Representative' 
UNION
SELECT Emp_id, Notes FROM Employee WHERE Title = 'Sales Manager'
este comportamiento está relacionado con el comportamiento de SELECT DISTINCT que se describe anteriormente en este artículo.

En versiones anteriores de VFP, el anterior mencionado instrucción SELECT se ejecuta sin errores, pero se omite el contenido de los campos Memo o General . Este comportamiento puede conducir a resultados inesperados si el campo sólo que no son distinto o los campos en la lista SELECT campos Memo . Si no hay ningún campo de clave y que tenga varios valores de campo de Memo donde los restantes valores de campo son distintos, normalmente recibe los registros o apellidos de los campos Memo que corresponden a los otros valores de campo distintos.

SELECT ? como cambios

En VFP7 y versiones anteriores, el carácter comodín de " _ " en una cláusula SELECT ? LIKE no se implementa correctamente. El carácter comodín de " _ " no se utiliza para comparar un espacio en blanco. Este problema se corrigió en VFP8.

Ejecutar el código siguiente en VFP7 y VFP8 comprobar el comportamiento:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
CREATE TABLE LikeTest (Field1 Char(5), Field2 Char(15))

INSERT Into LikeTest VALUES ('1', sys(2015))
INSERT Into LikeTest VALUES ('12 ', sys(2015))
INSERT Into LikeTest VALUES ('123', sys(2015))
INSERT Into LikeTest VALUES ('1234', sys(2015))
INSERT Into LikeTest VALUES ('234', sys(2015))
SELECT Field1 FROM LikeTest WHERE Field1 LIKE '1__'
en VFP7, SELECT devuelve un único registro con '123'.
En VFP8, SELECT devuelve 3 registros, '1', '12' y '123'.

Configurar el comportamiento de SELECT de SQL

Los errores que ocurren en VFP8 para varias instrucciones SQL SELECT son ayudar a Asegúrese de que los datos que se devuelven están correctos. Puede ejecutar cualquiera de las SELECT instrucciones que se describen anteriormente en este artículo (que se ejecutan sin errores en las versiones anteriores de Visual FoxPro) en VFP8 sin errores mediante VFP7 modo de compatibilidad.

Puede configurar el modo de compatibilidad de VFP7 cambiando el comportamiento del motor de datos de SQL. Utilice el siguiente para configurar VFP8 trabajar en modo de VFP7.

Ejecutar cualquiera de los siguientes comandos en VFP8:
SET ENGINEBEHAVIOR 70
- o -
SYS(3099,70)

Nota Tal como se explicó en las secciones anteriores, ver cada instrucción SELECT para asegurarse de que recibirá los conjuntos de resultado correcto si decide ejecutar las instrucciones SELECT en modo de compatibilidad de VFP7.

Para volver a VFP8 modo, ejecutar cualquiera de los siguientes comandos en VFP8:
SET ENGINEBEHAVIOR 80
- o -
SYS(3099, 80)

Comportamiento de SQL SELECT en VFP8

Para asegurarse de que SQL SELECT comportamiento es correcto en Visual FoxPro 8.0, siga estos pasos:
  1. Ver cada instrucción SELECT que provoca errores y determinar qué cláusula provocó el error (compruebe GROUP BY, DISTINCT, UNION o LIKE).
  2. Cambie las instrucciones SELECT siempre que sea posible para evitar cambiar el ENGINEBEHAVIOR a modo de compatibilidad de VFP7.
  3. Compruebe que recibir los datos correctos que espera cualquier instrucción SELECT que hace que los errores y requieren el uso de SET ENGINEBEHAVIOR 70.
  4. Puede establecer globalmente ENGINEBEHAVIOR. <value>Para ello, utilice ENGINEBEHAVIOR = <valor> en su archivo de configuración Config.fpw .

Referencias

Para obtener más información acerca de cambios de instrucción SQL SELECT en VFP8, vea los temas siguientes en la Ayuda de Visual FoxPro 8.0:

"Cambios de comportamiento desde Visual FoxPro 7.0"
"SET ENGINEBEHAVIOR comando"

Propiedades

Id. de artículo: 813361 - Última revisión: jueves, 27 de enero de 2005 - Versión: 2.2
La información de este artículo se refiere a:
  • Microsoft Visual FoxPro 8.0 Professional Edition
Palabras clave: 
kbmt kbmsg kbdatabase kbinfo KB813361 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 813361

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com