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:
- Primeiramente, como identificar uma consulta utilizada em um objeto do Elipse E3.
- Logo depois, como criar uma Stored Procedure.
- 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%>#
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.