Varias consultas do E3Browser com filtros por data


(Jeff) #1

Ola, sou novo e no Elipse, e estou com a seguinte dificuldade.
Preciso criar uma consulta no E3Broser, onde criei 3 consultas e filtrar por datas.

O Scrip no botao de consultar está assim:

Sub CommandButton1_Click()

menu = Application.SelectMenu(“Consumo||Temperatura||Volume”)

       select case menu

case 1 DataIni=Screen.Item(“spDataInicial”).Value
DataFim=Screen.Item(“spDataFinal”).Value
msgbox “ok1”
Set browser=Screen.Item(“E3Browser1”)
browser.SourceQuery=Consulta1
browser.RetrieveE3QueryFields()
msgbox “ok2”
Set consulta = browser.Item(Value)
consulta.SetVariableValue"DataInicial",DataIni
consulta.SetVariableValue"DataFinal",DataFim
browser.Requery()
msgbox “ok3”

case 2 Set browser = Screen.Item(“E3Browser1”)
browser.SourceQuery =“Consulta2”
browser.RetrieveE3QueryFields()
browser.Requery()

case 3 Set browser = Screen.Item(“E3Browser1”)
browser.SourceQuery =“Consulta3”
browser.RetrieveE3QueryFields()
browser.Requery()

       end select

End Sub


(Paulo Gustavo Süffert) #2

Jeff,

Provavelmente o problema esteja na seguinte linha, uma vez que o Botão de Comando não tem a propriedade ‘Value’:

Set consulta = browser.Item(Value)

Você deve utilizar o nome do objeto Consulta do E3Browser. Por exemplo:

Set consulta = browser.Item("Consulta1")


(Jeff) #3

Ola Paulo,

Exatamente isso. obrigado


(Jeff) #4

Paulo, pode me ajudar novamente?

Como tenho o script no botao 1 para consulta os cases dos menu, como devo selecionar corretamente qual o relatorio vai imprimir no botao 2 de gerar relatorio?
tentei com o if, mas não dá certo. Tentei usando uma tag interna, tambem nao funcionou.

Segue script do botao 1 de consulta:

Segue script do botao 2 de gerar relatorio:


(Paulo Gustavo Süffert) #5

Não entendi a dúvida.


(Jeff) #6

Bom dia Paulo

Tenho 3 formatos de relatorios, Relatorio1, Relatorio2 e Relatorio3

Para cada consulta, que tera dados diferentes no E3Browser, que sao carregados via o menu, no botao consulta, preciso depois imprimir o relatorio correspondente a esses dados carregados pela consulta. Tenho que associar qual relatorio imprimir, dependendo da qual consulta foi feita pelo menu.


(Paulo Gustavo Süffert) #7

Você tem que guardar o número da Consulta selecionada para imprimir o Relatório correto. Pode criar um Tag Interno no Viewer para isso.


(Jeff) #8

Tentei fazer isso, mas não tive sucesso.

Essa tag interna tem que ser no banco de dados ou na tela?

Como insiro um valor na tag interna, diretamente no viewer?

Ela serve como uma memoria global? ou seja, vai ser lida em qualquer parte do programa?

obrigado


(Jeff) #9

Eu tinha feito assim Paulo

definindo TagInterno1 como tipo inteiro, criado dentro da tela

e dentro das linhas dos case na consulta,coloquei o script

Item(“TagInterno1”).Value = 1

mas não funcionou


(Paulo Gustavo Süffert) #10

Dá uma olhada neste link:

http://kb.elipse.com.br/pt-br/questions/4200


(Jeff) #11

Ola Paulo

Deu certo agora, eu estava criando o TagInterno1 na tela e não no viewer.

Obrigado!


(Jeff) #12

Ola Paulo, tudo bem. Pode me ajudar novamente?

Tenho esse script na aba SQL da Consulta do E3Browser1, mas preciso filtrar tambem somente o primeiro e o ultimo resultado da tabela, tanto para a consulta do Brower, quanto ao relatório gerado.

Estou com esse script abaixo na aba SQL da Consulta:

SELECT Tabela1.E3TimeStamp,Tabela1.Campo1,Tabela1.Campo2,Tabela1.Campo1-Tabela1.Campo2 as CampoTotal
FROM Tabela1
WHERE ( Tabela1.E3TimeStamp >= #<%DataInicial%># AND Tabela1.E3TimeStamp <= #<%DataFinal%># )
ORDER BY Tabela1.E3TimeStamp ASC

Usei a ideia desse KB:

KB-43139: Fields’ subtraction result in a report.

O script ficou assim:

SELECT E3TimeStamp, Campo1, Campo2, TOTALS.SubCampo1, TOTALS.SubCampo2
FROM Tabela1,
(SELECT LAST.Campo1 - FIRST.Campo1 AS SubCampo1, LAST.Campo2 - FIRST.Campo2 AS SubCampo2 FROM
FIRST(SELECT TOP 1 E3Timestamp, Campo1, Campo2 FROM Tabela1 ORDER BY E3TimeStamp ASC)FIRST,
(SELECT TOP 1 E3Timestamp, Campo1, Campo2 FROM Tabela1 ORDER BY E3TimeStamp DESC)LAST)TOTALS
ORDER BY Tabela1.E3TimeStamp ASC

Mas na visualização do resultado gera a falha:

image

Fiz teste na linhas individualmente:

SELECT LAST(E3Timestamp) AS FirstDataHora FROM Tabela1 - OK

SELECT FIRST(E3Timestamp) AS FirstDataHora FROM Tabela1 - OK

SELECT TOTALS(Campo1,Campo2) AS TOTAL FROM Tabela1 - NÃO FUNCIONOU

Então alterei a posicao das funcoes LAST, FIRST e TOTALS na query , mas também não funciona.

SELECT E3TimeStamp, Campo1, Campo2, TOTALS.SubCampo1, TOTALS.SubCampo2
FROM Tabela1,
TOTALS(SELECT ULT.Campo1 - PRIM.Campo1 AS SubCampo1, ULT.Campo2 - PRIM.Campo2 AS SubCampo2 FROM
FIRST(SELECT TOP 1 E3Timestamp, Campo1, Campo2 FROM Tabela1 ORDER BY E3TimeStamp ASC) AS PRIM,
LAST(SELECT TOP 1 E3Timestamp, Campo1, Campo2 FROM Tabela1 ORDER BY E3TimeStamp DESC) AS ULT)
ORDER BY Tabela1.E3TimeStamp ASC

O que pode estar de errado?


(Paulo Gustavo Süffert) #13

Não entendi o que você quer fazer. Poderia dar um exemplo?


(Jeff) #14

Ola Paulo

Preciso, quando enviar os dados de uma consulta, tipo campo1 e campo2, filtrar por data inicial e data final, mas mostrar somente na consulta e no relatório, o primeiro e o ultimo valor da consulta, bem como sua diferença entre os valores do campo1 e campo2 pelas datas. Ou seja, campo1 data final - campo 1 data inicial, e campo2 data final - campo2 data inicial.

[]s, Jefferson


(Jeff) #15

Ola Paulo, fiz numa aplicação aqui ja conhecida para dar a ideia:

Quando seleciono as datas inicial e final, e mando gerar o relatorio

a ideia do relatorio seria ficar assim:

é claro que no relatorio o valor do Campo1 na data final ( 26/11/2018 13:23:22) deveria ser 10 e portanto o SubTotal seria 4


(Paulo Gustavo Süffert) #16

Para retornar somente o primeiro e o último registros, experimente a seguinte consulta:

SELECT * FROM
(SELECT TOP 1 E3TimeStamp, Campo1, Campo2
FROM Tabela1
WHERE E3TimeStamp >= #<%DataInicial%># AND E3TimeStamp <= #<%DataFinal%>#
ORDER BY E3TimeStamp ASC) as Tabela1
UNION ALL
SELECT * FROM
(SELECT TOP 1 E3TimeStamp, Campo1, Campo2
FROM Tabela1
WHERE E3TimeStamp >= #<%DataInicial%># AND E3TimeStamp <= #<%DataFinal%>#
ORDER BY E3TimeStamp DESC) as Tabela1

Para calcular a diferença entre os valores, você pode usar o script abaixo:

set dif1 = Application.GetObject("Dados1.Dif1")
set dif2 = Application.GetObject("Dados1.Dif2")
set report = Application.LoadReport("Relatorio1")
set rs = report.Item("Consulta1").GetADORecordset()
rs.MoveFirst()
dif1.Value = rs.Fields("Campo1").Value
dif2.Value = rs.Fields("Campo2").Value
rs.MoveNext()
dif1.Value = rs.Fields("Campo1").Value - dif1.Value
dif2.Value = rs.Fields("Campo2").Value - dif2.Value
report.PrintPreview()

Onde “Dados1.Dif1” e “Dados1.Dif2” são Tags Internos que servirão para guardar o resultado da subtração. No Relatório, você pode inserir dois campos de dados na seção ‘PageFooter’ e associá-los aos mesmos. A associação é feita através da propriedade DataField, inserindo o pathname do Tag.


(Jeff) #17

Funcionou certinho Paulo, obrigado.

Queria saber como posso ter o resultado da diferença sempre positivo.

O script ficou assim:
Sub CommandButton2_Click()
valor=Application.Item(“TagInterno1”).Value
if valor=1 then
set sub1 = Application.GetObject(“Dados.Subtotal.Sub_Tot_AF_Bec”)
set sub2 = Application.GetObject(“Dados.Subtotal.Sub_Tot_AG_Bec”)
set sub3 = Application.GetObject(“Dados.Subtotal.Sub_Tot_AP_Bec”)
set sub4 = Application.GetObject(“Dados.Subtotal.Sub_Tot_AQ_Bec”)
set report = Application.LoadReport(“Relatorio1”)
DataIni = Screen.Item(“spDataInicial”).Value
DataFim = Screen.Item(“spDataFinal”).Value
report.Item(“Consulta1”).SetVariableValue “DataInicial”, DataIni
report.Item(“Consulta1”).SetVariableValue “DataFinal”, DataFim
set rs = report.Item(“Consulta1”).GetADORecordset()
rs.MoveFirst()
sub1.Value = rs.Fields(“Tot_AF_Bec”).Value
sub2.Value = rs.Fields(“Tot_AG_Bec”).Value
sub3.Value = rs.Fields(“Tot_AP_Bec”).Value
sub4.Value = rs.Fields(“Tot_AQ_Bec”).Value
rs.MoveNext()
sub1.Value = rs.Fields(“Tot_AF_Bec”).Value - sub1.Value
sub2.Value = rs.Fields(“Tot_AG_Bec”).Value - sub2.Value
sub3.Value = rs.Fields(“Tot_AP_Bec”).Value - sub3.Value
sub4.Value = rs.Fields(“Tot_AQ_Bec”).Value - sub4.Value
report.PrintPreview()
end if

Tentei colocar a função abs, mas não funcionou, dai não calcula a diferença… tipo:
abs(sub1.Value = rs.Fields(“Tot_AF_Bec”).Value - sub1.Value)


(Paulo Gustavo Süffert) #18

sub1.Value = Abs(rs.Fields(“Tot_AF_Bec”).Value - sub1.Value)


(Jeff) #19

Bom dia e obrigado Paulo.