Bom dia galera!
Com relação a FWPreparedStatement [ http://tdn.totvs.com/display/PROT/FWPreparedStatement ], pergunto :
1)
essa classe implementa internamente Embedded SQL [ http://tdn.totvs.com/display/framework/Embedded+SQL ]
2)
para construção de querys devemos utilizar essa classe agora, e não mais usar construções "Embedded SQL"
O foco da pergunta é performance e boa prática (entenda-se boa prática o que é recomendado pela Totvs o uso, principalmente para novos desenvolvimentos)
Agradecido!
Só complementando com mais uma pergunta:
ainda é necessário usar a função ChangeQuery(), pois essa função não está implementada internamente na FWPreparedStatement
cQuery += “SELECT R_E_C_N_O_”
cQuery += GetFromQryAlias(cTable)
cQuery += GetWhereQryAlias(cTable, cFilter)
oStatement := FWPreparedStatement():New(cQuery)
cQuery := oStatement:getFixQuery()
cQuery := ChangeQuery(cQuery)
MPSysOpenQuery(cQuery, @cQryAlias)
oStatement:Destroy()
FwFreeObj(oStatement)
///////
Static Function createQueryAlias(cQryAlias, cTable, cFilter)
Local oStatement
Local cQuery := ""
cQuery += "SELECT RE_C_N_O"
cQuery += GetFromQryAlias(cTable)
cQuery += GetWhereQryAlias(cTable, cFilter)
oStatement := FWPreparedStatement():New(cQuery)
cQuery := oStatement:getFixQuery()
cQuery := ChangeQuery(cQuery)
MPSysOpenQuery(cQuery, @cQryAlias)
oStatement:Destroy()
FwFreeObj(oStatement)
Return cQuery
/////
Em relação as perguntas não sei responder, mas pelo que entendi na documentação devemos sempre usar o FWPreparedStatement em serviços que possam ser acessados fora do sistema, por motivos de segurança.
Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.
Boa tarde! 1) essa classe implementa internamente Embedded SQL [ Embedded SQL - Frameworksp - TDN ] - Nâo. É o contrário. A embedded SQL implementa o preparedstatment. Logo, usando o Embedded você estará usando a parepared.
- para construção de querys devemos utilizar essa classe agora, e não mais usar construções “Embedded SQL”. Depende. A orientação é que o Embedded seja usado, pois ele usa o prepared por trás e faz um cache da sua query, inclusive já passando pela changequery. Logo, se alguém ou mesmo você chamar a query e somente os parâmetros sejam diferentes
ela vai conseguir trocar e não vai passar pela changequery novamente, tendo um ganho significativo de performance. Se você usar a prepared ‘na mão’ você precisa passar na changequery. Mas como disse é necessário avaliar o que você precisa para fazer a escolha do que usar.
Boa noite Deodato.
Perfeito seu retorno.
Como sempre! 
Mas assim, a colocação do Uilon foi bem colocada.
com relação a SQL Injection, a Embedded SQL, vamos dizer assim, é segura de se usar, ao invés da FWPreparedStatement ?
Obrigado pelo retorno, tchê!
:). A colocação do Uilon é bem pertinente sim. Se for um serviço a melhor maneira de proteger é sim usar a FwPrepared. Mas uma dica de perfomance: Crie a query. Exemplo : cQuery := “Select A1_COD from SA1180 Where A1_COD = ?”. Pegue e passe a query assim pela changequery e depois coloque a mesma na fwprepared. Desta maneira se você precisar utilizar esta query mais de uma vez você não vai precisar ficar enviando toda hora para a changequery.
Pessoal boa noite,
Desculpe ressucitar esse tópico, porém fiquei com uma dúvida na utilização da FWPreparedStatement com MPSysOpenQuery passado em um exemplo acima, na utilização em um serviço para evitar SQL Injection eu consigo usar somente a MPSysOpenQuery passando no quinto parâmetro os valores para o bind, desta forma a minha dúvida é se eu tenho algum ganho e necessidade em utilizar a FWPreparedStatement juntamente com a MPSysOpenQuery, ficou bem mais simples utilizar direto a MPSysOpenQuery assim:
cCod := '000001'
cQuery := "SELECT XYZCOD FROM XYZ010 WHERE XYZ_COD = ? AND D_E_L_E_T = ' ' "
cAlias := MPSysOpenQuery(cQuery,,,,{cCod})
Eu particularmente estou utilizando a classe FWExecStatement para esse tipo de implementação ela já faz a montagem da query com os parâmetros e permite sua execução usando o método OpenAlias()