none
INSERTAR TODOS LOS DATOS DE COLUMNA 0 DE UN DATAGRIDVIEW A UNA TABLA DETALLE RRS feed

  • Pregunta

  • Buenos días:Nuevamente con una interrupción que no me deja seguir avanzando.

    Les explico estoy queriendo grabar todos los datos de la columna 0 la cual contiene los "id" a una tabla detalle. Recorro el datagridview pero al final solo me guarda el ultimo id=7 estoy utilizando el siguiente procedimiento almacenado:

    DROP PROCEDURE `Insert_Vehiservkm`; CREATE DEFINER=`root`@`localhost` PROCEDURE `Insert_Vehiservkm`(IN `gidv` INT, IN `gidserv` VARCHAR(220), IN `cont` INT, OUT `nmsg` VARCHAR(400)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
    BEGIN DECLARE C2 INT; 
    DECLARE i INT; 
    SET i=0; 
    START TRANSACTION; 
    INSERT INTO vehiservkm(idv) VALUES (gidv); 
    SET C2=(SELECT last_insert_id()); 
    IF C2<>0 or C2<>NULL THEN 
    WHILE i<cont DO 
    INSERT INTO det_vehiservkm(idvskm,idserv) VALUES(C2,gidserv); 
    SET i=i+1; 
    END WHILE; 
    SET nmsg = "Se registro correctamente seguimiento de mantenimiento del vehículo."; 
    END IF; 
    COMMIT; 
    END 

    Y en mi capa ACCESODATOS tengo el siguiente código  para utilizar el procedimiento:

    CLASE AsignaMantVehiKmAD

    Imports MySql.Data.MySqlClient
    Imports System.Data.SqlTypes
    Imports ENTIDAD
    Public Class AsignaMantVehiKmAD
        Private conn As New MySqlConnection 'SqlConnection
        Private conn1 As New MySqlConnection 'SqlCommand
        Private comando As New MySqlCommand 'SqlCommand
    #Region "Cadena de conexion"
        Public Sub New()
            Dim Objconexion As New ConexionAD
            conn = Objconexion.abrir
            comando.Connection = conn
        End Sub
    #End Region
    
    #Region "Función Insertar"
        Public Function Insert_Vehiservkm(ByVal ObjVehiservkmEN As VehiservkmEN, ByVal cont As Integer)
            Try
                comando.Parameters.Clear()
                comando.CommandType = CommandType.StoredProcedure
                comando.CommandText = "Insert_Vehiservkm"
    
                Dim _gidv As New MySqlParameter("gidv", MySqlDbType.Int32)
                _gidv.Value = ObjVehiservkmEN.idv
                _gidv.Direction = ParameterDirection.Input
                comando.Parameters.Add(_gidv)
    
    
                Dim _gidserv As New MySqlParameter("gidserv", MySqlDbType.String)
                _gidserv.Value = ObjVehiservkmEN.idserv
                _gidserv.Direction = ParameterDirection.Input
                comando.Parameters.Add(_gidserv)
    
                Dim _cont As New MySqlParameter("cont", MySqlDbType.Int32)
                _cont.Value = cont
                _cont.Direction = ParameterDirection.Input
                comando.Parameters.Add(_cont)
    
                Dim _nmsg As New MySqlParameter("nmsg", MySqlDbType.VarChar, 400)
                _nmsg.Direction = ParameterDirection.Output
                comando.Parameters.Add(_nmsg)
    
                Dim nmensaje As String
    
                comando.ExecuteNonQuery()
                nmensaje = Convert.ToString(_nmsg.Value)
                MsgBox(nmensaje)
                conn.ClearAllPools()
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical, ex.Source)
            Finally
                comando.Parameters.Clear()
                conn.Close()
                conn.ClearAllPools()
                conn = Nothing
            End Try
        End Function
    #End Region
    End Class

    Ahora la capa LÓGICANEGOCIO.

    Clase AsignaMantVehiKmLN

    Imports ACCESO_DATOS
    Imports ENTIDAD
    Public Class AsignaMantVehiKmLN
        Private ObjAsignaMantVehiKmAD As AsignaMantVehiKmAD
        Public Sub New()
            ObjAsignaMantVehiKmAD = New AsignaMantVehiKmAD
        End Sub
    #Region "Establecer conexion con la función Insert_AsignaPolizaVehi"
        Public Function Insert_Comp_Poli(ByVal ObjVehiservkmEN As VehiservkmEN, ByVal cont As Integer)
            Return ObjAsignaMantVehiKmAD.Insert_Vehiservkm(ObjVehiservkmEN, cont)
        End Function
    #End Region
    End Class

    Y mi capa PRESENTACIÓN.

    Formulario FrmAsignaKmServ

    Imports ENTIDAD
    Imports LOGICA_NEGOCIO
    Imports System.IO
    Imports System.Drawing
    Imports Helpers
    Public Class FrmInsertVehiculo
        Dim FormInsertaVehiculo As FrmListaVehiculo
        Public Sub New(ByVal _FormInsertaVehiculo As FrmListaVehiculo)
            ' The Me.InitializeComponent call is required for Windows Forms designer support.
            FormInsertaVehiculo = _FormInsertaVehiculo
            Me.InitializeComponent()
    
            '
            ' TODO : Add constructor code after InitializeComponents
            ''
        End Sub
        Private ObjVehiculoEN As VehiculoEN
        Private ObjVehiculoLN As VehiculoLN
    
        Private ObjMarcaEN As MarcaEN
        Private ObjMarcaLN As MarcaLN
    
        Private ObjEstadoEN As EstadoEN
        Private ObjEstadoLN As EstadoLN
    
        Private ObjServicioKMEN As ServicioKMEN
        Private ObjServicioKMLN As ServicioKMLN
        Private ObjAsignaMantVehiKmEN As VehiservkmEN
        Private ObjAsignaMantVehiKmLN As AsignaMantVehiKmLN
    
     Private Sub FrmInsertVehiculo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                
                DgvListaServ.DataSource = ObjServicioKMLN.Lista_ServMantxKM()
    
                'Dim checked As Boolean = True
                'Dim x As Integer
                'x = 0
                'With CheckListaServKM
                '    .ValueMember = "idserv"
                '    .DataSource = ObjServicioKMLN.Lista_ServMantxKM()
                '    .DisplayMember = "nomserv"
                '    .ColumnWidth = 180
                '    For i As Integer = 0 To .Items.Count - 1
                '        .SetItemChecked(i, checked)
                '        x += CStr(.SelectedValue)
                '    Next
                'End With
                
              
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical, ex.Source)
            Finally
            End Try
        End Sub
    
     Private Sub BtnAsignar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAsignar.Click
            'Dim cont, x As Integer
            'Dim checked As Boolean = True
            ObjAsignaMantVehiKmEN = New VehiservkmEN
            ObjAsignaMantVehiKmLN = New AsignaMantVehiKmLN
            Dim cont As Integer
            cont = DgvListaServ.RowCount
            ObjAsignaMantVehiKmEN.idv = 1
            For Each row As DataGridViewRow In DgvListaServ.Rows
                ObjAsignaMantVehiKmEN.idserv += CInt(row.Cells(0).Value)
            Next
            ObjAsignaMantVehiKmLN.Insert_Comp_Poli(ObjAsignaMantVehiKmEN, cont)
        End Sub

    Como podrán apreciar hay bloqueo de código que intenté hacer con un chekedlistbox pero tampoco funciono. Les dejo imagnes del form y de que es lo que me inserta:

    Bueno ya que solo se permiten 2 imagenes la de la tabla registro ya no la adjunto.

    Al colocar un aumentador me muestra que el idserv es=36

    ObjAsignaMantVehiKmEN.idserv += CInt(row.Cells(0).Value)

    Ahora cuando cambio esa línea:"quito el +"

    ObjAsignaMantVehiKmEN.idserv = CInt(row.Cells(0).Value)

    me muestra que el idserv es=7. Te adjunto la imagen.

    Hay manera de poder realizar todo en un único procedimiento; tal cual yo utilizo.

    Gracias de antemano.


    Junior


    • Editado Jejo1984 jueves, 25 de septiembre de 2014 13:14
    • Cambiado Enrique M. Montejo miércoles, 1 de octubre de 2014 15:11 Pregunta relacionada con el acceso a datos con MySQL.
    jueves, 25 de septiembre de 2014 13:10

Todas las respuestas

  • Ojo que asigno de momento al Obj..... idv le asigno= 1, porque estoy probando.

    Junior


    • Editado Jejo1984 jueves, 25 de septiembre de 2014 13:13
    jueves, 25 de septiembre de 2014 13:12
  • No se porque este código:

    For Each row As DataGridViewRow In DgvListaServ.Rows
                ObjAsignaMantVehiKmEN.idserv += CInt(row.Cells(0).Value)
            Next
    Si funca en un datagridview que solo es llenado por medio de un boton "Agregar". En cambio tengo problemas cuando el datagridview se cargan los datos por el datasource.


    Junior

    jueves, 25 de septiembre de 2014 16:21
  • Alguien me puede indicar :/

    Junior

    lunes, 29 de septiembre de 2014 3:43