Alterações de comportamento SQL SELECT no Visual FoxPro 8.0

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 813361
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Este artigo descreve as alterações de comportamento para execução de instrução SQL SELECT no Microsoft Visual FoxPro 8.0 (VFP8). Este artigo descreve por que essas alterações foram feitas e como alterar suas instruções SELECT para evitar erros que podem ocorrer devido a essas alterações de comportamento. Este artigo também contém soluções alternativas para esses erros.
Mais Informações
Várias alterações são feitas ao comportamento de instrução SQL SELECT em VFP8 em comparação com versões anteriores do Visual Fox Pro. As alterações são projetadas para impedir ambíguos dados retornadas de versões anteriores do Visual FoxPro (VFP). Você pode configurar esse comportamento. Portanto, você pode usar modo de compatibilidade do Visual FoxPro 7.0 ou Visual FoxPro 8.0 modo. O modo padrão é Visual FoxPro 8.0.

As seções a seguintes descrevem as alterações nas várias cláusulas de instruções SELECT .

Alterações para as cláusulas GROUP BY e HAVING

Em VFP8, a cláusula GROUP BY lista todos os os campos na SQL SELECT instrução lista campos, exceto para os campos que estão contidas em funções agregadas.

Nas versões anteriores para Visual FoxPro, você não pode receber a saída que você deseja se a cláusula GROUP BY não contém todos os campos que são mencionados na instrução SQL SELECT , exceto para campos contidos em funções agregadas.

Considere o seguinte exemplo:

Uma tabela de cliente contém informações sobre os clientes. Esta tabela contém informações como CÓDIGODOCLIENTE, empresa, endereço, região e país. Pode haver mais de um cliente para uma determinada região ou país. Nas versões anteriores para Visual FoxPro, se você tentar selecionar todas as informações cliente que são agrupadas por país, o conjunto de resultados retornará somente um cliente registro por país. Este registro costuma ser o último registro do cliente na ordem de inserção.

Executar a consulta seguinte em versões anteriores para Visual FoxPro:
OPEN DATABASE Home() + 'Samples\Data\Testdata'SELECT * FROM Customer GROUP BY Country
este código seja executado com êxito e retorna um registro de cliente por país. Isso não pode retornar a saída que desejar, pois isso retorna apenas um clientes por país e você não tem nenhum controle sobre o registro de cliente que é retornado para um país específico.

Em VFP8, esse tipo de instrução SELECT causa um erro. Se você executar essa instrução SELECT no VFP8, você receber a seguinte mensagem de erro:
SQL: Cláusula GROUP BY está ausente ou inválido.

Isso é erro 1807.

O código a seguir executa no VFP8 sem erros:
SELECT Count(*), Country FROM Customer GROUP BY Country
a seguir é outro exemplo:
SELECT Region, Country FROM Customer GROUP BY Country
essa instrução SELECT retorna dados ambíguos em versões anteriores para Visual FoxPro, (por exemplo, ela retorna um registro de região único para cada país). Essa instrução SELECT também causa erro 1807 no VFP8. Para retornar dados corretos, você pode reescrever essa instrução SELECT da seguinte maneira:
SELECT Region, Country FROM Customer GROUP BY Region, Country
se você usar uma cláusula HAVING juntamente com uma cláusula GROUP BY, GROUP BY cláusula listas todos os campos na cláusula HAVING, exceto para campos que estão contidos em funções agregadas. Qualquer violação dessa condição gera a seguinte mensagem de erro no VFP8:
SQL: Cláusula HAVING é inválida.
Isso é erro 1803.

Observação Se você não usar uma cláusula GROUP BY e somente uma HAVING cláusula, essa condição não se aplica. No caso mais recente, a cláusula HAVING comportamento o mesmo que uma cláusula WHERE, desde que a instrução SQL SELECT não contém todas as funções agregadas

O código a seguir usa uma cláusula HAVING e gera um erro no VFP8. Esse código é executado com êxito em versões anteriores para Visual FoxPro, no entanto, ela pode não lhe a saída que você deseja.
SELECT  Count(*), Region, Country FROM  Customer GROUP BY Country HAVING NOT Empty(Region)
Essa instrução SELECT não é muito eficiente porque pode haver mais de uma região em cada agrupamento de país. A seguir está o código corrigido seja executado com êxito VFP8 e produz corrigir resultados:
SELECT Count(*), Region, Country FROM  Customer GROUP BY Country, Region HAVING NOT Empty(Region)

Alterações feitas a cláusula DISTINCT


VFP8, não é possível usar a cláusula DISTINCT com campos Memorando ou Geral em uma instrução SQL SELECT . Se você executar uma cláusula SELECT DISTINCT… quando sua lista de campos contém um ou mais campos Memorando ou Geral , você receber a seguinte mensagem de erro:
A operação é inválida para um campo Memorando, geral ou imagem.
Isso é erro 34. Para contornar este erro, coloque a expressão de campo de Memorando dentro de uma função, como a função PADR() ou a função ALLTRIM() . Para obter mais informações sobre essas funções, consulte a Ajuda do Microsoft Visual FoxPro.

Executar o código seguinte nas versões para VFP7 e VFP8 para verificar a alteração:
OPEN DATABASE Home() + 'Samples\Data\Testdata'SELECT DISTINCT Title, Notes FROM Employee
em versões anteriores para Visual FoxPro, a instrução SQL SELECT que é descrita anteriormente neste artigo for executada sem erros. No entanto, o conteúdo de Memorando e os campos Geral é ignorados. Você recebe um único registro por título = 'Representante de vendas' no exemplo a seguir, mesmo que haja mais esses registros na tabela Funcionários:
SELECT DISTINCT Title, Notes FROM Employee WHERE Title = 'Sales Representative'
esse comportamento pode levar a resultados inesperados se a campos de Memorando são os campos apenas não-distintos na lista SELECT , como no caso anterior. Se não há nenhum campo de chave, e você tiver vários valores de campo de Memorando onde os valores de campo restantes são distintos, geralmente você recebe os registros ou sobrenome de campos Memorando correspondente a outros valores de campo diferentes.

SELECT … UNION alterações

IN VFP8, não é possível usar uma cláusula SELECT … UNION SELECT com campos Memorando ou Geral em uma instrução SQL SELECT . Se você executar uma cláusula SELECT … UNION SELECT quando sua lista de campos contém um ou mais campos Memorando ou Geral , você receber a seguinte mensagem de erro:
A operação é inválida para um campo Memorando, geral ou imagem.
Isso é erro 34.

Isso ocorre porque a cláusula UNION adiciona uma cláusula DISTINCT implícita. Para contornar este erro, você pode usar a cláusula UNION ALL em vez da cláusula UNION.

Execute o seguinte código no VFP7 e VFP8 para demonstrar essa alteração:
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'
esse comportamento está relacionado ao comportamento SELECT DISTINCT discutido anteriormente neste artigo.

Nas versões para Visual FoxPro anteriores, o anterior mencionado instrução SELECT for executada sem erros, mas o conteúdo de quaisquer campos Memorando ou Geral é ignorados. Esse comportamento pode levar a resultados inesperados se o campo somente não-distinto ou campos na lista SELECT campos de Memorando . Se não há nenhum campo de chave, e você tem vários valores de campo de Memorando onde os valores de campo restantes são distintos, você receberá normalmente os registros ou sobrenome de campos de Memorando que correspondem aos valores distintos de campo.

SELECT … como alterações

No VFP7 e em versões anteriores, o caractere curinga de " _ " em uma cláusula SELECT … como não foi corretamente implementado. O caractere curinga " _ " não é usado para comparar um espaço em branco. Esse problema é corrigido no VFP8.

Execute o seguinte código no VFP7 e VFP8 para verificar o comportamento:
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__'
in VFP7, SELECT retorna um único registro com '123'.
Em VFP8, SELECT retorna 3 registros, '1', '12' e '123'.

Configurar comportamento SQL SELECT

Os erros que ocorrem no VFP8 para várias instruções SQL SELECT são ajudam a tornar-se de que os dados que são retornados estão corretos. Você pode executar qualquer uma das instruções SELECT descritos neste artigo (que executado sem erros em versões anteriores do Visual FoxPro) em VFP8 sem erros usando o modo de compatibilidade VFP7.

Você pode configurar modo de compatibilidade VFP7 alterando o comportamento do mecanismo de dados SQL. Use o seguinte para configurar VFP8 trabalhar no modo de VFP7.

Execute qualquer um dos seguintes comandos em VFP8:
SET ENGINEBEHAVIOR 70
- ou -
SYS(3099,70)

Observação Conforme discutido em seções anteriores, exiba cada instrução SELECT para certificar-se que você recebe os conjuntos de resultado correto se você decidir executar instruções SELECT no modo de compatibilidade VFP7.

Para reverter para VFP8 modo, executar qualquer um dos seguintes comandos em VFP8:
SET ENGINEBEHAVIOR 80
- ou -
SYS(3099, 80)

Comportamento SQL SELECT no VFP8

Certifique-se que SQL SELECT comportamento está correto no Visual FoxPro 8.0, execute estas etapas:
  1. Exibir cada instrução SELECT que causa erros e determinar qual cláusula causou o erro (UNION verificar GROUP BY, DISTINCT, ou como).
  2. Altere as instruções SELECT sempre que possível para evitar a alteração a ENGINEBEHAVIOR para modo de compatibilidade VFP7.
  3. Verifique se você recebe os dados corretos que você espera do qualquer instrução SELECT que faz com que os erros e exige usando SET ENGINEBEHAVIOR 70.
  4. Você pode definir ENGINEBEHAVIOR globalmente. <value>Para fazer isso, use ENGINEBEHAVIOR = <valor> no seu arquivo de configuração Config.fpw .
Referências
Para obter mais informações sobre alterações de instrução SQL SELECT no VFP8, consulte os seguintes tópicos na Ajuda do Visual FoxPro 8.0:

"Alterações de comportamento desde FoxPro 7.0"
"SET ENGINEBEHAVIOR comando"

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 813361 - Última Revisão: 12/08/2015 01:56:00 - Revisão: 2.2

Microsoft Visual FoxPro 8.0 Professional Edition

  • kbnosurvey kbarchive kbmt kbmsg kbdatabase kbinfo KB813361 KbMtpt
Comentários