locked
Consulta dentro de ADO RRS feed

  • Pergunta

  • Oi Pessoal

    Eu estou criando uma função que precisa de ADO Recordset.

    database = "09/01/2009"
    fator = "DIxTR"

    Swap = "SELECT * FROM SwapHist WHERE ((Data = database) and (Indice=fator))"


    Set cnn = CurrentProject.Connection
    rstSWAP.Open Swap, cnn, adOpenDynamic, adLockOptimistic

     rstSWAP.MoveFirst

     

    acima está um pedaço da função. sempre ocorre erro de conexão e aparecem duas msg:1) nenhum valor foi fornecido por um ou mais parâmetros ou 2) EOF ou BOF são verdadeiros( nesse caso eu acredito que o problema é com a data).
    alguem consegue saber porque isso acontece? tambem gostaria de saber se dá para colocar a data como parametro a partir de um dtpicker que fica num formulario...
     
     
    Valeu

     

    quinta-feira, 15 de janeiro de 2009 13:15

Todas as Respostas

  • Oi Fradique!

    Sou iniciante em ADO e por isso não posso te ajudar muito, mas lá vai uma dika!

     

    Se você está escrevendo a query Swap no editor vba, tenta essa sintaxe:

     

    Swap = "SELECT * FROM SwapHist WHERE ((Data =" &  database & ") and (Indice=" & fator & "));"

     

    Desta forma as palavras database e fator não vão mais ser tratadas como parte da string Swap e sim como  as variaveis declaradas anteriormente.

    Espero ter ajudado.

    terça-feira, 20 de janeiro de 2009 20:07
  • Oi Abraão !

    Valeu pela dica. Agora eu sei que com essa sintaxe eu consigo chamar uma variavel na consulta.

    Só que esse comando ainda está com problemas. O campo Data traz o valor certo da variavel a partir do DTpicker mas

    a consulta vem sem dados. Eu acredito que seja problema de formatação de datas que o access é muito fresco com datas. Ja em relação ao campo Indice, a consulta diz que não ha parametros e isso gera problema antes mesmo de abrir a tabela usando ADO.

     

    Eu estou usando muito ADO mas ainda tenho muitos problemas com conultas que tem datas.

     

    Abraço 

    segunda-feira, 26 de janeiro de 2009 16:06
  • Use assim:

    Swap = "SELECT * FROM SwapHist WHERE ((Data =#" &  Format(database, "MM/dd/yyyy") & "#) and (Indice=" & fator & "));"


    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    domingo, 1 de fevereiro de 2009 16:02
    Moderador
  • Oi Luiz,

    Tentei fazer como pediu mas não deu certo. Eu tentei usar o parametro do ADO e tambem não deu certo.
    O Código está abaixo:

    Set cnn = CurrentProject.Connection

    cmd.CommandText = "SELECT * FROM SwapHistorico WHERE ((Data =?) and (Indice= ?));"
    cmd.CommandType = adCmdText

    Set prm = cmd.CreateParameter("Data", adDate, adParamInput)
    prm.Value = Form_frm_Menu.database.Value
    cmd.Parameters.Append prm

    Set prm1 = cmd.CreateParameter("Indice", adBSTR, adParamInput)
     If Indice = 0 Or Indice = "0" Or Indice = "TR" Or Indice = "SFH" Then
       prm1.Value = "DIxTR"
      ElseIf Indice = 13 Or Indice = "13" Or Indice = "IGPMPROR" Or Indice = "IGPM" Or Indice = 27 Or Indice = "27" Then
       prm1.Value = "DIxIGPM"
      Else
       prm1.Value = "DIxPRE"
     End If
    cmd.Parameters.Append prm1
     
    cmd.ActiveConnection = cnn
    'Set cmd = CurrentProject.Connection
    Set rstSWAP = cmd.Execute

    'rstSWAP.Open cmd, cnn, adOpenDynamic, adLockOptimistic

     rstSWAP.MoveFirst
     prazo1 = rstSWAP.Fields(2)
     tx1 = rstSWAP.Fields(4)


    Eu nunca usei ADO.Parameter e novamente não deu certo. no Ajuda do VBA mostra exemplo para um parametro. Mas para dois não sei se é dessa forma.
    Agradeço muito se puder me ajudar ou se alguem puder me ajudar.

    Abraço

    quinta-feira, 5 de fevereiro de 2009 18:33
  •  Oi Fradique,

    Primeira coisa : você realmente tem necessidade de usar ADO?
    ADO é otimo para interoperabilidade entre aplicações(troca de informações entre dispositivos), já o DAO é otimo para manipular objetos dentro do Access (na minha opinião!).Então vale a pena repensar sobre que metodo usar!

    Outra coisa, não sei se é o caso mas vale apena citar: "Lembre SEMPRE de utilizar variaveis 'tipadas'"
    Elas ajudam na hora de compilar um codigo, migrar todo o projeto e muito mais (sem falar na organização).
    No primeiro post você jogou o valor '09/01/2009' para a variavel database assim:

    database = '09/01/2009'

    O certo seria :

    dim database as Date         'Eu tipei a variavel  database como type Date. E 'Dim' define o escopo

    database = #01/09/2009# 'No Access o uso de # é obrigatorio para datas. E lembrado que o VBE
                                                'VBE considera as datas no formato mm/dd/aaaa.

    strSQL = " SELECT tb.* FROM tb WHERE tb.dtData =  #" & Format(database, "mm/d/yyyy") & "#;"

    Lembre-se de usar # tambem na string SQL como o Luiz Cláudio fez.
    E outra coisa!: pode ser até superstição minha mas eu NUNCA uso nomes como Data e afins em campos de tabelas, vai que ele entende que é alguma função!!

    Espero ter ajudado!







    quinta-feira, 5 de fevereiro de 2009 19:51
  • Olá Fradique,


    se a base de dados é SQL Server você precisa nos dizer, pois como o fórum é de Access, presumi que estava usando MDB como base de dados.

    Quanto à sugestão que dei, como ficou seu código? Você apenas disse que não deu certo, mas não disse nem como ficou o código e nem qual erro aconteceu.

    Se está usando SQL Server, ficaria assim:

    Swap = "SELECT * FROM SwapHist WHERE Data ='" &  Format(database, "yyyy-MM-dd") & "' and Indice=" & fator


    Presumo aqui também que o campo Indice seja um número inteiro.

    Uma coisa estranha é ter uma variável com nome database, já que database é um tipo de dados da biblioteca DAO. Muito melhor seria usar um nome como dtDataBase.


    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    sexta-feira, 6 de fevereiro de 2009 02:30
    Moderador
  • Oi Pessoal,

    Então, na verdade eu uso ADO porque aprendi a usá-lo no curso que fiz sobre access. Eu estou trabalhando com o office access sem SQL server. A minha rotina é acessar varias tabelas que na maioria das vesez estao vinculadas ou disponíveis no meu bd access e fazer vários cálculos e gerar relatórios. A função que passei acima é para fazer interpolação das taxas de juros entre dois periodos. A tabela para consulta é uma tabela vinculada. Para poder calcular a taxa interpeloda, eu preciso acessar a tabela filtrando ela a partir de uma data( data base) e indice( TR, IGPM, etc). Para automatizar a rotina, pensei em usar o DTpiker o qual serveria para todas as rotinas que usariam datas. Ja o indice pensei em usar o comando if.

    pelo comentario de vocês, o melhor é usar DAO não é?

    Eu reconheço que preciso de mais organização. As variaveis eu declaro todas elas no começo do código e eu não passei para não ficar muito comprido.

    Eu espero ter sido mais claro e gostaria de uma recomendação de vocês sobre algum livro ou curso avnçado sobre programar em access.

    Agradeço muito pela ajuda que foi muito rica.

     

     

    sexta-feira, 6 de fevereiro de 2009 13:07
  • Não há nada de errado em usar ADO, funciona da mesma forma que DAO.

    Quase todas as respostas acima estão corretas, seria muito útil você testá-las e descobrir exatamente o que faltou para funcionar no seu caso, pois só assim de fato aprenderá. 
    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    sexta-feira, 6 de fevereiro de 2009 23:14
    Moderador