Página 1 de 1

Resultset Vazio - VBA

Enviado: 16 Mar 2017 às 20:57
por FelipeArruda
Prezados, boa noite!

Tenho uma planilha que utiliza uma função em VBA onde conecto no banco Oracle, porém ao executar o sql e passar para o resultset não vem nenhum valor.
Código: Selecionar todos
Sub autImportados()
    Dim linhaI As Integer
    Dim colunaI As Integer
    Dim linhaF As Integer
    Dim colunaF As Integer
    Dim sql As String
    
    Dim cn As ADODB.Connection
    Dim rs As New ADODB.Recordset
    
    'DEFINE A LINHA E COLUNA QUE IRA COMECAR
    linhaI = 1
    colunaI = 8
    
    linhaF = 1
    colunaF = 10
    
    On Error Resume Next
    
    'DEFINE A CONEXAO COM O BANCO DE DADOS
    Set cn = New ADODB.Connection
    'DEFINE UM NOVO RECORDSET
    Set rs = New ADODB.Recordset
  
    cn.CursorLocation = adUseClient
    'ABRE A CONEXAO COM O BANCO
       cn.Open "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OMITIDO)(PORT=1521)))(CONNECT_DATA=(SID=OMITIDO)(SERVER=DEDICATED)));User Id=OMITIDO;Password=OMITIDO;"
           
    sql = "SELECT X.NM_USUARIO, X.dt_digitacao solicitacao, X.tipo, COUNT(*) QTDE FROM ( "
        sql = sql & "SELECT u.NM_USUARIO, "
        sql = sql & "TRUNC(s.dt_digitacao) dt_digitacao, "
        sql = sql & "DECODE(s.tp_solicitacao, 0, 'SADT', 1, 'Internação', 2, 'Consulta') tipo "
        sql = sql & "FROM   autsc2_solicitacoes s, autsc2_usuarios u "
        sql = sql & "WHERE  s.cd_usuario_criador = u.cd_usuario "
        sql = sql & "AND    (u.CD_GRUPO = 98 OR u.CD_GRUPO = 3) "
        sql = sql & "AND    s.nr_versao > 0 "
        sql = sql & "AND    s.dt_digitacao >= to_date('" & Cells(linhaI, colunaI).Value & "') "
        sql = sql & "AND    trunc(s.dt_digitacao) <= to_date('" & Cells(linhaF, colunaF).Value & "')) X "
    sql = sql & "GROUP  BY X.NM_USUARIO, X.dt_digitacao, X.tipo "
    sql = sql & "ORDER  BY X.dt_digitacao, X.tipo"
         
    rs.Open sql, cn
    
    Range("A1").Value = "NOME USUÁRIO"
    Range("B1").Value = "DATA"
    Range("C1").Value = "TIPO"
    Range("D1").Value = "QTDE"

    i = 2
    If Not rs.EOF Then
        Range("A" & i) = rs(0)
        i = i + 1
        rs.MoveNext
    End If
    
    'FECHA A CONEXÃO
    cn.Close
End Sub
A consulta acima roda normalmente no Oracle.

Coloquei OMITIDO na conexão.
Código: Selecionar todos
SELECT *
    FROM PREST
O com o select acima (simples) eu consigo trazer os dados e popular na planilha.



Existe outra forma de recuperar os dados do select?

Att.

Felipe Arruda

Resultset Vazio - VBA

Enviado: 17 Mar 2017 às 21:40
por FelipeArruda
Solução: no SELECT tive que alterar para o padrão abaixo incluindo o INNER JOIN.
Código: Selecionar todos
sql = "SELECT X.NM_USUARIO, X.dt_digitacao solicitacao, X.tipo, COUNT(*) QTDE FROM ( "
        sql = sql & "SELECT u.NM_USUARIO, "
        sql = sql & "TRUNC(s.dt_digitacao) dt_digitacao, "
        sql = sql & "DECODE(s.tp_solicitacao, 0, 'SADT', 1, 'Internação', 2, 'Consulta') tipo "
        sql = sql & "FROM   autsc2_solicitacoes s "
        sql = sql & "INNER JOIN autsc2_usuarios u"
       sql = sql & "on  s.cd_usuario_criador = u.cd_usuario"
        sql = sql & "WHERE (u.CD_GRUPO = 98 OR u.CD_GRUPO = 3)  "
        sql = sql & "AND    s.nr_versao > 0 "
        sql = sql & "AND    s.dt_digitacao >= to_date('" & Cells(linhaI, colunaI).Value & "') "
        sql = sql & "AND    trunc(s.dt_digitacao) <= to_date('" & Cells(linhaF, colunaF).Value & "')) X "
    sql = sql & "GROUP  BY X.NM_USUARIO, X.dt_digitacao, X.tipo "
    sql = sql & "ORDER  BY X.dt_digitacao, X.tipo"