Notifications
Clear all

SQL Query via VBA

4 Posts
2 Usuários
0 Reactions
3,034 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Prezados, boa tarde!

Como estão todos?

Depois de muito tempo quebrando a cabeça, percebi que de fato estou muito enferrujado para resolver minhas próprias dúvidas.

A Macro em tese é muito simples, eu preciso executar uma consulta no SQL e essa consulta vai me retornar uma tabela de dados. O porém é, esta consulta tem vários subselects com contas e tudo mais. E no final, esta dando um erro chamado "Erro de Sintaxe SQL".
A consulta esta correta, se eu tento rodar a mesmo dentro do SQL Server tudo funciona perfeitamente. porém no EXCEL, Não!

Toda mascara dessa planilha eu peguei de um modelo que funciona para outras consultas mais simples, esta na verdade é a primeiro consulta mais complexa que tento "automatizar". Vejam se podem me ajudar a resolver o problema.

Código Select do SQL

Select distinct
	LEFT(tT.SACA_ID,8) as [Raiz]
,	(Select distinct top 1 tbSACA.NOME from tbSACA where LEFT(tbSACA.SACA_ID, 8) = LEFT(tT.SACA_ID,8)) as [Nome]
,	SUM(CASE when DATEDIFF(day, tT.DATA_DEPO, tT.DATA_PAGO) < 6 and tB.BAIX_CADA_DETA_ID in ('PG BCO', 'PG SAC') 
	then VALO_TITU_ORIG ELSE 0 END) /	SUM(CASE when tB.BAIX_CADA_DETA_ID is not null 
	then VALO_TITU_ORIG ELSE 1 END) [Liq_5 dias]
,	SUM(CASE when tB.BAIX_CADA_DETA_ID is null and DATA_DEPO < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 0 END) [Vencidos]
,	SUM(CASE when tB.BAIX_CADA_DETA_ID is null and DATEDIFF(day, DATA_DEPO, convert(date,GETDATE())) > 10 then VALO_TITU_ORIG ELSE 0 END) [Vencidos > 10]
,	SUM(CASE when DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG * NUME_DIAS ELSE 0 end) / SUM(CASE when DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 1 end) [PzMedio]
,	SUM(CASE when DATA_INCL < convert(date,GETDATE()) and tB.BAIX_CADA_DETA_ID is null then VALO_TITU_ORIG ELSE 0 end) [A vencer]
,	SUM(CASE when tT.DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 0 end) [Vol Processado]
from tbTitu tT 
left join tbTITU_TARI_BAIX tB on tT.TITU_ID = tB.TITU_ID
group by LEFT(tT.SACA_ID, 8)

Segue o código do VBA

Private Sub teste()

    Sheets("Plan1").Select
    ActiveSheet.Cells.Clear
    

 
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=;UID=sa;PWD=;DATABASE=db" _
        , Destination:=Range("Plan1!$A$1")).QueryTable
                'UID= login sql, PWD = senha sql, = DATABASE = Banco de dados.
                'Select dentro da base SQL
        .CommandText = Array( _
        "Select distinct", _
        "LEFT(tT.SACA_ID, 8) As Raiz ", _
        ", (Select distinct top 1 tbSACA.NOME from tbSACA where LEFT(tbSACA.SACA_ID, 8) = LEFT(tT.SACA_ID,8)) as [Nome] ", _
        ", SUM(CASE when DATEDIFF(day, tT.DATA_DEPO, tT.DATA_PAGO) < 6 and tB.BAIX_CADA_DETA_ID in ('PG BCO', 'PG SAC') ", _
        "then VALO_TITU_ORIG ELSE 0 END) /   SUM(CASE when tB.BAIX_CADA_DETA_ID is not null ", _
        "then VALO_TITU_ORIG ELSE 1 END) [Liq_5 dias] ", _
        ", SUM(CASE when tB.BAIX_CADA_DETA_ID is null and DATA_DEPO < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 0 END) [Vencidos] ", _
        ", SUM(CASE when tB.BAIX_CADA_DETA_ID is null and DATEDIFF(day, DATA_DEPO, convert(date,GETDATE())) > 10 then VALO_TITU_ORIG ELSE 0 END) [Vencidos > 10] ", _
        ", SUM(CASE when DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG * NUME_DIAS ELSE 0 end) / SUM(CASE when DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 1 end) [PzMedio] ", _
        ", SUM(CASE when DATA_INCL < convert(date,GETDATE()) and tB.BAIX_CADA_DETA_ID is null then VALO_TITU_ORIG ELSE 0 end) [A vencer] ", _
        ", SUM(CASE when tT.DATA_INCL < convert(date,GETDATE()) then VALO_TITU_ORIG ELSE 0 end) [Vol Processado] ", _
        "from tbTitu tT ", _
        "left join tbTITU_TARI_BAIX tB on tT.TITU_ID = tB.TITU_ID ", _
        "group by LEFT(tT.SACA_ID, 8)")

        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Tabela_PNL_RendaFixa"
        .Refresh BackgroundQuery:=False
    End With

    Application.DisplayAlerts = False
    
End Sub

Agradeço desde já, abs!

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

 
Postado : 30/07/2018 2:48 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Já faz muito tempo que não utilizo sql; e a maioria do tempo foi no Access ou banco Oracle; então estou bedm enferrujado.
Voçe diz que a estrutura reportada "roda" diretamente no banco sem erro, o que é estranho.
Sem conhecer a estrutura do banco também fica difícil ler a estrutura, mas alguma situações chama atenção, porem e apenas suposição:
A partir da segunda linha (Left...) termina com virgula e a linha abaixo inicia com virgula, ficando assim virgulas contiguas (", ,")
Nas "clausulas" SUM e utilizado Case Then End, que normalmente "gera" um campo a ser nomeado "AS"; porem na instrução e indicado um campo entre "[ ]" que indica um campo de tabela; Talvez deva ser END) as "Liq_5 dias" e não END) [Liq_5 dias]

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

 
Postado : 30/07/2018 5:04 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fala Reinaldo meu amigo!

Tentando explicar o modelo do banco, basicamente estou fazendo um query com join em 3 tabelas. Uma que contem os dados de todos os títulos(tbTITU), outra que contem as informações de cada sacado (tbSACA) e outra que contem a informação da liquidação de um título, caso esteja liquidado (TB_TARI_BAIXA_TITU)

Com relação a virgula na primeira linha, se trata da virgula do Array, basicamente estou agrupando a query num array gigante, confesso que não acho a forma mais simples, mas quando tento colocar ela diretamente, não funciona, já com Array, funciona!

Na verdade o SQLServer, eu não necessariamente preciso nomear utilizando o "as" e os campos [] basicamente são os resultados da consulta.

Veja abaixo uma tela do SQL Server com a consulta executada, é dificil esse tipo de caso porque, eu não consigo "descaracterizar" um banco inteiro pra que possamos fazer testes.

Mas desde já agradeço todo empenho.

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

 
Postado : 31/07/2018 7:08 am
(@guimatheus)
Posts: 30
Eminent Member
 

Não sei se faz diferença, mas as minhas consultas SQL eu coloco no excel diretamente através da aba Dados => Obter Dados => De outras fontes => (Eu seleciono geralmente ODBC ou Microsoft Query).

Já tentou dessa forma ?

 
Postado : 16/08/2018 10:49 am