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. deve ser utilizada antes de abrir uma query, tanto em programas do software padrão como também em customizações. Este recurso permite que grande parte das queries codificadas para uma aplicação possam ser executadas em outros bancos de dados, sem a necessidade de escrever uma query diferente para cada banco. 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 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 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:
|