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

Dbgrid, Datagrid, Msflexgrid...


Evandro Fontes

Pergunta

Olá a todos.

Vou colokar uma imagem da minha tela, e logo abaixo segue uma duvida biggrin.gif

user posted image

O problema é o seguinte, nesa tela tem o grid (nessa imagem eu estava usando o DataGrid, mas sem nenhum sucesso, os campos de cim, são preenchidos com dados da tabela [Clientes], e o grid seria preenchido com os dados da tabela[OS], que eu pretendo ligar via SQL, ateh ai, nada que umas hrs de briga não resolvam, mas o meu maior problema é como preencher o grid... eu já li todos os topicos relacionados aqui do forum, tentie fazer igual as explicações... e nada. dry.gif

Visitei os sites da lista, tentei fazer quenem o exemplo ,e sempre dava erro.. Tentei o dbgrid, o data grid, o msflexgrid, e o grid da sheridan, mas nenhum deu certo.

Alguém poderia me dar uma explicação detalhada sobre o assunto!?

estou usando conexão ADO...

Sub conecta()

    caminho = ReadINI("CAMINHOS", "banco", App.Path & "\config.ini")

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & caminho & " ;"

    rs.CursorLocation = adUseClient

    rs.Open "Select ....", cnn, adOpenKeyset, adLockOptimistic, adCmdText

End Sub

Espero respostas, e agradeço desde já a atenção de vocês.

Abraços.

Evandro.

Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0
O DBGrid e o MsFlexGrid você não conseguirá preencher com um Recordset ADO, no entanto, o DataGrid sim. Eu faço da seguinte maneira (após abrir o Recordset, semelhante ao exemplo que você deu no outro post):

set datagrid1.datasource = rs

Abraços,

Graymalkin

hmmmm, coloquei essa linha na rotina "carrega", ela criou 2 linhas no Grid, correspondente aos 2 registro que existem na tabela de clientes.... mas não mostrou os dados da tabela de OS...

Se eu criar um recordset especifico pra tabela de OS com uma instrução SQL diferente, não dá certo também, ou só com uma instrução SQL eu consigo puxar os dados das 2 tabelas, e dividir kd campo ao seu respectivo destino.. ?

Abraços, e muito obrigado ateh agora

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, você pode puxar dados de duas ou mais tabelas fazendo um relacionamento. Se quiser mais detalhes, informe os campos que você quer que apareçam e qual o campo que existe em comum entre as duas tabelas, que eu faço um exemplo pra ti.

Abraços,

Graymalkin

valeu cara..

Na tabela de Clientes, são os seguintes campos. campos em negrito não vai ser mostrado no form

campo - txt no form

codigo

cliente - txtEmpresa

contato - txtContato

end - txtEnd

num - txtNum

cep - txtCep.Text

bairro - txtBairro.Text

cidade - txtCid.Text

tel - txtTel.Text

cel - txtCel.Text

email - txtEmail.Text

da Tabela OS, são os seguintes campos

os - referente à primeira coluna do grid

data - referente à segunda coluna

defeito - referente a terceira coluna

os outros campos da tabela OS, serão só pra efeito de cadastro na tela de pedidos, e pra impressão no relatorio, e na propria OS.

Mais uma vez, muito obrigado pela sua ajuda

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, o mais importante você não especificou (o campo que existe em comum entre as tabelas; mas acredito que seja o campo "codigo" do cliente). Porém, pelo que li, não há necessidade de fazer um relacionamento. Você pode perfeitamente criar os dois Recordsets:

rsClientes.Open "SELECT * FROM clientes WHERE codigo=3", cn, 2, 3

rsOS.Open "SELECT * FROM os WHERE codigo=3", cn, 2, 3

'Preenche as textboxes com o recordset rsClientes
txtEmpresa.text = rsClientes.fields("cliente").value
txtContato.text = rsClientes.fields("contato").value
...
txtEmail.text = rsClientes.fields("email").value

'Preenche a grade com o recordset OS
set datagrid1.datasource = rsOS

Repare que considerei que existe um campo chamado "codigo" na tabela OS e que o mesmo identifica todas as OS do cliente.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, o mais importante você não especificou (o campo que existe em comum entre as tabelas; mas acredito que seja o campo "codigo" do cliente). Porém, pelo que li, não há necessidade de fazer um relacionamento. Você pode perfeitamente criar os dois Recordsets:

rsClientes.Open "SELECT * FROM clientes WHERE codigo=3", cn, 2, 3

rsOS.Open "SELECT * FROM os WHERE codigo=3", cn, 2, 3

'Preenche as textboxes com o recordset rsClientes
txtEmpresa.text = rsClientes.fields("cliente").value
txtContato.text = rsClientes.fields("contato").value
...
txtEmail.text = rsClientes.fields("email").value

'Preenche a grade com o recordset OS
set datagrid1.datasource = rsOS

Repare que considerei que existe um campo chamado "codigo" na tabela OS e que o mesmo identifica todas as OS do cliente.

Abraços,

Graymalkin

cara.. não deu certo sad.gif ...

tipo, ele deu erro por causa dos 2 recordsets, deu um erro, se não me engano era "wrong numbers", e apontava pro segundo recordset(rsCli)

eu fiz um teste, deixei só um rescordset, e fiz como você mostrou no codigo, ele criou as 2 linhas relativas aos 2 registros na tabela, mas não preencheu o grid com os dados....

Link para o comentário
Compartilhar em outros sites

  • 0

bom, o problema nos recordsets eu resolvi, nem sei como mas funciono.. criei uma rotina pra mostrar os dados no grid

Sub gridDados ()

Set GridOS.DataSource = rsOS

GridOS.Columns(0) = rsOS("os").Value

GridOS.Columns(1) = rsOS("data").Value

GridOS.Columns(2) = rsOS("defeito").Value

end sub

, mas eu não consegui fazer ela apagar os dados, como faço isso ???

qual propriedade usar?

Agradeço desde já

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0
No Recordset existe um método chamado Delete. É só você estar posicionado no registro e chamar este método.

Abraços,

Graymalkin

isso não iria apagar meu registro??, tipo, eu conectei o recorset pelo codigo do cliente, e quando eu mudo o registro de cliente *(avanço ou recuo), ele não muda o grid...

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0
No Recordset existe um método chamado Delete. É só você estar posicionado no registro e chamar este método.

Abraços,

Graymalkin

isso não iria apagar meu registro??, tipo, eu conectei o recorset pelo codigo do cliente, e quando eu mudo o registro de cliente *(avanço ou recuo), ele não muda o grid...

Abraços,

Evandro

Sim, apagaria o registro. O que você quer dizer então por "mas eu não consegui fazer ela apagar os dados, como faço isso ???"?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se segui uma ordem, ou lógica correta, mas, fiz da seguinte forma, primeiramente ele carrega os dados da tabela cliente, e logo após ele busca os dados da tabela OS, conforme o codigo do cliente..

mas ao navegar pelos registros do cliente, ele não muda os dados dogrid da OS, eles permanecem os mesmo da primeira vez que foi carregado.

A minha duvida, era comofazer para limpar o grid, e mostrar o resultado da consulta pelo codigo do cliente...

só limpar o grid, sem apagar os registros

desculpe pela minha má expressão no post anterior.

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0

Então o que você tem que fazer é refazer a consulta do segundo recordset (da OS) e jogar os dados de novo na grade. Acredito que isso possa ser feito no evento Click da grade (dessa maneira quando o usuário mudar de um registro para o outro a consulta será refeita e os dados serão reamostrados).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Eu fiz a seguinte rotina:

Sub CarregaGrid()

If rsOS.State = 1 Then

rsOS.Close

End If

rsOS.Open "SELECT * FROM OS WHERE codigo =" & txtCod.Text, cnn, adOpenDynamic, adLockOptimistic

Set GridOS.DataSource = rsOS

GridOS.Columns(0) = rsOS("os").Value

GridOS.Columns(1) = rsOS("data").Value

GridOS.Columns(2) = rsOS("defeito").Value

End Sub

Após ele carregar os dados do cliente, ele executa esta rotina, mas além de não mudar o Grid, quando chega no EOF, ou BOF da tabela Clientes, ele acusa o seguinte erro:

RUN-Time Error "3219":

Operação não permitida neste contexto, e ele aponta para o rsos.close da rotina acima (deixarei em negrito)....

O que está errado nesta rotina ?

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0

Após ele carregar os dados do cliente, ele executa esta rotina, mas além de não mudar o Grid, quando chega no EOF, ou BOF da tabela Clientes, ele acusa o seguinte erro:

RUN-Time Error "3219":

Operação não permitida neste contexto, e ele aponta para o rsos.close da rotina acima (deixarei em negrito)....

Onde você colocou esse código?

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

ele dá esse erro nos botões de próximo, e anterior (navegação dos registros do cliente), abaixo segue um exemplo:

Case "Proximo"

If rs.RecordCount < 1 Then

MenuGrava.Buttons("Proximo").Enabled = False

End If

If Not rs.EOF Then

rs.MoveNext

carrega

CarregaGrid

Else

MsgBox "Esse é o último registro", vbOKOnly, "Navegação de Registro"

End If

ele movimenta normal o registro de clientes, mas o grid permanece igual a primeira carregação...

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0

ele dá esse erro nos botões de próximo, e anterior (navegação dos registros do cliente), abaixo segue um exemplo:

Case "Proximo"

    If rs.RecordCount < 1 Then

            MenuGrava.Buttons("Proximo").Enabled = False

    End If

    If Not rs.EOF Then

        rs.MoveNext

        carrega

        CarregaGrid

    Else

MsgBox "Esse é o último registro", vbOKOnly, "Navegação de Registro"

End If

ele movimenta normal o registro de clientes, mas o grid permanece igual a primeira carregação...

Abraços,

Evandro

Acho que o código deveria ser:

Case "Proximo"
    If rs.RecordCount < 1 Then
        MenuGrava.Buttons("Proximo").Enabled = False
    End If
    If Not rs.EOF Then
        rs.MoveNext
        if not rs.eof then
            carrega
            CarregaGrid
        endif
    Else
        MsgBox "Esse é o último registro", vbOKOnly, "Navegação de Registro"
    End If

Já que após o MoveNext pode ser que seja o último registro.

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
ele dá esse erro nos botões de próximo, e anterior (navegação dos registros do cliente), abaixo segue um exemplo:

Case "Proximo"

    If rs.RecordCount < 1 Then

            MenuGrava.Buttons("Proximo").Enabled = False

    End If

    If Not rs.EOF Then

        rs.MoveNext

        carrega

        CarregaGrid

    Else

MsgBox "Esse é o último registro", vbOKOnly, "Navegação de Registro"

End If

ele movimenta normal o registro de clientes, mas o grid permanece igual a primeira carregação...

Abraços,

Evandro

Acho que o código deveria ser:

Case "Proximo"
    If rs.RecordCount < 1 Then
        MenuGrava.Buttons("Proximo").Enabled = False
    End If
    If Not rs.EOF Then
        rs.MoveNext
        if not rs.eof then
            carrega
            CarregaGrid
        endif
    Else
        MsgBox "Esse é o último registro", vbOKOnly, "Navegação de Registro"
    End If

Já que após o MoveNext pode ser que seja o último registro.

Graymalkin

Deu o mesmo erro....

Eu to achando que ele dá erro ao fechar o rsOS, por causa queele está vinculado com o GRID, se que se desvincular o grid antes de fechar a conexão, não daria certo... acho que ficaria ao tipo:

Sub CarregaGrid()

If rsOS.State = 1 Then

    Set GridOS.DataSource =""

    rsOS.Close

End If

    rsOS.Open "SELECT * FROM OS WHERE codigo =" & txtCod.Text, cnn, adOpenDynamic, adLockOptimistic

    Set GridOS.DataSource = rsOS

    GridOS.Columns(0) = rsOS("os").Value

    GridOS.Columns(1) = rsOS("data").Value

    GridOS.Columns(2) = rsOS("defeito").Value

End Sub

mas ele não aceita, deixa o data source em branco... como eu posso fazer pra desvincular o rsOs do GRID ?

Link para o comentário
Compartilhar em outros sites

  • 0

Para desvincular você faz:

set datagrid1.datasource = nothing
Porém tenho um programa que faz algo bem próximo a isso (mostrar dados em uma datagrid de acordo com o que está em outra) e faço a seguinte declaração...
dim rsTemp as new adodb.recordset
... do Recordset direto na rotina ao invés dele ser público. Então, experimente colocar...
dim rsOS as new adodb.recordset

... diretamente na rotina CarregaGrid.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Para desvincular você faz:

set datagrid1.datasource = nothing
Porém tenho um programa que faz algo bem próximo a isso (mostrar dados em uma datagrid de acordo com o que está em outra) e faço a seguinte declaração...
dim rsTemp as new adodb.recordset
... do Recordset direto na rotina ao invés dele ser público. Então, experimente colocar...
dim rsOS as new adodb.recordset

... diretamente na rotina CarregaGrid.

Abraços,

Graymalkin

Deu erro cara, na hora dele igualar o GRID ao Record set...

Aparece o seguinte erro:

Run-time error '7004':

The rowset is not bookmarkable.

e aponta pra parte em que iguala o grid ao record set

Sub CarregaGrid()

Dim rsOS As New ADODB.Recordset

rsOS.Open "SELECT * FROM OS WHERE codigo =" & txtCod.Text, cnn, adOpenDynamic, adLockOptimistic

Set GridOS.DataSource = rsOS

GridOS.Columns(0) = rsOS("os").Value

GridOS.Columns(1) = rsOS("data").Value

GridOS.Columns(2) = rsOS("defeito").Value

End Sub

Link para o comentário
Compartilhar em outros sites

  • 0

Putz cara, consegui!!!!, não sei o qe fiz de diferente, mas essa bagaça foi...

a rotina ficou assim:

Sub CarregaGrid()

        Dim rsOs As New Recordset

        rsOs.CursorLocation = adUseClient

        Set GridOS.DataSource = Nothing

       

       

    rsOs.Open "SELECT * FROM OS WHERE codigo =" & txtCod.Text, cnn, adOpenDynamic, adLockOptimistic, adCmdText

    Set GridOS.DataSource = rsOs

    If rsOs.RecordCount > 0 Then

    GridOS.Columns(0) = IIf((rsOs("os").Value <> ""), rsOs("os").Value, "")

    GridOS.Columns(1) = IIf((rsOs("data").Value <> ""), rsOs("data").Value, "")

    GridOS.Columns(2) = IIf((rsOs("defeito").Value <> ""), rsOs("defeito").Value, "")

    End If

End Sub

valeu MESMO, sua ajuda foi fundamental, brigadão, se você precisar de qlqr coisa, e estiver ao meu alcance, pode pedir, que farei com o maior prazer biggrin.gif

Agradeço sua atenção e sua paciencia.

Logo mais deve surgir uma duvida minha por aki.

Abraços,

Evandro

Link para o comentário
Compartilhar em outros sites

  • 0
Putz cara, consegui!!!!, não sei o qe fiz de diferente

O que você fez diferente foi o...

rsOs.CursorLocation = adUseClient

... que deixa o cursor local e assim o grid consegue marcá-lo (bookmark). Realmente esqueci desse detalhe. Mas que bom que você conseguiu. biggrin.gif

Abraços,

Graymalkin

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...