none
pulsar doubleclick en un datagridview y abrir formulario con detalles

    Question

  • Nuevamente apoyandome de sus grandes conocimientos....

    Tengo un formulario en el cual tengo un datagridview y quiero que al pulsar doubleclick en una fila, me abra otro formulario con los detalles, para esto estoy utilizando access 2010 y vb.net con el metodo OleDb, pongo el codigo para que me digan donde estoy mal, porque al pulsar sobre una fila, en el formulario detalles que abre, me muestra todos los datos de la tabla detalles... no los filtra...

    'FormularioSolicitudes, evento doubleclick del datagridview Private Sub dgridSolicitudes_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgridSolicitudes.DoubleClick ' Referenciamos la fila. Dim row As DataGridViewRow = dgridSolicitudes.CurrentRow Using frm As New frmMuestraDetalleSol(row) ' Muestro el formulario frmMuestraDetalleSol frm.ShowDialog() End Using End Sub 'Formulario MuestraDetallesolicitud Public Class frmMuestraDetalleSol Private m_row As DataGridViewRow Dim Conexion As OleDbConnection Public Sub New(ByVal row As DataGridViewRow) InitializeComponent() ' En el caso improbable de que el valor sea Nothing devolvemos la excepción al procedimiento llamador. If (row Is Nothing) Then _ Throw New ArgumentNullException() ' Asignamos el valor del campo con el valor del parámetro pasado al constructor. m_row = row End Sub Private Sub frmMuestraDetalleSol_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Conexion = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Siscompras\siscomp.accdb; Persist Security Info=False;") cargardatos() Me.CancelButton = btnSalir End Sub Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click ' Cerramos el cuadro de diálogo que se abrio (en este caso el formularioDetalles) DialogResult = DialogResult.Cancel End Sub Sub CargarDatos() ' llena el grid articulos por proveedor

    'hago la consulta con las 2 tablas (Solicitudes y DetalleSolicitud) Dim adaptador As New OleDb.OleDbDataAdapter(" SELECT * FROM tb_detalle_solicitud_depto INNER JOIN tb_solicitudes ON tb_detalle_solicitud_depto.fk_cve_solicitud = tb_solicitudes.cve_solicitud", Conexion) Dim datos As New DataSet Conexion.Open() adaptador.Fill(datos, "tb_detalle_solicitud_depto") Conexion.Close()   dgridDetalleArticulosSol.DataSource = datos.Tables("tb_detalle_solicitud_depto")
    End Sub End Class

    Pongo una imagen, por ejemplo: la solicitud No. 40, tiene solo 3 conceptos en detalles y me muestra todo, no me filtra de acuerdo a la clave de solicitud, sino que muestra todo, campo: cve_solicitud (tb_solicitudes) y campo: fk_cve_solicitud (tb_detalle_solicitud_depto)

    imagen del formulario

    gracias por su ayuda...




    • Edited by Casperman Friday, April 26, 2013 5:30 PM
    Friday, April 26, 2013 4:38 PM

Answers

  • "Casperman" escribió:

    > ' cuando verifico el valor de IdSolicitud, esta es igual a valor
    > de la tabla solicitudes, pero no me muestra nada en el segundo grid

    Te comento que "adivino" no soy, por lo que ignoro el motivo por el que "no te muestra nada en el segundo grid".

    > Dim adaptador As New OleDb.OleDbDataAdapter( _
    > " SELECT * FROM tb_detalle_solicitud_depto WHERE " & _
    > "fk_cve_solicitud  = '" + IdSolicitud.Text + "'", Conexion)

    Al observar la consulta SQL de selección que deseas ejecutar, lo único que te puedo aconsejar es que utilices PARÁMETROS en lugar de concatenar los valores, porque por la poca información que facilitas unido a que tienes desactivada la instrucción Option Strict (¡¡MAL HECHO!!), es imposible averiguar por mensajes de correo lo que te puede estar sucediendo.

    Como también observo que estás utilizando un objeto OleDbConnection global (el objeto Conexion), también te aconsejo que te olvides de conexiones globales y la crees cuando la vayas a utilizar.

    El procedimiento CargarDatos debería ser un procedimiento Funtion, que de acuerdo al valor de solicitud especificado te devuelva un objeto DataTable:

    Imports System.Data.OleDb
    
        ' A nivel del formulario, declaramos la cadena de conexión
        ' con la base de datos de Access.
        '
        Private cadenaConexion As String = _
         "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Siscompras\siscomp.accdb"
    
        Private Function CargarDatos(idSolicitud As String) As DataTable
    
            Try
                Using conexion As New OleDbConnection(cadenaConexion)
    
                    ' Creamos el comando
                    '
                    Dim comando As OleDbCommand = conexion.CreateCommand()
    
                    ' Especificamos la consulta parametrizada que vamos a ejecutar
                    '
                    comando.CommandText = _
                      "SELECT * FROM tb_detalle_solicitud_depto WHERE fk_cve_solicitud=@clave"
    
                    ' Añadimos el parámetro
                    '
                    comando.Parameters.AddWithValue("@clave", idSolicitud)
    
                    ' Creamos el adaptador
                    '
                    Dim adaptador As New OleDbDataAdapter(comando)
    
                    ' Creamos el objeto DataTable
                    '
                    Dim dt As New DataTable()
    
                    ' Rellenamos el objeto DataTable
                    '
                    adaptador.Fill(dt)
    
                    ' Devolvemos el objeto DataTable
                    '
                    Return dt
    
                End Using
    
            Catch
                ' Cualquier error lo devolvemos al procedimiento llamador.
                Throw
    
            End Try
    
        End Function

    Y en el evento Load del formulario ejecutarías lo siguiente:

        Private Sub frmMuestraDetalleSol_Load( _
            ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    
            Try
                ' aqui me traigo el valor del objeto datarow
                Dim valor As String = Convert.ToString(m_row.Cells(0).Value)
    
                ' Rellenamos el control DataGridView
                dgridDetalleArticulosSol.DataSource = CargarDatos(valor)
    
                ' lo asigno a un label para despues hacer la comparativa en la tabla...
                IdSolicitud.Text = valor
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
            Me.CancelButton = btnSalir
    
        End Sub

    Quiero entender que el campo fk_cve_solicitud es del tipo de dato alfanumérico.

    Todo esto que te estoy explicando son cuestiones básicas de acceso a datos que cualquier programador debería de conocer con soltura, y si no lo conoce, lo primero que tiene que hacer es ponerse a estudiar cómo se recuperan datos mediante una consulta con parámetros. :-(

    Prueba a ver si de ésta manera obtienes datos, y si no lo obtienes, lo siento muchísimo por tí, pero ya no sé a qué se puede deber.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marked as answer by Casperman Thursday, May 02, 2013 3:46 PM
    Wednesday, May 01, 2013 5:49 AM

All replies

  • hola

    como es eso que no lo filtra ?

    veo que al forma que abres le pasas un DataGridViewRow en el constructor, peor despues no lo utilizas en ningun lado

    no sera que deberias tomar un valor de alguna columana de este row que pasas al form y suarla como parametro en el query que defines para cargar el grid

    porque esto no veo que lo estes realizando

    slaudos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Proposed as answer by Sergio ParraMVP Friday, April 26, 2013 4:50 PM
    • Unproposed as answer by Casperman Friday, April 26, 2013 5:01 PM
    Friday, April 26, 2013 4:47 PM
  • Hola yo uso un constructor asi:

    este codigo va en el formulario donde quieres ver los datos:

     Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
           
    
            If (IdCliente <> String.Empty) Then
    
                TraerCliente(IdCliente)
            End If
    
        End Sub
    
      
    
        Public Property IdCliente As String
    
        'Creamos una metodo privada para cargar los datos del cliente
        Public Sub TraerCliente(ByVal IdCliente As String)
            Try
                Using cnx As New SqlConnection("Data Source=ASHLEY;Initial Catalog=OpticaBarraquel;Integrated Security=True")
    
                    cnx.Open()
    
                    Dim SqlAction As String = "SELECT CODIGO_CLIENTES,CI_DEL_CLIENTE,FECHA,NOMBRE,APELLIDOS,DIRECCION,EDAD,PROFESION,SEXO,TELEFONO,CELULAR,CORREO_ELECTRONICO,OD_ESFERA,OD_CILINDRO,OD_EJE,OD_PRISMA,OD_ADICCION,OI_ESFERA,OI_CILINDRO,OI_EJE,OI_PRISMA,OI_ADICCION,DP,ALT,OBSERVACION_CLIENTE FROM Clientes WHERE CODIGO_CLIENTES= @Idcliente"
                    Dim cmd As New SqlCommand(SqlAction, cnx)
    
                    cmd.Parameters.AddWithValue("@Idcliente", CStr(IdCliente))
    
                    Dim dr As SqlDataReader = cmd.ExecuteReader()
    
                    If (dr.Read()) Then
                        CODIGO_CLIENTESTextBox.Text = dr.Item("CODIGO_CLIENTES").ToString
                        NOMBRETextBox.Text = dr.Item("NOMBRE").ToString
                        APELLIDOSTextBox.Text = dr.Item("APELLIDOS").ToString
                        CI_DEL_CLIENTEMaskedTextBox.Text = dr.Item("CI_DEL_CLIENTE").ToString
                        FECHADateTimePicker.Value = CDate(dr.Item("Fecha"))
                        DIRECCIONTextBox.Text = dr.Item("DIRECCION").ToString
                        TELEFONOMaskedTextBox.Text = dr.Item("TELEFONO").ToString
                        CELULARMaskedTextBox.Text = dr.Item("CELULAR").ToString
                        PROFESIONTextBox.Text = dr.Item("PROFESION").ToString
                        EDADTextBox.Text = dr.Item("EDAD").ToString
                        SEXOComboBox.Text = dr.Item("SEXO").ToString
                        CORREO_ELECTRONICOTextBox.Text = dr.Item("CORREO_ELECTRONICO").ToString
                        OD_ESFERATextBox.Text = dr.Item("OD_ESFERA").ToString
                        OD_CILINDROTextBox.Text = dr.Item("OD_CILINDRO").ToString
                        OD_EJETextBox.Text = dr.Item("OD_EJE").ToString
                        OD_PRISMATextBox.Text = dr.Item("OD_PRISMA").ToString
                        OD_ADICCIONTextBox.Text = dr.Item("OD_ADICCION").ToString
                        OI_ESFERATextBox.Text = dr.Item("OI_ESFERA").ToString
                        OI_CILINDROTextBox.Text = dr.Item("OI_CILINDRO").ToString
                        OI_EJETextBox.Text = dr.Item("OI_EJE").ToString
                        OI_PRISMATextBox.Text = dr.Item("OI_PRISMA").ToString
                        OI_ADICCIONTextBox.Text = dr.Item("OI_ADICCION").ToString
                        DPTextBox.Text = dr.Item("DP").ToString
                        ALTTextBox.Text = dr.Item("ALT").ToString
                        OBSERVACION_CLIENTETextBox.Text = dr.Item("OBSERVACION_CLIENTE").ToString
                    End If
                End Using
    
            Catch ex As Exception
                MessageBox.Show(String.Format("Error : {0}", ex.Message, "Ocurrio un error inesperado", MessageBoxButtons.OK, MessageBoxIcon.Error))
            End Try
            
        End Sub

    y este codigo va en el formulario donde tienes el datagridview:

    Private Sub CLIENTESDataGridView_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles CLIENTESDataGridView.CellDoubleClick
    
            Try
                If (e.RowIndex = -1) Then Return
    
                Dim row As DataGridViewRow
                row = CLIENTESDataGridView.Rows(e.RowIndex)
                Dim Idcliente As String
    
                Idcliente = CStr(row.Cells(0).Value)
                Dim Frm2 As New Form2()
                Frm2.IdCliente = Idcliente
                Frm2.Show()
                Me.Hide()
    
               
            Catch er As Exception
                Throw er
            End Try
    
        End Sub

    Espero haberte ayudado saludos y suerte..

    Sunday, April 28, 2013 7:00 AM
  • "Casperman" escribió:

    > Tengo un formulario en el cual tengo un datagridview y quiero que al pulsar
    > doubleclick en una fila, me abra otro formulario con los detalles, ...

    Hola:

    Lo mismo te es de ayuda lo que explico en el siguiente artículo:

    Cómo pasar datos a un formulario

    > ... para esto estoy utilizando access 2010 ...
    >
    > dgridDetalleArticulosSol.DataSource = datos.Tables("tb_detalle_solicitud_depto")

    Mientras que el control DataGridView se encuentre enlazado a un objeto DataTable, como así parece ser que lo tienes, no hay inconveniente alguno para hacer lo que deseas. En el artículo indicado tienes todo lo necesario para abrir un nuevo formulario con los detalles de la fila del control DataGridView donde has efectuado el doble clic. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Proposed as answer by Luis_Escobar Sunday, April 28, 2013 11:15 PM
    Sunday, April 28, 2013 7:52 AM
  • Harías algo como esto en tu formulario principal pondrías este código

    Private Sub Editar()
            Dim codigo As String = CStr(dgvCliente.CurrentRow.Cells(0).Value)
            Dim frm As New frmEditarCliente(CInt(codigo))
            frm.flag = 2
            frm.ShowDialog()
        End Sub
    
    Private Sub dgvCliente_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvCliente.CellDoubleClick
            Editar()
        End Sub
    
        Private Sub dgvCliente_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgvCliente.KeyDown
            Editar()
        End Sub

    En la variable código que esta sombreado obtienes el id con eso haces la consulta para que obtengas los datos deseados por medio de un SELECT campo1, campo2, campo3 FROM MiTabla WHERE id = @Codigo

    Para eso tienes que usar el contructor en el formulario que quieres obtener la data.

    Public Class frmEditarCliente
        Private Cliente As New LN.Cliente
        Public flag As Integer
        Private Codigo As Integer
    
        Public Sub New()
    
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
    
        End Sub
        Public Sub New(ByVal _codigo As Integer)
            Me.Codigo = _codigo
            InitializeComponent()
        End Sub

    Pasaje de información formulario hijo


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    Sunday, April 28, 2013 5:30 PM
  • "Casperman" escribió:

    > Enrique... De hecho es tu  codigo el que estoy tratando de implementar,
    > solo que no encuentro la forma de adecuardo a mis tablas...
    >
    > 'Formulario Detalles
    >
    >  Private Sub frmMuestraDetalleSol_Load(ByVal sender As System.Object,
    >      ByVal e As System.EventArgs) Handles MyBase.Load
    >        Conexion = New OleDb.OleDbConnection("Provider=Microsoft.
    >       ACE.OLEDB.12.0;Data Source=C:\Siscompras\siscomp.accdb; Persist Security >    Info=False;")
    >   Dim value As Integer = m_row.Cells(0).Value
    >        CargarDatos(value)
    >        Me.CancelButton = btnSalir
    >    End Sub
    >

    ¿Seguro que has leído el artículo completo? ;-)

    Todo ese código no es necesario que lo ejecutes en el formulario de detalle, es más, SOBRA.

    En dicho formulario ÚNICAMENTE TIENES QUE "JUGAR" con el objeto DataRow que recibe el constructor del formulario (el procedimiento New):

    Public Class frmMuestraDetalleSol()
    
        ' Declaramos el objeto DataRow que utilizará el formulario.
        '
        Private m_row  As DataGridViewRow
    
        Public Sub New(ByVal row As DataGridViewRow)
    
             InitializeComponent()
    
            ' En el caso improbable de que el valor sea Nothing,
             ' devolvemos la excepción al procedimiento llamador.
             '
             If (row Is Nothing) Then _
                Throw New ArgumentNullException()
    
            ' Asignamos el valor del campo con el valor
             ' del parámetro pasado al constructor.
             '
             m_row = row
    
        End Sub
    
        Private Sub frmMuestraDetalleSol_Load(ByVal sender As Object, _
            ByVal e  As EventArgs) Handles Me.Load
    
             ' Es aquí donde mostramos en los controles TextBox
             ' los valores de los campos existentes en el objeto
             ' DataRow pasado al formulario.
             '
             ' Rellenamos los controles TextBox
             '
             Dim value As Object  = m_row.Cells(0).Value
             If (value  IsNot DBNull.Value) Then
                 TextBox1.Text = CStr(value)
             End If
    
             value = m_row.Cells(1).Value
             If (value  IsNot DBNull.Value) Then
                 TextBox2.Text = CStr(value)
             End If
    
             value = m_row.Cells(2).Value
             If (value  IsNot DBNull.Value) Then
                 TextBox3.Text = CStr(value)
             End If
    
          End Sub
    
    End Class

    Repasa bien el contenido del artículo.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Monday, April 29, 2013 4:34 PM
  • "Casperman" escribió:

    > ya repase tu articulo ...

    ¡Vamos a ver! Una cosa es repasar o leer el artículo, y otra cosa muy diferente es COMPRENDERLO, porque yo puedo leer o repasar cualquier artículo y no enterarme de lo que he leído. ;-)

    > ... y en el tomas los datos de un grid y los muestras en otro
    > formulario dentro de textbox, los datos de ese grid, yo no
    > tomo todos los datos del primer grid (como tu ejemplo, yo
    > necesito solo la clave de la solicitud...
    >

    Pues lo siento mucho, pero eso no es lo que demandabas en tu primer mensaje, que te recuerdo era lo siguiente:

    > Tengo un formulario en el cual tengo un datagridview y quiero que al pulsar
    > doubleclick en una fila, me abra otro formulario con los detalles, ...

    Como bien creo que podrás comprender, yo me limité a indicarte un artículo que te podía ser útil para lo que decías que deseas hacer. Si ahora resulta que deseas hacer otra cosa diferente, puede suceder que el contenido de ese artículo no te resulte de utilidad.

    Las cosas HAY QUE DECIRLAS CLARAS DESDE UN PRIMER MOMENTO, porque si no es así, lo único que puede suceder es que estemos aquí PERDIENDO EL TIEMPO TONTAMENTE. :-(

     

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Monday, April 29, 2013 5:12 PM
  • "Casperman" escribió:

    > mil disculpas si te ofendi en algo...

    No es necesario que te disculpes porque no me he sentido ofendido por nada, pero conprende que no me gusta perder el tiempo.

    > tomo solo la clave del grid (dgridSolicitudes) del formulario1
    > "frmSolicitudes" (tabla tb_solicitudes)
    >
    > comparo la clave obtenida del dgridSolicitudes con la clave
    > fk_cve_solicitudes de la tabla tb_detalle_solicitud_depto
    >
    > si tiene detalles, los muestro en el gridDetalleArticulosSol
    > del formulario2 "frmMuestraDetallesSol

    Una vez que hayas llegado al tercer paso (si la clave obtenida tiene detalles), al segundo formulario le tienes que pasar el objeto DataRow cuyos datos deseas mostrar en los controles del formulario frmMuestraDetallesSol.

    En el ejemplo de mi artículo, el segundo formulario únicamente espera un objeto DataRow, para poder leer los valores de sus campos y mostrarlos en los diferentes controles del formulario, nada más.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Monday, April 29, 2013 5:35 PM
  • buenas tardes... ya implemente lo que me indicaron, al ejecutar el programa paso a paso (F8), e ir checando los valores de las variables, al llegar a este paso, el valor de la clave del primer grid, coincide con el que tengo en la tablas solicitudes...

    Private Sub frmMuestraDetalleSol_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Conexion = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Siscompras\siscomp.accdb; Persist Security Info=False;")
            ' aqui me traigo el valor del objeto datarow
            Dim valor As Object = m_row.Cells(0).Value
            ' lo asigno a un label para despues hacer la comparativa en la tabla...
            IdSolicitud.Text = valor
            CargarDatos()
            Me.CancelButton = btnSalir
        End Sub

    'funcion CargarDatos

      Sub CargarDatos()
            ' aqui hago mi consulta..
            ' cuando verifico el valor de IdSolicitud, esta es igual a valor de la tabla solicitudes, pero no me muestra nada en el segundo grid
            Dim adaptador As New OleDb.OleDbDataAdapter(" SELECT * FROM tb_detalle_solicitud_depto WHERE fk_cve_solicitud  = '" + IdSolicitud.Text + "'", Conexion)
            Dim datos As New DataSet
    
            Conexion.Open()
            adaptador.Fill(datos, "tb_detalle_solicitud_depto")
            Conexion.Close()
    
            dgridDetalleArticulosSol.DataSource = datos.Tables("tb_detalle_solicitud_depto")
        End Sub
    muchas gracias por su ayuda...



    • Edited by Casperman Tuesday, April 30, 2013 7:58 PM
    Tuesday, April 30, 2013 7:49 PM
  • "Casperman" escribió:

    > ' cuando verifico el valor de IdSolicitud, esta es igual a valor
    > de la tabla solicitudes, pero no me muestra nada en el segundo grid

    Te comento que "adivino" no soy, por lo que ignoro el motivo por el que "no te muestra nada en el segundo grid".

    > Dim adaptador As New OleDb.OleDbDataAdapter( _
    > " SELECT * FROM tb_detalle_solicitud_depto WHERE " & _
    > "fk_cve_solicitud  = '" + IdSolicitud.Text + "'", Conexion)

    Al observar la consulta SQL de selección que deseas ejecutar, lo único que te puedo aconsejar es que utilices PARÁMETROS en lugar de concatenar los valores, porque por la poca información que facilitas unido a que tienes desactivada la instrucción Option Strict (¡¡MAL HECHO!!), es imposible averiguar por mensajes de correo lo que te puede estar sucediendo.

    Como también observo que estás utilizando un objeto OleDbConnection global (el objeto Conexion), también te aconsejo que te olvides de conexiones globales y la crees cuando la vayas a utilizar.

    El procedimiento CargarDatos debería ser un procedimiento Funtion, que de acuerdo al valor de solicitud especificado te devuelva un objeto DataTable:

    Imports System.Data.OleDb
    
        ' A nivel del formulario, declaramos la cadena de conexión
        ' con la base de datos de Access.
        '
        Private cadenaConexion As String = _
         "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Siscompras\siscomp.accdb"
    
        Private Function CargarDatos(idSolicitud As String) As DataTable
    
            Try
                Using conexion As New OleDbConnection(cadenaConexion)
    
                    ' Creamos el comando
                    '
                    Dim comando As OleDbCommand = conexion.CreateCommand()
    
                    ' Especificamos la consulta parametrizada que vamos a ejecutar
                    '
                    comando.CommandText = _
                      "SELECT * FROM tb_detalle_solicitud_depto WHERE fk_cve_solicitud=@clave"
    
                    ' Añadimos el parámetro
                    '
                    comando.Parameters.AddWithValue("@clave", idSolicitud)
    
                    ' Creamos el adaptador
                    '
                    Dim adaptador As New OleDbDataAdapter(comando)
    
                    ' Creamos el objeto DataTable
                    '
                    Dim dt As New DataTable()
    
                    ' Rellenamos el objeto DataTable
                    '
                    adaptador.Fill(dt)
    
                    ' Devolvemos el objeto DataTable
                    '
                    Return dt
    
                End Using
    
            Catch
                ' Cualquier error lo devolvemos al procedimiento llamador.
                Throw
    
            End Try
    
        End Function

    Y en el evento Load del formulario ejecutarías lo siguiente:

        Private Sub frmMuestraDetalleSol_Load( _
            ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    
            Try
                ' aqui me traigo el valor del objeto datarow
                Dim valor As String = Convert.ToString(m_row.Cells(0).Value)
    
                ' Rellenamos el control DataGridView
                dgridDetalleArticulosSol.DataSource = CargarDatos(valor)
    
                ' lo asigno a un label para despues hacer la comparativa en la tabla...
                IdSolicitud.Text = valor
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
            Me.CancelButton = btnSalir
    
        End Sub

    Quiero entender que el campo fk_cve_solicitud es del tipo de dato alfanumérico.

    Todo esto que te estoy explicando son cuestiones básicas de acceso a datos que cualquier programador debería de conocer con soltura, y si no lo conoce, lo primero que tiene que hacer es ponerse a estudiar cómo se recuperan datos mediante una consulta con parámetros. :-(

    Prueba a ver si de ésta manera obtienes datos, y si no lo obtienes, lo siento muchísimo por tí, pero ya no sé a qué se puede deber.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marked as answer by Casperman Thursday, May 02, 2013 3:46 PM
    Wednesday, May 01, 2013 5:49 AM
  • funciona a la perfección...

    te agradezco mucho Enrique... gracias por el tiempo y la paciencia para ayudarme en mi programacion...

    saludos





    • Edited by Casperman Thursday, May 02, 2013 5:07 PM
    Thursday, May 02, 2013 3:51 PM