Ir para conteúdo
Fórum Script Brasil
  • 0

Como modificar o caminho da base de dados?


Duduh_Capixaba

Pergunta

Olá pessoal! Seguinte...

Criei um relatório no Crystal Reports onde configurei a base de dados por "Connection String", assim:

Conexão ODBC (RDO)

Connection String: Dbname=X:\Caminho\Base;Driver=Firebird/InterBase® driver;CHARSET=NONE;UID=SYSDBA;PWD=masterke

Ok, agora, com esse código dentro do VB eu exibo o relatório:

Private Sub Command1_Click()
    Dim crAppl As CRAXDRT.Application
    Dim crRep As CRAXDRT.Report

    Set crAppl = New CRAXDRT.Application
    Set crRep = crAppl.OpenReport("X:\Caminho\Relatorio.rpt")
    
    If Text1.Text <> "" Then 'Caso o cliente queira definir um filtro
        crRep.SQLQueryString = "SELECT * FROM TABELA WHERE CAMPO = " & Text1.Text
    End If
    
    Form1.Show
    Form1.crViewer1.ReportSource = crRep
    Form1.crViewer1.ViewReport
End Sub

Tá tudo ótimo! Mas, e se eu quiser mudar o local da base de dados? Tipo, lá na Connection String do relatório, tá configurado pra ele procurar a base de dados na pasta X, mas e se eu quiser a pasta Y?

Eu pensei em um comando tipo: crRep.DataBase.ConnectionString = "Y:\NovoCaminho\NovaBase", mas já testei um monte de comandos aqui (obs: esse que eu escrevi não existe) e nenhum funcionou. Alguém sabe me responder essa? Vlw!

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Acho que achei o comando, de todos os que eu testei parece que este é o que mais se aproxima: "crRep.Database.SetDataSource". Só não estou sabendo como usá-lo. Esses são os parâmetros que ele pede:

SetDataSource(data, [dataTag], [tableNumber])

Se for mesmo esse o comando, o que eu devo colocar pra cada parâmetro desse?

Link para o comentário
Compartilhar em outros sites

  • 0

com firebird não sei, mas com access, da pra fazer assim: http://scriptbrasil.com.br/forum/index.php...st&p=448962

outra coisa q sei q da pra fazer é um relatorio q não aponte pra banco nenhum, apenas com os campos definidos e depois, pelo Visual Basic, você passar os dados do RecordSet para o relatorio. se isso servir pra você, da um toque ae.

Link para o comentário
Compartilhar em outros sites

  • 0

é, sei que dá pra fazer muitas coisas...o problema é saber como, hehe :)

bem, testei aqui e estou quase chegando onde eu quero. fazendo do jeito que está no outro tópico, agora aparece a seguinte mensagem:

"Logon failed.

Details: Cannot find DSN in connection string"

e realmente não coloquei nenhum DSN na minha conexão, pois sem usar um novo direcionamento de base o relatório abre normal. acho que agora eu devo usar o comando LogOnServer, mas tentei e não consegui tb, veja:

crRep.Database.LogOnServer "odbc", "localhost", Fonte_ODBC, SYSDBA, masterke

dá erro na conexão ODBC:

"Nome da fonte de dados não encontrado e nenhum driver padrão especificado"

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0

Olá Kuroi:

outra coisa q sei q da pra fazer é um relatorio q não aponte pra banco nenhum, apenas com os campos definidos e depois, pelo Visual Basic, você passar os dados do RecordSet para o relatorio. se isso servir pra você, da um toque ae.

Isto é precisamente o que eu precisava fazer...você por acaso tem código em VB que possa postar aqui,para exemplificar essa situação?Já agora que tipo de campos definidos no CR se refere?ParameterFields?

Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

  • 0

não é parameter field não. você não vai apontar direto pro seu banco de dados, e sim pra apenas a definicao da tabela. tipo, você vai definir os campos assim:

na hora de setar o banco de dados no Crystal, clique em More Data Sources -> Active Data -> Active Data (Field Definitions Only).

vai abrir uma janela escrito Select Data Source. la embaixo, na opcao Data Definition clique em New ai ele vai abrir uma janelinha para você montar a estrutura da tabela.

ai no Visual Basic, o RecordSet deve estar aberto com uma consulta na mesma estrutura q você criou no Crystal.

ai pra preencher a tabela pelo Visual Basic, usando o objeto Report da bibliotece Crystal Reports ActiveX Design RunTime Library, use o seguinte codigo:

cr.Database.Tables(1).SetDataSource rs, 3

onde cr é o seu objeto Report e rs é seu RecordSet.

lembrando se você fizer dessa forma, existe uma desvantagem q é, quando o relatorio estiver sendo visualizado, e alguma alteracao é feita no banco de dados, ao clicar em Refresh ele não vai atualizar, já q esta apontando pro RecordSet q foi carregado na memoria e não diretamente pro banco de dados.

qualquer duvida poste ae.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Kuroi:

Na Opção que você indicou More Data Sources o que aparece é "no items Found"...não consigo visualizar as opções seguintes...

o que eu pretendo fazer é algo do género que fazemos no visual Basic para um ListView ou para um Flexgrid que é:

Dim Report As New CRAXDRT.Application
Dim Rpt As CRAXDRT.Report


Set db = Workspaces(0).OpenDatabase(progaves)
Set Rstalao = db.OpenRecordset("select * from talao")
aSQL = aSQL & " ORDER BY nomecomprador"
Set Data1.Recordset = Rstalao


Set Report = New CRAXDRT.Application
Set Rpt = Report.OpenReport(App.Path & "\Listagementregaaves.rpt")

Do While Not Data1.Recordset.EOF

comprador = Data1.Recordset![nomecomprador] & ""
expositor = Data1.Recordset![expositor] & ""
gaiola = Data1.Recordset![gaiola] & ""

Rpt.ParameterFields(1).AddCurrentValue (comprador) 'Comprador
Rpt.ParameterFields(2).AddCurrentValue (expositor) ' Expositor
Rpt.ParameterFields(3).AddCurrentValue (gaiola) ' Gaiola


Data1.Recordset.MoveNext

Loop

setviewersize

CRViewer1.ReportSource = Rpt

CRViewer1.ViewReport

Só que claro está isto que fiz para um report no CR era demasiado fácil para ser verdade...logo percebi que tinha que fazer mais qualquer coisa para fazer uma coisa do género...

Agora não sei qual a melhor forma de fazer isto...

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Kuroi:

Efectivamente já consegui descobrir onde se encontrava a janela no CR,que estava em "Field Definitions Only" e a partir daqui já consegui criar os campos que pretendo e introduzi-os no relatório...foi criado o ficheiro .TTX bem como o .Rpt...

A partir daqui construí o seguinte código:

Dim Report As New CRAXDRT.Application
Dim Rpt As CRAXDRT.Report

Set con = New ADODB.Connection
Set rs = New ADODB.Recordset
[b]con.Open "DSN=BDGCE"[/b]
rs.cursorlocation = aduseclient
rs.Open "Select [nomecomprador], [expositor], [gaiola], position " & _
        "From talao2006 " & _
        "Order By [nomecomprador]", con, adopenstatic, adlockreadonly, adcmdtext
        
Set Report = New CRAXDRT.Application
Set Rpt = Report.OpenReport(App.Path & "\Listagementregaaves.rpt")

If (Rpt.HasSavedData) Then Rpt.DiscardSavedData

crreport.Database.SetDataSource rs, 3, 1



setviewersize

CRViewer1.ReportSource = Rpt

CRViewer1.ViewReport

que dá um erro no VB na linha marcada a Bold:

"[Microsoft][gestor de controladores ODBC]O nome de origem de dados não foi encontrado e não foi especificado nenhum controlador pré-definido"

Sabe o porquê deste erro?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

bom, eu tava explicando aqui como achar o Field Definitions, mas agora vi q você editou o post e já achou. mas como deu mo trabalho pra escrever vou deixar aqui, pode servir pra outras pessoas q lerem aqui. mas como não interessa mais pra você, pule essa parte.

Na Opção que você indicou More Data Sources o que aparece é "no items Found"...não consigo visualizar as opções seguintes...

tipo, não aparece essas opceos no More Data Sources??

crystal1ww1.jpg

tipo ai na opcao Active Data (Field Definitions Only), clique no "+" q tem ao lado, q ai deve aparecer essa janela aqui:

crystal2ba5.jpg

nela clique em New q vai aparecer a janelinha pra editar os campos.

Só que claro está isto que fiz para um report no CR era demasiado fácil para ser verdade...logo percebi que tinha que fazer mais qualquer coisa para fazer uma coisa do género...

então, se você conseguir fazer o arquivo de estrutura, ai tem como vca passar os dados do RecordSet.

senao, tb tem outras opcoes, dependendo de como você quer, talvez ate melhores.

tipo, você pode apontar direto pro seu banco de dados no rpt. mas ai pelo Visual Basic você edita o Selection Formula pelo filtro q você quer. exmeplo, se no seu programa o cara filtrar pela data maior que 2005, é só você adicionar essa instrucao no Selection Formula (pela propriedade RecordSelectionFormula do obejto Report).

outra opcao é deixar a Selection Formula pronta no rpt mas baseada em campos parametros. ai você preencheria os campos parametros apenas pra montar o filtro (e não pra passar todos os dados).

que dá um erro no VB na linha marcada a Bold:

"[Microsoft][gestor de controladores ODBC]O nome de origem de dados não foi encontrado e não foi especificado nenhum controlador pré-definido"

tipo, você devia passar a ConnectionString correta do seu banco de dados no lugar de "DSN=BDGCE". isso depende do banco de dados q você usa. veja nesse site http://www.connectionstrings.com/ q ele passa os codigos corretos das connectionstrings pra varios bancos de dados.

caso tenha alguma dificuldade de achar a sua conexao, me fala qual bd você usa?? você ta usando ODBC??

Link para o comentário
Compartilhar em outros sites

  • 0

Parece que já consegui...

BOm eu não sabia que podia fazer a conexão com recurso ao DAO e então como costumo utilizar mais o DAO fiz assim:

Dim Report As New CRAXDRT.Application
Dim Rpt As CRAXDRT.Report

caminho = frmopcoesgerais.Text1.Text
photo = frmopcoesgerais.Text2.Text

If frmanocriacao.Text1(1).Text <> "" Then
ano = frmanocriacao.Text1(1).Text
Else
ano = frmanocriacao.Text1(0).Text
End If

FrmComprasAvesExposicao.BackColor = RGB(239, 238, 238)

Set db = Workspaces(0).OpenDatabase(caminho)

Sql = _
      "select" & _
        " nomecomprador, expositor, gaiola" & _
        " from talao2006" & _
        " order by nomecomprador"
  
Set rs = db.OpenRecordset(Sql)
Set Data1.Recordset = rs

        
Set Report = New CRAXDRT.Application
Set Rpt = Report.OpenReport(App.Path & "\aves2.rpt")

If (Rpt.HasSavedData) Then Rpt.DiscardSavedData

Rpt.Database.SetDataSource rs, 3


setviewersize

CRViewer1.ReportSource = Rpt

CRViewer1.ViewReport

Parece fácil extrair então valores da BD para o relatório através de campos .TTX

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --sacramento --

Olá Kuroi:

Por acaso sabes como posso fazer para imprimir no mesmo report um outro recordset?

Ou seja usando o código anterior que postei mas adicionando uma outra extracção de SQL...

Por exemplo:

Set db = Workspaces(0).OpenDatabase(caminho)

Sql = _
      "select" & _
        " nomecomprador, expositor, gaiola" & _
        " from talao2006" & _
        " order by nomecomprador"
  
Set rs = db.OpenRecordset(Sql)
Set Data1.Recordset = rs


Sql = _
      "select" & _
        " nomecomprador, expositor, gaiola" & _
        " from talao2007" & _
        " order by nomecomprador"
  
Set rs = db.OpenRecordset(Sql)
Set Data1.Recordset = rs


        
Set Report = New CRAXDRT.Application
Set Rpt = Report.OpenReport(App.Path & "\aves2.rpt")

If (Rpt.HasSavedData) Then Rpt.DiscardSavedData

Rpt.Database.SetDataSource rs, 3


setviewersize

CRViewer1.ReportSource = Rpt

CRViewer1.ViewReport

Tenho dois SQL's mas como o código como está só extrai para o report um SQL,mas eu queria extrair os dois no mesmo report...sabes como se faz?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

tente isso:

Sql = _
      "select" & _
        " nomecomprador, expositor, gaiola" & _
        " from talao2006" & _
        " order by nomecomprador UNION ALL " & _
      "select" & _
        " nomecomprador, expositor, gaiola" & _
        " from talao2007" & _
        " order by nomecomprador"[/code]

Link para o comentário
Compartilhar em outros sites

  • 0
Guest mssacramento

Olá Kuroi:

Desculpe só responder agora á sua resposta mas de facto funciona na perfeição,a sugestão que recomendou...

Tenho usado a técnica dos ficheiros .ttx criados no "field definitions Only" tal como já foi abordado neste tópico para extrair recordsets para dentro do crystal reports...

Agora tenho uma situação que não sei se é possível resolvê-la que é a seguinte:

Depois de ter criado alguns campos no "field definitions Only" pretendia alterar via VB o nome de um desses "Fields"...é possível fazer isso?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

opa, foi mal a demora.

Depois de ter criado alguns campos no "field definitions Only" pretendia alterar via VB o nome de um desses "Fields"...é possível fazer isso?

nossa não sei, mas tipo qual seria a finalidade?? se não me engano o nome no recordset não precisa ser o mesmo do ttx, só precisa estar na mesma ordem, então basicamento o nome do ttx não influi em nd. o q exatamente você ta precisando??

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal aconteceu algo estranho, tava eu no google pesquisando e cliquei num link, e o link já abriu o forum em modo de edição, eu cliquei em salvar pra ver o que era, e apenas fez eu postar aqui, achei estranho ou falta de segurança do IPB, mas deixa pra la.

Editado por Fabyo
Link para o comentário
Compartilhar em outros sites

  • 0
Guest mssacramento

Olá Kuroi:

O problema é que se não houver maneira de mudar o nome dos ttx então vou ter que criar uns quantos campos de ttx para o mesmo sitio...se houvesse forma de renomear os fields então criava só um field e depois via código alterava o nome...

Os ttx influenciam tb no nome,não dei conta da ordem no recordset...

Cumprimentos

Link para o comentário
Compartilhar em outros sites

  • 0

hum, tipo, você quer modificar o nome do arquivo .ttx ou o nome do campo q esta dentro do arquivo??

tb não entendi direito o q exatamente você esta precisando??

você esta com mais de um .ttx no mesmo report?? se for, não posso te dar mta dica, porque nunca trabalhei assim. quando eu precisava selecionar mais de uma tabela, eu usava um .ttx só com todos os campos, e fazia um select de join no recordset e passava os dados todos pra um .ttx só.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...