KB-102503: Substituindo consultas do Elipse E3 por Stored Procedures no banco de dados.

Descrição:

Minha aplicação apresenta baixa performance devido ao grande número de consultas que estão sendo executadas ciclicamente no Elipse E3. Neste caso, é possível substituir essas consultas por Stored Procedures, para assim diminuir a quantidade de processamento que se dá no E3 e então transferir este processamento para o Banco de Dados?

Solução:

Sim. De acordo com o artigo Dicas de Performance para o E3, dependendo da complexidade da consulta desejada, ou até mesmo do seu intervalo de execução, pode-se optar por substituir essas consultas por Stored Procedures. Essas SPs são criadas no banco de dados especificamente para esta função; ao Elipse E3, compete apenas executá-las. Assim, todo o processamento gerado por essa consulta estará separado do E3.

Neste artigo, demonstraremos:

  1. Primeiramente, como identificar uma consulta utilizada em um objeto do Elipse E3.
  2. Logo depois, como criar uma Stored Procedure.
  3. Finalmente, como substituir a consulta por uma Stored Procedure em um banco SQL Server e executá-la a partir do Elipse E3.

Para este exemplo, criamos uma consulta em uma tabela que utiliza três variáveis no filtro. O banco de dados utilizado neste estudo de caso foi o Microsoft SQL Server 2014.

Consulta utilizada em um objeto E3Query no E3:

SELECT Alarms.E3TimeStamp,Alarms.FullAlarmSourceName,Alarms.InTime,Alarms.OutTime,Alarms.Area,Alarms.ConditionName 
FROM Alarms 
WHERE (( Alarms.E3TimeStamp >= #<%InitialDate%># AND Alarms.E3TimeStamp <= #<%FinalDate%># ) AND ( Alarms.Area = '<%Area%>' )) 
ORDER BY Alarms.E3TimeStamp ASC

Criando a Stored Procedure

CREATE PROCEDURE SPAlarms
-- Add the parameters for the stored procedure here
@Area varchar(50), @InitialDate datetime, @FinalDate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT Alarms.E3TimeStamp,Alarms.FullAlarmSourceName,Alarms.InTime,Alarms.OutTime,Alarms.Area,Alarms.ConditionName 
FROM Alarms 
WHERE (( Alarms.E3TimeStamp >= @InitialDate AND Alarms.E3TimeStamp <= @FinalDate ) AND ( Alarms.Area = @Area )) 
ORDER BY Alarms.E3TimeStamp ASC

END

Executando a Stored Procedure a partir do E3

Para executar a Stored Procedure, antes de mais nada é necessário inserir a seguinte sintaxe em uma consulta:

EXEC SPAlarms '<%Area%>', #<%InitialDate%>#, #<%FinalDate%>#
Da mesma forma, para configurar as variáveis e retornar os dados da Stored Procedure, insira o seguinte script no Elipse E3:
Sub CommandButton1_Click()
set Consulta = Screen.Item("Consulta1") 
Consulta.SetVariableValue "Area", "Area1"
Consulta.SetVariableValue "InitialDate", "13/11/2018 15:52:00"
Consulta.SetVariableValue "FinalDate", "13/11/2018 15:52:10"
set RS = Consulta.GetADORecordset()

For i = 1 To RS.RecordCount
C1 = RS("E3TimeStamp")
C2 = RS("Area")
C3 = RS("FullAlarmSourceName")
RS.MoveNext()
str = str & C1 & vbTab & C2 & vbTab & C3 & vbnewline 
Next
MsgBox str
End Sub

NOTA: Em casos semelhantes, pode-se optar por substituir o método GetADORecordset pelo método GetAsyncADORRecordSet. O método GetAsyncADORecordSet cria uma Consulta; esta Consulta, uma vez finalizada, vai gerar o evento OnAsyncQueryFinish no objeto; e então o resultado passado para este evento é o resultado (Recordset) gerado.

 

Artigos relacionados


Este artigo foi útil? Was this post helpful?
Yes1
No0

Deixe seu Comentário

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