none
Ayuda Pasar datos de un datagridview a un Listbox con un formato especifico RRS feed

  • Pregunta

  • Buenas colegas, es pero que tengan un excelente dia, acudo a ustedes pues de un dia entero en esto no doy con lo que quiero hacer, la cuestion es la siguiente, tengo un Form con un datagridview, un Listbox y un Boton, en el grid se insertan datos en estas columnas, CodigoV, DescripcionV, UM, Existencia, ImpMN, ImpCUC, CuentaMN, CuentaCUC, Ubicacion, CodigoN, DescripcionN esos son los nombres de las columnas, los datos se insertan perfecto aqui le pongo el codigo del Form y el resultado que da al pasar esos datos al listbox:

    Public Class frmCrearMovimientos
        Private nombrearchivo As String
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            TempMovProd() 'creo la tabla
            DtMovProd1.MovProd.Clear() 'borro el dataset
            'Empiza la rutina de salidas
            Try
                SqlConnection1.ConnectionString = "Server= " & Trim(frmLogin.txtServidor.Text) & ";Initial Catalog= " & Trim(frmLogin.txtBD.Text) & ";Uid= " & frmLogin.txtUser.Text & ";Pwd= " & Trim(frmLogin.txtpass.Text)
                SqlConnection1.Open()
                SqlCommand1.ExecuteNonQuery() 'ejecuta el insert de los datos a partir de otra consulta
                SqlConnection1.Close()
                SqlDataAdapter1.Fill(DtMovProd1.MovProd)
                If dgv.Rows.Count = 0 Then
                    MsgBox("No contiene registros", vbCritical, "ERROR")
                Else
                    'recorro el grid para obtener los registros y los añado al listbox
                    For Each al As DataGridViewRow In dgv.Rows
                        lsbMuestra.Items.Add("[Documento]")
                        lsbMuestra.Items.Add("Concepto=" & frmAsociacionExcel.cmbSalidas.SelectedValue) 'valor de otro form
                        lsbMuestra.Items.Add("Almacen=" & al.Cells("Alm").Value.ToString.Trim) 'dato del grid de la columna Alm
                        lsbMuestra.Items.Add("Numero=1")
                        lsbMuestra.Items.Add("NumCtrl=")
                        lsbMuestra.Items.Add("Fecha=" & Date.Now.ToString("dd/MM/yyyy")) 'obtengo la fecha actual
                        lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue) 'valor de otro form
                        lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue) 'valor de otro form
                        lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
                        lsbMuestra.Items.Add("[Ubicacion]")
                        'para añadir los datos de ubicacion
                        lsbMuestra.Items.Add(al.Cells("CodigoV").Value.ToString.Trim & "|" & al.Cells("DescripcionV").Value.ToString & "|" & al.Cells("UM").Value.ToString.Trim & "|" & al.Cells("CuentaMN").Value.ToString & "|" & al.Cells("CuentaCUC").Value.ToString & "|||" & al.Cells("Ubicacion").Value.ToString)
                        lsbMuestra.Items.Add("[Movimientos]")
                        'para añadir los datos de los movimientos
                        lsbMuestra.Items.Add(al.Cells("CodigoV").Value.ToString.Trim & "|" & al.Cells("UM").Value.ToString.Trim & "|" & al.Cells("Existencia").Value.ToString & "|" & al.Cells("ImpMN").Value.ToString & "|" & al.Cells("ImpCUC").Value.ToString & "|" & "0")
                    Next
                End If
                'guardo el fichero
                If nombrearchivo = "" Then
                    With SaveFileDialog1
                        .FileName = "Salidas Por Recodificacion.mvt"
                        .Filter = "Versat Mov Files (*.mvt)|*.mvt"
                        .CheckPathExists = True
                        .CheckFileExists = False
                        .ShowDialog()
                        If DialogResult.OK Then
                            lsbMuestra.Text = .FileName
                            nombrearchivo = .FileName
                            GuardaSalida(.FileName)
                        End If
                    End With
                Else
                    GuardaSalida(nombrearchivo)
                End If
                MsgBox("Fichero de Salidas creado con exito", vbInformation, "INFORMACION")
                ' lsbMuestra.Items.Clear()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    End Sub
    
    Private Sub GuardaSalida(ByVal nombre As String)
            'Guardar fichero TXT en formato por defecto(Default)
            Dim AA As String
            Dim Guardar As New IO.StreamWriter(nombre, False, System.Text.Encoding.Default)
            For Each AA In lsbMuestra.Items
                Guardar.WriteLine(AA)
            Next
            Guardar.Close()
        End Sub
    
    Private Sub frmCrearMovimientos_Load(sender As Object, e As EventArgs) Handles Me.Load
            DtMovProd1.MovProd.Clear()
            lsbMuestra.Items.Clear()
        End Sub
    End Class

    el resultado que me da al pasarlo al list box es este:

    [Documento]
    Concepto=2120
    Almacen=01
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016306|ROD 6306 ZZ|U|18901        01         |18901        01         |||01
    [Movimientos]
    3061016306|U|6.0000|8.59|18.25|0
    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016211|ROD 6210 ZZ|U|18901        07         |18901        07         |||07
    [Movimientos]
    3061016211|U|2.0000|2.96|6.76|0
    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016308|ROD 6307 ZZ|U|18901        07         |18901        07         |||07
    [Movimientos]
    3061016308|U|2.0000|8.35|16.41|0
    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016309|RODAMIENTO 6309 ZZ|U|18901        07         |18901        07         |||07
    [Movimientos]
    3061016309|U|10.0000|46.56|75.21|0

    Lo cual no lo quiero asi, deberia quedar asi:

    [Documento]
    Concepto=2120
    Almacen=01
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016306|ROD 6306 ZZ|U|18901        01         |18901        01         |||01
    [Movimientos]
    3061016306|U|6.0000|8.59|18.25|0

    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=21/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Salidas de productos por recodificacion
    [Ubicacion]
    3061016211|ROD 6210 ZZ|U|18901        07         |18901        07         |||07
    3061016308|ROD 6307 ZZ|U|18901        07         |18901        07         |||07
    3061016309|RODAMIENTO 6309 ZZ|U|18901        07         |18901        07         |||07
    [Movimientos]
    3061016211|U|2.0000|2.96|6.76|0
    3061016308|U|2.0000|8.35|16.41|0
    3061016309|U|10.0000|46.56|75.21|0

    o sea por cada almacen debe quedar en Ubicacion y Movimientos los respectivos datos que correspondan a ese almacen y lo que hace es dar el formato pero por cada registro que haya en el grid, ya no se que hacer,,,pienso que el problema esta en el For, pero la verdad ya ni idea.Espero de su valiosa ayuda, de antemano muchas gracias.Salu2s

    sábado, 22 de julio de 2017 13:30

Respuestas

  • Recupera los códigos de almacén y por cada uno de ellos itera las filas que correspondan con el mismo valor:

    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
    	Where(Function(f) Not f.IsNewRow).
    	Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
    
    	lsbMuestra.Items.Add("[Documento]")
    	lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}")
    	lsbMuestra.Items.Add($"Almacen={Almacen}")
    	lsbMuestra.Items.Add("Numero=1")
    	lsbMuestra.Items.Add("NumCtrl=")
    	lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
    	lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
    	lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
    	lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
    	lsbMuestra.Items.Add("[Ubicacion]")
    	For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}",
    					Fila.Cells("CodigoV").Value.ToString.Trim,
    					Fila.Cells("DescripcionV").Value.ToString.Trim,
    					Fila.Cells("UM").Value.ToString.Trim,
    					Fila.Cells("CuentaMN").Value.ToString.Trim,
    					Fila.Cells("CuentaCUC").Value.ToString.Trim,
    					Fila.Cells("Ubicacion").Value.ToString.Trim))
    	Next
    	lsbMuestra.Items.Add("[Movimientos]")
    	For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0",
    					Fila.Cells("CodigoV").Value.ToString.Trim,
    					Fila.Cells("UM").Value.ToString.Trim,
    					Fila.Cells("Existencia").Value.ToString.Trim,
    					Fila.Cells("ImpMN").Value.ToString.Trim,
    					Fila.Cells("ImpCUC").Value.ToString.Trim))
    	Next
    	lsbMuestra.Items.Add("")
    Next

    No olvides indicar el espacio de nombres al inicio del archivo: Imports System.Linq


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta PedroJ2017 domingo, 23 de julio de 2017 0:44
    sábado, 22 de julio de 2017 22:26
  • Adicional a lo que se hizo en el caso anterior, debes agrupar y sumarizar los valores de las columnas 'Existencia', 'ImpMN' y 'ImpCUC' que se espera deban contener valores numéricos válidos.

    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
    	Where(Function(f) Not f.IsNewRow).
    	Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
    
    	lsbMuestra.Items.Add("[Documento]")
    	lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}")
    	lsbMuestra.Items.Add($"Almacen={Almacen}")
    	lsbMuestra.Items.Add("Numero=1")
    	lsbMuestra.Items.Add("NumCtrl=")
    	lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
    	lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
    	lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
    	lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
    	lsbMuestra.Items.Add("[Ubicacion]")
    	For Each Fila In dgv.Rows.Cast(Of DataGridViewRow).
    		Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen).
    		GroupBy(Function(c) c.Cells("CodigoV").Value.ToString.Trim).
    		Select(Function(g) New With
    		{
    			.CodigoV = g.Key,
    			.Desc = g.Max(Function(c) c.Cells("DescripcionV").Value.ToString.Trim),
    			.UM = g.Max(Function(c) c.Cells("UM").Value.ToString.Trim),
    			.CuentaMN = g.Max(Function(c) c.Cells("CuentaMN").Value.ToString.Trim),
    			.CuentaCUC = g.Max(Function(c) c.Cells("CuentaCUC").Value.ToString.Trim),
    			.Ubicacion = g.Max(Function(c) c.Cells("Ubicacion").Value.ToString.Trim)
    		})
    
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}", Fila.CodigoV,
    			Fila.Desc, Fila.UM, Fila.CuentaMN, Fila.CuentaCUC, Fila.Ubicacion))
    	Next
    	lsbMuestra.Items.Add("[Movimientos]")
    	For Each Fila In dgv.Rows.Cast(Of DataGridViewRow).
    		Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen).
    		GroupBy(Function(c) c.Cells("CodigoV").Value.ToString.Trim).
    		Select(Function(g) New With
    		{
    			.CodigoV = g.Key,
    			.UM = g.Max(Function(c) c.Cells("UM").Value.ToString.Trim),
    			.Exis = g.Sum(Function(c) Convert.ToDecimal(c.Cells("Existencia").Value)),
    			.ImpMN = g.Sum(Function(c) Convert.ToDecimal(c.Cells("ImpMN").Value)),
    			.ImpCUC = g.Sum(Function(c) Convert.ToDecimal(c.Cells("ImpCUC").Value))
    		})
    
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0",
    			Fila.CodigoV, Fila.UM, Fila.Exis, Fila.ImpMN, Fila.ImpCUC))
    	Next
    	lsbMuestra.Items.Add("")
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta PedroJ2017 lunes, 24 de julio de 2017 12:39
    domingo, 23 de julio de 2017 17:29

Todas las respuestas

  • A mi entender el for each esta bien lo que sucede es justamente  que no recore por coordenadas sino por existencia de rows. Luego de Ubicación o Movimientos, como repetiría un row más, si está recorriendo el anterior?. Abría que ver la disposición del Grid para evaluar la forma en que recorres.

    Saludos

    sábado, 22 de julio de 2017 19:14
  • Recupera los códigos de almacén y por cada uno de ellos itera las filas que correspondan con el mismo valor:

    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
    	Where(Function(f) Not f.IsNewRow).
    	Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
    
    	lsbMuestra.Items.Add("[Documento]")
    	lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}")
    	lsbMuestra.Items.Add($"Almacen={Almacen}")
    	lsbMuestra.Items.Add("Numero=1")
    	lsbMuestra.Items.Add("NumCtrl=")
    	lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
    	lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
    	lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
    	lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
    	lsbMuestra.Items.Add("[Ubicacion]")
    	For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}",
    					Fila.Cells("CodigoV").Value.ToString.Trim,
    					Fila.Cells("DescripcionV").Value.ToString.Trim,
    					Fila.Cells("UM").Value.ToString.Trim,
    					Fila.Cells("CuentaMN").Value.ToString.Trim,
    					Fila.Cells("CuentaCUC").Value.ToString.Trim,
    					Fila.Cells("Ubicacion").Value.ToString.Trim))
    	Next
    	lsbMuestra.Items.Add("[Movimientos]")
    	For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
    			Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0",
    					Fila.Cells("CodigoV").Value.ToString.Trim,
    					Fila.Cells("UM").Value.ToString.Trim,
    					Fila.Cells("Existencia").Value.ToString.Trim,
    					Fila.Cells("ImpMN").Value.ToString.Trim,
    					Fila.Cells("ImpCUC").Value.ToString.Trim))
    	Next
    	lsbMuestra.Items.Add("")
    Next

    No olvides indicar el espacio de nombres al inicio del archivo: Imports System.Linq


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta PedroJ2017 domingo, 23 de julio de 2017 0:44
    sábado, 22 de julio de 2017 22:26
  • Una vez mas satisfecho, muchas gracias por responder en especial a Williams, increiblemente ni se me habia pasado por la mente de hacer eso, un millon de gracias, mi pregunta queda respondida con su respuesta, y cien por cien hace lo que deceo hacer, muchas gracias una vez mas.Salu2s
    domingo, 23 de julio de 2017 0:47
  • Ahora la siguiente inconveniente es: ya para las salidas todo esta bien, para las entradas igual, solo que cambio dos columnas, en vez de CodigoV y DescripcionV, para las entradas seran CodigoN y DescripcionN, todo lo demas se mantiene, ahora como puedo hacer para agrupar los codigo que se repitan, o sea si hay dos codigos iguales, me sumen la cantidad y los importyes y solo los ponga en un solo codigo, o sea: este es el codigo de las entradas y les muestro el resultado, y como deceo que quede:

    'Empieza la rutina de entradas Try If dgv.Rows.Count = 0 Then MsgBox("No contiene registros", vbCritical, "ERROR") Else For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow). Where(Function(f) Not f.IsNewRow). Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct() lsbMuestra.Items.Add("[Documento]") lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}") lsbMuestra.Items.Add($"Almacen={Almacen}") lsbMuestra.Items.Add("Numero=1") lsbMuestra.Items.Add("NumCtrl=") lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}") lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue) lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue) lsbMuestra.Items.Add("Descripcion=Entradas de productos por recodificacion") lsbMuestra.Items.Add("[Ubicacion]") For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow). Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen) lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}", Fila.Cells("CodigoN").Value.ToString.Trim, Fila.Cells("DescripcionN").Value.ToString.Trim, Fila.Cells("UM").Value.ToString.Trim, Fila.Cells("CuentaMN").Value.ToString.Trim, Fila.Cells("CuentaCUC").Value.ToString.Trim, Fila.Cells("Ubicacion").Value.ToString.Trim)) Next lsbMuestra.Items.Add("[Movimientos]") For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow). Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen) lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0", Fila.Cells("CodigoN").Value.ToString.Trim, Fila.Cells("UM").Value.ToString.Trim, Fila.Cells("Existencia").Value.ToString.Trim, Fila.Cells("ImpMN").Value.ToString.Trim, Fila.Cells("ImpCUC").Value.ToString.Trim)) Next lsbMuestra.Items.Add("") Next End If If nombrearchivo1 = "" Then With SaveFileDialog1 .FileName = "Entradas Por Recodificacion.mvt" .Filter = "Versat Mov Files (*.mvt)|*.mvt" .CheckPathExists = True .CheckFileExists = False .ShowDialog() If DialogResult.OK Then lsbMuestra.Text = .FileName nombrearchivo1 = .FileName GuardaEntrada(.FileName) End If End With Else GuardaEntrada(nombrearchivo1) End If MsgBox("Fichero de Entradas creado con exito", vbInformation, "INFORMACION") lsbMuestra.Items.Clear() Catch ex As Exception MsgBox(ex.Message) End Try End Sub Public Sub GuardaEntrada(ByVal nombre As String) 'Guardar fichero TXT en formato por defecto(Default) Dim AA As String Dim Guardar As New IO.StreamWriter(nombre, False, System.Text.Encoding.Default) For Each AA In lsbMuestra.Items Guardar.WriteLine(AA) Next Guardar.Close() End Sub

    el resultado es este:

    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=22/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Entradas de productos por recodificacion
    [Ubicacion]
    0070009120|RODAMIENTO 6307 ZZ|U|18901        07|18901        07|||07
    0070009120|RODAMIENTO 6307 ZZ|U|18901        07|18901        07|||07
    0070009160|RODAMIENTO 6309 ZZ|U|18901        07|18901        07|||07
    [Movimientos]
    0070009120|U|2.0000|2.96|6.76|0
    0070009120|U|2.0000|8.35|16.41|0
    0070009160|U|10.0000|46.56|75.21|0

    y me debe quedar asi:

    [Documento]
    Concepto=2120
    Almacen=07
    Numero=1
    NumCtrl=
    Fecha=22/07/2017
    CuentaMN=69902  
    CuentaMLC=69902  
    Descripcion=Entradas de productos por recodificacion
    [Ubicacion]
    0070009120|RODAMIENTO 6307 ZZ|U|18901        07|18901        07|||07
    0070009160|RODAMIENTO 6309 ZZ|U|18901        07|18901        07|||07
    [Movimientos]
    0070009120|U|4.0000|11.31|23.17|0
    0070009160|U|10.0000|46.56|75.21|0

    o sea que le haga una especie de group by, Salud2s


    domingo, 23 de julio de 2017 1:06
  • Adicional a lo que se hizo en el caso anterior, debes agrupar y sumarizar los valores de las columnas 'Existencia', 'ImpMN' y 'ImpCUC' que se espera deban contener valores numéricos válidos.

    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
    	Where(Function(f) Not f.IsNewRow).
    	Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
    
    	lsbMuestra.Items.Add("[Documento]")
    	lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}")
    	lsbMuestra.Items.Add($"Almacen={Almacen}")
    	lsbMuestra.Items.Add("Numero=1")
    	lsbMuestra.Items.Add("NumCtrl=")
    	lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
    	lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
    	lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
    	lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
    	lsbMuestra.Items.Add("[Ubicacion]")
    	For Each Fila In dgv.Rows.Cast(Of DataGridViewRow).
    		Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen).
    		GroupBy(Function(c) c.Cells("CodigoV").Value.ToString.Trim).
    		Select(Function(g) New With
    		{
    			.CodigoV = g.Key,
    			.Desc = g.Max(Function(c) c.Cells("DescripcionV").Value.ToString.Trim),
    			.UM = g.Max(Function(c) c.Cells("UM").Value.ToString.Trim),
    			.CuentaMN = g.Max(Function(c) c.Cells("CuentaMN").Value.ToString.Trim),
    			.CuentaCUC = g.Max(Function(c) c.Cells("CuentaCUC").Value.ToString.Trim),
    			.Ubicacion = g.Max(Function(c) c.Cells("Ubicacion").Value.ToString.Trim)
    		})
    
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}", Fila.CodigoV,
    			Fila.Desc, Fila.UM, Fila.CuentaMN, Fila.CuentaCUC, Fila.Ubicacion))
    	Next
    	lsbMuestra.Items.Add("[Movimientos]")
    	For Each Fila In dgv.Rows.Cast(Of DataGridViewRow).
    		Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen).
    		GroupBy(Function(c) c.Cells("CodigoV").Value.ToString.Trim).
    		Select(Function(g) New With
    		{
    			.CodigoV = g.Key,
    			.UM = g.Max(Function(c) c.Cells("UM").Value.ToString.Trim),
    			.Exis = g.Sum(Function(c) Convert.ToDecimal(c.Cells("Existencia").Value)),
    			.ImpMN = g.Sum(Function(c) Convert.ToDecimal(c.Cells("ImpMN").Value)),
    			.ImpCUC = g.Sum(Function(c) Convert.ToDecimal(c.Cells("ImpCUC").Value))
    		})
    
    		lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0",
    			Fila.CodigoV, Fila.UM, Fila.Exis, Fila.ImpMN, Fila.ImpCUC))
    	Next
    	lsbMuestra.Items.Add("")
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta PedroJ2017 lunes, 24 de julio de 2017 12:39
    domingo, 23 de julio de 2017 17:29
  • Muchisimas gracias, lo rpobe y funciono de maravillas, auqneu ya habia resuelto, creando otro adaptador y ejecutando una consulta con group by, y asi solucione el problema:

    la consulta quedo asi:

    SELECT        CodigoN, DescripcionN, UM, Alm, SUM(Existencia) AS Existencia, SUM(ImpMN) AS ImpMN, SUM(ImpCUC) AS ImpCUC, CuentaMN, CuentaCUC, Ubicacion
    FROM            TempMovprod
    GROUP BY CodigoN, DescripcionN, UM, Alm, CuentaMN, CuentaCUC, Ubicacion

    y pude obtener el resultado esperado y para el codigo quedo asi:

    Public Class frmCrearMovimientos
        Private nombrearchivo As String
        Private nombrearchivo1 As String
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            TempMovProd() 'creo la tabla
            DtMovProd1.MovProd.Clear() 'borro el dataset
            'Empiza la rutina de salidas
            Try
                SqlConnection1.ConnectionString = "Server= " & Trim(frmLogin.txtServidor.Text) & ";Initial Catalog= " & Trim(frmLogin.txtBD.Text) & ";Uid= " & frmLogin.txtUser.Text & ";Pwd= " & Trim(frmLogin.txtpass.Text)
                SqlConnection1.Open()
                SqlCommand1.ExecuteNonQuery() 'ejecuta el insert de los datos a partir de otra consulta
                SqlConnection1.Close()
                SqlDataAdapter1.Fill(DtMovProd1.MovProd)
                If dgv.Rows.Count = 0 Then
                    MsgBox("No contiene registros", vbCritical, "ERROR")
                Else
                    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
        Where(Function(f) Not f.IsNewRow).
        Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
                        lsbMuestra.Items.Add("[Documento]")
                        lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbSalidas.SelectedValue}")
                        lsbMuestra.Items.Add($"Almacen={Almacen}")
                        lsbMuestra.Items.Add("Numero=1")
                        lsbMuestra.Items.Add("NumCtrl=")
                        lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
                        lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
                        lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
                        lsbMuestra.Items.Add("Descripcion=Salidas de productos por recodificacion")
                        lsbMuestra.Items.Add("[Ubicacion]")
                        For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
                                Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
                            lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}",
                                        Fila.Cells("CodigoV").Value.ToString.Trim,
                                        Fila.Cells("DescripcionV").Value.ToString.Trim,
                                        Fila.Cells("UM").Value.ToString.Trim,
                                        Fila.Cells("CuentaMN").Value.ToString.Trim,
                                        Fila.Cells("CuentaCUC").Value.ToString.Trim,
                                        Fila.Cells("Ubicacion").Value.ToString.Trim))
                        Next
                        lsbMuestra.Items.Add("[Movimientos]")
                        For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
                                Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
                            lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|0",
                                        Fila.Cells("CodigoV").Value.ToString.Trim,
                                        Fila.Cells("UM").Value.ToString.Trim,
                                        Fila.Cells("Existencia").Value.ToString.Trim,
                                        Fila.Cells("ImpMN").Value.ToString.Trim,
                                        Fila.Cells("ImpCUC").Value.ToString.Trim))
                        Next
                        lsbMuestra.Items.Add("")
                    Next
                End If
                'guardo el fichero
                If nombrearchivo = "" Then
                    With SaveFileDialog1
                        .FileName = "Salidas Por Recodificacion.mvt"
                        .Filter = "Versat Mov Files (*.mvt)|*.mvt"
                        .CheckPathExists = True
                        .CheckFileExists = False
                        .ShowDialog()
                        If DialogResult.OK Then
                            lsbMuestra.Text = .FileName
                            nombrearchivo = .FileName
                            GuardaSalida(.FileName)
                        End If
                    End With
                Else
                    GuardaSalida(nombrearchivo)
                End If
                MsgBox("Fichero de Salidas creado con exito", vbInformation, "INFORMACION")
                lsbMuestra.Items.Clear()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            'Empieza la rutina de entradas
    'Aqui ejectuto la consulta del segundo adaptador para obtener los datos agrupados        
           dgv.DataSource = Nothing
            DtMovProd1.Clear()
            SqlDataAdapter2.Fill(DtMovProd1.TempMovprodGroup)
            dgv.DataSource = DtMovProd1.TempMovprodGroup
            Try
                If dgv.Rows.Count = 0 Then
                    MsgBox("No contiene registros", vbCritical, "ERROR")
                Else
                    For Each Almacen As String In dgv.Rows.Cast(Of DataGridViewRow).
    Where(Function(f) Not f.IsNewRow).
    Select(Function(c) Convert.ToString(c.Cells("Alm").Value)).Distinct()
                        lsbMuestra.Items.Add("[Documento]")
                        lsbMuestra.Items.Add($"Concepto={frmAsociacionExcel.cmbEntrada.SelectedValue}")
                        lsbMuestra.Items.Add($"Almacen={Almacen}")
                        lsbMuestra.Items.Add("Numero=1")
                        lsbMuestra.Items.Add("NumCtrl=")
                        lsbMuestra.Items.Add($"Fecha={Date.Now.ToString("dd/MM/yyyy")}")
                        lsbMuestra.Items.Add("CuentaMN=" & frmAsociacionExcel.cmbCuentaCUP.SelectedValue)
                        lsbMuestra.Items.Add("CuentaMLC=" & frmAsociacionExcel.cmbCuentaCUC.SelectedValue)
                        lsbMuestra.Items.Add("Descripcion=Entradas de productos por recodificacion")
                        lsbMuestra.Items.Add("[Ubicacion]")
                        For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
                            Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
                            lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|||{5}",
                                    Fila.Cells("CodigoN").Value.ToString.Trim,
                                    Fila.Cells("DescripcionN").Value.ToString.Trim,
                                    Fila.Cells("UM").Value.ToString.Trim,
                                    Fila.Cells("CuentaMN").Value.ToString.Trim,
                                    Fila.Cells("CuentaCUC").Value.ToString.Trim,
                                    Fila.Cells("Ubicacion").Value.ToString.Trim))
                        Next
                        lsbMuestra.Items.Add("[Movimientos]")
                        For Each Fila As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow).
                            Where(Function(f) Convert.ToString(f.Cells("Alm").Value) = Almacen)
                            lsbMuestra.Items.Add(String.Format("{0}|{1}|{2}|{3}|{4}|{2}",
                                    Fila.Cells("CodigoN").Value.ToString.Trim,
                                    Fila.Cells("UM").Value.ToString.Trim,
                                    Fila.Cells("Existencia").Value.ToString.Trim,
                                    Fila.Cells("ImpMN").Value.ToString.Trim,
                                    Fila.Cells("ImpCUC").Value.ToString.Trim))
                        Next
                        lsbMuestra.Items.Add("")
                    Next
                End If
                If nombrearchivo1 = "" Then
                    With SaveFileDialog1
                        .FileName = "Entradas Por Recodificacion.mvt"
                        .Filter = "Versat Mov Files (*.mvt)|*.mvt"
                        .CheckPathExists = True
                        .CheckFileExists = False
                        .ShowDialog()
                        If DialogResult.OK Then
                            lsbMuestra.Text = .FileName
                            nombrearchivo1 = .FileName
                            GuardaEntrada(.FileName)
                        End If
                    End With
                Else
                    GuardaEntrada(nombrearchivo1)
                End If
                MsgBox("Fichero de Entradas creado con exito", vbInformation, "INFORMACION")
                lsbMuestra.Items.Clear()
                Me.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Me.Close()
        End Sub
        Private Sub GuardaSalida(ByVal nombre As String)
            'Guardar fichero TXT en formato por defecto(Default)
            Dim AA As String
            Dim Guardar As New IO.StreamWriter(nombre, False, System.Text.Encoding.Default)
            For Each AA In lsbMuestra.Items
                Guardar.WriteLine(AA)
            Next
            Guardar.Close()
        End Sub
        Public Sub GuardaEntrada(ByVal nombre As String)
            'Guardar fichero TXT en formato por defecto(Default) 
            Dim AA As String
            Dim Guardar As New IO.StreamWriter(nombre, False, System.Text.Encoding.Default)
            For Each AA In lsbMuestra.Items
                Guardar.WriteLine(AA)
            Next
            Guardar.Close()
        End Sub
    
        Private Sub frmCrearMovimientos_Load(sender As Object, e As EventArgs) Handles Me.Load
            DtMovProd1.MovProd.Clear()
            DtMovProd1.TempMovprodGroup.Clear()
            lsbMuestra.Items.Clear()
        End Sub
    End Class
    asi me quedo y funciona de maravillas...muchas gracias por responder.Salu2s

    domingo, 23 de julio de 2017 18:36