El RecordSet ado ese viejo amigo
Si el RecordSet, es ese viejo amigo que hoy dia aún seguimos conservando, en aplicaciones como Excel, Access, o si sigues trabajando en Visual Basic 6 todavía utilizaras.
Más que contenido para programadores
Si el RecordSet, es ese viejo amigo que hoy dia aún seguimos conservando, en aplicaciones como Excel, Access, o si sigues trabajando en Visual Basic 6 todavía utilizaras.
hola a todos hoy os traigo una clase con la que generar filtros para nuestras consultas de sql o de nuestros dataviews o donde lo queramos usar.
Hola amigos , aqui os dejo una buena paractica usando addhandler… que es … la suscripcion de eventos de los propios controles a otras funciones.
Hola a todos, siempre hemos querido hacer un control personalizado para guardar nuestros datos. Pues aqui te dejo un codigo que seguro que te gustará.
Rebuscanco codigo que tenia almacena en ficheros de texto encontre este que forzaba la liberacion de la RAM no utilizada por nuestra aplicacion.
No siempre el GC (Garbage Collector) elimina la memoria disponible. asi que aqui os dejo esto que fueza esa liberacion usando el api de Kernell32.dll de windows.
Es 100% efectivo y lo he probado recientemente en windows 10 .
asi que aqui os dejo el codigo . espero que os sirva.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean Public Sub LiberarRAM() Try Dim MiProceso As Process MiProceso = Process.GetCurrentProcess() SetProcessWorkingSetSize(memoria.Handle, -1, -1) Catch ex As Exception End Try End Sub |
llamalo como quieras Limpiar Ram o Liberar. pero la ram es importante en nuestros equipos. y que la aplicacion consuma lo menos posible es una buena practica. eso significa que hacemos buen uso del codigo.
Un Saludo
Hola Amigos aqui os dejo unos enlaces para que os podais descargar Framworks,Motor de bases de datos y IDEs de micrososft.
Los enlaces los iré actualizando segun vaya teniendo tiempo.
Frameworks :
SQL SERVER :
SQL SERVER 2008 R2 Express with advance services x86
SQL SERVER 2012 Express with advance services
SQL SERVER 2014 Express with advance services
Visual Studio
Espero que os sirvan
Si alguna vez pensaste en como guardar el estado de los objetos que tienes en tu programa, no me refiero solo a los datos. si no a a clases completas, con esta clase, valga a redundancia lo podras hacer.
Para que ?, pues como te cuento en el ejemplo del video , para guardar el estado de una aplicacion cuando da error.
Lo que necesitas para este ejemplo es: 1 textbox, y 3 botones.
el codigo lo tienes a continuación del video. Miralo te vendra bien :).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Imports System.Runtime.Serialization.Formatters.Binary Public Class Form1 Public Lst As New List(Of DtoCliente) Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub <Serializable()> Partial Public Class DtoCliente Public Property Id As Integer Public Property Nombre As String Public Sub New() End Sub End Class Public id As Integer = 0 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click id += 1 Dim dto As New DtoCliente dto.Id = id dto.Nombre = Me.TextBox1.Text Me.TextBox1.Text = "" Lst.Add(dto) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim ms As New IO.FileStream(My.Application.Info.DirectoryPath & "\DtoSave.dto", IO.FileMode.Create) Dim bn As New BinaryFormatter() bn.Serialize(ms, Lst) ms.Close() End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Dim ms As New IO.FileStream(My.Application.Info.DirectoryPath & "\DtoSave.dto", IO.FileMode.Open) Dim bn As New BinaryFormatter() Lst = bn.Deserialize(ms) ms.Close() Dim z = "" End Sub End Class |
espero que te sirva un Saludo… Jose Ortiz “Souslmakers.com”
Video y codigo con correcciones
Hola a todos. Vamos a ver como podemos transformar los datos que provienen de un datatable a un objeto contenedor , que contienen DTOs con los datos.
Partiendo de la Base del DTO vamos a crear una clase con una funcion que transformara esos datos.
Lo primero es la clase DTO que vamos a utilizar que podria ser como esta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Public Class DTOCLIENTE Private _Id Public Property Id As Integer Get Return _Id End Get Set(value As Integer) _Id = value End Set End Property Private _Nombre Public Property Nombre As String Get Return _Nombre End Get Set(value As String) _Nombre = value End Set End Property Private _Apellidos Public Property Apellidos As String Get Return _Apellidos End Get Set(value As String) _Apellidos = value End Set End Property Public Sub New() End Sub End Class |
Pues bien , ya tenemos el DTO general , ahora necesitamos los datos,
los puedes haber obtenido usando OLEDB, ADODB. o como sea yo los creare a mano para el ejemplo.
Como vas a ver , coinciden los formatos de campo con los formatos de campo del DTO, esto es importante por que si no dara error.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Dim dt As New DataTable dt.Columns.Add("Id", GetType(Int32)) : dt.Columns.Add("Nombre", GetType(String)) : dt.Columns.Add("Apellidos", GetType(String)) Dim dr As DataRow dr = dt.NewRow dr("id") = 1 dr("Nombre") = "Juan" dr("Apellidos") = "Pardo" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 2 dr("Nombre") = "Lucas" dr("Apellidos") = "Martinez" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 3 dr("Nombre") = "Pablo" dr("Apellidos") = "Beltran" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 4 dr("Nombre") = "Maria" dr("Apellidos") = "Juliana" dt.Rows.Add(dr) dt.TableName = "Clientes" |
Ya tenemos la estructura DTO y el Datatable, pues ahora solo nos falta el convertidor, que yo , lo cree en una nueva clase, que se llama DTToDTO
(Datatable to DTO) cuya funcion es ToDTO al cual le pasamos el Datatable y el type del DTO. Primero el convertidor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Imports System.Reflection Public Class DTToDTO Public Sub New() End Sub Public Function ToDTO(ByVal dt As DataTable, ByVal Type As Type) 'Invocamos una instacia del type que va pasar a ser DTO Dim DTOBASE = Type.InvokeMember("new", Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing) 'Creamos el contenedor de retorno Dim DTORETURN(-1) For Each dr As DataRow In dt.Rows ReDim Preserve DTORETURN(UBound(DTORETURN) + 1) Dim DTOADD = DTOBASE For Each dc As DataColumn In dt.Columns Dim Pr As PropertyInfo = DTOADD.GetType.GetProperty(dc.ColumnName) Pr.SetValue(DTOADD, dr(dc.ColumnName), Nothing) Next DTORETURN(UBound(DTORETURN)) = DTOADD Next Return DTORETURN End Function End Class |
Y Ahora al contrario.
Lo primero que haremos sera crear una clase a la que yo llame DTOToDTT(DTO to Datatable) y Crearemos una funcion que yo llame ToDTT que tendra como variable un Object y el valor de retorno sera el datatable, y vamos a utilizar la misma logica con reflection la cosa de momento queda asi.
1 2 3 4 5 6 7 8 9 |
Imports System.Reflection Public Class DTOToDTT Public Sub New() End Sub Public Function ToDTT(ByVal DTOs As Object) As DataTable End Function End Class |
A continuación vamos trazar los siguientes pasos para no liarnos, de tal forma que quedara una secuencia logica.
1 Columnas y tipo de dato
2 Datos
Creamos el datatable y vamos a empezar a crear las columnas a traves del reflection, yo lo desglosare y saldrán mas lineas de codigo pero se puede hacer en 1 linea por cada columna del datatable.
1 2 3 4 5 6 |
Dim Dt As New DataTable For Each Pr As PropertyInfo In DTOs(0).GetType.GetProperties Dim NombreColumna = Pr.Name Dim TipoDato As Type = Pr.PropertyType Dt.Columns.Add(NombreColumna, TipoDato) Next |
La cosa va facil no??, creo que no necesita mucha explicación.
Bueno y ahora a rellenar los datos. Para ello vamos a repetir parte de la logica anterior añadimos un For para recorrer el Array y vamos creando los rows, como dije antes, lo voy a desglosar para que se entienda mejor,pero se puede hacer en menos lineas.
1 2 3 4 5 6 7 8 9 10 11 |
For i As Integer = 0 To DTOs.length - 1 Dim dr As DataRow dr = Dt.NewRow For Each pr As PropertyInfo In DTOs(i).GetType.GetProperties Dim NombreColumna = pr.Name Dim Valor = DTOs(i).GetType.GetProperty(NombreColumna).GetValue(DTOs(i)) dr(NombreColumna) = Valor Next Dt.Rows.Add(dr) Next Return Dt |
En 2 pasos, ya esta, ya lo tenemos resuelo. a continuacion os dejo todo el codigo completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Imports System.Reflection Public Class DTOToDTT Public Sub New() End Sub Public Function ToDTT(ByVal DTOs As Object) As DataTable Dim Dt As New DataTable For Each Pr As PropertyInfo In DTOs(0).GetType.GetProperties Dim NombreColumna = Pr.Name Dim TipoDato As Type = Pr.PropertyType Dt.Columns.Add(NombreColumna, TipoDato) Next For i As Integer = 0 To DTOs.length - 1 Dim dr As DataRow dr = Dt.NewRow For Each pr As PropertyInfo In DTOs(i).GetType.GetProperties Dim NombreColumna = pr.Name Dim Valor = DTOs(i).GetType.GetProperty(NombreColumna).GetValue(DTOs(i)) dr(NombreColumna) = Valor Next Dt.Rows.Add(dr) Next Return Dt End Function End Class |
Enlace corto a este post http://4go.es/?4
Buenos dias a todos.
De bien es sabido que en todo desarrollo que se precie, deben de estar ordenados los campos, para que aquellos usuario que normalmente se encargan de cargar datos en la aplicacion , ya sea pedidos, facturas u otro dato, suelen utilizar el tabulador para moverse mas rapido por los registros.
Tambien ocurre que como nos suelen pedir modificaciones , y solemos poner campos nuevos en la o las pantallas, estos ya estan desordenados.
Aqui os traigo una funcion que poniendola en el load de la pantalla reordenara los tabindex de los controles según su posición. asi cuando vayamos pulsando la tecla tab. estos pasaran por orden.
Para ello necesitamos usar un datatable , que ira guardando las posiciones X,Y y el nombre del control, un dataview para ordenarlos, un contador para asignarle el nuevo numero de index.
Aqui el codigo seguido. Espero que os sirva.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Ordenar() End Sub Public Function Ordenar() Dim Orden As Integer = 0 Dim dt As New DataTable Dim dv As New DataView dt.Columns.Add("X", GetType(Integer)) : dt.Columns.Add("Y", GetType(Integer)) : dt.Columns.Add("NAME", GetType(String)) For Each cn As Control In Me.Controls Dim dr As DataRow = dt.NewRow dr("X") = cn.Location.X dr("Y") = cn.Location.Y dr("NAME") = cn.Name dt.Rows.Add(dr) Next dt.TableName = "ORDENAR CAMPOS" dv.Table = dt dv.Sort = "Y ASC,X ASC" For i As Integer = 0 To dv.Count - 1 Me.Controls.Item(dv(i).Row("NAME")).TabIndex = Orden Orden += 1 Next End Function |
Un saludo a todos