El programa lo hice en visual studio 2003, pero he realizado algunos cambios como por ejemplo la posibilidad de elegir el tiempo en que se copiaran los archivos y ademas lo he migrado a visual studio 2010.
Aquí muestro una imagen del programa.
Public Class Personal
Private lcod_personal As String
Private lnom_personal As String
Private lcod_concepto As String
Private limp_concepto As Decimal
Public Property cod_personal() As String
Get
Return lcod_personal
End Get
Set(ByVal value As String)
lcod_personal = value
End Set
End Property
Public Property nom_personal() As String
Get
Return lnom_personal
End Get
Set(ByVal value As String)
lnom_personal = value
End Set
End Property
Public Property cod_concepto() As String
Get
Return lcod_concepto
End Get
Set(ByVal value As String)
lcod_concepto = value
End Set
End Property
Public Property imp_concepto() As Decimal
Get
Return limp_concepto
End Get
Set(ByVal value As Decimal)
limp_concepto = value
End Set
End Property
End Class
Public Class ListPersonal
Inherits List(Of Personal)
Sub New()
End Sub
Sub AddPersonal(ByVal lcod_personal As String, _
ByVal lnom_personal As String, _
ByVal lcod_concepto As String, _
ByVal limp_concepto As Decimal)
Dim lPersonal As New Personal
lPersonal.cod_personal = lcod_personal
lPersonal.nom_personal = lnom_personal
lPersonal.cod_concepto = lcod_concepto
lPersonal.imp_concepto = limp_concepto
Me.Add(lPersonal)
End Sub
End Class
Public Class Conceptos
Private lcod_concepto As String
Private lnom_concepto As String
Public Property cod_concepto() As String
Get
Return lcod_concepto
End Get
Set(ByVal value As String)
lcod_concepto = value
End Set
End Property
Public Property nom_concepto() As String
Get
Return lnom_concepto
End Get
Set(ByVal value As String)
lnom_concepto = value
End Set
End Property
End Class
Public Class ListConcepto
Inherits List(Of Conceptos)
Sub New()
End Sub
Sub AddConcepto(ByVal Codigo As String, ByVal Nombre As String)
Dim lconcepto As New Conceptos
lconcepto.cod_concepto = Codigo
lconcepto.nom_concepto = Nombre
Me.Add(lconcepto)
End Sub
End Class
Public Class Form1
Dim lListPersonal As New ListPersonal
Dim lListConcepto As New ListConcepto
Dim lBinding As New BindingSource
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Creamos la Estructura del datagridview
Dim ColumnCodigo As New DataGridViewTextBoxColumn
ColumnCodigo.Name = "Código"
ColumnCodigo.HeaderText = "Codigo"
ColumnCodigo.DataPropertyName = "cod_personal"
ColumnCodigo.Width = 80
Me.DataGridView1.Columns.Add(ColumnCodigo)
Dim ColumnNombre As New DataGridViewTextBoxColumn
ColumnNombre.Name = "Nombre"
ColumnNombre.HeaderText = "Apellidos y nombre"
ColumnNombre.DataPropertyName = "nom_personal"
ColumnNombre.Width = 200
Me.DataGridView1.Columns.Add(ColumnNombre)
Dim ColumnConcepto As New DataGridViewComboBoxColumn
ColumnConcepto.Name = "Concepto"
ColumnConcepto.HeaderText = "Concepto pago"
ColumnConcepto.DataPropertyName = "cod_concepto"
ColumnConcepto.Width = 140
Me.DataGridView1.Columns.Add(ColumnConcepto)
Dim ColumnImporte As New DataGridViewTextBoxColumn
ColumnImporte.Name = "Concepto"
ColumnImporte.HeaderText = "Importe S/."
ColumnImporte.DataPropertyName = "imp_concepto"
Me.DataGridView1.Columns.Add(ColumnImporte)
Me.DataGridView1.AutoGenerateColumns = False
'Agregamos los conceptos de pago y los asignamos a la columna tipo combobox
lListConcepto.AddConcepto("", "(SELECCIONE)")
lListConcepto.AddConcepto("01", "SUELDO BÁSICO")
lListConcepto.AddConcepto("02", "ASIGNACION FAMILIAR")
lListConcepto.AddConcepto("03", "HORAS EXTRAS")
lListConcepto.AddConcepto("04", "GRATIFICACION")
lListConcepto.AddConcepto("05", "MOVILIDAD")
lListConcepto.AddConcepto("06", "REFRIGERIO")
ColumnConcepto.DataSource = lListConcepto
ColumnConcepto.DisplayMember = "nom_concepto"
ColumnConcepto.ValueMember = "cod_concepto"
'Cargamos algunos trabajadores
lListPersonal.AddPersonal("XY001", "PEREZ RODRIGUEZ, JUAN", "", 0)
lBinding.DataSource = lListPersonal
Me.DataGridView1.DataSource = lBinding
End Sub
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
Dim lInfo As New Personal
lInfo.cod_personal = "XY001"
lInfo.nom_personal = "PEREZ RODRIGUEZ, JUAN"
lInfo.cod_concepto = ""
lInfo.imp_concepto = 0
lBinding.Add(lInfo)
End Sub
Private Sub DataGridView1_CurrentCellChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellChanged
If DataGridView1.CurrentRow Is Nothing Then Exit Sub
If DataGridView1.CurrentRow.Cells("Concepto").Value = String.Empty Then
Me.DataGridView1.CurrentRow.ErrorText = "Debe seleccionar un concepto válido"
Else
Me.DataGridView1.CurrentRow.ErrorText = String.Empty
End If
End Sub
Private Sub DataGridView1_CellBeginEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
Dim lStrColumn As String = Me.DataGridView1.Columns(e.ColumnIndex).Name
'Solo es váido cuando la columna del datagridview corresponde a conceptos
If lStrColumn = "Concepto" Then
Dim lConceptosAsignados As New List(Of String)
Dim lConceptosNoAsignados As New ListConcepto
'PASO 1
'Obtenemos los conceptos que ya fueron asignados al personal
'Recorremos las filas del datagridview
For Each lInfo As DataGridViewRow In Me.DataGridView1.Rows
'Entraran a la condicion todas las filas excepto la fila que esta
'en edicion
If e.RowIndex <> lInfo.Index Then
'Obtenemos la entidad por fila
Dim lBoundItem As Personal = lInfo.DataBoundItem
If lBoundItem Is Nothing Then
Continue For
End If
'Agregamos a la lista de conceptos asignados
lConceptosAsignados.Add(lBoundItem.cod_concepto)
End If
Next
'PASO 2
'En la Celda del DataGridViewComboboxcolum que esta en edicion
'mostramos aquellos conceptos que aun no han sido asignados
Dim lBoolAsignado As Boolean = False
For Each info As Conceptos In lListConcepto
lBoolAsignado = False
'Verificamos si el concepto ha sido asignado en alguna fila
For Each Value As String In lConceptosAsignados
If info.cod_concepto = Value Then
lBoolAsignado = True
Exit For
End If
Next
'Si el concepto aun no ha sido asignado
If lBoolAsignado = False Then
lConceptosNoAsignados.Add(info)
End If
Next
'A la celda del DatagridViewComboBoxcolumn en edicion indicamos
'que solo se muestren los items que aun no han sido asignados
Dim dgvColumn As New DataGridViewComboBoxCell
dgvColumn.DataSource = lConceptosNoAsignados
dgvColumn.ValueMember = "cod_concepto"
dgvColumn.DisplayMember = "nom_concepto"
Me.DataGridView1.Item(lStrColumn, e.RowIndex) = dgvColumn
End If
End Sub
Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
If Not (DataGridView1.CurrentRow Is Nothing) Then
lBinding.RemoveCurrent()
End If
End Sub
End Class
GO
drop function [fGetCondicion]
GO
create function [dbo].[fGetCondicion]
(
@Condicion varchar(20),
@value varchar(100)
)
RETURNS VARCHAR(20)
AS
-- =============================================
-- Author: Milton Baltazar Valenzuela
-- Description: Obtiene el tipo de condicion y el valor
-- de la condicion para devolver la condicion
-- en el formato requerido
-- =============================================
BEGIN
RETURN (
SELECT
CASE @Condicion
WHEN 'like' THEN @Condicion + '''%' + @value + '%'''
WHEN '=' THEN @Condicion + ' ' + @value
WHEN '<>' THEN @Condicion + ' ' + @value
WHEN '>' THEN @Condicion + ' ' + @value
WHEN '<' THEN @Condicion + ' ' + @value ELSE null END) END GO GO drop procedure usp_get_products GO create procedure usp_get_products ( @productID int ,@ProductName varchar(40) ,@CategoryID int ,@UnitPrice money ,@Condicion varchar(100) ) AS BEGIN Declare @ls_query nvarchar(4000) Declare @li_error int Declare @ls_error varchar(1000) set @ls_query='select productID, ProductName, CategoryID, UnitPrice from dbo.Products' if @productID is not null begin set @ls_query = @ls_query + ' where productID ' + dbo.fGetCondicion(@Condicion,@productID) end else if @ProductName is not null begin set @ls_query = @ls_query + ' where ProductName ' + dbo.fGetCondicion(@Condicion,@ProductName) end else if @CategoryID is not null begin set @ls_query = @ls_query + ' where CategoryID ' + dbo.fGetCondicion(@Condicion,@CategoryID) end exec @li_error = sp_executesql @ls_query,N' @productID int ,@ProductName varchar(40) ,@CategoryID int ,@Condicion varchar(100)' ,@productID ,@ProductName ,@CategoryID ,@Condicion ; if @li_error <> 0
begin
set @ls_error = 'Error en la consulta. '
RaisError(@ls_error,16,1)
end
END
GO
----------------------------------------------------
--ejecutamos el procedimiento almacenado
----------------------------------------------------
exec usp_get_products 10,null,null,null,'='
exec usp_get_products null,'',null,null,'like'
exec usp_get_products null,'Chai',null,null,'Like'
GO
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Linq
Imports System.Linq.Expressions
Imports System.Text
Imports System.Reflection
Public Class SortableBindingList(Of T)
Inherits BindingList(Of T)
Private _isSorted As Boolean
Private _sortDirection As ListSortDirection
Private _sortProperty As PropertyDescriptor
'This override shows the binded object, that our list supports sorting
Protected Overrides ReadOnly Property SupportsSortingCore() As Boolean
Get
Return True
End Get
End Property
'And that it can sort bi-directional
Protected Overrides ReadOnly Property SortDirectionCore() As ListSortDirection
Get
Return _sortDirection
End Get
End Property
'And that it can sort by T typed object's properties
Protected Overloads Overrides ReadOnly Property SortPropertyCore() As PropertyDescriptor
Get
Return _sortProperty
End Get
End Property
'This is the method, what gets called when the sort event occurs in the bound object
Protected Overloads Overrides Sub ApplySortCore(ByVal prop As PropertyDescriptor, ByVal direction As ListSortDirection)
Dim items As List(Of T) = TryCast(Me.Items, List(Of T))
If items IsNot Nothing Then
Dim pc As New PropertyComparer(Of T)(prop.Name, direction)
items.Sort(pc)
_isSorted = True
_sortDirection = direction
_sortProperty = prop
Else
_isSorted = False
End If
OnListChanged(New ListChangedEventArgs(ListChangedType.Reset, -1))
End Sub
'This shows if our list is already sorted or not
Protected Overloads Overrides ReadOnly Property IsSortedCore() As Boolean
Get
Return _isSorted
End Get
End Property
'Removing the sort
Protected Overrides Sub RemoveSortCore()
_isSorted = False
End Sub
'Sub New(ByVal list As ICollection(Of T))
' MyBase.New(list)
'End Sub
End Class
Public Class PropertyComparer(Of T)
Implements IComparer(Of T)
Private _property As PropertyInfo
Private _sortDirection As ListSortDirection
Public Sub New(ByVal sortProperty As String, ByVal sortDirection As ListSortDirection)
_property = GetType(T).GetProperty(sortProperty)
Me._sortDirection = sortDirection
End Sub
Public Function Compare(ByVal x As T, ByVal y As T) As Integer Implements IComparer(Of T).Compare
Dim valueX As Object = _property.GetValue(x, Nothing)
Dim valueY As Object = _property.GetValue(y, Nothing)
If _sortDirection = ListSortDirection.Ascending Then Return Comparer.[Default].Compare(valueX, valueY)
Return Comparer.[Default].Compare(valueY, valueX)
End Function
End Class
Public Class Categories
Private lCategoryId As String = String.Empty
Private lCategoryName As String = String.Empty
Private lDescription As String = String.Empty
Public Property CategoryId() As String
Get
Return lCategoryId
End Get
Set(ByVal value As String)
lCategoryId = value
End Set
End Property
Public Property CategoriName() As String
Get
Return lCategoryName
End Get
Set(ByVal value As String)
lCategoryName = value
End Set
End Property
Public Property Description() As String
Get
Return lDescription
End Get
Set(ByVal value As String)
lDescription = value
End Set
End Property
End Class
Public Class ListCategories
Inherits SortableBindingList(Of Categories)
Sub New()
End Sub
End Class
Dim lList As New ListCategories
Using cn As New SqlConnection("Data Source=XXXX;Initial Catalog=BD;User ID=sa;Password=xyzxyz")
Using cmd As New SqlCommand
cmd.CommandType = CommandType.Text
cmd.CommandText = "select categoryId, categoryName, Description from Categories"
cmd.Connection = cn
cn.Open()
Using dr As SqlDataReader = cmd.ExecuteReader
If dr.HasRows = True Then
Dim lColumn0 As Integer = dr.GetOrdinal("categoryId")
Dim lColumn1 As Integer = dr.GetOrdinal("categoryName")
Dim lColumn2 As Integer = dr.GetOrdinal("Description")
Dim lCount As Integer = dr.FieldCount - 1
Dim Values(lCount) As Object
Dim lEntidad As Categories
While dr.Read
dr.GetValues(Values)
lEntidad = New Categories
lEntidad.CategoryId = Values(lColumn0)
lEntidad.CategoriName = Values(lColumn1)
lEntidad.Description = Values(lColumn2)
lList.Add(lEntidad)
End While
End If
End Using
cn.Close()
End Using
End Using
DataGridView1.DataSource = lList