Neste post vamos comentar sobre uma possibilidade interessante em cenários específicos que é a utilização de subquery ou scalar query no Magic xpa, eliminando a necessidade de rotina complementar.
Quando falamos de subquery, estamos falando desta situação (destacada em azul):
- SELECT COLUNA1, COLUNA2, (SELECT COLUNA3 FROM TABELA2) FROM TABELA1
Quanto a scalar query, estamos falando desta outra situação (destacada em azul):
- SELECT COLUNA1, COLUNA2, (SELECT SUM(COLUNA3) FROM TABELA2) FROM TABELA1
Na prática: imagine uma tela de pedido onde há o total do pedido, sendo que esta informação não é persistida no banco de dados:
Nesta situação haveria alguma rotina (batch) que retornasse o total do pedido.
Existe outra forma de se obter este valor, que é a utilização de scalar query.
Para calcular o total do pedido, é necessário uma scalar query conforme demonstrado abaixo (em azul):
- SELECT Order_Number ,Order_Date ,Customer_Code ,Method_Of_Payment ,(SELECT SUM(Product_Quantity*Product_Price) FROM Order_Lines WHERE Order_Lines.Order_Number=Orders.Order_Number) FROM Orders
Agora que já sabemos a scalar query necessária, vamos colocá-la no Magic xpa.
Implementando a Query Scalar
Baixe este projeto exemplo, em Magic xpa 2.5a, clicando aqui.
Primeiramente, desative as alterações de estrutura de tabela no Magic xpa Studio:
Vamos repetir ou copiar o data source que conterá a scalar query:
Neste novo data source vamos adicionar uma coluna e na propriedade “DB Column name”, vamos adicionar a query scalar:
Agora temos um novo data source que lista todos os dados do pedido com os seus totais, veja o CTRL+G:
Agora, basta colocar a leitura deste novo data source no programa:
e disponibilizar a informação na tela:
Com esta técnica simples economizamos rotinas complementares (batch) e até performance em aplicações RIA pois não haverão chamadas extras ao RIA Server para execução de rotinas batch.
Essa técnica requer algumas considerações:
- A coluna incluída no novo data source é apenas virtual, ou seja, se tentar criar ou atualizar com este data source haverá problema, neste caso, deve-se utilizar o data source original para criação/alteração.
- Este novo data source não poderá ser usado em um conjunto de joins pois a query final poderá ser gerada errada diferentemente do que se foi idealizado no início: SELECT Order_Number, Order_Date, Customer_Code, Method_Of_Payment, (SELECT SUM(Product_Quantity*Product_Price) FROM Order_Lines WHERE Order_Lines.Order_Number=Orders.Order_Number) FROM Orders
- A propriedade “DB Column name” tem um limite de 300 caracteres, então sua subquery ou scalar query não pode ultrapassar este limite.
- É de responsabilidade do desenvolvedor construir uma subquery ou scalar query corretamente e de acordo com a sintaxe do DBMS.
Para receber os artigos do Blog Magic Brasil em primeira mão no seu email registre-se aqui