Relatorio dinâmico

Bom dia

Estou tentando criar um relatório dinâmico estou seguindo o webinar de relatórios no entanto ao seguir os passos a cada linha existe algum tipo diferente de erro.

O código abaixo é o utilizado pelo exemplo

dim counter, counter2, i, detail, g_header, g_footer, screen, CB_PCC, CB_P, CB_VA
counter = 2
counter2 = 20

set detail = Report.Sections("Detail")
set g_header = Report.Sections("GroupHeader1")
set g_footer = Report.Sections("GroupFooter1")

set screen = Application.GetFrame().Screen
	
set CB_P = Screen.Item("CB_P")
set CB_PCC = Screen.Item("CB_PCC")
set CB_VA = Screen.Item("CB_VA")

if CB_P.value then
	detail.Controls("TextBox" & CStr(counter)).DataField = "P"
	g_header.Controls("Label" & CStr(counter)).Caption = "Potência CA (W)"
	g_footer.Controls("TextBox" & CStr(counter2 + i)).Visible = true
	g_footer.Controls("TextBox" & CStr(counter2 + i)).DataField = "P"
	counter = counter + 1
	counter2 = counter2 + 10
end if

O código abaixo foi feito algumas alterações para que fosse possível buscar o Report que no código acima apresentam erro, no entanto ao tentar buscar o GetFrame não estou encontrando uma solução.

dim counter, counter2, i, detail, g_header, g_footer, screen, CB_PCC, CB_P, CB_VA
counter = 2
counter2 = 20

detail = Me.Detail						'.Sections("Detail")
g_header = Me.PageHeader				'.Sections("GroupHeader1")
g_footer = Me.PageFooter				'.Sections("GroupFooter1")

screen = Application.GetFrame().Screen
	
CB_P = Screen.Item("CB_P")
CB_PCC = Screen.Item("CB_PCC")
CB_VA = Screen.Item("CB_VA")

if CB_P.value then
	detail.Controls("TextBox" & CStr(counter)).DataField = "P"
	g_header.Controls("Label" & CStr(counter)).Caption = "Potência CA (W)"
	g_footer.Controls("TextBox" & CStr(counter2 + i)).Visible = true
	g_footer.Controls("TextBox" & CStr(counter2 + i)).DataField = "P"
	counter = counter + 1
	counter2 = counter2 + 10
end if

Gostaria de saber se existe algum outro lugar para buscar a documentação de como fazer o relatório dinâmico funcionar ou algum sabe a solução para esse problema.

Desde já agradeço.

Oi amigo, qual webinar você está utilizando? Acredito que é para a versão antiga do relatório. Com o Relatório de Seção mudaram algumas coisas nos scripts

Este webinar

Webinar - Configurações avançadas em Relatórios do Elipse E3 (youtube.com)

É de uns bons anos atrás mas consegui gerar o relatório e a pesquisa baseado nele no entanto chegou nessa parte q estou querendo aprender a fazer e não estou conseguindo

Ah sim, esse webinar é da versão antiga do relatório.
Tentei assim:

Sub ActiveReport_ReportStart
’Esse script é necessário para o correto funcionamento de controles E3Chart
’Caso deseje acessar dados da aplicação, é possível utilizar o objeto ‘Application’ criado abaixo
dim Application = Activator.CreateInstance(Type.GetTypeFromProgID(“Reports.E3ApplicationLink”))
Application.LinkWithApplication(rpt)

dim counter, counter2, i, detail, g_header, g_footer, screen, CB_PCC, CB_P, CB_VA
counter = 2
counter2 = 20

detail = Me.Detail '.Sections(“Detail”)
g_header = Me.PageHeader '.Sections(“GroupHeader1”)
g_footer = Me.PageFooter '.Sections(“GroupFooter1”)

CB_P = Application.GetScreenValue(“CB_P”)
CB_PCC = Application.GetScreenValue(“CB_PCC”)
CB_VA = Application.GetScreenValue(“CB_VA”)

i = 3
if CB_P.value then
detail.Controls(“TextBox” & counter).DataField = “P”
g_header.Controls(“Label” & counter).Caption = “Potência CA (W)”
g_footer.Controls(“TextBox” & (counter2 + i)).Visible = true
g_footer.Controls(“TextBox” & (counter2 + i)).DataField = “P”
counter = counter + 1
counter2 = counter2 + 10
end if
End Sub

Em negrito estão as partes que faltaram. O script precisa estar dentro de um bloco de evento do relatório. No caso coloquei no bloco do ReportStart. Quando você cria um novo Relatório de Seção, esse bloco já vem pré-montado, aquelas linhas são importante você deixar para o funcionamento do script.
O GetScreen() como você usou não existe mais hoje, tem que usar o GetScreenValue para pegar o valor de tags da tela.

Além disso você não tinha definido um valor para i apesar de que acho que ia fazer isso mais adiante. Ali para concatenar o valor também não se usa mais o CStr.

Me diga se ajudou

opa

os erros que comentei resolveram, agora apareceram outros

Exception details:
System.Reflection.TargetInvocationException: Uma exceção foi acionada pelo destino de uma chamada. —> System.InvalidCastException: Conversão especificada não é válida.
em Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
em Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
em Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
em Script.ReportScript.ActiveReport_ReportStart()
— Fim do rastreamento de pilha de exceções internas —
em System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
em System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
em System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
em GrapeCity.ActiveReports.DDScripting.ExecuteMethod(String methodName, Object[] parameters, Boolean& success)
em GrapeCity.ActiveReports.SectionReport.RaiseReportStartScript()
em GrapeCity.ActiveReports.SectionReport.ProcessInit(Boolean bDelayedInit)
em GrapeCity.ActiveReports.SectionReport.RunImpl(Boolean syncDocument)
em GrapeCity.ActiveReports.SectionReport.Run(Boolean syncDocument)
em GrapeCity.ActiveReports.Viewer.Common.Internal.RpxReport.LoadDocument(SectionDocument document)
em GrapeCity.ActiveReports.Viewer.Common.Internal.RdfDocumentReportBase.<>c__DisplayClass19_0.b__4()
em GrapeCity.ActiveReports.Viewer.Common.AsyncLoader.<>c__DisplayClass9_0.b__2(Object , DoWorkEventArgs )
em System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
em System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

como está seu script?

O código esta como abaixo

Dim counter As Integer
Dim counter2 As Integer
Dim i As Integer
Dim detail As Object
Dim g_header As Object
Dim g_footer As Object
Dim PCC As Object
Dim P As Object
Dim VA As Object

counter = 2
counter2 = 20

detail = Me.Detail 
g_header = Me.PageHeader 
g_footer = Me.PageFooter 

P = Application.GetScreenValue("CB_P")
PCC = Application.GetScreenValue("CB_PCC")
VA = Application.GetScreenValue("CB_VA")

i = 3

If P.value Then
	detail.Controls("TextBox" & counter).DataField = "P"
	g_header.Controls("Label" & counter).Caption = "Potência CA(W)"
	g_footer.Controls("TextBox" & (counter2 + i)).Visible = True
	g_footer.Controls("TextBox" & (counter2 + i)).DataField = "P"
	counter = counter + 1
	counter2 = counter2 + 10
End If

If PCC.value Then
	detail.Controls("TextBox" & counter).DataField = "PCC"
	g_header.Controls("Label" & counter).Caption = "Potência CC(W)"
	g_footer.Controls("TextBox" & (counter2 + i)).Visible = True
	g_footer.Controls("TextBox" & (counter2 + i)).DataField = "PCC"
	counter = counter + 1
	counter2 = counter2 + 10
End If

If VA.value Then
	detail.Controls("TextBox" & counter).DataField = "VA"
	g_header.Controls("Label" & counter).Caption = "Tensão Fase A (V)"
	g_footer.Controls("TextBox" & (counter2 + i)).Visible = True
	g_footer.Controls("TextBox" & (counter2 + i)).DataField = "VA"
	counter = counter + 1
	counter2 = counter2 + 10
End If

Ao invés de “if P.Value Then” (e nos outros casos) tenta só “If P = true then”