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

Descobrir ID da conexão


Flechaus

Pergunta

Essa está difícil!

Eu trabalho com Visual Basic 6, Crystal Reports 11.5 e MySQL 5.1

Eu sei que se uma conexão é estabelecida ao servidor MySQL, esta recebe um ID de conexão. Isso para mim não tem problemas.

O meu problema é o seguinte: Eu quero saber o ID da conexão que o Crystal Reports faz ao se conectar ao banco de dados para exibir o relatório. Tentei configurar a conexão do CR de duas formas: Por DSN e passando uma conexão feita através do adodb. Consegui das duas formas, porém, nas duas formas, o CR cria uma conexão própria pra ele, e não sei como recuperar o id desta conexão. Se puderem me dar uma luz, agradeço.

Desde já, obrigado a todos.

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

12 respostass a esta questão

Posts Recomendados

  • 0

hum... posso perguntar porque você precisa saber esse id??

de qualquer forma, você consegue saber esse id pela funcao connection_id() do mysql certo??

então, se você chamar essa funcao numa view ou procedure e apontar o crystal reports para essa view ou procedure, você consegue saber dentro do crystal reports qual é o id da conexao, certo??

agora, se você precisar saber esse id pelo visual basic, então você vai ter q dar um jeito de ler esse valor de dentro do crystal reports.

bom, eu consigo fazer isso atraves do evento format() do objeto CRAXDRT.Section, depois de aponta-lo para o details do relatorio, exemplo:

Dim crAppl As CRAXDRT.Application, crRep As CRAXDRT.Report
Private WithEvents crDetails As CRAXDRT.Section

Dim ID_Conexao As Long

Private Sub Imprime()
    Set crAppl = New CRAXDRT.Application
    Set crRep = crAppl.OpenReport("C:\relatorio.rpt")

    ID_Conexao = 0&

    Set crDetails = crRep.Sections("D") 'Aponta crDetails para o details

    CRViewer1.ReportSource = crRep
    CRViewer1.ViewReport
End Sub
Private Sub crDetails_format(ByVal pFormattingInfo As Object)
    If ID_Conexao = 0& Then
        Dim tb As Long, Campo As Long

        tb = [indice da tabela no crystal reports q traz o connection_id()]
        campo = [indice do campo q traz o connection_id() na tabela]

        ID_Conexao = crRep.Database.Tables(tb).Fields(campo).Value
    End If
End Sub[/code]

mais ou menos isso, só não tenho certeza se o campo deve estar adicionado no relatorio para q possa ser lido. mas se precisar, deve funcionar adicionando-o no relatorio e deixando-o suprimido.

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

  • 0
hum... posso perguntar porque você precisa saber esse id??

de qualquer forma, você consegue saber esse id pela funcao connection_id() do mysql certo??

então, se você chamar essa funcao numa view ou procedure e apontar o crystal reports para essa view ou procedure, você consegue saber dentro do crystal reports qual é o id da conexao, certo??

agora, se você precisar saber esse id pelo visual basic, então você vai ter q dar um jeito de ler esse valor de dentro do crystal reports.

bom, eu consigo fazer isso atraves do evento format() do objeto CRAXDRT.Section, depois de aponta-lo para o details do relatorio, exemplo:

Dim crAppl As CRAXDRT.Application, crRep As CRAXDRT.Report
Private WithEvents crDetails As CRAXDRT.Section

Dim ID_Conexao As Long

Private Sub Imprime()
    Set crAppl = New CRAXDRT.Application
    Set crRep = crAppl.OpenReport("C:\relatorio.rpt")

    ID_Conexao = 0&

    Set crDetails = crRep.Sections("D") 'Aponta crDetails para o details

    CRViewer1.ReportSource = crRep
    CRViewer1.ViewReport
End Sub
Private Sub crDetails_format(ByVal pFormattingInfo As Object)
    If ID_Conexao = 0& Then
        Dim tb As Long, Campo As Long

        tb = [indice da tabela no crystal reports q traz o connection_id()]
        campo = [indice do campo q traz o connection_id() na tabela]

        ID_Conexao = crRep.Database.Tables(tb).Fields(campo).Value
    End If
End Sub

mais ou menos isso, só não tenho certeza se o campo deve estar adicionado no relatorio para q possa ser lido. mas se precisar, deve funcionar adicionando-o no relatorio e deixando-o suprimido.

Acho que ainda não é isso, pois este método não iria trazer um id real da conexão. Pois o CR faz uma conexão própria dele, sendo assim, mesmo que eu dê a ele uma conexão adodb pronta, ele aceita, mas cria uma outra, e é esta que quero capturar a id. Deste modo que você citou, eu estaria assumindo que o id da conexão dele será outro e não o real. Não sei se deu pra entender.

Ainda estou tentando fazer com que ele não faça uma nova conexão, mas não sei se vou conseguir.

E obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu dei uma rápida pesquisada sobre stored procedures no MySQL, pois nunca tinha usado ou me interessado por isso, e desenvolvi uma procedure simples para recuperar somente o id da conexão.

Converti esta informação na procedure mesmo para signed, pois o crystal reports e o visual basic 6 não suportam o tipo BIGINT, ai ficou assim a minha procedure:

CREATE DEFINER=`fjsrsistemas`@`%` PROCEDURE `myconid`()

BEGIN

select cast(connection_id() as signed) as con_id;

END

Eu testei no MySQL mesmo para ver se estava funcionando desta forma:

call myconid;

E retornou o id da conexão.

Inseri esta procedure no Crystal Reports 11.5, e apareceu no link como uma tabela de apenas um campo, e inseri este campo na seção detalhes.

Pelo que eu vi, realmente apareceu no CR o número correto da conexão.

Se eu fizer desta forma, vai ser dose... são 115 relatórios no projeto.

Mas tomei uma surra pra botar essa procedure pra funcionar, fiquei prestando atenção na sintaxe que não conheço, que cometi um erro de digitação no nome da variável. rsrs

Para quem interessar, a idéia do kuroi funciona.

Obrigado kuroi pela atenção.

Depois posto mais uma dificuldade avançada pra ver se você sabe. rsrs

Um abraço.

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

  • 0

Se tivesse como recuperar este conteúdo sem este evento seria melhor, porque de acordo com o que estou fazendo, meu código está em um módulo e estou controlando um ocx em um form.

Ficou complicado, mas estou tentando.

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

  • 0
Se tivesse como recuperar este conteúdo sem este evento seria melhor, porque de acordo com o que estou fazendo, meu código está em um módulo e estou controlando um ocx em um form.

hum... não sei... pra trazer algum dado de volta do crystal reports, só consegui imaginar esse jeito.

mas não é porque um pedaco do codigo esta no module e o outro no form q não da pra funcionar. você pode passar os objetos como parametro pras funcoes q vai usar, ou mesmo declara-lo como publico.

se quiser poste ai os codigos q esta usando.

Link para o comentário
Compartilhar em outros sites

  • 0
Se tivesse como recuperar este conteúdo sem este evento seria melhor, porque de acordo com o que estou fazendo, meu código está em um módulo e estou controlando um ocx em um form.

hum... não sei... pra trazer algum dado de volta do crystal reports, só consegui imaginar esse jeito.

mas não é porque um pedaco do codigo esta no module e o outro no form q não da pra funcionar. você pode passar os objetos como parametro pras funcoes q vai usar, ou mesmo declara-lo como publico.

se quiser poste ai os codigos q esta usando.

Estou dando meu jeito aqui, tive que refazer a seção do meu sistema que é responsável pelos relatórios. Estava um pouco fora de padrão.

Pelos últimos testes que eu fiz funcionou, mas ainda tenho que arrumar umas coisas, deixei isso uma bagunça com tanto código que tentei.

Uma observação: O código que você postou não funciona. O evento que você indicou está correto, porém aquela estrutura de código de tabelas não é aceita durante a execução do evento. Tive que mudar o código para trabalhar com definições de objetos.

Obrigado pela ajuda ai kuroi, valeu mesmo!

Oo.. vou abrir outro tópico sobre Crystal Reports 11. Tenho um pepino que procurei mas parece que não tem solução. rs

Link para o comentário
Compartilhar em outros sites

  • 0
Uma observação: O código que você postou não funciona. O evento que você indicou está correto, porém aquela estrutura de código de tabelas não é aceita durante a execução do evento.

hum... pra mim funcionou com o crystal 8.5 e access. talvez seja diferente nas versoes mais novas.

Oo.. vou abrir outro tópico sobre Crystal Reports 11. Tenho um pepino que procurei mas parece que não tem solução. rs

beleza, lembre-se de q tb temos uma sala sobre crystal reports: http://scriptbrasil.com.br/forum/index.php?showforum=68

Link para o comentário
Compartilhar em outros sites

  • 0
Uma observação: O código que você postou não funciona. O evento que você indicou está correto, porém aquela estrutura de código de tabelas não é aceita durante a execução do evento.

hum... pra mim funcionou com o crystal 8.5 e access. talvez seja diferente nas versoes mais novas.

Oo.. vou abrir outro tópico sobre Crystal Reports 11. Tenho um pepino que procurei mas parece que não tem solução. rs

beleza, lembre-se de q tb temos uma sala sobre crystal reports: http://scriptbrasil.com.br/forum/index.php?showforum=68

Rapaz, tome cuidado com o access, usei ele por anos e já me dei mal.

Link para o comentário
Compartilhar em outros sites

  • 0

Será que existe este evento _format para a seção 'Cabeçalho da Página' ?

Pois existem alguns relatórios no meu projeto que eu suprimi a seção Details.

Desde já, muito obrigado.

Acabei de ver, tem sim.

O evento crPageHeader_format dispara uma vez (creio eu por página), por ser o cabeçalho de página.

Enquando que o evento crDetails_format dispara uma vez para cada linha na seção detalhes, (creio eu por página).

Só fiz testes até agora com relatório de apenas uma página.

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

  • 0
O evento crPageHeader_format dispara uma vez (creio eu por página), por ser o cabeçalho de página.

Enquando que o evento crDetails_format dispara uma vez para cada linha na seção detalhes, (creio eu por página).

Só fiz testes até agora com relatório de apenas uma página.

hum... o evento não se chama necessariamente crPageHeader_format nem crDetails_format.

seria sim o evento format() do obejto CRAXDRT.Section. você poe o nome q quiser no objeto (crDetails, crPageHeader ou qualquer outra coisa q quiser), correto??

a diferenca é com a secao a qual você associa.

hum... com todos os testes q fiz aqui, sempre usei crDetails pra associar com os details, já q esse é o nome popular dado ao objeto q associamos aos details, q encontramos nos codigos de exemplo, por ai. mas acredito q não tenha porque ele não aceitar com outro nome.

Link para o comentário
Compartilhar em outros sites

  • 0
O evento crPageHeader_format dispara uma vez (creio eu por página), por ser o cabeçalho de página.

Enquando que o evento crDetails_format dispara uma vez para cada linha na seção detalhes, (creio eu por página).

Só fiz testes até agora com relatório de apenas uma página.

hum... o evento não se chama necessariamente crPageHeader_format nem crDetails_format.

seria sim o evento format() do obejto CRAXDRT.Section. você poe o nome q quiser no objeto (crDetails, crPageHeader ou qualquer outra coisa q quiser), correto??

a diferenca é com a secao a qual você associa.

hum... com todos os testes q fiz aqui, sempre usei crDetails pra associar com os details, já q esse é o nome popular dado ao objeto q associamos aos details, q encontramos nos codigos de exemplo, por ai. mas acredito q não tenha porque ele não aceitar com outro nome.

Está correto, o nome do objeto pode ser qualquer um que seja aceito pela regra de nomenclatura de variáveis.

Fiz os testes e funciona igualmente bem com a seção Detail(detalhes) ou PageHeader(cabeçalho de página).

Creio que funcionaria com PageFooter ou ReportFooter, se é que estou escrevendo o nome delas corretamente.

É isso ai... contribuindo... rsrs

Editado por Flechaus
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,4k
×
×
  • Criar Novo...