Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
poulain

Visual Basic 6.0 - Conexão

Recommended Posts

Boa Tarde ^_^

Estou com um projeto, e coloquei o código abaixo em um Módulo:


Option Explicit

Public cnnbase As ADODB.Connection
Public rs As ADODB.Recordset
Public strconn2000 As String
Public strconn2003 As String
Public SQL As String

Public Sub AbrirConexao(Banco As String)
strconn2000 = "Provider=microsoft.jet.oledb.3.51;data source=" & Banco
strconn2003 = "Provider=microsoft.jet.oledb.4.0;data source=" & Banco
Set cnnbase = New ADODB.Connection
cnnbase.ConnectionString = strconn2003
cnnbase.Open
End Sub

Public Function ExecutarRecordset(Comando As String, Tipo As String) As ADODB.Recordset
Dim RecTemp As ADODB.Recordset
Set RecTemp = New ADODB.Recordset
If Tipo = "s" Then
[COLOR="Red"]Set RecTemp = cnnbase.Execute(Comando)[/COLOR]
Else
cnnbase.Execute (Comando)
Set RecTemp = Nothing
End If
Set ExecutarRecordset = RecTemp
End Function

A linha em vermelho é onde está dando erro ao executar o programa.

O erro que aaprece é:

Run-time error '91'

Object variable or Witch block variable not set

Alguém poderia me ajudar?

Obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa chamar o "AbrirConexao" antes de chamar o "ExecutarRecordset"

JP

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Hummm...

    Eu dei uma modificada no código, mas acredito que estou me confundindo na hora de puxar o recordset oO'

    Tenho um banco que se chama cadastro.mdb e nele tem a tabela clientes, que tem os campos Nome, Rua, Número, Bairro, Cidade, Nascimento. (nenhum deles é chave primária, e todos estão como formato de texto).

    E no Form tenho os texts txt_nome, txt_rua, txt_num, txt_bai, txt_cid, txt_nasc.

    Vou recolocar o código do módulo, pois fiz algumas alterações:


    Option Explicit
    Public cnnBase As ADODB.Connection
    Public RS As ADODB.Recordset
    Public STRconn2000 As String
    Public STRconn2003 As String
    Public SQL As String


    [COLOR="Blue"]Public Sub AbrirConexao(Banco As String)[/COLOR]
    STRconn2000 = "Provider=Microsoft.Jet.OLEDB.3.51;Fata Source=" & Banco
    STRconn2003 = "Provider=Microsoft.Ket.OLEDB.4.0;Data Source=" & Banco
    Set cnnBase = New ADODB.Connection
    cnnBase.ConnectionString = STRconn2003
    cnnBase.Open
    [COLOR="Blue"]End Sub[/COLOR]

    [COLOR="Blue"]Public Function ExecutarRecordset(Comando As String, Tipo As String) As ADODB.Recordset[/COLOR]
    Dim RecTemp As ADODB.Recordset
    Set RecTemp = New ADODB.Recordset
    If Tipo = "S" Then
    [COLOR="Red"]Set RecTemp = cnnBase.Execute(Comando)[/COLOR] [COLOR="SeaGreen"]'ao clicar no botão Inserir do form
    (código abaixo) dá erro nesta linha do módulo, agora
    mostrando o erro [B]"O comando de texto não foi
    definido para o objeto de comando"[/B] e ainda no Debug
    coloco o mouse sobre (Comando) aparece [B]Comando=""[/B]
    creio que não estou puxando corretamente o recordset ou o abrirbranco.[/COLOR]
    Else
    Set RecTemp = Nothing
    End If
    Set ExecutarRecordset = RecTemp
    [COLOR="Blue"]End Function[/COLOR]

    Agora, no Form tenho o código do Form_Load e o cmd_inserir:


    [COLOR="Blue"]Private Sub cmd_inserir_Click()[/COLOR]
    Set RecTemp = ExecutarRecordset(SQL, "S") [COLOR="Green"]'aqui seria mesmo (SQL, "S")?[/COLOR]
    SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values (" & txt_nome.Text & " , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
    cnnBase.Execute (Comando)
    [COLOR="Blue"]End Sub[/COLOR]


    [COLOR="Blue"]Private Sub Form_Load()[/COLOR]
    AbrirConexao ("C:\Paola\cadastro.mdb")

    [COLOR="Blue"]End Sub[/COLOR]

    :confused: Este é o código do meu programa atualmente...

    Obrigada e espero um mãozinha rsrsrs

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Não está dando erro na "AbrirConexao"? Essa connection string está com erro de digitação "Microsoft.Ket".


    STRconn2003 = "Provider=Microsoft.Ket.OLEDB.4.0;Data Source=" & Banco

    E aqui você está mandando executar uma instrução que não sei qual é (variável SQL) e depois o insert usando a variavel SQL setada. Acho que você queria fazer só isso aqui:


    Private Sub cmd_inserir_Click()
    SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values (" & txt_nome.Text & " , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
    Set RecTemp = ExecutarRecordset(SQL, "S") 'aqui seria mesmo (SQL, "S")?
    End Sub

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Hummm modifiquei mas agora está dando outro erro, na mesma linha do módulo:

    Set RecTemp = cnnBase.Execute(Comando)

    Agora aparece assim: Nenhum valor foi fornecido para um ou mais parâmetros necessários, ou aparece erro na sintaxe INSERT INTO.

    E quando coloco o mouse sobre (comando) aparece:

    Comando = "INSERT INTO clientes (Nome, Rua, Número...

    aparece o código inteiro do insert into.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Acho que falta qualificar como texto os "Nome" do cliente, colocando entre aspas simples, como os outros campos:

    Esse pedaço:

    )... Values (" & txt_nome.Text & " ...

    Deve ficar

    )... Values ('" & txt_nome.Text & "' ...

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • heueheueheue

    deu certo, não acredito que era algo tão simples como um aspa ... =)

    Obrigada!

    Agora pra colocar condições no cmd_inserir, por exemplo:

    1) Todos os campos devem ser preenchidos, se não forem o label8 fica visivel e aparece a msg "Todos os campos devem ser preenchidos

    Eu fiz assim:

    Private Sub cmd_inserir_Click()

    If txt_nome.Text = "" And txt_rua.Text = "" And txt_num.Text = "" And txt_cid.Text = "" And txt_bai.Text = "" And txt_nasc.Text = "" Then

    Label8.Visible = True

    Else

    SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"

    Set RecTemp = ExecutarRecordset(SQL, "S")

    End If

    End Sub

    Mas deu erro naquela mesma linha do módulo, parece que ele ja foi direto pra linha SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, ...

    as outras condições que quero e nao sei fazer são:

    1) o campo txt_num tem que ser número, se não for o label3 fica visivel e aparece que o campo tem que ser numérico

    3) o campo txt_nasc tem que ser data, se não for o label4 fica visivel e aparee que o campo tem que ser data.

    Obrigada!!!!!!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Que erro dá?

    Se você não quer que nenhum dos campos esteja em branco, teste com OR a não com AND. Com AND você está testando se TODOS os campos estão em branco.

    Para saber se o campo é numérico, o VB tem uma função IsNumeric(numero):


    If Not IsNumeric(txt_num.Text) Then
    Label8.Visible = True
    Exit Sub
    End If

    Há algo semelhante para Date também, com a função IsDate(data):


    If Not IsDate(txt_nasc.Text) Then
    Label4.Visible = True
    Exit Sub
    End If

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Deu certo, o código final ficou assim:


    Private Sub cmd_inserir_Click()
    Label8.Visible = False
    Label3.Visible = False
    Label9.Visible = False
    If txt_nome.Text = "" Or txt_rua.Text = "" Or txt_num.Text = "" Or txt_cid.Text = "" Or txt_bai.Text = "" Or txt_nasc.Text = "" Then
    Label8.Visible = True
    End If
    If Not IsNumeric(txt_num.Text) Then
    Label3.Visible = True
    Exit Sub
    End If
    If Not IsDate(txt_nasc.Text) Then
    Label9.Visible = True
    Exit Sub
    End If

    SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
    Set RecTemp = ExecutarRecordset(SQL, "S")
    MsgBox "Registro inserido com sucesso"


    End Sub

    Por enquanto não estou com dúvidas, se tiver mais eu coloco aqui!!

    Obrigada!!! ^_^

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ponha o Exit Sub nesse trecho aqui também, senão ele vai tentar fazer o insert, mesmo entre no IF. O Exit Sub força o fim do processamento do Sub, ou seja, não chega até a linha do ExecutarRecordset.


    If txt_nome.Text = "" Or txt_rua.Text = "" Or txt_num.Text = "" Or txt_cid.Text = "" Or txt_bai.Text = "" Or txt_nasc.Text = "" Then
    Label8.Visible = True
    Exit Sub
    End If

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Ok, coloquei e agora está isnerindo certinho^^

    Mas agora surgiu outra duvida,

    eu criei um menu no form1 e quero que o que eu chamar apareça dentro do form, mas nao lembro se o menu tem que ser no MDI ou no proprio form.

    E como puxa o form pra dentro do mdi / vice-versa.

    ^B)

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Agora puxa normalmente o form1 dentro do MDI.

    ^^

    Agora criei um FORM2, nele eu coloquei um Text e um List, e dois botões: cmdlistar e cmdok,

    O que fiz:

    quando clica no cmdlistar, dentro do list aparece todos os nomes do registro,

    e quando digita no Text algum nome, e clica no cmdok aparece os registros com aquele nome;

    O código abaixo do form2:


    Option Explicit
    Public RSList As ADODB.Recordset
    Public RSText As ADODB.Recordset



    Private Sub cmdlistar_Click()
    List1.Clear
    SQL = "select Nome from clientes"
    Set RSList = ExecutarRecordset(SQL, "S")
    If RSList.EOF = True Then
    MsgBox "nenhum registro"
    Else
    Do While RSList.EOF = False
    List1.AddItem RSList!Nome
    RSList.MoveNext
    Loop
    End If
    End Sub

    Private Sub cmdok_Click()
    List1.Clear
    SQL = "select Nome from clientes where Nome = '" & Text1.Text & "'"
    Set RSList = ExecutarRecordset(SQL, "S")
    If RSList.EOF = True Then
    MsgBox "nenhum registro"
    Else
    Do While RSList.EOF = False
    List1.AddItem RSList!Nome
    RSList.MoveNext
    Loop
    End If
    End Sub

    Private Sub Form_Load()
    AbrirConexao ("C:\Paola\cadastro.mdb")
    SQL = "select distinct Nome from clientes"
    Set RSText = ExecutarRecordset(SQL, "S")
    End Sub

    O único problema que está dando é que quando se digita "Paola" no Text, apareceque não tem nenhum registro, é necessário digitar o nome completo "Paola Napoli" para aparecer, e eu quero que verifique em qualquer palavra por exemplo:

    Para encontrar "Paola Napoli" poderá digitar no text:

    Paola

    Napoli

    pa

    ola

    poli

    etc..

    um pedaço do nome, não o nome completo.

    Valeu!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    No form pai tem que ser um "MDI Form" (e não só form). Nos filhos você seta a propriedade MDIChild para True. Assim, quando ler o form, ele será filho do form que leu.

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ao invés de "=" na condição do nome, use "select Nome from clientes where Nome LIKE '%" & Text1.Text & "%'"

    O "%" é o coringa. Então vai buscar os registros com o que foi digitado em qualquer posição do campo nome.

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Era isso mesmo, obrigada!

    Agora neste form2, ao dar um duplo clique em algum nome do List, deveria retornar ao form1, com os dados preenchidos do nome que foi clicado no list do Form2, oO'

    aii deve usar form1.show, mas nao sei o código que utiliza para saber que vão ser definidos os campos com o que foi clicado no form2...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Faça no Form1 uma função que recebe o código do usuário clicado, e chame-a do Form2. Algo +/- assim:

    No Form1:


    Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long)
    ... (preenche os campos conforme você quer, baseado nesse código passado por parâmetro) ...
    Me.Show
    (Acho que é bom por um Me.ZOrder também para ele trazer o form para frente, caso já esteja exibido, mas por baixo do outro)
    End Sub

    No Form2:


    Sub lstXanana_DblClick(Index As Long)
    Form1.ExibeDadosUsuario(lstXanana.List(Index)) ' Assumindo que o texto do ListBox é sua chave de procura, que será usada no outro sub
    End Sub

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Vamos ver se entendi,

    No Form1 coloquei:


    Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long) [COLOR="Green"]'pra que esse lngCodigo?[/COLOR]
    SQL = "Update clientes set (Nome, Rua, Número, Bairro, Cidade, Nascimento) where ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
    Me.Show
    Me.ZOrder
    End Sub

    No Form2:


    Private Sub List1_DblClick(Index As Long)
    Form1.ExibeDadosUsuario (List1.List(Index))
    End Sub

    Porém logo ao executar o programa, aparece:

    Compile error: Procedure declaration does not match description of event or procedure having the same name

    E fica selecionado:

    Private Sub List1_dblclick(Index As Long

    oO'

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    O "Index" aqui é "integer" e não long. Sorry, não tenho um VB aqui para testar...

    Private Sub List1_DblClick(Index As Long)

    Mas vai continuar dando erro, porque te passei a solução pensado em passar só um código aqui:

    Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long) 'pra que esse lngCodigo?

    quando você quer passar todos os dados. Mude os parametros para os conteúdos dos seus textboxes, e daí na instrução SQL pegue os valores dos parâmetros.

    Não vou fazer para você porque senão você não vai aprender nada... Estou vendo que você está empacando em cada errinho que dá. Tem que se quebrar um pouco para aprender :)

    JP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×