You are on page 1of 4

8/4/2009

http://demintranet.microsiga.com.br/

Embedded SQL - Facilitador de Query's


Revis o: 2 8 /1 2 /2 0 0 6

Abrangncia Verso 8.11

O objetivo do Embedded SQL facilitar a escrita e leitura de query's. Foi definida uma sintaxe para que se possa escrever a query diretamente no cdigo ADVPL, sem a necessidade de fic ar concatenando pedaos de string para compor a string final. Disponibilidade do Recurso Este recurso est disponvel apenas no Protheus 8. A utilizao do Embedded SQL divide-se em : compilao do fonte, e execuo do fonte. Para ser possvel compilar um fonte com o cdigo escrito no formato Embedded, deve ser utilizado um Protheus, com Build igual ou superior a 7.00.050721p, em um ambiente com repositrio para TopConnect ( RPODB=TOP ). A utilia o deste recurso tambm depende da atualizao da LIB 811, superior a 'Lib 20050902 - 811'. Exemplo bsico - Fonte atual cQuery cQuery cQuery cQuery cQuery cQuery : 'SELECT SE2.E2_PREFIXO,SE2.E2_NUM ' += 'FROM '+RetSqlTable('SE2')+' SE2,'+RetSqlTable('QEK')+' QEK ' += 'WHERE SE2.E2_FILIAL= '+xfilial('SE2')+' AND ' += 'SE2.E2_PREFIXO<> ''+cPrefixo+'' AND ' += 'SE2.D_E_L_E_T_ = ' ' ' += 'ORDER BY '+RetSqlOrder('SE2')

dbUseArea(.T.,'TOPCONN',TcGenQry(,,cQuery),'E2TEMP',.T.,.T.) TCSetField('E2TEMP','E2_EMISSAO','D',8,0) Exemplo bsico - Utilizando Embedded SQL BeginSql alias 'E2TEMP' column E2_EMISSAO as Date %noparser% SELECT SE2.E2_PREFIXO,SE2.E2_NUM FROM %table:SE2% SE2,%table:QEK% QEK WHERE SE2.E2_FILIAL= %xfilial:SE2% AND SE2.E2_PREFIXO<> %exp:cPrefixo% AND SE2.%notDel% ORDER BY %Order:SE2% EndSql Caractersticas operacionais - Sintaxe O bloco onde ser escrito o Select deve sempre ser iniciado com 'BeginSql alias' e finalizado com 'EndSql'. Partes do c digo que devem ser substitudas aparecem entre os sinais de %. Estas expresses possuem tratamento especial em momento de execuo. Qualquer instruo colocada entre BEGINSQL ... ENDSQL, que no seja uma expresso %...% , ser inserida na query a ser enviada para o banco, de forma literal. Variveis, expresses, funes aparecem iniciando com %exp: %. Em column, especificar campos da query que so do tipo data, lgico ou numrico
microsiga.com.br/w_wEx011.apw?Pr 1/4

8/4/2009

http://demintranet.microsiga.com.br/

(DATE, LOGIC, NUMBER). Esta linha trocada por chamadas funo TCSetField. %noparser% indica que a query no deve passar pela funo 'ChangeQuery' antes de ser enviada ao banco de dados. Caso no especificado, o default a string da query ser passada automatic amente pela funo ChangeQuery. %table:<alias>% substituda por RetSqlName(<alias>) %notDel% substituda por D_E_L_E_T_= ' ' %Order:<alias>% substituda por SqlOrder(<alias>->(IndexKey())) H 3 opes para o %Order: 1. %Order: <cAlias> % traduzido para

SqlOrder(<cAlias>->(IndexKey())) 2. %Order: <cAlias>, <nIndice>% traduzido para

SqlOrder(<cAlias>->(IndexKey(<nIndic e>))) 3. %Order: <cAlias>, <cNick>% traduzido para

SqlOrder(<alias>->(DBNickIndexKey(<cNick>))) Limitao: No permitido incluir funes no meio do cdigo 'embedded'. Se precisar, o valor deve ser guardado em uma varivel antes do incio do BeginSql. Ex: tam_cp := GetE2ValorSize() BeginSql alias 'E2TEMP' column E2_EMISSAO as Date, E2_VALOR as Numeric(tam_cp,2) . . . EndSql Erros de Compilao Caso seja utilizado algum argumento invlido para especificar as colunas, ou erros de sintaxe nas expresses a serem transformadas para a montagem da query, a compilao do fonte interrompida com a ocorrncia 'Syntax Error', informando a linha onde a primeira ocorrncia foi encontrada. ENDSQL (Error C2001 Syntax error:) Caso a ocorrncia de compilao aponte diretamente para a linha do c digo-fonte, onde est escrita a instruo EndSql, verifique se existe algum espao em branco ou tabulao, a partir do incio da linha, antes da instruo EndSql. A verso atual desde ambiente no suporta esta declara o, exigindo que a instruo EndSql seja alinhada esquerda do fonte, sem espaos ou tabulaes. Erros de Execuo 'Query Argument Error : Alias [XXX] already in use.' Caso a instru o BeginSQL especifique um alias que j esteja aberto (em uso), a aplica o abortada com a ocorrncia de erro fatal acima, informando em XXX o alias utilizado. 'Query Argument Error : Invalid Value Type [X]' Caso alguma expresso informada na Query, atravs da tag %exp: ... %, retorne um valor de tipo diferente de 'C' Catacter, 'D' Data, 'N' Numrico, ou 'L' Lgico, a aplicao abortada com a oc orrncia de erro acima, onde o tipo do argumento inesperado
microsiga.com.br/w_wEx011.apw?Pr 2/4

8/4/2009

http://demintranet.microsiga.com.br/

mostrado em [X]. 'Type Mismach on +' Esta ocorrncia, se reproduzida, informar na pilha de chamadas o nmero da linha do cdigo-fonte correspondente instru o EndSQL. Ocorre caso alguma funo intermediria do engine do Embedded SQL, excluindo-se as funes especificadas na query com a sintaxe %exp: ... % , retornar um c ontedo no-caractere a ser ac rescentado na Query. Esta oc orrncia de mais difcil localizao, sendo til nestes casos a anlise do arquivo temporrio gerado pelo Protheus IDE, no momento da compilao. Help NOFUNCW - Funo __EXECSQL Caso um fonte com o Embedded SQL seja executado em um repositrio que no tenha sido atualizado, OU que no seja um Repositrio para o ambiente TOPConnect ( RPODB=TOP), a aplicao exibir a ocorrncia acima, indicando que a funo interna de execuo da Query no est presente no ambiente. Verifique se a lib est atualizada, e se o RPO em uso de um ambiente TOPConnect. Caractersticas operacionais - depurao Dada a montagem da Query, no possvel depurar o bloco do cdigo-fonte compreendido entre as instrues BeginSql e EndSql, no sendo considerados pontos de parada de depurao ( BreakPoints ), c aso colocados neste intervalo do cdigo. A colocao de pontos de parada deve ser realizada antes ou depois deste bloco. Funo auxiliar - GETLastQuery() Aps a abertura do cursor, no alias especificado, a funo GetLastQuery() retorna um array, com 5 elementos, onde esto disponveis as seguintes informaes sobre a Query executada : [1] [2] [3] [4] [5] cAlias - Alias usado para abrir o Cursor. cQuery - Query executada. aCampos - Array de campos c om critrio de converso especificados. lNoParser - Caso .T., no foi utilizada ChangeQuery() na String original. nTimeSpend - Tempo, em segundos, utilizado para a abertura do Cursor.

Exemplo mais completo ADVPL BeginSql alias 'E2TEMP' column E2_EMISSAO as Date, E2_VALOR as Numeric(tam_cp,2) column QEK_SKLDOC As Logical %noparser% SELECT SE2.E2_PREFIXO,SE2.E2_NUM, SE2.E2_FORNECE, SE2.E2_LOJA,SE2.E2_VALOR, SE2.D_E_L_E_T_ DEL1, QEK.D_E_L_E_T_ DEL2 , QEK.QEK_SKLDOC, SE2.R_E_C_N_O_ SE2RECNO FROM %table:SE2% SE2,%table:qeK% QEK WHERE SE2.E2_FILIAL= %xfilial:SE2% AND qek.%notDel% and SE2.E2_PREFIXO<> %exp:cPrefixo% AND SE2.E2_NUM<> %exp:(cAlias)->M0_CODIGO% AND SE2.E2_NUM<>45 AND SE2.E2_FORNECE=%exp:Space(Len(SE2->E2_FORNECE))% AND SE2.E2_EMISSAO<>%exp:MV_PAR06% AND SE2.E2_LOJA<>%exp:MV_PAR05% AND
microsiga.com.br/w_wEx011.apw?Pr 3/4

8/4/2009

http://demintranet.microsiga.com.br/

SE2.E2_VALOR<>%exp:MV_PAR04% AND qek.QEK_SKLDOC<>%exp:MV_PAR03% And SE2.%notDel% ORDER BY %Order:SE2,1% EndSql Fonte gerado pelo pr-compilador (PPO) __execSql('E2TEMP',' SELECT SE2.E2_PREFIXO,SE2.E2_NUM, SE2.E2_FORNECE, SE2.E2_LOJA,SE2.E2_VALOR, SE2.D_E_L_E_T_ DEL1, QEK.D_E_L_E_T_ DEL2 , QEK.QEK_SKLDOC, SE2.R_E_C_N_O_ SE2RECNO FROM '+RetSqlName('SE2')+' SE2, '+RetSqlName('QEK')+' QEK WHERE SE2.E2_FILIAL= '' +xFilial('SE2')+'' AND qek.D_E_L_E_T_= ' ' and SE2.E2_PREFIXO<> '+___SQLGetValue(CPREFIXO)+' AND SE2.E2_NUM<> '+___SQLGetValue((CALIAS)->M0_CODIGO)+' AND SE2.E2_NUM<>45 AND SE2.E2_FORNECE= '+___SQLGetValue(SPACE(LEN(SE2->E2_FORNECE)))+' AND SE2.E2_EMISSAO<> '+___SQLGetValue(MV_PAR06)+' AND SE2.E2_LOJA<> '+___SQLGetValue(MV_PAR05)+' AND SE2.E2_VALOR<> '+___SQLGetValue(MV_PAR04)+' AND qek.QEK_SKLDOC<> '+___SQLGetValue(MV_PAR03)+' And SE2.D_E_L_E_T_= ' ' ORDER BY '+ SqlOrder(SE2>(IndexKey(1))),{{'E2_EMISSAO','D',8,0},{'E2_VALOR','N',tam_cp,2},{'QEK_SKLDOC','L',1,0}},.T.)

Grupos Relacionados Principal / A Tecnologia Protheus / Banco de Dados / TopConnect

Topo da Pgina

microsiga.com.br/w_wEx011.apw?Pr

4/4

You might also like