Notifications
Clear all

Exportar para a Plan o resultado de um select dinâmico

9 Posts
2 Usuários
0 Reactions
1,872 Visualizações
Trindade
(@trindade)
Posts: 278
Reputable Member
Topic starter
 

Bom dia, Srs.

Gostaria de uma ajuda, eu tenho a estrutura que exporta um select com as colunas fixa que seria algo assim:

# Parte da Conexão

With cnt

	If Val(Application.Version) < 12 Then
		.Provider = "Microsoft.Jet.OLEDB.4.0"
	Else
		.Provider = "Microsoft.ACE.OLEDB.12.0"
	End If
	
	' ABRE CAIXA PARA SELECIONAR O ARQUIVO
	.Open importFileName
	
End With

# Parte do SQL que exporta para a Plan

' DADOS DE CONSULTA DA TABELA CHUVA - SEM COLUNAS NOVAS
strSql = ""
strSql = strSql & "SELECT QualAgua.RegistroID, QualAgua.EstacaoCodigo, QualAgua.Data, "
strSql = strSql & "QualAguaStatus." & UserFormColunasVariaveis.vNomeColunaLigacao & " As Total, QualAgua." & UserFormColunasVariaveis.vNomeColuna & " As TotalSomado "
strSql = strSql & "FROM ((((((Estacao INNER JOIN Estado ON Estacao.EstadoCodigo = Estado.Codigo) "
strSql = strSql & "INNER JOIN Entidade ON Estacao.OperadoraCodigo = Entidade.Codigo) "
strSql = strSql & "INNER JOIN Bacia ON Estacao.BaciaCodigo = Bacia.Codigo) "
strSql = strSql & "INNER JOIN SubBacia ON Estacao.SubBaciaCodigo = SubBacia.Codigo) "
strSql = strSql & "INNER JOIN Municipio ON Estacao.MunicipioCodigo = Municipio.Codigo) "
strSql = strSql & "INNER JOIN QualAgua ON Estacao.Codigo = QualAgua.EstacaoCodigo) "
strSql = strSql & "INNER JOIN QualAguaStatus ON QualAgua.RegistroID = QualAguaStatus.RegistroID "
strSql = strSql & "WHERE (QualAgua.EstacaoCodigo in (" & strParam & ") "
strSql = strSql & "AND QualAgua." & UserFormColunasVariaveis.vNomeColuna & " IS NOT NULL "
strSql = strSql & "ORDER BY QualAgua.Data ASC"

' ABRE RECORDSET COM A INTRUCAO SQL
rst.Open strSql, cnt

' VERIFICA SE A ESTACAO SOLICITADA EXISTE
If rst.EOF And rst.BOF Then

	' MENSAGEM DE ALERTA DO SISTEMA
	MsgBox "Estação não foi encontrada.", vbCritical, "Atenção"

Else
	
	' LOOPS DE TODAS AS LINHAS PARA INSERRI-LAS NA FOLHA
	rowNum = 9
	
	Do While Not rst.EOF
			
		Plan2.Range("B" & rowNum).Value = rst![RegistroID]
		Plan2.Range("C" & rowNum).Value = rowNum - 8
		Plan2.Range("D" & rowNum).Value = rst![EstacaoCodigo]
		Plan2.Range("E" & rowNum).Value = rst![Data]
		Plan2.Range("F" & rowNum).Value = rst![Total]
		Plan2.Range("F" & rowNum).Value = rst![TotalSomado]
		
		rst.MoveNext
		
	Loop

End if

Agora vem o detalhe o meu SQL será dinâmico hora terá 6 colunas como poderá ter até 100 colunas, nesse momento que não consegui montar a exportação dinâmica, e gostaria de uma ajuda dos colega.

Toda e qualquer ideia sempre é bem vinda.

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 24/02/2017 7:01 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Varra os campos pra colocar os nomes na linha 1,
e em seguida:

range("A2").copyfromrecordset rst

e corre pro abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/02/2017 8:57 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O que irá determinar o "dinamismo" do sql, em seu exemplo são selecionados 5 campos.
Qual o fator/parâmetro que determinara esse incremento?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/02/2017 9:13 am
Trindade
(@trindade)
Posts: 278
Reputable Member
Topic starter
 

Reinaldo

Eu tenho um UserForm que preencher conforme o banco selecionado na tabela especifica.

O usuário ira selecionar as estações que vão no WHERE e as variáveis no SELECT, faço a leitura dos itens selecionados no ListBox para poder montar o SELECT.

Na imagem eu selecionei duas estações (66011000 e 66015000 ) e as variáveis Aldrin e Algas, mas posso selecionar ate 153 colunas.

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 24/02/2017 9:39 am
Trindade
(@trindade)
Posts: 278
Reputable Member
Topic starter
 

Varra os campos pra colocar os nomes na linha 1,
e em seguida:

range("A2").copyfromrecordset rst

e corre pro abraço

Obrigado fernando.fernandes
Vou pesquisar a respeito do copyfromrecordset rst

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 24/02/2017 9:45 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não sei se entendi, mas creio que devera criar um loop "lendo' os itens em sua listbox/listview. Algo mais ou menos assim:

' DADOS DE CONSULTA DA TABELA CHUVA - SEM COLUNAS NOVAS
strsql = ""
strsql = strsql & "SELECT QualAgua.RegistroID, QualAgua.EstacaoCodigo, QualAgua.Data, "
'strsql = strsql & "QualAguaStatus." & UserFormColunasVariaveis.vNomeColunaLigacao & " As Total, QualAgua." & UserFormColunasVariaveis.vNomeColuna & " As TotalSomado "
For x = 0 To sualstvariavel.Count - 1
    strsql = strsql & "QualAguaStatus." & sualstvariavel(x)
Next
strsql = strsql & "FROM ((((((Estacao INNER JOIN Estado ON Estacao.EstadoCodigo = Estado.Codigo) "
strsql = strsql & "INNER JOIN Entidade ON Estacao.OperadoraCodigo = Entidade.Codigo) "
strsql = strsql & "INNER JOIN Bacia ON Estacao.BaciaCodigo = Bacia.Codigo) "

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/02/2017 9:59 am
Trindade
(@trindade)
Posts: 278
Reputable Member
Topic starter
 

Reinaldo,

Essa parte que mandou esta tranquilo, o que não estou conseguindo fazer essa parte:

Do While Not rst.EOF
         
      Plan2.Range("B" & rowNum).Value = rst![RegistroID]
      Plan2.Range("C" & rowNum).Value = rowNum - 8
      Plan2.Range("D" & rowNum).Value = rst![EstacaoCodigo]
      Plan2.Range("E" & rowNum).Value = rst![Data]
      Plan2.Range("F" & rowNum).Value = rst![Total]
      Plan2.Range("F" & rowNum).Value = rst![TotalSomado]
      
      rst.MoveNext
      
   Loop

fazer esse loop pegando as colunas que tenho no select para poder imprimir na plan

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 24/02/2017 11:41 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Novamente:
remova o loop, e use essa linha assim:

Plan2.Range("B" & rowNum).CopyFromRecordset rst

Faça isso e seus problemas acabam.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 24/02/2017 12:10 pm
Trindade
(@trindade)
Posts: 278
Reputable Member
Topic starter
 

fernando.fernandes
Obrigado, deu certo com o código que indicou, agora vou fechar o tópico.

Reinaldo
Obrigado pela força.

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 24/02/2017 3:00 pm