LOOP COM SELECT
pessoal boa tarde, estou tentando fazer um loop aqui mas nao to conseguindo de forma alguma, tenho um grid que ele tem uma coluna que tem como checar as caixinhas para o mesmo ser executado, entao vamos supor, eu quero imprimir os relatorios apenas das id(s) 1,3, e 5, eu checo essas caixas o sistema executa o select e imprime o relatorio em crystal report, so que nao to conseguindo fazer isso funcionar, abaixo o codigo que estou tentando, estou jogando o que esta checado para outro grid para o mesmo receber quais foram checados e executar a query so que nao to conseguindo fazer de jeito algum..
Private Sub Inclus()
Dim iL As Integer
Set clsCnn = New TS_AcessoBD
Set Report = Crystal.OpenReport([Ô]c:\RELTESTE.rpt[Ô])
strSQL = [Ô][Ô] & [Ô]select a.*, b.*,c.*,d.*,e.*,f.*,g.* [Ô]
strSQL = strSQL & [Ô] from movimentoocorrencias a,cadpessoasendereco b,cadocorrencias c,cadcat d,cadpessoascontato e,cadpessoas f,cadusuarios g [Ô]
strSQL = strSQL & [Ô] where f.pesscodigo=e.pesscodigo and f.pesscodigo=b.pesscodigo and [Ô]
strSQL = strSQL & [Ô] a.movclicodigo=f.pesscodigo and a.movfilial=d.id and [Ô]
strSQL = strSQL & [Ô] a.movocorrencia=c.idocorr and a.movidcolaborador=g.userid and [Ô]
strSQL = strSQL & [Ô] e.contprincipal=[ô]1[ô] and b.endprincipal=[ô]1[ô] [Ô]
Set MyRS = clsCnn.ExecutaSQL(strSQL)
[ô]primeiro loop jogando para o grid 2 as informacoes
VSFlexGrid1.Clear
For i = 1 To TDBGrid1.Rows - 1
If TDBGrid1.TextMatrix(i, 11) = strChecked Then
VSFlexGrid1.AddItem TDBGrid1.TextMatrix(i, 0)
End If
Next i
For iL = 1 To VSFlexGrid1.Rows - 1
VSFlexGrid1.Row = iL
strSQL = strSQL & [Ô] and a.idmov=[ô][Ô] & VSFlexGrid1.TextMatrix(VSFlexGrid1.Row, 0) & [Ô][ô][Ô]
Set MyRS = clsCnn.ExecutaSQL(strSQL)
Report.Database.SetDataSource MyRS
Next iL
With frm_REL_Relatorios
.CrV.DisplayGroupTree = False
.CrV.ReportSource = Report
.CrV.ViewReport
.CrV.Refresh
.Show
End With
End Sub
Mude assim:
For iL = 1 To VSFlexGrid1.Rows - 1
VSFlexGrid1.Row = iL
strSQL2 = [Ô] and a.idmov=[ô][Ô] & VSFlexGrid1.TextMatrix(VSFlexGrid1.Row, 0) & [Ô][ô][Ô]
Set MyRS = clsCnn.ExecutaSQL(strSQL & strSQL2)
Report.Database.SetDataSource MyRS
Next iL
boa tarde Edemir, fiz da forma que vc colocou, mas mesmo assim, ele imprime apenas a ultima que foi selecionada, ous eja, ele nao [Ô]coleciona[Ô] as que tem que imprimir .. entendeu? veja como modifiquei..
Private Sub ImprimirOS()
Dim sCriterio As String
Set clsCnn = New TS_AcessoBD
Set Report = Crystal.OpenReport([Ô]c:\RELTESTE.rpt[Ô])
Report.DiscardSavedData
strSQL = [Ô]select a.*, b.*,c.*,d.*,e.*,f.*,g.* [Ô]
strSQL = strSQL & [Ô] from movimentoocorrencias a,cadpessoasendereco b,cadocorrencias c,cadcat d,cadpessoascontato e,cadpessoas f,cadusuarios g [Ô]
strSQL = strSQL & [Ô] where f.pesscodigo=e.pesscodigo and f.pesscodigo=b.pesscodigo and [Ô]
strSQL = strSQL & [Ô] a.movclicodigo=f.pesscodigo and a.movfilial=d.id and [Ô]
strSQL = strSQL & [Ô] a.movocorrencia=c.idocorr and a.movidcolaborador=g.userid and [Ô]
strSQL = strSQL & [Ô] e.contprincipal=[ô]1[ô] and b.endprincipal=[ô]1[ô] [Ô]
Set MyRS = clsCnn.ExecutaSQL(strSQL)
For i = 1 To TDBGrid1.Rows - 1
TDBGrid1.Row = i
If TDBGrid1.TextMatrix(i, 11) = strChecked Then
strSQL2 = [Ô] and a.idmov=[ô][Ô] & TDBGrid1.TextMatrix(i, 0) & [Ô][ô][Ô]
End If
Set MyRS = clsCnn.ExecutaSQL(strSQL & strSQL2)
Report.Database.SetDataSource MyRS
Next
With frm_REL_Relatorios
.CrV.DisplayGroupTree = False
.CrV.ReportSource = Report
.CrV.ViewReport
.CrV.Refresh
.Show
End With
Set clsCnn = Nothing
Set Report = Nothing
End Sub
Veja se funciona agora
Private Sub Inclus()
Dim iL As Integer
Dim sidMovs as String
Set clsCnn = New TS_AcessoBD
Set Report = Crystal.OpenReport([Ô]c:\RELTESTE.rpt[Ô])
[ô]primeiro loop jogando para a variável sidMovs as informacoes
For i = 1 To TDBGrid1.Rows - 1
If TDBGrid1.TextMatrix(i, 11) = strChecked Then
sidMovs = sidMovs & TDBGrid1.TextMatrix(i, 0) & IIf((i=TDBGrid1.Rows - 1),[Ô][Ô],[Ô],[Ô]) [ô] aqui estou considerando o campo idMov como inteiro
End If
Next i
strSQL = [Ô][Ô] & [Ô]select a.*, b.*,c.*,d.*,e.*,f.*,g.* [Ô]
strSQL = strSQL & [Ô] from movimentoocorrencias a,cadpessoasendereco b,cadocorrencias c,cadcat d,cadpessoascontato e,cadpessoas f,cadusuarios g [Ô]
strSQL = strSQL & [Ô] where f.pesscodigo=e.pesscodigo and f.pesscodigo=b.pesscodigo and [Ô]
strSQL = strSQL & [Ô] a.movclicodigo=f.pesscodigo and a.movfilial=d.id and [Ô]
strSQL = strSQL & [Ô] a.movocorrencia=c.idocorr and a.movidcolaborador=g.userid and [Ô]
strSQL = strSQL & [Ô] e.contprincipal=[ô]1[ô] and b.endprincipal=[ô]1[ô] and a.idmov in([Ô] & sidMovs & [Ô])[Ô]
Set MyRS = clsCnn.ExecutaSQL(strSQL)
Report.Database.SetDataSource MyRS
With frm_REL_Relatorios
.CrV.DisplayGroupTree = False
.CrV.ReportSource = Report
.CrV.ViewReport
.CrV.Refresh
.Show
End With
End Sub
OOOOPS !!! Mais uma mudança:
strSQL2 = [Ô][Ô]
For i = 1 To TDBGrid1.Rows - 1
TDBGrid1.Row = i
If TDBGrid1.TextMatrix(i, 11) = strChecked Then
strSQL2 = strSQL2 & iif(len(strSQL2) = 0;[Ô] and ([Ô];[Ô] or [Ô]) & [Ô]a.idmov=[ô][Ô] & TDBGrid1.TextMatrix(i, 0) & [Ô][ô][Ô]
End If
Next
strSQL2 = iif(len(strSQL2) <> 0;[Ô])[Ô];[Ô][Ô])
Set MyRS = clsCnn.ExecutaSQL(strSQL & strSQL2)
Report.Database.SetDataSource MyRS
Amigo, a forma que nosso amigo leandro passou esta correta, so faria uma pequena alteração, o sistema vai identificar ali embaixo uma virgula a mais quando fazer a seleçao... entao faça um replace depois do seu ultimo strsql assim :
strSQL = strSQL & [Ô] e.contprincipal=[ô]1[ô] and b.endprincipal=[ô]1[ô] and a.idmov in([Ô] & sidMovs & [Ô])[Ô]
strSQL = Replace(strSQL, [Ô],)[Ô], [Ô])[Ô])
ai ele vai passar a string sem a utlima virgula.
strSQL = strSQL & [Ô] e.contprincipal=[ô]1[ô] and b.endprincipal=[ô]1[ô] and a.idmov in([Ô] & sidMovs & [Ô])[Ô]
strSQL = Replace(strSQL, [Ô],)[Ô], [Ô])[Ô])
ai ele vai passar a string sem a utlima virgula.
Tópico encerrado , respostas não são mais permitidas