Implementando Subquery ou Scalar Query no Magic xpa

image000

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:

image001

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:

image002

Vamos repetir ou copiar o data source que conterá a scalar query:

image003

Neste novo data source vamos adicionar uma coluna e na propriedade “DB Column name”, vamos adicionar a query scalar:

image004

Agora temos um novo data source que lista todos os dados do pedido com os seus totais, veja o CTRL+G:

image005

Agora, basta colocar a leitura deste novo data source no programa:

image006

e disponibilizar a informação na tela:

image007

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.
Jeronimo Alberto da Costa – Analista Desenvolvedor / Project Designer / DB Expert – Magic Software Brasil
Jeronimo Alberto da Costa – Analista Desenvolvedor / Project Designer / DB Expert – Magic Software Brasil

 Para receber os artigos do Blog Magic Brasil em primeira mão no seu email registre-se aqui

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *