Histórico da Página
...
Portuguese | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Função: ChangeQuery
Descrição: Esta função tem como objetivo retornar uma query modificada de acordo a escrita adequada para o banco de dados em uso, a partir da query originalmente informada. Programa Fonte: APLIB070.PRW Sintaxe: ChangeQuery ( cQuery ) --> cNewQuery Retorno: cNewQuery
Observações Requisitos de sintaxe da Query a ser avaliada
Limitações: A ChangeQuery possui uma limitação quanto a algumas palavras reservadas fora do contexto delas, pois por padrão, ao encontrar certas palavras reservadas a ChangeQuery dá automaticamente um espaço, logo isso pode vir a quebrar a query. Exemplo: SELECT ZZZ_FROM, ZZZ_TO FROM ZZZ010 Veja que no exemplo acima, existe a palavra FROM no campo ZZZ_FROM, por conta disso, essa query não será parseada corretamente na ChangeQuery e será retornada como SELECT ZZZ_ FROM, ZZZ_TO FROM ZZZ010 Essa situação ocorre com as seguintes palavras reservadas: - SELECT - FROM - WHERE - ORDER BY - UNION. Este comportamento ocorre inclusive para conteúdo de campos na query. Essa limitação não pode ser corrigida por conta do legado do Protheus, então é necessário cuidado no momento de criar os campos, evitando assim tais nomes. Pode-se também utilizar a classe FWPreparedStatement, protegendo os campos e valores que se enquadram nesta situação. Adequações realizadas X Banco de Dados
Todos os bancos : - Ao ser recodificada, são removidos espaços em branco não significativos da query. Informix : - Caso a query possua a instrução ORDER BY contendo nomes de campos do select de origem, ela será remontada contendo a seqüência sequência numérica correspondente à ordem dos campos originais da query. DB2 ( Todos, inclusive TOP2 e TOP4 no AS400 ) - Ao final da query, é acrescentada automaticamente a expressão "FOR READ ONLY". DB2 AS400 ( com TOPConnect 2 no AS400 ) - Caso a query possua a instrução ORDER BY contendo nomes de campos do select de origem, ela será remontada contendo a seqüência sequência numérica correspondente à ordem dos campos originais da query. Boas práticas e recomendações ao codificar uma QueryO desempenho e confiabilidade de uma query começam na forma através da qual ela foi escrita. Veja abaixo alguns pontos importantes de atenção às boas práticas de uso de query :
Exemplos /*O exemplo abaixo ilustra o comportamento da função ChangeQuery para diferentes bancos de dados. Execute este programa a partir de uma opção de Menu do ERP, em ambientes com TOPConnect e/ou TOTVSDBAccess, com diferentes bancos de dados. Para cada tipo de banco, serão realizadas as adequações necessárias na expressão.*/#INCLUDE "PROTHEUS.CH"User Function TSTQry()Local cQuery #IFDEF TOP cQuery := "SELECT CODIGO , (ID || SEQ) AS CHAVE FROM LIVROS " cQuery += "WHERE SUBSTRING(CONTROLE,5,2) = '02' AND NOME LIKE 'PROGRAMANDO%' " cQuery += "ORDER BY CODIGO" cQuery := ChangeQuery(cQuery) MsgInfo(cQuery,"ChangeQuery utilizando "+TCGetDB())#ELSE MsgStop("Função ChangeQuery() não disponível neste Ambiente.")#ENDIFReturn Parâmetros:
|