Sunteți pe pagina 1din 164

Notas sobre VB.

Net
1 2 3 4 5 6 6.1 7 8 8.1 8.2 8.3 9 10 11 12 12.1 12.1.1 12.1.2 13 13.1 13.2 13.3 13.3.1 13.3.2 13.3.3 13.3.4 13.3.5 13.4 13.4.1 13.4.2 13.5 13.6 14 14.1 14.2 14.3 14.4 15 15.1 15.2 15.3 15.4 Propiedades de un proyecto.......................................................................................................................... 4 Evitar multiples instancias de una aplicacion .Net ..................................................................................... 5 Carpetas especiales........................................................................................................................................ 8 Variables del entorno .................................................................................................................................... 9 Detectar la pulsacin de una tecla.............................................................................................................. 12 Manejo de las solapas de un TabControl .................................................................................................. 13 Seleccionar una solapa determinada.............................................................................................................. 13 Structure....................................................................................................................................................... 14 Combobox .................................................................................................................................................... 17 Estilo Single .................................................................................................................................................. 17 Estilo DropDown........................................................................................................................................... 17 Estilo DropDownList..................................................................................................................................... 17 InputBox....................................................................................................................................................... 18 CheckedListBox........................................................................................................................................... 19 Control ToolTip ........................................................................................................................................... 20 Barra de herramientas:............................................................................................................................... 21 Cmo saber el nombre del botn pulsado...................................................................................................... 21 Usando el evento ........................................................................................................................................... 21 Usando el nombre del remitente (sender)...................................................................................................... 22 Forms............................................................................................................................................................ 23 Coleccin de forms........................................................................................................................................ 23 Consultar coleccin de forms y controles en cada form ................................................................................ 24 Commondialog .............................................................................................................................................. 25 Ejemplo de FolderDialog .............................................................................................................................. 26 Ejemplo de OpenFileDialog.......................................................................................................................... 27 Ejemplo de SaveFileDialog ........................................................................................................................... 28 Ejemplo de ColorDialog................................................................................................................................ 29 Ejemplo de FontDialog ................................................................................................................................. 30 Salvar en fichero atributos y recuperarles...................................................................................................... 31 Salvar Color y atributos del Font.................................................................................................................. 31 Recuperar y asignar Color de fondo y atributos del font .............................................................................. 33 Repintar fondo cuando se cambia el tamao ................................................................................................. 38 Dibujar lnea roja........................................................................................................................................... 39 Form MDI .................................................................................................................................................... 40 Problema con las llamadas entre forms ......................................................................................................... 40 Patrn Singleton con formularios MDI ......................................................................................................... 42 Invocar un Form Hijo .................................................................................................................................... 43 Color de fondo en un formulario MDI .......................................................................................................... 44 Asistente form de datos ............................................................................................................................... 49 Cadena de conexin:...................................................................................................................................... 49 Modificar la select generada por el asistente ................................................................................................. 50 Cmo rellena el asistente un DataGrid de datos ............................................................................................ 51 Cmo modificar el adaptador cuando se aaden columnas ........................................................................... 53

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 1 de 164

15.5 16 16.1 16.2 16.3 16.4 16.4.1 16.4.2 16.4.3 16.4.4 16.4.5 16.5 16.6 16.6.1 17 17.1 17.2 17.3 17.4 17.5 17.6 18 18.1 18.2 18.3 18.3.1 18.4 18.5 18.5.1 18.5.2 18.6 18.7 19 19.1 19.2 20 21 22 23 23.1 24 24.1 24.2 24.3 25 26 27 27.1 28

Ejemplo 2: Aadir un campo booleano ......................................................................................................... 59 SQL............................................................................................................................................................... 62 Ejecutar comando inmediato ......................................................................................................................... 62 Clausula Delete.............................................................................................................................................. 63 Clausula insert ............................................................................................................................................... 64 Clausula SELECT ......................................................................................................................................... 65 Select count(*) ............................................................................................................................................... 65 Where con Like , Order by ASC/DESC ......................................................................................................... 69 Where con campo tipo booleano ................................................................................................................... 71 Where con campos nulos ............................................................................................................................... 72 No mostrar filas duplicadas con DISTINCT................................................................................................. 73 Vistas ............................................................................................................................................................. 75 Tipos de concurrencia.................................................................................................................................... 76 Optimista ....................................................................................................................................................... 76 Acceso a datos .............................................................................................................................................. 77 Transacciones con .NET................................................................................................................................ 77 Recuperar el valor de un campo con ExecuteScalar...................................................................................... 80 Ejecutar comando que no devuelve un conjunto de registros : ExecuteNonQuery ....................................... 81 Recuperar un conjunto de registros con Datareader ...................................................................................... 82 Rellenar un datagrid con Adaptador sin asistente.......................................................................................... 83 Form_cliente_detalle_pedidos....................................................................................................................... 86 Datagrid........................................................................................................................................................ 87 Cmo saber en que celda de un Datagrid se pulsa......................................................................................... 87 Cmo referenciar una celda de un Datagrid .................................................................................................. 88 Mantenimiento de una tabla en un nico Form ............................................................................................. 89 Tabla de Artculos: Seleccionar celdas de una fila ....................................................................................... 89 Datagrid con Tabla de memoria .................................................................................................................... 90 DataGrid con Manejador ............................................................................................................................... 93 Ejemplo 1....................................................................................................................................................... 93 Ejemplo 2....................................................................................................................................................... 99 Configurar el adaptador al aadir un campo nuevo a la tabla...................................................................... 106 Datagrid con CheckBox............................................................................................................................... 111 Funcin Format()....................................................................................................................................... 115 Formato de fechas........................................................................................................................................ 115 Formato de numeros .................................................................................................................................... 117 Funciones matemticas ............................................................................................................................. 118 Bucles.......................................................................................................................................................... 121 Select Case.................................................................................................................................................. 122 Tabla de estilos........................................................................................................................................... 123 Ejemplo 1 .................................................................................................................................................... 123 Tratamiento de fechas............................................................................................................................... 125 Funcin DateAdd......................................................................................................................................... 125 Funcin DateDiff......................................................................................................................................... 128 Formatear fechas ......................................................................................................................................... 131 Control de pago.......................................................................................................................................... 132 Forzar la recuperacion de un campo ....................................................................................................... 133 Ejecutar aplicacion.................................................................................................................................... 135 Consola MS-DOS........................................................................................................................................ 137 Leer un documento word desde vb.Net ................................................................................................... 139

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 2 de 164

29 30 30.1 30.2 30.3 30.3.1 30.3.2 30.3.3 30.4 30.5 30.6 31

Enviar Mail desde VB.Net ........................................................................................................................ 147 Crystal Report ........................................................................................................................................... 150 Insertar Lnea en blanco como separador en un report ................................................................................ 150 Otra forma de insertar lnea en blanco......................................................................................................... 154 Definir la orientacin de la Pgina Horizontal o vertical ............................................................................ 155 Impresora .................................................................................................................................................... 155 Papel............................................................................................................................................................ 155 Orientacin.................................................................................................................................................. 155 Explorador de Campos ................................................................................................................................ 157 Ajustar las lineas para un campo de mltiples Lineas de Informacin........................................................ 158 Pasar parametro desde vb.net a Report........................................................................................................ 160 Direcciones tiles Visual Studio .NET ..................................................................................................... 162

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 3 de 164

1 Propiedades de un proyecto

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 4 de 164

2 Evitar multiples instancias de una aplicacion .Net


Option Explicit On Imports System Imports System.ComponentModel Imports System.Diagnostics Module M_Inicio Public Forms As M_FormCollection Private oFormPrincipal As F_Logon Public ReadOnly Property FormPrincipal() As F_Logon Get Return oFormPrincipal End Get End Property Public Sub Main() Forms = New M_FormCollection '-------------------------------------'obtener el nombre de este proceso '-------------------------------------Dim EsteProceso As Process = Process.GetCurrentProcess() Dim w_Este_Proceso As String w_Este_Proceso = EsteProceso.ToString 'MsgBox(w_Este_Proceso) '-------------------------------------'examinar la coleccion de procesos '-------------------------------------Dim w_proceso As Process Dim w_nombre As String Dim w_conta As Integer For Each w_proceso In Process.GetProcesses w_nombre = w_proceso.ToString If w_nombre = w_Este_Proceso Then w_conta += 1 End If 'MsgBox(w_nombre) 'MsgBox(w_proceso.ToString) Next '----------------------------------------------------------'si solo hay una, es porque es que solo esta este proceso '----------------------------------------------------------If w_conta = 1 Then 'solo esta el proceso actual '-----------------------------------------'Ejecutamos nuestra aplicacin '-----------------------------------------'Control de acceso a la aplicacion '---------------------------------Forms = New M_FormCollection oFormPrincipal = New F_Logon Application.Run(oFormPrincipal) '-----------------------------------------'logon termina con END 'o configurando el form MDI ' aqui le corremos como form principal '-----------------------------------------'la aplicacion propiamente dicha '---------------------------------Application.Run(o_F_MDI)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 5 de 164

'-----------------------------------------'Application.Run(o_F_acceso) 'Application.Run(New F_Logon) ' otra forma de abrirla '-----------------------------------------Else '-----------------------------'Error: Ya hay otrqa instancia '-----------------------------MsgBox("Ya se encuentra en ejecucin " _ & "otra instancia de esta aplicacion" _ , MsgBoxStyle.Exclamation, _ "Abriendo Aplicacin TER ...") End If End Sub End Module

Prevent Multiple Instances of a .NET Windows Application

This tip describes how to avoid loading a second instance of an application when the user already has one instance running. It also sets the focus to the first instance of the .NET Windows application when you attempt to start a second instance of the same application. This code is applicable to the .NET 1.0 and 1.1 Framework applications (Visual Studio.NET 2002 uses .NET 1.0 framework and Visual Studio.NET 2003 uses .NET 1.1 Framework).
''Add this code in the form_load event.. (the form which loaded and shown as the first form) ''This works well with an MDI form or a non-MDI form Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurre ntProcess.ProcessName)) > 0 Then ''Send opening form's TEXT property as a parameter to the function "ActivatePrevInstance" ''This works well with an MDI form or a non-MDI form ''It is advised that you give a Unique name to your Form so that it doe not conflict with other applications ActivatePrevInstance(TEXT_PROPERTY_OF_OPENING_FORM) End If End Sub ---------------------------------------------Add these following declarations in the form code or in a COMMON module if you have one. ''Declarations of Windows API functions Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Sub ActivatePrevInstance(ByVal argStrAppToFind As String) Dim PrevHndl As Long Dim result As Long

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 6 de 164

Dim objProcess As New Process 'Variable to hold individual Process Dim objProcesses() As Process 'Collection of all the Processes running on local machine objProcesses = Process.GetProcesses() ''Get all processes into the collection For Each objProcess In objProcesses ''Check and exit if we have SMS running already If UCase(objProcess.MainWindowTitle) = UCase(argStrAppToFind)

Then

MsgBox("Another instance of " & argStrAppToFind & " is already running on this machine. You cannot run TWO instances at a time. Please use the other instance.") PrevHndl = objProcess.MainWindowHandle.ToInt32() Exit For End If Next If PrevHndl = 0 Then Exit Sub 'if No previous instance found exit the application. ''If found result = OpenIcon(PrevHndl) 'Restore the program. result = SetForegroundWindow(PrevHndl) 'Activate the application. End Sub End 'End the current instance of the application.

As a result of this code, the first instance of the program is given focus and the second instance is closed. If the first instance of the application was minimized, it will be restored to a normal window automatically. Though this code is written in VB.NET, it can easily be converted into C# or JScript easily on similar grounds. Raj Chidipudi

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 7 de 164

3 Carpetas especiales

Private Sub lstFolders_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstFolders.SelectedIndexChanged Dim sf As Environment.SpecialFolder ' GetSpecialFolderFromList is a method ' in the hidden "Enum Handling" region ' above. It returns a member of the ' Environment.SpecialFolder enumeration, ' and is specific to this demonstration. sf = GetSpecialFolderFromList() ' GetFolderPath is a method provided by ' the System.Environment namespace. ' Specifically, you could call the GetFolderPath ' method like this: ' YourPath = GetFolderPath(SpecialFolder.Favorites) ' GetFolderPath is actually System.Environment.GetFolderPath. ' See the Imports statement at the top of this file. lblSpecialFolder.Text = GetFolderPath(sf) End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 8 de 164

4 Variables del entorno

Private Sub F_New_Version_Load( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load '----------------------------------------'incluir el form en la coleccion de forms 'posicionar el form '----------------------------------------Call Abrir_Form(Me) Call cargar_datos_Proceso() 'determinar directorio de Local de APlicaciones Dim w_path_carpeta As String Call Determinar_path_LocalApplicationData(w_path_carpeta) Me.T_Path_File_param.Text = w_path_carpeta 'cargar nombre del exe que se esta ejecutando Me.T_Path.Text = Environment.CommandLine 'cargar valor de la version Me.T_Version.Text = vg_ver_app If vg_usuario_admin = "jmpeco" Then Me.Bot_refrescar.Enabled = True Me.Height = 368 Else Me.Bot_refrescar.Enabled = False Me.Height = 200 End If End Sub

Public Sub Determinar_path_LocalApplicationData( _ ByRef p_folder As String) Dim sf As Environment.SpecialFolder

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 9 de 164

'------------------------------------------------------------'recuperar el indice dentro de la lista de carpetas especiales '------------------------------------------------------------' GetSpecialFolderFromList is a method ' in the hidden "Enum Handling" region ' above. It returns a member of the ' Environment.SpecialFolder enumeration, ' and is specific to this demonstration. sf = GetSpecialFolderFromList("LocalApplicationData") '------------------------------------------------------------'recuperar el valor asociado al indice '------------------------------------------------------------' GetFolderPath is a method provided by ' the System.Environment namespace. ' Specifically, you could call the GetFolderPath ' method like this: ' YourPath = GetFolderPath(SpecialFolder.Favorites) ' GetFolderPath is actually System.Environment.GetFolderPath. ' See the Imports statement at the top of this file. ' -------------------------'======>> Imports System.Environment ' -------------------------p_folder = GetFolderPath(sf) End Sub

Private Function GetSpecialFolderFromList( _ ByVal p_carpeta As String) _ As Environment.SpecialFolder ' lstFolders.SelectedItem returns the name of the ' special folder. System.Enum.Parse will turn that ' into an object corresponding to the enumerated value ' matching the specific text. CType then converts the ' object into an Environment.SpecialFolder object. ' This is all required because Option Strict is on. Return CType( _ System.Enum.Parse(GetType(Environment.SpecialFolder), _ p_carpeta), _ Environment.SpecialFolder) End Function

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 10 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 11 de 164

5 Detectar la pulsacin de una tecla


Ahora tenemos que hacer ms cosas cuando se detecta la pulsacin de la tecla suprimir en el evento KeyDown, ya que tenemos que saber qu elementos estn seleccionados para poder borrarlos. Lo primero que tenemos que hacer es recorrer todos los elementos del ListBox para saber si est o no seleccionado, pero ese recorrido hay que hacerlo desde atrs hacia adelante... por qu? porque si lo hiciramos desde el principio de la lista, al eliminar un elemento de dicha lista, el nmero de elementos variara y tendramos problemas cuando llegsemos al final, ya que no ser el mismo nmero de elementos despus de haber borrado alguno... mientras que al recorrer los elementos desde el final hacia adelante, no importar que borremos alguno del final, ya que el siguiente que comprobaremos estar ms al principio que el recin borrado y no tendremos problemas... s que no te has enterado, pero no importa, confa en mi, (que remedio te queda!), y ya tendrs tiempo de comprobarlo por tu cuenta. Veamos primero el cdigo que habra que usar y despus lo comento. Private Sub ListBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyDown If e.KeyCode = Keys.Delete Then ' Borrar las palabras seleccionadas del listbox Dim i As Integer ' With ListBox1 For i = .SelectedItems.Count - 1 To 0 Step -1 .Items.Remove(.SelectedItems.Item(i)) Next End With End If End Sub La parte del If e.KeyCode = Keys.Delete Then ya la vimos antes, aunque no te expliqu qu es lo que significa esto... bueno que es lo que significa si que te lo dije, lo que no te expliqu es porqu eso sirve para saber "qu es lo que significa". Slo decirte que IF... THEN... sirve para hacer comparaciones o para comprobar si una o ms cosas estn relacionadas de alguna forma, en este caso, queremos saber si el valor de e.KeyCode, que es la tecla que has pulsado, es igual a Keys.Delete, ste ltimo valor es un valor "predefinido" que representa a la tecla suprimir. Por tanto, si la tecla que hemos pulsado es igual a la tecla suprimir, entonces hacer lo que viene a continuacin... todo lo que viene a continuacin? NO, slo hasta que encontremos End If, pero de esto ya hablaremos en otra ocasin.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 12 de 164

6 Manejo de las solapas de un TabControl 6.1 Seleccionar una solapa determinada


Cualquiera de los dos mtodos usados a continuacin, en caso de error nos presenta la solapa donde se encuentra el campo y posiciona el cursor en el valor errneo
If Len(Me.editdni_cli.Text) > 15 Then MsgBox("El DNI/NIF/CIF " _ & "No puede ser mas largo de 15 caracteres" _ , MsgBoxStyle.Information, Me.Text) Me.TabControl1.SelectedIndex = 0 Me.editdni_cli.Focus() Exit Sub End If If Len(Me.editcop_cli.Text) > 5 Then MsgBox("El Codigo Postal " _ & "No puede ser mas largo de 5 digitos" _ , MsgBoxStyle.Information, Me.Text) Me.TabControl1.SelectedTab = Me.TabControl1.TabPages(0) Me.editcop_cli.Focus() Exit Sub End If

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 13 de 164

7 Structure
Structure (Instruccin) Vea tambin Dim (Instruccin) | Implements (Instruccin) | Event (Instruccin) | Property (Instruccin) Se utiliza en el nivel de mdulo o clase para declarar una estructura y definir las caractersticas de sus miembros. [ <attrlist> ] [{ Public | Protected | Friend | Protected Friend | Private }] [ Shadows ] Structure name [ Implements interfacenames ] variabledeclarations [ proceduredeclarations ] End Structure Partes attrlist Opcional. Lista de atributos que se aplican a esta estructura. Los atributos mltiples se separan por comas. Public Opcional. Las estructuras declaradas con la palabra clave Public tienen acceso pblico. No hay restricciones para obtener acceso a las estructuras pblicas. Protected Opcional. Las estructuras declaradas mediante la palabra clave Protected tienen acceso protegido. Slo son accesibles desde su propia clase o desde una clase derivada. El acceso protegido slo se puede especificar en miembros de clases. No es un supraconjunto del acceso de tipo amigo. Friend Opcional. Las estructuras declaradas con la palabra clave Friend tienen acceso de tipo amigo. Son accesibles desde dentro de su contexto de declaracin y desde otra seccin del mismo programa. Protected Friend Opcional. Las estructuras declaradas mediante los modificadores Protected Friend tienen acceso combinado de tipo protegido y amigo. Puede utilizarlas el cdigo del mismo programa, as como el cdigo de clases derivadas. El acceso de tipo amigo slo se puede especificar en miembros de clases. Private Opcional. Las estructuras declaradas mediante el modificador Private tienen acceso de tipo privado. Slo son accesibles desde dentro del contexto de su declaracin, incluidos los miembros de cualquier tipo anidado como los procedimientos. Shadows Opcional. Indica que esta estructura sombrea un elemento de programacin denominado de forma idntica, o un conjunto de elementos sobrecargados, en una clase base. Puede hacer que cualquier tipo de elemento declarado prevalezca sobre cualquier otro tipo. Un elemento sombreado no est disponible desde la clase derivada que lo sombrea, a menos que el elemento que produce el sombreado no est accesible, por ejemplo, si es Private. name Requerido. Nombre de la estructura. Debe ser un identificador de Visual Basic vlido. Implements Opcional. Indica que esta estructura implementa los miembros de una o ms interfaces. interfacenames Es obligatorio si se utiliza la instruccin Implements. Nombres de las interfaces implementadas por esta estructura. Si utiliza la instruccin Implements, debe colocarla inmediatamente detrs de la instruccin Structure, y debe implementar cada miembro definido por cada interfaz que se especifique. variabledeclarations Requerido. Una o ms instrucciones Dim, Event, Friend, Private o Public declaran variables que declaran variables y eventos que sirven como miembros de datos de la estructura. Estas declaraciones siguen las mismas reglas que rigen fuera de una estructura. Tambin pueden definirse constantes y propiedades en la estructura, pero debe declararse por lo menos un evento o variable no compartido. proceduredeclarations Opcional. Cero o ms declaraciones de los procedimientos Function, Property o Sub que sirven como miembros del mtodo de la estructura. Estas declaraciones siguen las mismas reglas que rigen fuera de una estructura. Cada atributo de la parte attrlist tiene la siguiente sintaxis y partes: attrname [({ attrargs | attrinit })] Partes attrlist attrname Requerido. Nombre del atributo. Debe ser un identificador de Visual Basic vlido. attrargs

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 14 de 164

Opcional. Lista de argumentos por posicin de este atributo. Los argumentos mltiples se separan por comas. attrinit Opcional. Lista de inicializadores de campos o propiedades de este atributo. Los inicializadores mltiples se separan por comas. Comentarios La instruccin Structure slo puede aparecer en el nivel de mdulo, espacio de nombres o archivo. Esto es, puede declarar estructuras en un archivo de cdigo fuente o dentro de un mdulo, una interfaz o una clase, pero no dentro de un procedimiento. Tambin puede definirse una estructura dentro de otra, pero ello imposibilita el acceso a sus miembros a travs de la otra. En lugar de ello, debe declararse una variable del tipo de datos de la estructura interna. Se puede tener acceso a las estructuras desde cualquier lugar del mdulo o clase en que se declaran. De forma predeterminada una estructura es Friend. Para especificar la accesibilidad de manera ms detallada, incluya Public, Protected, Friend, Protected Friend o Private en la instruccin Structure. Debe declarar cada miembro de datos de una estructura. Esto significa que cada instruccin de la parte variabledeclarations debe contener Dim, Friend, Private o Public. Los miembros de una estructura no pueden ser Protected o Protected Friend porque no se puede heredar nada de una estructura. Sin embargo, la propia estructura puede ser Protected o Protected Friend. Si Option Strict es On, debe incluir tambin la clusula As en cada declaracin de miembro. Los miembros declarados con Dim tienen acceso de tipo Public de manera predeterminada, y los miembros declarados sin la clusula As utilizan de manera predeterminadas el tipo de datos Object. En una estructura debe declararse por lo menos un evento o variable no compartido. No pueden utilizarse nicamente constantes, propiedades y procedimientos, aunque algunos sean no compartidos. El mbito de todos los miembros de la estructura es la estructura completa. No se podr inicializar el valor de cualquier miembro de datos de una estructura como parte de su declaracin. Se debe inicializar un miembro de datos mediante un constructor parametrizado en la estructura o asignar un valor al miembro despus de crear una instancia de la estructura. Las estructuras admiten muchas de las mismas caractersticas como clases. Por ejemplo, las estructuras pueden tener propiedades y mtodos, pueden implementar interfaces y pueden tener constructores con parmetros. No obstante, existen diferencias de consideracin entre las estructuras y las clases en materias como la herencia, las declaraciones y la utilizacin. Ejemplo En este ejemplo se utiliza la instruccin Structure para definir un conjunto de datos relacionados de un empleado. Se muestra el uso de los miembros Public, Friend y Private para reflejar la confidencialidad de los elementos de datos. Tambin se muestran los miembros de evento, propiedad y procedimiento. Public Structure Employee ' Public members, accessible throughout declaration region. Public FirstName As String Public MiddleName As String Public LastName As String ' Friend members, accessible anywhere within the same program. Friend EmployeeNumber As Integer Friend WorkPhone As Long ' Private members, accessible only within the structure itself. Private HomePhone As Long Private Level As Integer Private Salary As Double Private Bonus As Double ' Procedure member, which can access structure's private members. Friend Sub CalculateBonus(ByVal Rate As Single) Bonus = Salary * CDbl(Rate) End Sub ' Property member to return employee's eligibility. Friend ReadOnly Property Eligible() As Boolean Get Return Level >= 25 End Get End Property ' Event member, raised when business phone number has changed. Public Event ChangedWorkPhone(ByVal NewPhone As Long) End Structure Vea tambin Dim (Instruccin) | Implements (Instruccin) | Event (Instruccin) | Property (Instruccin)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 15 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 16 de 164

8 Combobox 8.1 Estilo Single 8.2 Estilo DropDown 8.3 Estilo DropDownList

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 17 de 164

9 InputBox

Dim w_aux As Boolean = True Dim w_opcion As String While w_aux w_opcion = MsgBox("Poner Lapiz de Memoria en dispositivo " _ & vbCrLf _ & vbCrLf & "Pulse <SI> cuando est listo el dispositivo" _ & vbCrLf & " <NO> Para NO REALIZAR el backup" _ & vbCrLf & " <CANCEL> en cualquier otro caso" _ , MsgBoxStyle.Information + MsgBoxStyle.YesNoCancel _ , Me.Text) Select Case w_opcion Case MsgBoxResult.Yes Exit While Case MsgBoxResult.No MsgBox("BACKUP diario automtico: Abortado" _ , MsgBoxStyle.Exclamation, Me.Text) Exit Sub Case Else End Select End While

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 18 de 164

10 CheckedListBox

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 19 de 164

11 Control ToolTip
Este control sirve para mostrar entre otras cosas mensajes que pueden servir en los comienzos pero son innecesarios cuando se conoce ya la aplicacin. Para poder asociar un mensaje a un campo es preciso incluir previamente un tooltip de la barra de companentes.

A partir de ese momento ya se dispone de la propiedad ToolTip en ToolTip

selccionando todos los controles a los que quiero asignar un mismo mensaje, resulta

En tiempo de ejecucin resulta:

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 20 de 164

12

Barra de herramientas:

12.1 Cmo saber el nombre del botn pulsado


12.1.1 Usando el evento

Private Sub ToolBar1_ButtonClick( _ ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) _ Handles ToolBar1.ButtonClick '---------------------------------------'la siguiente opcion muestra: 'como recoger el texto del boton pulsado '---------------------------------------Dim w_boton As String Dim w_len As Integer w_boton = e.Button.ToString ' recoge --> ToolBarButton: Abrir, St... w_len = InStr(15, w_boton, ",") ' quitamos desde la coma en adelante If w_len = 0 Then Exit Sub w_boton = Trim(Mid(w_boton, 1, w_len - 1)) w_boton = Mid(w_boton, 16) ' nos quedamos solo con el texto del boton Dim o1 As Object 'Select Case ToolBar1.Buttons.IndexOf(e.Button) Select Case w_boton.ToLower Case "clte" '******************************* Call Me.M_manto_clientes_Click(o1, o1) Case "prov" Call Me.m_Manto_Proveedores_Click(o1, o1)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 21 de 164

'-------------------------------------------' En este ejemplo se usa el nombre del botn '-------------------------------------------If e.Button Is Me.clientes Then Call Me.M_manto_clientes_Click(o1, o1) End If

Y, usando Select sera:


'---------------------------------------'la siguiente opcion muestra: 'como recoger el nombre del boton pulsado '---------------------------------------Dim o2 As Object Select Case e.Button.ToString Case Me.Clientes.ToString Call Me.M_manto_clientes_Click(o2, o2) Case Me.Contrato.ToString Call Me.m_contrato_Click(o2, o2) End Select

12.1.2

Usando el nombre del remitente (sender)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 22 de 164

13 Forms 13.1 Coleccin de forms


'----------------------------------------'incluir el form en la coleccion de forms 'posicionar el form '----------------------------------------Call Abrir_Form(Me)

Public Sub Abrir_Form(ByRef p_form As Form) '---------------------------------------'incluir el form en la coleccion de forms '---------------------------------------Forms.Add(p_form) '---------------------------------------'Leer posicionamiento de la ultima vez '---------------------------------------Call leer_posicion_form(p_form) End Sub Module M_Inicio Public Forms As M_FormCollection . . . Public Sub Main() Forms = New M_FormCollection

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 23 de 164

13.2 Consultar coleccin de forms y controles en cada form

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 24 de 164

13.3 Commondialog
Buscar en Ayuda: CommonDialog (control) En esta seccin ColorDialog (Componente, formularios Windows Forms) Permite que el usuario seleccione un color de una paleta en un cuadro de dilogo preconfigurado y que agregue colores personalizados a la paleta. FolderBrowserDialog (Componente, formularios Windows Forms) Permite a los usuarios buscar y seleccionar carpetas. FontDialog (Componente, formularios Windows Forms) Expone las fuentes actualmente instaladas en el sistema. OpenFileDialog (Componente, formularios Windows Forms) Permite que los usuarios abran archivos mediante un cuadro de dilogo preconfigurado. PageSetupDialog (Componente, formularios Windows Forms) Establece los detalles de impresin de la pgina a travs de un cuadro de dilogo preconfigurado. PrintDialog (Componente, formularios Windows Forms) Selecciona una impresora, elige las pginas que se van a imprimir y determina otros valores de configuracin relacionados con la impresin. PrintPreviewDialog (Control, formularios Windows Forms) Muestra un documento tal como aparecer cuando se imprima. SaveFileDialog (Componente, formularios Windows Forms) Selecciona los archivos que se van a guardar y el lugar en el que se guardarn. Informacin adicional Cuadros de dilogo en formularios Windows Forms Describe cmo crear un cuadro de dilogo para un formulario Windows Forms. ColorDialog (Clase) Proporciona informacin de referencia acerca de la clase ColorDialog y sus miembros. FontDialog (Clase) Proporciona informacin de referencia acerca de la clase FontDialog y sus miembros. OpenFileDialog (Clase) Proporciona informacin de referencia acerca de la clase OpenFileDialog y sus miembros. PageSetupDialog (Clase) Proporciona informacin de referencia acerca de la clase PageSetupDialog y sus miembros. PrintDialog (Clase) Proporciona informacin de referencia acerca de la clase PrintDialog y sus miembros. PrintPreviewDialog (Clase) Proporciona informacin de referencia acerca de la clase PrintPreviewDialog y sus miembros. SaveFileDialog (Clase) Proporciona informacin de referencia acerca de la clase SaveFileDialog y sus miembros.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 25 de 164

13.3.1

Ejemplo de FolderDialog

Private Sub Bot_sel_dir_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Sel_dir.Click Dim folderBrowserDialog1 As New FolderBrowserDialog ' Establecer el texto en el area de Descripcion del dialogo Dim w_texto As String w_texto = "Directorio destino " folderBrowserDialog1.Description = _ "Seleccione el Directorio que desea " _ & "usar como " & w_texto & " por defecto..." ' Permitir que aparezca el boton Nueva carpeta folderBrowserDialog1.ShowNewFolderButton = True ' Raiz: POr defecto Mi Pc folderBrowserDialog1.RootFolder = _ Environment.SpecialFolder.MyComputer '''' Raiz: POr defecto Mis Documentos '''folderBrowserDialog1.RootFolder = _ ''' Environment.SpecialFolder.Personal Dim result As DialogResult = folderBrowserDialog1.ShowDialog() If (result = DialogResult.OK) Then Me.T_dir_destino.Text = folderBrowserDialog1.SelectedPath End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 26 de 164

13.3.2

Ejemplo de OpenFileDialog

Private Sub Bot_Sel_Origen_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Sel_Origen.Click Dim w_texto As String w_texto = "Seleccione el archivo Origen" Dim myStream As String Dim openFileDialog1 As New OpenFileDialog openFileDialog1.InitialDirectory = "c:\" openFileDialog1.Filter = "Ficheros ejecutables (*.exe)|*.exe|" _ & "Ficheros de DATOS de aplcacin (*.dat)|*.dat|" _ & "Ficheros Procesos por lotes (*.bat)|*.bat|" _ & "Ficheros del sistema (*.com)|*.com|" _ & "Administrador de ODBC (odbcad*.*)|odbcad*.*|" _ & "Todos los archivos (*.*)|*.*" openFileDialog1.FilterIndex = 1 openFileDialog1.Title = w_texto openFileDialog1.RestoreDirectory = True openFileDialog1.ShowReadOnly = True 'openFileDialog1.ShowDialog() Dim w_valor As String If openFileDialog1.ShowDialog() = DialogResult.OK Then w_valor = openFileDialog1.FileName Me.T_File_origen.Text = w_valor End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 27 de 164

13.3.3

Ejemplo de SaveFileDialog

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 28 de 164

13.3.4

Ejemplo de ColorDialog

Private Sub Bt_Color_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bt_Color.Click 'Ejemplo() de la ayuda Introduccion al commondialog 'En el siguiente ejemplo se utiliza la implementacin ColorDialog de CommonDialog y se indica cmo crear y mostrar un cuadro de dilogo. Este ejemplo supone que se llama al mtodo desde un formulario existente, en el cual se colocan un control TextBox y otro Button. Dim MyDialog As New ColorDialog '-------------------------------------' para permitir colores personalizados '-------------------------------------MyDialog.AllowFullOpen = True MyDialog.ShowHelp = True '-------------------------------------' establecer el color activo actual '-------------------------------------MyDialog.Color = Me.TN_ficha.ForeColor '-------------------------------------' Establecer el color seleccionado '-------------------------------------If (MyDialog.ShowDialog() = DialogResult.OK) Then Me.TN_ficha.BackColor = MyDialog.Color Me.LB_Ficha.BackColor = MyDialog.Color End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 29 de 164

13.3.5

Ejemplo de FontDialog

Private Sub btn_Fuente_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btn_fuente.Click Dim fontDialog1 As New FontDialog fontDialog1.ShowColor = True fontDialog1.Font = Me.TN_ficha.Font fontDialog1.Color = Me.TN_ficha.ForeColor Dim w_font_size As String If fontDialog1.ShowDialog() <> DialogResult.Cancel Then vg_fontSize = fontDialog1.Font.Size vg_fontName = fontDialog1.Font.Name vg_fontColor = fontDialog1.Color.Name vg_fontBold = fontDialog1.Font.Bold vg_fontItalic = fontDialog1.Font.Italic vg_fontStrikeOut = fontDialog1.Font.Strikeout If vg_debug Then Dim w_aux As String w_aux = "Fontsize : " & vg_fontSize & vbCrLf _ & "Fontname : " & vg_fontName & vbCrLf _ & "Fontcolor : " & vg_fontColor & vbCrLf _ & "FontBold : " & vg_fontBold & vbCrLf _ & "FontItalic : " & vg_fontItalic & vbCrLf _ & "Fontstrikeout : " & vg_fontStrikeOut MsgBox(w_aux) End If Me.LB_Ficha.Font = fontDialog1.Font Me.TN_ficha.Font = fontDialog1.Font Me.TN_ficha.ForeColor = fontDialog1.Color End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 30 de 164

13.4 Salvar en fichero atributos y recuperarles

13.4.1

Salvar Color y atributos del Font

Private Sub Btn_Salvar_color_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Btn_Salvar_color.Click Dim pp1, pp2(7), pp3(7) As String Try oCon_Nucleo.Open() pp1 = vg_usuario pp2(1) = "Color" pp3(1) = Me.TN_ficha.BackColor.ToString pp2(2) = "FontName" pp3(2) = vg_fontName pp2(3) = "Fontsize" pp3(3) = vg_fontSize pp2(4) = "FontColor" pp3(4) = vg_fontColor pp2(5) = "FontItalic" pp3(5) = vg_fontItalic pp2(6) = "Fontbold" pp3(6) = vg_fontBold pp2(7) = "FontStrike" pp3(7) = vg_fontStrikeOut Dim x As Integer For x = 1 To 7 '---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT count(*) " _ & " FROM Parm_user " _ & " WHERE t4_usuario = '" & vg_usuario & "'" _ & " AND t4_param = '" & pp2(x) & "'" Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) Dim w_sql As String If w_conta = 0 Then '------ Hay que dar de alta Dim w_insert As String w_insert = " INSERT INTO parm_user " _ & "(t4_usuario, t4_param, t4_valor) " _ & " VALUES " _ & "('" & pp1 & "','" & pp2(x) & "','" & pp3(x) _ & "')" w_sql = w_insert

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 31 de 164

'------------------- hay que modificar Dim w_update As String w_update = " UPDATE parm_user " _ & " SET t4_valor = '" & pp3(x) & "'" _ & " WHERE t4_usuario = '" & pp1 & "'" _ & " AND t4_param ='" & pp2(x) & "'" w_sql = w_update End If If vg_debug Then MsgBox(pp2(x) & vbCrLf & pp3(x) & vbCrLf & w_sql) End If Dim cmdsql As New OleDbCommand(w_sql, oCon_Nucleo) Dim w_reg As Integer w_reg = cmdsql.ExecuteNonQuery() Next MsgBox("Se ha salvado correctamente") Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try End Sub

Else

Este es el resultado:

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 32 de 164

13.4.2

Recuperar y asignar Color de fondo y atributos del font

Private Sub Ficha_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load '----------------------------------------'incluir el form en la coleccion de forms 'posicionar el form 'el contador le incrementa AppFicha '----------------------------------------Call Abrir_Form(Me) R00_Cargar_form() Me.T0_Usuario.Text = vg_usuario Me.T0_Password.Text = vg_password '-------------------------------'Examinar si hay definidas bases '-------------------------------If Me.Combo_DB.Items.Count = 0 Then MsgBox("Para poder abrir una BD de Fichas, antes debe crearla" _ & vbCrLf _ & "Use la opcion <Base Datos>--> <Nueva> " _ & "para crear una BD" _ , MsgBoxStyle.Exclamation) Exit Sub End If 'Me.ListBox_BD.Items.Clear() 'Dim x As Integer 'For x = 0 To Me.Combo_DB.Items.Count - 1 ' Me.ListBox_BD.Items.Add(Me.Combo_DB.Items(x)) 'Next '----------------------------'cargar el color personalizado '----------------------------Dim r, g, b As Integer Mod_Ficha.cargar_color_usuario(Me, r, g, b) Me.LB_Ficha.BackColor = Color.FromArgb(r, g, b) Me.TN_ficha.BackColor = Color.FromArgb(r, g, b) '---------------------------'cargar el font personalizado '---------------------------'Dim w_fontName As Font 'w_fontName = New Font Dim w_valor As String Call cargar_font_usuario(w_valor) 'w_fontName = w_valor 'Me.TN_ficha.Font = CType(w_valor, Font) 'Public vg_fontName As String 'Public vg_fontSize As String 'Public vg_fontColor As String 'Public vg_fontItalic As Boolean 'Public vg_fontBold As Boolean 'Public vg_fontStrikeOut As Boolean Dim w_size As Integer w_size = Val(vg_fontSize) If w_size < 8 Then w_size = 8 'If vg_fontcolor = True Then w_estilo = FontStyle. Dim w_estilo As FontStyle

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 33 de 164

If vg_fontBold = True Then w_estilo = FontStyle.Bold If vg_fontItalic = True Then w_estilo = FontStyle.Italic If vg_fontStrikeOut = True Then w_estilo = FontStyle.Strikeout Dim font As System.Drawing.Font If vg_fontName = Nothing Then vg_fontName = "Courier New" w_size = 10 w_estilo = FontStyle.Regular End If font = New System.Drawing.Font(vg_fontName, _ w_size, _ w_estilo) Me.TN_ficha.Font = font Me.LB_Ficha.Font = font '-----------------------------------'Pintar linea Roja '-----------------------------------' se pinta sola con el metodo paint ' el degradado del fondo tambien se repinta solo '-----------------------------------'colocar panel de utilidades '-----------------------------------Me.Pan_nota_uti.Top = Me.Pan_color_font.Top Me.Pan_nota_uti.Left = Me.Pan_color_font.Left Me.Pan_color_font.Visible = False Me.Pan_nota_uti.Visible = True Me.Pan_Objeto_nuevo.Visible = False Me.bt_Fijar.Enabled = False '-----------------------------------'activar solapas en funcion del usuario '-----------------------------------If Me.T0_Usuario.Text = vg_usuario_admin Then Me.Tab_ficha.TabPages(5).Visible = True Else Me.Tab_ficha.TabPages(5).Visible = False End If End Sub

Public Sub cargar_color_usuario(ByVal p_form As Form, _ ByRef r As Integer, _ ByRef g As Integer, _ ByRef b As Integer) Try '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT t4_valor " _ & " FROM Parm_user " _ & " WHERE t4_usuario = '" & vg_usuario & "'" _ & " AND t4_param = 'Color'" oCon_Nucleo.Open() Dim ColorCMD As OleDbCommand ColorCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_color As String w_color = ColorCMD.ExecuteScalar()

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 34 de 164

If w_color = Nothing Then w_color = "Color [A=255, R=249, G=253, B=176]" End If 'Color [A=255, R=128, G=255, B=255] Dim w_pos_ini, w_pos_fin As Integer Dim Rs, Gs, Bs As Integer w_pos_ini = InStr(1, w_color, "R=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Rs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini r = Val(Rs) w_pos_ini = InStr(1, w_color, "G=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Gs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini g = Val(Gs) w_pos_ini = InStr(1, w_color, "B=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Bs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini b = Val(Bs)

",") 2) ",") 2) "]") 2)

Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try End Sub

Public Sub cargar_font_usuario(ByRef p_fontName As String) Dim pp2(7), pp3(7) As String pp2(1) pp2(2) pp2(3) pp2(4) pp2(5) pp2(6) pp2(7) = = = = = = = "Color" "FontName" "Fontsize" "FontColor" "FontItalic" "Fontbold" "FontStrike"

Try '---------------------------------------------'Establecer la conexion con la BD del nucleo '---------------------------------------------oCon_Nucleo.Open() Dim x As Integer For x = 1 To 7 '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT t4_valor " _ & " FROM Parm_user " _ & " WHERE t4_usuario = '" & vg_usuario & "'" _

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 35 de 164

& "

AND t4_param = '" & pp2(x) & "'"

Dim fontNameCMD As OleDbCommand fontNameCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_fontName As String pp3(x) = fontNameCMD.ExecuteScalar() 'lucida Consola p_fontName = w_fontName Next For x = 2 To 7 Select Case x Case 2 ' "FontName" vg_fontName = pp3(x) Case 3 ' "Fontsize" vg_fontSize = pp3(x) Case 4 ' "FontColor" If pp3(x) = "True" Then vg_fontColor = True Else vg_fontColor = False End If Case 5 ' "FontItalic" If pp3(x) = "True" Then vg_fontItalic = True Else vg_fontItalic = False End If Case 6 ' "Fontbold" If pp3(x) = "True" Then vg_fontBold = True Else vg_fontBold = False End If Case 7 ' "FontStrike" If pp3(x) = "True" Then vg_fontStrikeOut = True Else vg_fontStrikeOut = False End If End Select Next Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 36 de 164

End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 37 de 164

13.5 Repintar fondo cuando se cambia el tamao


Private Sub AppFicha_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, _ New PaintEventArgs(Me.ctlMDI.CreateGraphics, _ New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub

Private Sub PintarFondo(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Dim w_color1, w_color2 As Color If Me.m_color_fondo.Checked Then w_color1 = Color.Blue w_color2 = Color.Black Else w_color1 = Color.Gray w_color2 = Color.Beige End If If ctlMDI.Width = 0 _ Or ctlMDI.Height = 0 Then Exit Sub End If Dim GradientePanel As _ New LinearGradientBrush( _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height), _ w_color1, _ w_color2, _ LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height)) End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 38 de 164

13.6 Dibujar lnea roja


Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) 'If vg_debug Then 'libro:Manual Avanzado de Jorge Serrano Perez 'capitulo 2 --> ejemplo 4 Call pintar_fondo_ficha() 'End If '-----------------------------------'DIBUJAR LINEA ROJA '-----------------------------------'libro:Manual Avanzado de Jorge Serrano Perez 'capitulo 2 --> ejemplo 1 y 2 'Dim Grafico As System.Drawing.Graphics Dim Grafico As Graphics = e.Graphics Dim Lapiz As New Pen(Color.Red, 3) Dim X1, Y1, X2, Y2 As Integer X1 = Me.Tab_ficha.Left Y1 = Me.Tab_ficha.Top - 2 X2 = Me.Tab_ficha.Width + Me.Tab_ficha.Left Y2 = Me.Tab_ficha.Top - 2 Grafico.DrawLine(Lapiz, X1, Y1, X2, Y2) End Sub Private Sub pintar_fondo_ficha() 'Gradiente Diagonal hacia atrs 'Dim Forma As New Rectangle(New Point(0, 0), Me.ClientSize) Dim Forma As Rectangle Dim x0, y0 As Integer x0 = 0 y0 = Me.Tab_ficha.Top Forma = New Rectangle(New Point(x0, y0), Me.ClientSize) Dim Gradiente As New Drawing2D.LinearGradientBrush _ (Forma, _ Color.Beige, _ Color.Black, _ Drawing.Drawing2D.LinearGradientMode.BackwardDiagonal) '--------------'Color..White, _ 'Color.Black, _ '--------------'Color.Yellow, _ 'Color.YellowGreen, _ 'Drawing.Drawing2D.LinearGradientMode.BackwardDiagonal) Me.CreateGraphics.FillRectangle(Gradiente, Forma) End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 39 de 164

14 Form MDI 14.1 Problema con las llamadas entre forms


Planteamiento inicial: Bsicamente hay 3 forms Un form MDI Un form (que denomino PADRE) y que es llamado desde el MDI Otro form (Que aunque es hermano del anterior le llamo HIJO) es llamado al pulsar un botn situado en el form PADRE Form_MDI Tiene un men desde el que llama al form_Padre mediante la siguiente opcin de l men: Private Sub MenuItem1_Click(..) Dim obj_form_padre As New Form_Padre obj_form_padre.MdiParent = Me obj_form_padre.Show() end sub Form_Padre Tiene un botn desde el que llama al form_hijo Adems tiene un contador (por simplificar el problema) de una variable que debe pasar al hijo para visualizarla cuando se pulse el botn1 Private Sub Button1_Click() Dim obj_form_hijo As New form_Hijo obj_form_hijo.MdiParent = Me.MdiParent obj_form_hijo.Show() obj_form_hijo.TextBox1.Text = w_contador End Sub Form_hijo Tiene una ventana que muestra el valor del contador pasado por el Form_Padre Private Sub Button1_Click() Me.Close() End Sub Problema: Si desde el form_MDI abrimos form_Padre incrementamos el contador asignando en el textbox un valor y pulsamos en el botn de abrir hijo, se abre el form_hijo y muestra el valor pasado Si desde el form_Padre pulsamos de nuevo sobre el botn de abrir hijo, se crea una nueva instancia de form_hijo, no siendo eso lo que se desea, se desea que sea sobre el mismo objeto form_hijo que ya existe. Solucin a este problema: Definimos el objeto a nivel de form en el form_padre, y realmente funciona Public Class Form_Padre . . . Dim obj_form_hijo As New form_Hijo Private Sub Button1_Click() <<<< Dim obj_form_hijo As New form_Hijo obj_form_hijo.MdiParent = Me.MdiParent obj_form_hijo.Show() obj_form_hijo.TextBox1.Text = w_contador End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 40 de 164

Con lo cual, el problema aparentemente queda solucionado, pero si se cierra el form_padre (manteniendo abierto el form_hijo) y se vuelve a abrir el form_padre, al pulsar sobre el botn de abrir el form_hijo se abre una nueva instancia del form_hijo con lo cual tendramos dos instancias del mismo objeto form_hijo Solucin: Definir el objeto form_hijo a nivel de mdulo y ciertamente el problema queda resuelto, Pero si se cierra el form_hijo y se vuelve a invocar, se genera un error de system.objectdisposedException en system.windows.forms.dll

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 41 de 164

14.2 Patrn Singleton con formularios MDI


En das anteriores estaba creando una aplicacin en la cual requera crear una sola instancia de los formularios hijos de una MDI padre. Buscando en la documentacin de Microsoft encontr este patrn llamado Singleton. Ac les muestro una sencilla implementacin en formularios MDI para tener solamente una instancia abierta por formulario. Lo primero que hay que hacer es modificar el constructor del formulario hijo, o sea, el formulario que queremos que solo tenga una instancia en la aplicacin. Este constructor inicialmente aparece como publico (public). Lo modificaremos y lo haremos privado (private) para evitar llamados a este formulario.
#Region " Windows Form Designer generated code " ' En esta constructora es que cambio la propiedad Public por la propiedad Private Private Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub

Luego lo que haremos ser crear una variable global en este mismo formulario hijo para que controle la instancia y la haremos shared para que pueda ser accesada desde el formulario padre.
'Variable pblica. Private Shared ChildInstance As frmChild = Nothing

Finalmente crearemos una funcin shared que ser la que finalmente controlara la creacin o manejo de la instancia del formulario, logrando obtener solo un formulario abierto para este frmChild.
'controla que slo exista una instancia del formulario. Public Shared Function Instance() As frmChild If ChildInstance Is Nothing OrElse ChildInstance.IsDisposed = True Then ChildInstance = New frmChild End If ChildInstance.BringToFront() Return ChildInstance End Function

Ahora en el formulario padre escribiremos el llamado al formulario hijo para crear una instancia, o si ya esta creada, entonces pondr el formulario hijo en frente para que lo podamos ver.

dim frmChildInstance as frmChild = frmChildInstance.Instance frmChildInstance.MdiParent = me frmChildInstance.Show Espero que les parezca fcil y es de mucha ayuda. Origen: Web El Guille, Fecha: 30 de junio de 2004 Autor: Camilo Andrs Jaramillo lvarez - caja911@yahoo.com

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 42 de 164

14.3 Invocar un Form Hijo


En el form hijo, suponiendo que pertenezca a la clase F_Contrato, hay que definir :
#Region "EstaCargado e Instancia" ' Aadimos las propiedades EstaCargado e Instancia Public Shared ReadOnly Property EstaCargado() Get Return Not mInstancia Is Nothing AndAlso Not mInstancia.IsDisposed End Get End Property Private Shared mInstancia As F_Contrato Public Shared ReadOnly Property Instancia() As F_Contrato Get If Not EstaCargado Then mInstancia = New F_Contrato mInstancia.MdiParent = o_F_MDI End If Return mInstancia End Get End Property #End Region

En el form llamante hay que definir el siguiente procedimiento


Private Sub grdContrato_Click( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles grdContrato.DoubleClick If F_Contrato.EstaCargado Then F_Contrato.Instancia.Activate() Else F_Contrato.Instancia.Show() End If F_Contrato.Instancia.MdiParent = o_F_MDI F_Contrato.Instancia.T_Id_buscado.Text _ = Me.grdContrato.Item(Me.grdContrato.CurrentRowIndex, 0) F_Contrato.Instancia.btn_Buscar_ID_Click(sender, e) End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 43 de 164

14.4 Color de fondo en un formulario MDI

Option Explicit On Imports System.Data Imports System.Data.OleDb Imports Imports Imports Imports System.MarshalByRefObject System.Drawing.Drawing2D.LinearGradientBrush System.Drawing.Brush System.Drawing.Drawing2D

Public Class AppFicha Inherits System.Windows.Forms.Form '----------------------------------'cambiar color de fondo del form MDI '----------------------------------'necesitamos esta variable global Dim ctlMDI As MdiClient

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 44 de 164

Private Sub M_color_fondo_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles M_color_fondo.Click Dim color1 As Color Dim w_valor_parm As String If M_color_fondo.Checked Then Me.M_color_fondo.Checked = False color1 = Color.Gray w_valor_parm = "NO" Else Me.M_color_fondo.Checked = True color1 = Color.AntiqueWhite w_valor_parm = "SI" End If Call pintar_fondo(color1) Dim o As Object Call Me.F_MDI_Resize(o, o) End Sub Private Sub pintar_fondo(ByVal color1 As Color) 'necesitamos est variable global Dim ctlMDI As MdiClient Dim ctl As Control 'Estamos buscando en control que 'representa el area cliente MDI For Each ctl In Me.Controls Try Select Case ctl.Name Case "STatusBar1" Case Else ctlMDI = CType(ctl, MdiClient) ' Asignamos el color de fondo ctlMDI.BackColor = Color.AntiqueWhite 'Aqu asignamos el manejador para pintar 'el fondo con degradados o lo que queramos. 'Si solo queremos cambiar el color de fondo 'no hace falta, 'ni las funciones siguientes tampoco AddHandler ctlMDI.Paint, AddressOf PintarFondo End Select Catch ex As InvalidCastException MsgBox("Error: " _ & Err.Number _ & " - " & ex.Message _ & vbCrLf & ctl.Name) End Try Next End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 45 de 164

Private Sub AppFicha_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, _ New PaintEventArgs(Me.ctlMDI.CreateGraphics, _ New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub

Private Sub PintarFondo(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Dim w_color1, w_color2 As Color If Me.m_color_fondo.Checked Then w_color1 = Color.Blue w_color2 = Color.Black Else w_color1 = Color.Gray w_color2 = Color.Beige End If If ctlMDI.Width = 0 _ Or ctlMDI.Height = 0 Then Exit Sub End If Dim GradientePanel As _ New LinearGradientBrush( _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height), _ w_color1, _ w_color2, _ LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height)) End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 46 de 164

Y pintar en el

rea cliente MDI

Ref: El guille : Color de fondo en un formulario MDI Y pintar en el rea cliente MDI Fecha: 04/03/2004 (06/Mar/2004) Autor: Jos Ramn Pastor Compa jrpc@ono.com Cuando empec con Visual Basic 6, siempre tenia la mana de cambiar el color de fondo de los formularios MDI y cuando ya sabia algo mas, les dibujaba degradados al estilo de los programas de instalacin. Cuando empec con VB .NET me di cuenta de que el color de fondo de un formulario no se puede cambiar, siempre apareca ese color "tosco" que no me gusta nada, as que investigando encontr un artculo en Microsoft que explicaba como cambiar el color de fondo. Yo lo he mejorado un poco y adems de cambiar el color, creo degradados de fondo en el rea cliente MDI. Para cambiar el color de fondo de un MDI aade el siguiente cdigo en el evento load del formulario: Nota: Necesitamos la variable global ctlMDI
Dim ctlMDI as MdiClient Private Sub TfrmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ctl As Control 'Estamos buscando en control que representa el area cliente MDI For Each ctl In Me.Controls Try ctlMDI = CType(ctl, MdiClient) ' Asignamos el color de fondo ctlMDI.BackColor = Color.AntiqueWhite 'Aqu asignamos el manejador para pintar el fondo con degradados o lo que 'queramos. Si solo queremos cambiar el color de fondo no hace falta, ni las funciones siguientes tampoco AddHandler ctlMDI.Paint, AddressOf PintarFondo Catch ex As InvalidCastException End Try Next End Sub

Vale, ahora necesitamos la funcin que pinta el fondo del area cliente:
Private Sub PintarFondo(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Dim GradientePanel As New LinearGradientBrush(New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height), Color.Blue, Color.Black,LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height)) End Sub

Por ltimo, es conveniente capturar el evento Resize del formulario.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 47 de 164

Esto es as porque me he dado cuenta de que cuando se redimensiona el formulario no se pinta bien el degradado, as que si "capturamos" el evento y forzamos a que se repinte, todo ir bien. Este es el cdigo.
Private Sub TfrmMain_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, New PaintEventArgs(Me.ctlMDI.CreateGraphics, New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 48 de 164

15 Asistente form de datos


Cuando se elige el asistente para generar un form de datos, este genera automticamente una serie de mtodos o procedimientos de forma automtica. En este apartado vamos a hacer hincapi en los puntos que se pueden modificar sin tocar para nada los mtodos y propiedades generados por el asistente:

15.1 Cadena de conexin:


El asistente por defecto ha generado una cadena de conexin en base a los parmetros que nosotros hemos definido al asistente. En tiempo de ejecucin, si queremos cambiar los valores de direccionamientos, nombre, etc. De la cadena de conexin, haremos: #Region "Eventos propios del form" Private Sub F_Parametros_Loc_Load( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load Me.OleDbConnection1.ConnectionString = vg_cad_Nucleo

Donde la variable vg_cad_Nucleo hace referencia a la Variable Global Cadena de Conexin de la Base de datos '------------------------------------------------'generar la cadena de conexion con el nucleo local '------------------------------------------------vg_cad_Nucleo = "provider=microsoft.jet.oledb.4.0.;" _ & "data source=" & vg_PBD_nucleo Debug.WriteLine(vg_PBD_nucleo) Donde la variable vg_PBD_Nucleo hace referencia a la Variable Global Path de la Base de datos del ncleo Dim Base_jmp_ref As String Base_jmp_ref = w_dir_win & "\" & w_base_local '-------------------------------------------'validar que existe la BD local '-------------------------------------------If Dir(Base_jmp_ref) = "" Then MsgBox("E0100: No Existe el Nucleo especificado" _ & vbCr & " ejecute el SETUP" _ , MsgBoxStyle.Exclamation) Exit Sub Else vg_PBD_nucleo = Base_jmp_ref End If

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 49 de 164

15.2 Modificar la select generada por el asistente


A veces, puede ser interesante y necesario poder cambiar la select generada por el asistente automticamente.

En este caso, asignamos la select que generemos al comando select


Private Sub Bot_Buscar_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Buscar.Click, _ Bot_Ir_A.Click Dim w_select As String Dim w_where As String Select Case sender.name Case "Bot_Ir_A" w_where = " Where Parm_id =" & Me.T_Ir_a.Text & " " Case "Bot_Buscar" w_where = _ " Where parm_descripcion like '%" & Me.T_Buscar.Text & "%' " _ & " or parm_valor like '%" & Me.T_Buscar.Text & "%' " End Select If Trim(Me.T_Ir_a.Text) = "" _ And sender.name = "Bot_Ir_A" Then w_where = "" End If If Trim(Me.T_Buscar.Text) = "" _ And sender.name = "Bot_Buscar" Then w_where = "" End If w_select = & & & "SELECT * " _ " FROM ParmApp " _ w_where _ " Order by parm_id"

Me.OleDbSelectCommand1.CommandText = w_select Call btnLoad_Click(sender, e) Me.t_num_reg.Text = Me.objDS_Parametros_App.Tables("ParmApp").Rows.Count End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 50 de 164

15.3 Cmo rellena el asistente un DataGrid de datos


Una vez que hemos cargado el comando Select, para ejecutarle invocamos el mtodo : BtnLoad, es decir, hacemos como si pulsramos el botn Load. Me.OleDbSelectCommand1.CommandText = w_select Call btnLoad_Click(sender, e)
Private Sub btnLoad_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btnLoad.Click Try 'Intente cargar el conjunto de datos. Me.LoadDataSet() Catch eLoad As System.Exception 'Agregar aqu el cdigo de control de errores. 'Mostrar mensaje de error, si hay alguno. System.Windows.Forms.MessageBox.Show(eLoad.Message) End Try End Sub

Este mtodo simplemente se limita a Invocar al mtodo LoadDataSet para Cargar el dataset
Public Sub LoadDataSet() 'Crear un conjunto de datos para alojar los registros 'devueltos de la llamada a FillDataSet. 'Se utiliza un conjunto de datos temporal porque 'el relleno del conjunto de datos existente 'requerira que se volvieran a enlazar los enlaces de datos. Dim objDataSetTemp As MJmpBase.DS_Parametros_App objDataSetTemp = New MJmpBase.DS_Parametros_App Try 'Intente rellenar el conjunto de datos temporal. Me.FillDataSet(objDataSetTemp) Catch eFillDataSet As System.Exception 'Agregar aqu el cdigo de control de errores. Throw eFillDataSet End Try Try grdParmApp.DataSource = Nothing 'Vaciar los registros obsoletos del conjunto de datos. objDS_Parametros_App.Clear() 'Combinar los registros en el conjunto de datos principal. objDS_Parametros_App.Merge(objDataSetTemp) grdParmApp.SetDataBinding(objDS_Parametros_App, "ParmApp") Me.t_num_reg.Text = Me.objDS_Parametros_App.Tables("ParmApp").Rows.Count Catch eLoadMerge As System.Exception 'Agregar aqu el cdigo de control de errores. Throw eLoadMerge End Try End Sub

El asistente, en cualquier caso da toda la informacin que se muestra en el cdigo mostrado. l se limita a generar un fichero temporal, por si algo esta mal, que no se borren los datos que contiene actualmente el DataGrid Una vez relleno de acuerdo con la nueva select, borra los datos del Dataset que ya estaba asociado anteriormente al datagrid, y mezcla su contenido con el temporal nuevo.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 51 de 164

Public Sub FillDataSet(ByVal dataSet As MJmpBase.DS_Parametros_App) 'Desactive la comprobacin de restricciones 'antes de rellenar el conjunto de datos. 'De esta forma los adaptadores pueden rellenar 'el conjunto de datos sin preocuparse 'de las dependencias entre las tablas. dataSet.EnforceConstraints = False Try 'Abra la conexin. Me.OleDbConnection1.Open() 'Intente rellenar el conjunto de datos a travs de OleDbDataAdapter1. Me.OleDbDataAdapter1.Fill(dataSet) Catch fillException As System.Exception 'Agregar aqu el cdigo de control de errores. Throw fillException Finally 'Volver a activar la comprobacin de restricciones. dataSet.EnforceConstraints = True 'Cerrar la conexin independientemente de si se inici una excepcin o no. Me.OleDbConnection1.Close() End Try End Sub

Y, como muy bien dice el comentario del asistente, es el OledbAdapter1, creado por el aistente quien selecciona y ejecuta el comando asociado al mtodo invocado (Fill)
'OleDbDataAdapter1 ' Me.OleDbDataAdapter1.DeleteCommand = Me.OleDbDeleteCommand1 Me.OleDbDataAdapter1.InsertCommand = Me.OleDbInsertCommand1 Me.OleDbDataAdapter1.SelectCommand = Me.OleDbSelectCommand1 Me.OleDbDataAdapter1.TableMappings.AddRange(New System.Data.Common.DataTableMapping() {New System.Data.Common.DataTableMapping("Table", "ParmApp", New System.Data.Common.DataColumnMapping() {New System.Data.Common.DataColumnMapping("Parm_Descripcion", "Parm_Descripcion"), New System.Data.Common.DataColumnMapping("Parm_Id", "Parm_Id"), New System.Data.Common.DataColumnMapping("Parm_tipo", "Parm_tipo"), New System.Data.Common.DataColumnMapping("Parm_Valor", "Parm_Valor")})}) Me.OleDbDataAdapter1.UpdateCommand = Me.OleDbUpdateCommand1

Me.OleDbSelectCommand1.CommandText = w_select

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 52 de 164

15.4 Cmo modificar el adaptador cuando se aaden columnas

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 53 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 54 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 55 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 56 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 57 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 58 de 164

15.5 Ejemplo 2: Aadir un campo booleano

w_Update = " UPDATE fal_cli " _ & " Set raz_cli = '" & Trim(Me.editraz_cli.Text) & "' , " _ & " nom_cli = '" & Trim(Me.editnom_cli.Text) & "' , " _ & " dni_cli = '" & Trim(Me.editdni_cli.Text) & "' , " _ & " dir_cli = '" & Trim(Me.editdir_cli.Text) & "' , " _ & " cop_cli = '" & Trim(Me.editcop_cli.Text) & "' , " _ & " em1_cli = '" & Trim(Me.editem1_cli.Text) & "' , " _ & " em2_cli = '" & Trim(Me.editem2_cli.Text) & "' , " _ & " tarifa = '" & Trim(Me.editTarifa.Text) & "' , " _ & " obs_cli = '" & Trim(Me.editobs_cli.Text) & "' ," _ & " Manto_Agrup = " & Me.Chk_Manto_Agrup.Checked _ & " WHERE cod_cli = '" & Trim(Me.editcod_cli.Text) & "'"

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 59 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 60 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 61 de 164

16 SQL 16.1 Ejecutar comando inmediato


Public Sub Ejecutar_comando_inmediato_ODBC(ByVal p_sql As String) '-----------------------------------'Definir objeto de conexin con la BD '-----------------------------------oCon_ODBC = New OdbcConnection(vg_cad_ODBC) ' Try '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------oCon_ODBC.Open() Dim ContaCMD As OdbcCommand ContaCMD = New OdbcCommand(p_sql, oCon_ODBC) Debug.WriteLine(p_sql) Dim CmdSql As New OdbcCommand(p_sql, oCon_ODBC) CmdSql.ExecuteNonQuery() Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "M_Globales.Ejecutar_comando_inmediato_ODBC " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally '-----------------------------------------------------'siempre se ejecuta, incluso con exit sub dentro de Try Try oCon_ODBC.Close() Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "M_Globales.Ejecutar_comando_inmediato(Finally)" _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try End Try End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 62 de 164

16.2 Clausula Delete


Private Sub m_inicializar_ParmForm_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles m_inicializar_ParmForm.Click Dim w_delete As String w_delete = " DELETE " _ & " FROM parmForm " M_Globales.Ejecutar_comando_inmediato_nucleo(w_delete) End Sub

Dim w_Delete As String w_Delete = " DELETE " _ & " FROM fal_cli " _ & " WHERE cod_cli ='" & Me.editcod_cli.Text & "'" M_Globales.Ejecutar_comando_inmediato_OLE(w_Delete)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 63 de 164

16.3 Clausula insert


'----------------------'Crear registro '----------------------Dim w_insert As String w_insert = " INSERT INTO oferta_cab " _ & "(OFE_Id) " _ & " VALUES " _ & "('" & Me.T_Id_Oferta.Text & "')" M_Globales.Ejecutar_comando_inmediato_ODBC(w_insert)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 64 de 164

16.4 Clausula SELECT


16.4.1 Select count(*)

Public Sub grabar_posicion_form(ByVal p_Form As Form) '--------------------------'renombrar variables '--------------------------Dim w_Form As String w_Form = Trim(p_Form.Name) Dim Dim Dim Dim Dim p_Top As Integer p_Left As Integer p_Height As Integer p_Width As Integer p_Resto As String

p_Top = p_Form.Top p_Left = p_Form.Left p_Height = p_Form.Height p_Width = p_Form.Width p_Resto = p_Form.Name '------------------------------------------'Preparar 1 variable con toda la informacion '------------------------------------------Dim w_valor As String w_valor = Space(70) Mid$(w_valor, 1, 5) = CStr(p_Top) Mid$(w_valor, 6, 5) = CStr(p_Left) Mid$(w_valor, 11, 5) = CStr(p_Height) Mid$(w_valor, 16, 5) = CStr(p_Width) Mid$(w_valor, 21, 50) = p_Resto & Space(50) 'Nota Al maximizar un formulario en tiempo de 'ejecucin se genera un evento Resize. 'La propiedad WindowState refleja el estado 'actual de la ventana. 'Si establece la propiedad WindowState a 2 '(maximizada), el formulario se maximizar, 'independientemente de los valores que haya 'en las propiedades MaxButton y BorderStyle. Dim pp1 pp2 pp3 Try '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT count(*) " _ & " FROM ParmForm " _ & " WHERE pf_usuario = '" & vg_usuario & "'" _ & " AND pf_form = '" & w_Form & "'" oCon_Nucleo.Open() Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) pp1, pp2, pp3 As String = vg_usuario = w_Form = w_valor

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 65 de 164

Dim w_sql As String If w_conta = 0 Then '------ Hay que dar de alta Dim w_insert As String w_insert = " INSERT INTO ParmForm " _ & "(PF_usuario, PF_form, " _ & " PF_height, PF_left, " _ & " PF_top, PF_Width, " _ & " PF_cadena) " _ & " VALUES " _ & "('" & vg_usuario & "'," _ & "'" & w_Form & "'" _ & "," & p_Height & "," & p_Left _ & "," & p_Top & "," & p_Width _ & ",'" & pp3 & "')" w_sql = w_insert Else '------------------- hay que modificar Dim w_update As String w_update = " UPDATE ParmForm " _ & " SET PF_height = " & p_Height & "," _ & " PF_left = " & p_Left & "," _ & " PF_top = " & p_Top & "," _ & " PF_width = " & p_Width & "," _ & " PF_cadena = '" & pp3 & "' " _ & " WHERE PF_usuario = '" & vg_usuario & "'" _ & " AND PF_Form ='" & w_Form & "'" w_sql = w_update End If Debug.WriteLine(w_sql) Dim cmdInsert As New OleDbCommand _ (w_sql, oCon_Nucleo) cmdInsert.ExecuteNonQuery() Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally '-----------------------------------------------------'siempre se ejecuta, incluso con exit sub dentro de Try Try oCon_Nucleo.Close() Catch ex As Exception End Try End Try End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 66 de 164

Public Sub leer_ParmApp_nucleo _ (ByRef p_codigo As Integer, _ ByRef p_valor As String) '-----------------------------------'Definir objeto de conexin con la BD '-----------------------------------oCon_Nucleo = New OleDbConnection(vg_cad_Nucleo) ' '-----------------------------------' Crear Adaptador '-----------------------------------Dim oDA_Nucleo = New OleDbDataAdapter Dim w_valor As String Try '---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT count(*) " _ & " FROM ParmApp " _ & " WHERE Parm_Id = " & p_codigo oCon_Nucleo.Open() Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) '-----------------------------'NO existe un registro esperado '-----------------------------If w_conta = 0 Then MsgBox("Error: No existe el codigo " _ & p_codigo & " en ParmApp del nucleo" _ & vbCrLf _ & "Contacte con su distribuidor de la aplicacion." _ , vbOK, "Error de aplicacion (JMP Soft)") Exit Sub End If '---------------------------'existe un registro '---------------------------' se pueden recuperar los registrso de 2 formas: 'modo 1 'pasar todos los registros que cumplen la condicion 'a un dataset y recorrer luego las filas (solo hay una) 'modo 2 'Acceder directamente al registro 'que cumple la condicion Dim modo_recuperacion As String modo_recuperacion = 2 Select Case modo_recuperacion Case "1" w_select = _ "SELECT * " _ & " FROM ParmApp " _ & " WHERE Parm_id = '" & p_codigo oDA_Nucleo = New OleDbDataAdapter _ (w_select, oCon_Nucleo) oDS_Nucleo.Clear() oDA_Nucleo.Fill(oDS_Nucleo, "Nucleo") '------------------------------

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 67 de 164

'examinar registros recuperados '-----------------------------Dim objRow As DataRow For Each objRow In _ oDS_Nucleo.Tables("Nucleo").Rows() w_valor = objRow("Parm_valor") Next Case "2" 'en este caso solo se recupera un valor w_select = _ "SELECT parm_Valor " _ & " FROM ParmApp " _ & " WHERE Parm_Id = " & p_codigo Dim CMDselect As OleDbCommand CMDselect = New OleDbCommand _ (w_select, oCon_Nucleo) w_valor = CMDselect.ExecuteScalar() End Select Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "M_Globales.leer_parametro_nucleo " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try '------------------------------------------'Devolver el valor recogido como texto '------------------------------------------p_valor = w_valor End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 68 de 164

16.4.2

Where con Like , Order by ASC/DESC

Dim w_select As String w_select = "SELECT * " _ & "FROM fal_cli " _ & "WHERE nom_cli like & " or raz_cli like & " or obs_cli like & " or dni_cli like & " or dir_cli like & " or pob_cli like & " or fax_cli like & " or tel_cli like

'%" '%" '%" '%" '%" '%" '%" '%"

& & & & & & & &

w_cad_buscar w_cad_buscar w_cad_buscar w_cad_buscar w_cad_buscar w_cad_buscar w_cad_buscar w_cad_buscar

& & & & & & & &

"%'" "%'" "%'" "%'" "%'" "%'" "%'" "%'"

_ _ _ _ _ _ _

'OleDbSelectCommand1 es el objeto que contiene la cadena Select Me.OleDbSelectCommand1.CommandText = w_select

Private Sub Bot_Buscar_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Buscar.Click, _ Bot_Ir_A.Click, _ Bot_Nombre.Click Dim w_select As String Dim w_where As String Select Case sender.name Case "Bot_Ir_A" w_where = " Where cod_cli Me.T_Buscar.Text = "" Me.T_Nombre.Text = "" Case "Bot_Nombre" w_where = " Where nom_cli & " or raz_cli Me.T_Buscar.Text = "" Me.T_Ir_a.Text = "" Case "Bot_Buscar" w_where = " Where tel_cli & " or fax_cli & " or pob_cli & " or pro_cli & " or dni_cli & " or obs_cli Me.T_Ir_a.Text = "" Me.T_Nombre.Text = "" End Select

like '%" & Me.T_Ir_a.Text & "' "

like '%" & Me.T_Nombre.Text & "%' " _ like '%" & Me.T_Nombre.Text & "%' "

like like like like like like

'%" '%" '%" '%" '%" '%"

& & & & & &

Me.T_Buscar.Text Me.T_Buscar.Text Me.T_Buscar.Text Me.T_Buscar.Text Me.T_Buscar.Text Me.T_Buscar.Text

& & & & & &

"%' "%' "%' "%' "%' "%'

" " " " " "

_ _ _ _ _

If Trim(Me.T_Ir_a.Text) = "" _ And sender.name = "Bot_Ir_A" Then w_where = "" End If If Trim(Me.T_Nombre.Text) = "" _ And sender.name = "Bot_Alias" Then w_where = "" End If If Trim(Me.T_Buscar.Text) = "" _ And sender.name = "Bot_Buscar" Then w_where = "" End If '------------- order by Dim w_order As String If Me.RB_codigo.Checked Then w_order = "Order By Cod_cli" Else w_order = "Order by Nom_cli"

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 69 de 164

End If If Me.CB_Asc.Checked Then w_order &= " ASC " Else w_order &= " Desc" End If w_select = & & & "SELECT * " _ " FROM fal_cli " _ w_where _ w_order

Me.OleDbSelectCommand1.CommandText = w_select Call btnLoad_Click(sender, e) Me.T_Num_Reg.Text _ = Me.BindingContext(objDS_Clientes, "fal_cli").Count.ToString() End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 70 de 164

16.4.3

Where con campo tipo booleano


If Me.Chk_agrupar.Checked = True Then w_where &= " AND (Manto_agrup = true )" Else w_where &= " AND (Manto_agrup <> true )" End If

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 71 de 164

16.4.4
'

Where con campos nulos

'siempre se seleccionan registros "AC" ' w_where &= " AND (CTRH_tipo = 'AC' )" w_where &= " AND (CTRH_Num_Fac Is Null or CTRH_Num_Fac = '')"

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 72 de 164

16.4.5
w_Select = & & & &

No mostrar filas duplicadas con DISTINCT


"SELECT * " _ " FROM Presup_det " _ " WHERE PreD_Concepto = '" & Me.T_Pan_Conc.Text & "'" _ " AND PreD_Concepto <> ''" _ " ORDER By Pred_ID Desc "

w_Select = "SELECT DISTINCT '1','2','3',pred_Concepto,Pred_precio,1 " _ & " FROM Presup_det " _ & " WHERE PreD_Concepto = '" & Me.T_Pan_Conc.Text & "'" _ & " AND PreD_Concepto <> ''" ' & " ORDER By Pred_ID Desc " esta clausula no esta soportada

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 73 de 164

Esta ventana sirve para recoger el valor seleccionado y trasladarle a otro Datagrid
Private Sub DG_Sel_conc_CurrentCellChanged( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles DG_Sel_conc.CurrentCellChanged Dim w_fila As Integer With DirectCast(sender, DataGrid).CurrentCell w_fila = .RowNumber End With DG_Detalle.Item(l_fila, 2) = Me.DG_Sel_conc.Item(w_fila, 3).ToString DG_Detalle.Item(l_fila, 3) = Me.DG_Sel_conc.Item(w_fila, 4).ToString End Sub

A pesar de que solo se muestran 2 columnas, no se produce error alguno al hacer el movimiento de la informacion entre datagrids ya que el indice viene definido en la tabla de estilos que usamos.
'---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de columna 'para aadir los nuevos estilos creados '---------------------------------------------------------TS_Detalle2.GridColumnStyles.Clear() TS_Detalle2.GridColumnStyles.Add(col_id) TS_Detalle2.GridColumnStyles.Add(col_Lin) TS_Detalle2.GridColumnStyles.Add(col_Cant) TS_Detalle2.GridColumnStyles.Add(col_ConC) TS_Detalle2.GridColumnStyles.Add(col_Prec) TS_Detalle2.GridColumnStyles.Add(col_Total) 0 1 2 3 4 5

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 74 de 164

16.5 Vistas

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 75 de 164

16.6 Tipos de concurrencia


16.6.1 Optimista

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 76 de 164

17 Acceso a datos 17.1 Transacciones con .NET


Concepto de transaccin: Es una secuencia de operaciones realizadas como una sola unidad de trabajo. Las propiedades de las transacciones se las conoce como ACID: Atomicidad, Coherencia, Aislamiento, Durabilidad. Atomicidad: Una transaccin debe ser una unidad atmica de trabajo, o se hace todo o no se hace nada. Coherencia: Debe dejar los datos en un estado coherente luego de realizada la transaccin. Aislamiento: Las modificaciones realizadas por transacciones son tratadas en forma independiente, como si fueran un solo y nico usuario de la base de datos. Durabilidad: Una vez concluida la transaccin sus efectos son permanentes y no hay forma de deshacerlos. Ahora, que tiene que ver esto con mis datos?? Pues bien, todas las instrucciones que normalmente escribo en los procedimientos son update, insert, delete de una o ms tablas y si no uso procedimientos almacenados uso comandos desde mi programa; pues bien, entonces sera algo as:
Update Persona set Sueldo=sueldo * 1. 5 Update Grupos set estado=1 where estado=0

Pero nos encontramos con un problema, que las dos sentencias deben hacerse siempre unidas, como si fueran una sola pues perteneces a una actualizacin de sueldos. Pero que pasa si se realiza la primera operacin y no la segunda. Huy! Que rabia, o que pasa si solo se realiza parte de la primera, ms Huy! Pues no se sabe hasta que punto se hizo o no se hizo nada, pues nada hay que me garantice esto. Aqu surgen las transacciones.
Begin Tran Update Persona set Sueldo=sueldo * 1.5 Update Grupos set estado=1 where estado=0 Commit Tran

Al encerrar en una transaccin decimos que se realice todo o no se realice nada (atomicidad) pues si surge algn error se deshace todo lo realizado anteriormente en la transaccin.

Ahora desde vb.NET


(Comandos independientes)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 77 de 164

Teniendo una base de datos llamada Ejemplo y una tabla de nombre persona que tiene los siguientes campos Codigo varchar(10) Nombres varchar(50) Sueldo int Estado varchar(1) En un formulario que posee un botn escribimos lo siguiente en el evento clic del botn, sin olvidarse hacer antes el imports a system.data.sqlClient:
Dim Conn As SqlConnection = New SqlConnection("Data Source=INFORM77;Initial Catalog=EJEMPLO;User Id=sa") Conn.Open() Try Dim Comando As New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG1','JOSE',200,'A')", Conn) Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG2','LUIS',180,'B')", Conn) Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG3','PEDRO',400,'A')", Conn) Comando.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) End Try Conn.Close() MsgBox("Datos Ingresados")

Como vemos aadiremos en la tabla persona 3 registro, pero si quisiramos convertirle a transaccin para que se ejecuten todos o ninguno si encuentra un error deberamos hacer lo siguiente. Fjese en los datos para el campo cdigo pues ahora son tr1, tr2, tr3.
Dim Conn As SqlConnection = New SqlConnection("Data Source=INFORM77;Initial Catalog=EJEMPLO;User Id=sa") Conn.Open() Dim myTrans As SqlTransaction Dim Comando As SqlClient.SqlCommand myTrans = Conn.BeginTransaction() Try Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr1','JOSE',200,'A')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr2','LUIS',180,'B')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr3','PEDRO',400,'A')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() myTrans.Commit() MsgBox("Datos Ingresados") Catch ex As Exception myTrans.Rollback() MsgBox(ex.Message) End Try Conn.Close()

Ahora al ejecutar insertar los nuevos 3 registros sin novedad, pero lo har usando transacciones para lo cual iniciamos la transaccin con myTrans = Conn.BeginTransaction() y finalizamos con myTrans.Commit() y en caso de algn error ejecutamos myTrans.Rollback() para cancelar todo lo realizado en la transaccin. Para comprobar que la transaccin se cancela al encontrar un error cambiamos los valores del campo cdigo por tr1 por ab1 y tr2 por ab2, dejando tr3 en el tercer registro pues as dar un error de clave duplicada porque ya existe un registro con esta clave previamente grabada.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 78 de 164

Al ejecutar nos saldr un mensaje que indica que existi una violacin de primary key. Si verificamos los datos, no habr ningn registro aadido pues como est en una transaccin o se agregan todos o no se agrega ninguno.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 79 de 164

17.2 Recuperar el valor de un campo con ExecuteScalar


Este mtodo recupera la primera columna del primer registro del conjunto de registros seleccionados con una select.

'---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------oCon_Nucleo.Open() Dim w_select As String w_select = "SELECT count(*) " & " FROM Parm_user " & " WHERE t4_usuario & " AND t4_param = _ _ = '" & pp1 & "'" _ '" & pp2 & "'"

Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) oCon_Nucleo.Close()

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 80 de 164

17.3 Ejecutar comando que no devuelve un conjunto de registros : ExecuteNonQuery


'---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------oCon_Nucleo.Open() Dim w_select As String w_select = "SELECT count(*) " & " FROM Parm_user " & " WHERE t4_usuario & " AND t4_param = _ _ = '" & pp1 & "'" _ '" & pp2 & "'"

Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) Dim w_sql As String If w_conta = 0 Then '------ Hay que dar de alta Dim w_insert As String w_insert = " INSERT INTO parm_user " _ & "(t4_usuario, t4_param, t4_valor) " _ & " VALUES " _ & "('" & pp1 & "','" & pp2 & "','" & pp3 _ & "')" w_sql = w_insert Else '------------------- hay que modificar Dim w_update As String w_update = " UPDATE parm_user " _ & " SET t4_valor = '" & pp3 & "'" _ & " WHERE t4_usuario = '" & pp1 & "'" _ & " AND t4_param ='" & pp2 & "'" w_sql = w_update End If If vg_debug Then MsgBox(pp2 & vbCrLf & pp3 & vbCrLf & w_sql) End If Dim cmdsql As New OleDbCommand(w_sql, oCon_Nucleo) Dim w_reg As Integer w_reg = cmdsql.ExecuteNonQuery() If vg_debug Then MsgBox("Se ha salvado correctamente " _ & w_reg & "Registros")

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 81 de 164

17.4 Recuperar un conjunto de registros con Datareader


'---------------------------------------------------------'Cargar datos del cliente una vez hechas las validaciones '---------------------------------------------------------w_select = "SELECT * " _ & " FROM Fal_cli " _ & " WHERE cod_cli = '" & Me.T_cod_cli.Text & "'" Dim w_direccion As String Dim w_cod_postal As String Dim w_Poblacion As String Dim w_Provincia As String ' '---- crear conexion Dim oCON As OleDbConnection oCON = New OleDbConnection(vg_cad_OLE) '--- Crear comando Dim oCMD As OleDbCommand oCMD = New OleDbCommand(w_select, oCon_OLE) '--- crear DataReader Dim oDR As OleDbDataReader oDR = oCMD.ExecuteReader '--- recorrer filas While oDR.Read w_direccion = oDR("Dir_Cli") w_cod_postal = oDR("Cop_Cli") w_Poblacion = oDR("Pob_Cli") w_Provincia = oDR("Pro_Cli") End While oDR.Close() oCON.Close()

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 82 de 164

17.5 Rellenar un datagrid con Adaptador sin asistente

Imports System.Data.OleDb Public Class F_Contrato Inherits System.Windows.Forms.Form Private oDataAdapter As OleDbDataAdapter Private oDataSet As DataSet Private iPosicionFilaActual As Integer

#Region "Metodos del navegador" Public Sub btn_Buscar_ID_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btn_Buscar_ID.Click If Trim(Me.T_Id_buscado.Text) = "" Then MsgBox("Para Buscar un ID antes hay que especificarle ") Exit Sub End If 'OleDbSelectCommand1 Dim w_select As String w_select = "SELECT * " _ & "FROM Contrato " _ & "WHERE CTR_ID = " & Me.T_Id_buscado.Text Me.OleDbSelectCommand1.CommandText = w_select Call cargar_dataset(w_select) Call Me.cargar_registro_actual() Me.T_Cadena_buscada.Text = "" End Sub Private Sub cargar_dataset(ByVal p_select As String) 'crear conexion Dim oCON As OleDbConnection oCON = New OleDbConnection oCON.ConnectionString = vg_cad_OLE 'Crear Adaptador Me.oDataAdapter = New OleDbDataAdapter(p_select, oCON) 'crear Dataset Me.oDataSet = New DataSet 'llenar dataset oCON.Open() Me.oDataAdapter.Fill(oDataSet, "Contrato") oCON.Close() 'establecer el indicador del registro Me.iPosicionFilaActual = 0 End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 83 de 164

Private Sub cargar_registro_actual() Dim oDataRow As DataRow oDataRow = Me.oDataSet.Tables("Contrato").Rows(Me.iPosicionFilaActual) Me.T_cod_cli.Text = oDataRow("CTR_cliente") Me.T_situacion.Text = oDataRow("CTR_Situacion") Me.T_Fec_Firma.Text = oDataRow("CTR_fecha_firma") Me.T_Maquina.Text = oDataRow("CTR_maquina") Me.T_Modelo.Text = oDataRow("CTR_modelo") Me.T_Numero.Text = oDataRow("CTR_numero") Me.T_Fec_visita_next.Text = oDataRow("CTR_fec_visita_prox") Me.T_Observa.Text = oDataRow("CTR_observaciones") Me.T_Id_contrato.Text = oDataRow("Ctr_Id") 'mostrar la posicion actual del registro Me.l_num_reg.Text = Me.iPosicionFilaActual + 1 Me.l_num_reg.Text &= " de " Me.l_num_reg.Text &= Me.oDataSet.Tables("Contrato").Rows.Count End Sub Private Sub Btn_Buscar_cadena_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Btn_Buscar_cad.Click 'If Trim(Me.T_Cadena_buscada.Text) = "" Then ' 'MsgBox("Para Buscar una cadena antes hay que especificarla") ' 'Exit Sub 'End If Dim w_cad_buscar As String If Trim(Me.T_Cadena_buscada.Text) = "" Then w_cad_buscar = "%" Else w_cad_buscar = Me.T_Cadena_buscada.Text End If w_cad_buscar = Trim(Me.T_Cadena_buscada.Text) Dim w_select As String w_select = "SELECT * " _ & "FROM Contrato " _ & "WHERE CTR_Maquina like '%" & w_cad_buscar & "%'" _ & " or CTR_Modelo like '%" & w_cad_buscar & "%'" _ & " or CTR_Numero like '%" & w_cad_buscar & "%'" _ & " or CTR_Observaciones like '%" & w_cad_buscar & "%'" 'OleDbSelectCommand1 es el objeto que contiene la cadena Select Me.OleDbSelectCommand1.CommandText = w_select Call cargar_dataset(w_select) Call Me.cargar_registro_actual() Me.l_num_reg.Text = Me.l_num_reg.Text Me.T_Id_buscado.Text = "" End Sub Private Sub Bot_Primero_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Primero.Click Me.iPosicionFilaActual = 0 Call Me.cargar_registro_actual() End Sub Private Sub Bot_prev_Click( _ ByVal sender As System.Object, _

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 84 de 164

ByVal e As System.EventArgs) _ Handles Bot_prev.Click If Me.iPosicionFilaActual = 0 Then MsgBox("Ya est en el primer registro.", _ MsgBoxStyle.Exclamation, Me.Text) Exit Sub End If Me.iPosicionFilaActual -= 1 Call Me.cargar_registro_actual() End Sub Private Sub Bot_Next_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Next.Click Dim w_ultimo As Integer w_ultimo = Me.oDataSet.Tables("Contrato").Rows.Count - 1 If Me.iPosicionFilaActual = w_ultimo Then MsgBox("Ya est en el ltimo registro.", _ MsgBoxStyle.Exclamation, Me.Text) Exit Sub End If Me.iPosicionFilaActual += 1 Call Me.cargar_registro_actual() End Sub Private Sub Bot_Ultimo_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Ultimo.Click Dim w_ultimo As Integer w_ultimo = Me.oDataSet.Tables("Contrato").Rows.Count - 1 Me.iPosicionFilaActual = w_ultimo Call Me.cargar_registro_actual() End Sub #End Region

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 85 de 164

17.6 Form_cliente_detalle_pedidos

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 86 de 164

18 Datagrid 18.1 Cmo saber en que celda de un Datagrid se pulsa


El siguiente mtodo permite determinar sobre que celda del Datgrid se hace clic
Private Sub grdfal_pro_CurrentCellChanged( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles DG_Detalle.CurrentCellChanged Dim w_fila As Integer Dim w_col As Integer Dim w_valor As String With DirectCast(sender, DataGrid).CurrentCell w_fila = .RowNumber w_col = .ColumnNumber End With '------------------------------'memorizar la linea seleccionada '------------------------------Me.l_columna = w_col Me.l_fila = w_fila '-- recuperar el valor que se haya escrito w_valor = DG_Detalle.Item(w_fila, w_col).ToString Me.T_Pan_Conc.Text = w_valor '--- visualizar numero de linea Me.T_Pan_Lin.Text = DG_Detalle.Item(w_fila, 0).ToString 'Me.T_col_new.Text = w_col 'Me.T_fila_new.Text = w_fila 'Me.T_valor.Text = w_valor 'Me.T_num_Cols_visibles.Text = grdWeb_site.VisibleColumnCount 'Me.T_num_Filas_visibles.Text = grdWeb_site.VisibleRowCount End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 87 de 164

18.2 Cmo referenciar una celda de un Datagrid


Private Sub Bot_Pan_Sel_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Pan_Sel.Click Dim w_fila As Integer Try w_fila = Me.DG_Sel_conc.CurrentRowIndex DG_Detalle.Item(l_fila, 1) = Me.DG_Sel_conc.Item(w_fila, 2).ToString DG_Detalle.Item(l_fila, 2) = Me.DG_Sel_conc.Item(w_fila, 3).ToString DG_Detalle.Item(l_fila, 3) = Me.DG_Sel_conc.Item(w_fila, 4).ToString Catch ex As Exception End Try Call Me.Bot_Pan_Cerrar_Click(sender, e) End Sub

En este caso solo se quiere saber cual es la fila seleccionada, para copiar los valores de dicha fila a otro datagrid cuando se pulsa el botn Seleccionar

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 88 de 164

18.3 Mantenimiento de una tabla en un nico Form


18.3.1 Tabla de Artculos: Seleccionar celdas de una fila

Este formulario presenta por una parte una relacin de todas los registros que contiene, y en la parte inferior muestra el detalle de la fila seleccionada.

Private Sub grdfal_art_Click( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles grdfal_art.Click Call Cargar_Detalle_articulo() End Sub Private Sub Cargar_Detalle_articulo() Me.T_referencia_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 0) Me.Combo_Familias.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 1).ToString Me.T_Nombre_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 2).ToString Me.T_Familia.Text = Me.Combo_Familias.Text Me.T_Precio1_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 3).ToString Me.T_precio2_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 4).ToString Me.T_Iva.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 5).ToString Me.T_observa.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 6).ToString End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 89 de 164

18.4 Datagrid con Tabla de memoria


Se define a nivel de clase
Public Class F_Presupuesto Inherits System.Windows.Forms.Form Private DT_Datagrid2 As DataTable Private TS_DataGrid2 As New DataGridTableStyle

Se crea al cargar el formulario invocando al siguiente metodo


Private Sub Crear_y_Cargar_DT_trabajo() '******************************************** 'crear y cargar una tabla de datos en memoria 'para contener los trabajos realizados para mostrar en el datagrid '******************************************** DT_Datagrid2 = New DataTable("DataGrid2") 'Thread.CurrentThread.CurrentCulture = New CultureInfo("es-ES") 'ver en documentacion: CultureInfo (Clase) '--------------------------------------------' Aadir columnas y filas de datos al datagrid '--------------------------------------------With DT_Datagrid2 With .Columns .Add(columnName:="PreT_Lin", Type:=GetType(Integer)) .Add(columnName:="PreT_Trabajo", Type:=GetType(String)) .Add(columnName:="PreT_Id", Type:=GetType(String)) End With Dim x As Integer Dim w_ref As String Dim w_concepto As String 'inicializar la tabla con 30 lineas a blanco For x = 1 To 30 With .Rows '.Add(values:=New Object() {x,0 , "", "", , , }) .Add(values:=New Object() {x}) End With Next .AcceptChanges() End With Call Definir_Tabla_Estilos_Trabajos(DT_Datagrid2) '--------------------------------'mapear el grid ... Bind the Grid '--------------------------------With Me.DG_Trabajos .DataSource = DT_Datagrid2 .TableStyles.Add(TS_DataGrid2) 'definida a nivel clase .BackgroundColor = TS_DataGrid2.BackColor End With End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 90 de 164

Definicin de la tabla de estilos


Private Sub Definir_Tabla_Estilos_Trabajos( _ ByRef p_DataTable As DataTable) '-------------------------------------' Crear El estilo de tabla (tablestyle) '-------------------------------------With TS_DataGrid2 .AlternatingBackColor = Color.PaleGreen .BackColor = Color.LemonChiffon .MappingName = p_DataTable.TableName .AllowSorting = True With .GridColumnStyles .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS2_Linea"))) 'TS2_linea es el nombre del estilo de la columna Linea ' en la Tabla de estilos With .Item(Index:=0) .MappingName = "Num_Linea" ' esta columna nunca aparecera .HeaderText = "Linea" .Alignment = HorizontalAlignment.Center .Width = 50 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS2_trabajo"))) With .Item(Index:=1) .MappingName = "PreT_trabajo" .HeaderText = "trabajo " .HeaderText = "T R A B A J O R E A L I Z A D O" .Alignment = HorizontalAlignment.Left .Width = 700 .ReadOnly = False .NullText = String.Empty End With End With End With End Sub

El resultado es el siguiente:

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 91 de 164

Cuando queremos cargar esta tabla con determinados valores, por ejemplo, al consultar un presupuesto ya existente, hacemos lo siguiente:
Private Sub Cargar_Detalle_Trabajos() Me.t_num_lin_Trab.Text = 0 Dim w_select As String w_select = "SELECT * " _ & " FROM Presup_Trab " _ & " WHERE PreT_id = '" & Me.T_num_ppto.Text & "'" _ & " ORDER by PreT_lin" oDA_OLE = New OleDbDataAdapter(w_select, oCon_OLE) Dim oDS_Tra As New DataSet oDS_Tra.Clear() oDA_OLE.Fill(oDS_Tra, "Presup_Trab") Me.t_num_lin_Trab.Text = oDS_Tra.Tables("Presup_Trab").Rows.Count '-------------------------------------'cargar tabla de trabajos '-------------------------------------Dim w_trabajo(30) As String Dim oTabla As DataTable oTabla = oDS_Tra.Tables("Presup_Trab") Dim oFila As DataRow Dim w_lin As Integer = 0 For Each oFila In oTabla.Rows w_lin += 1 w_trabajo(w_lin) = oFila.Item("PreT_Trabajo") Next With DT_Datagrid2 'asi se crea la tabla en memoria, con estas columnas 'With .Columns ' .Add(columnName:="PreT_Lin", Type:=GetType(Integer)) ' .Add(columnName:="PreT_Trabajo", Type:=GetType(String)) ' .Add(columnName:="PreT_Id", Type:=GetType(String)) 'End With Dim x As Integer Dim w_ref As String Dim w_concepto As String '----------------------------------'limpiar tabla de lineas de trabajos '----------------------------------Me.DT_Datagrid2.Clear() ' 'Cargar tabla con las ocurrencias que tenga y nuevas hasta 30 ' With DT_Datagrid2 For x = 1 To 30 If x <= w_lin Then Dim w_valor As String w_valor = w_trabajo(x) .Rows.Add(values:=New Object() {x, w_valor}) Else .Rows.Add(values:=New Object() {x}) End If Next .AcceptChanges() End With End With End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 92 de 164

18.5 DataGrid con Manejador


18.5.1 Ejemplo 1

Al especificar una cantidad y un precio, el sistema calcula el importe, que adems, es un campo protegido

Private Sub Crear_y_Cargar_DT_Detalle() '******************************************** 'crear y cargar una tabla de datos en memoria 'para contener las lineas de detalle del ppto '******************************************** ' En el caso de modificaciones, 'esta tabla coincidira con Presup_det 'por eso la creamos con la misma estructura '-------------------------------------------DT_Datagrid = New DataTable("DT_Detalle") ' '--------------------------------------------' Aadir columnas y filas de datos al datagrid '--------------------------------------------With DT_Datagrid With .Columns .Add(columnName:="PreD_Lin", Type:=GetType(Integer)) .Add(columnName:="PreD_Cantidad", Type:=GetType(String)) .Add(columnName:="PreD_Concepto", Type:=GetType(String)) .Add(columnName:="PreD_Precio", Type:=GetType(String)) .Add(columnName:="PreD_total", Type:=GetType(String)) .Add(columnName:="PreD_id", Type:=GetType(String)) End With Dim x As Integer Dim w_ref As String Dim w_concepto As String ' 'inicializar la tabla con 8 lineas a blanco (el impreso no admite mas) ' For x = 1 To 8 With .Rows '.Add(values:=New Object() {x,0 , "", "", , , }) .Add(values:=New Object() {x}) End With Next .AcceptChanges() End With Call Definir_Tabla_estilos_Detalle(DT_Datagrid) '--------------------------------'mapear el grid ... Bind the Grid '--------------------------------With Me.DG_Detalle .DataSource = DT_Datagrid .TableStyles.Add(TS_DataGrid) '.BackgroundColor = TS_DataGrid.BackColor End With ' End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 93 de 164

Private Sub Definir_Tabla_estilos_Detalle( _ ByRef p_DataTable As DataTable) ' '-----------------------------------------' Get a handle to the currency manager 'crear un manejador para recorrer la tabla '-----------------------------------------Dim CM As CurrencyManager CM = DirectCast(Me.BindingContext(p_DataTable), CurrencyManager) ' '-----------------------------------------' Handle the column change event 'manejar los eventos de las columnas '-----------------------------------------AddHandler p_DataTable.ColumnChanging, _ AddressOf Tratar_cambio_de_Col_en_DG_Detalle '-------------------------------------' Crear El estilo de tabla (tablestyle) '-------------------------------------'Dim TS_DataGrid As New DataGridTableStyle With TS_DataGrid .AlternatingBackColor = Color.AliceBlue .BackColor = Color.White .MappingName = p_DataTable.TableName .AllowSorting = True With .GridColumnStyles ' 'a la tabla de estilos la aadimos el estilo de columna ' .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Linea"))) 'TS_linea es el nombre del estilo de la columna Linea ' en la Tabla de estilos With .Item(Index:=0) .MappingName = "Pred_Lin" .HeaderText = "Linea" .Alignment = HorizontalAlignment.Center .Width = 50 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Cantidad"))) With .Item(Index:=1) .MappingName = "PreD_Cantidad" .HeaderText = "Cantidad " .Alignment = HorizontalAlignment.Center .Width = 70 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Concepto"))) With .Item(Index:=2) .MappingName = "PreD_Concepto" .HeaderText = "Concepto" .Alignment = HorizontalAlignment.Left .Width = 300 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Precio")))

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 94 de 164

With .Item(Index:=3) .MappingName = "Pred_Precio" .HeaderText = "___P/U___" .Alignment = HorizontalAlignment.Right .Width = 70 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Importe"))) With .Item(Index:=4) .MappingName = "Pred_Total" .HeaderText = "__Importe__" .Alignment = HorizontalAlignment.Right .Width = 70 .ReadOnly = True .NullText = String.Empty End With End With End With ' 'MsgBox("saliendo de la rutina de creacion") End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 95 de 164

Private Sub Tratar_cambio_de_Col_en_DG_Detalle( _ ByVal sender As Object, _ ByVal e As DataColumnChangeEventArgs) If l_Validando Then Exit Sub Dim w_cabecera As String Dim w_fila As Integer Dim w_columna As Integer w_cabecera = e.Column.Caption 'MsgBox("Caption:" & w_cabecera) w_cabecera = e.Column.ToString 'MsgBox("Columna:" & w_cabecera) w_cabecera = e.Row.ToString 'MsgBox("row:" & w_cabecera) Dim Dim Dim Dim Dim Dim Dim Dim w_linea As Integer w_cantidad As Double w_concepto As String w_precio As Double w_descuento As Double w_importe As Double w_importe_A As String w_referencia As String

With e '.Row.SetColumnError(columnName:="Ref", error:=String.Empty) Select Case (.Column.Caption).ToLower Case Is = ("Concepto").ToLower, ("Pred_Concepto").ToLower 'MsgBox("No se valida nada") Case Is = ("Cantidad").ToLower, ("pred_Cantidad").ToLower Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: La cantidad debe ser numerica" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If If (.Row!Pred_precio Is DBNull.Value) Then .Row!Pred_Total = "" Exit Sub Else If Trim(.Row!Pred_precio) = "" Then .Row!Pred_Total = "" Exit Sub End If End If w_precio = .Row!PreD_precio.ToString If w_precio = 0 Then Exit Sub If .ProposedValue Is DBNull.Value Then .Row!Pred_Total = "" Exit Sub End If w_cantidad = .ProposedValue If w_cantidad = 0 Then .Row!Pred_Total = "" Exit Sub End If '--------------------------------------------'el siguiente tratamiento hay que hacerle 'ya que se ha definido la columna como string 'y por cultura, el punto decimal es la coma '--------------------------------------------'******************************** 'tratar las cantidades no enteras '******************************** Dim w_aux As String Dim w_pos As Integer w_aux = e.ProposedValue.ToString

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 96 de 164

If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_aux = CStr(.ProposedValue) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_cantidad = w_aux If w_cantidad = 0 Then Exit Sub '******************************** 'tratar los precios no enteros '******************************** w_aux = .Row!PreD_precio If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_precio = w_aux If w_precio = 0 Then Exit Sub w_importe = w_cantidad * w_precio w_importe_A = Format(w_importe, "#######0.00") .Row!Pred_Total = w_importe_A Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Cantidad " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try Case Is = ("Precio").ToLower, ("Pred_precio").ToLower Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: El Precio debe ser numerico" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") .Row!Pred_total = "" Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If '--------------------'recoger cantidad '--------------------If (.Row!PreD_Cantidad Is DBNull.Value) Then .Row!Pred_total = "" Exit Sub End If w_cantidad = .Row!PreD_cantidad If w_cantidad = 0 Then Exit Sub '--------------------'recoger precio '--------------------'******************** todo ok 'w_precio = .ProposedValue 'If w_precio = 0 Then Exit Sub 'w_importe = w_precio * w_cantidad 'w_importe_A = Format(w_importe, "N") '.Row!Importe = w_importe_A '******************** todo ok 'CAMBIO EL TIPO DE LA ROW A STRING '******************************** 'tratar las cantidades no enteras '******************************** Dim w_aux As String Dim w_pos As Integer w_aux = .Row!PreD_cantidad If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_cantidad = w_aux

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 97 de 164

If w_cantidad = 0 Then .Row!Pred_total = "" Exit Sub End If '******************************** 'tratar los precios no enteras '******************************** w_aux = e.ProposedValue.ToString If Trim(w_aux) = "" Then .Row!Pred_total = "" Exit Sub End If 'MsgBox(w_aux) w_aux = CStr(.ProposedValue) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_precio = w_aux If w_precio = 0 Then Exit Sub w_importe = w_precio * w_cantidad w_importe_A = Format(w_importe, "######0.00") .Row!Pred_Total = w_importe_A 'formatear campo precio 'no se puede reformatear porque se realimenta 'Dim w_precio_A As String 'w_precio_a = Format(w_precio, "N") 'If w_precio_a <> .Row!Precio Then ' .Row!precio = w_importe_A 'End If Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Precio " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try End Select End With End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 98 de 164

18.5.2

Ejemplo 2

Este Datagrid est asociado a una tabla de memoria.

Al hacer clic en la columna concepto, queremos que salga una lista con todos los conceptos que tenemos tabulados.

Y al seleccionar un concepto, el precio unitario debe colocarse en la columna Precio.

Eso ocurre cuando cambiamos de columna, por ejemplo al seleccionar columna Cantidad

Al escribir una cantidad, se desea que se calcule el importe.

Ese clculo se realiza de nuevo al cambiar de columna

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 99 de 164

Public Class F_Factura Inherits System.Windows.Forms.Form Private DT_Referencias As DataTable Private DT_Datagrid As DataTable

Private Sub Cargar_DT_Ref_y_DT_Datagrid() 'Thread.CurrentThread.CurrentCulture = New CultureInfo("es-ES") 'ver en documentacion: CultureInfo (Clase) Dim TS_DataGrid As New DataGridTableStyle Dim CM As CurrencyManager '------------------------------------------'se crean 2 tablas de datos ' 1: para contener las referencias ' 2: para mostrar en el datagrid '------------------------------------------DT_Referencias = New DataTable("Referencias") DT_Datagrid = New DataTable("DataGrid") ' '---------------------------------' Aadir columnas y filas de datos '---------------------------------Dim oDA_odbc = New OdbcDataAdapter Dim oDs_odbc = New DataSet Dim CMDselect As OdbcCommand Dim w_select As String Dim objRow As DataRow With DT_Referencias '-----------------------------------'Definir las columnas de la tabla '-----------------------------------With .Columns .Add(columnName:="Referencia", Type:=GetType(String)) .Add(columnName:="Concepto", Type:=GetType(String)) '.Add(columnName:="familia", Type:=GetType(String)) End With Call Cargar_Tabla_articulos() End With '--------------------------------------------' Aadir columnas y filas de datos al datagrid '--------------------------------------------With DT_Datagrid With .Columns .Add(columnName:="Linea", Type:=GetType(Integer)) .Add(columnName:="Cantidad", Type:=GetType(Double)) .Add(columnName:="Concepto", Type:=GetType(String)) .Add(columnName:="Precio", Type:=GetType(Double)) .Add(columnName:="Dto", Type:=GetType(Double)) .Add(columnName:="Importe", Type:=GetType(Double)) '.Add(columnName:="Ref", Type:=GetType(String)) End With Dim x As Integer Dim w_ref As String Dim w_concepto As String For x = 1 To 30 'w_ref = Me.Combo_ref.Items(x) With .Rows '.Add(values:=New Object() {x,0 , "", "", , , }) .Add(values:=New Object() {x}) End With Next .AcceptChanges() End With ' '------------------------------------' Get a handle to the currency manager '-------------------------------------

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 100 de 164

CM = DirectCast(Me.BindingContext(DT_Datagrid), CurrencyManager) ' '-----------------------' Create the tablestyle '-----------------------With TS_DataGrid .AlternatingBackColor = Color.Aquamarine .BackColor = Color.Beige .MappingName = DT_Datagrid.TableName .AllowSorting = True With .GridColumnStyles .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="Linea"))) With .Item(Index:=0) .MappingName = "Linea" .HeaderText = "Linea" .Alignment = HorizontalAlignment.Center .Width = 50 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="Cantidad"))) With .Item(Index:=1) .MappingName = "Cantidad" .HeaderText = "Cantidad " & Chr(254) .Alignment = HorizontalAlignment.Center .Width = 55 .ReadOnly = False .NullText = String.Empty End With '----------------------------------------------------------'esto es para mapear este combo sobre ' DT_Referencias.Referencia ' ------------ xxxxxxxxx ' datatable campo ' lin(-1098) lin-1115 '----------------------------------------------------------.Add(column:=New DataGridComboBoxColumn _ (DataSource:=DT_Referencias, _ DisplayMember:="Concepto", _ ValueMember:="Referencia")) '----------------------------------------------------------'esto seria para mapear este combo directamente con la tabla '----------------------------------------------------------'.Add(column:=New DataGridComboBoxColumn _ ' (DataSource:=oDs_odbc.Tables("fal_art"), _ ' ValueMember:="ref_art", _ ' DisplayMember:="Nom_art")) '----------------------------------------------------------' ' Overloaded constructor -' '.Add(column:=New DataGridComboBoxColumn(DataSource:=Combo_ref, _ ' DisplayMember:=0, _ ' ValueMember:=1)) With .Item(Index:=2) .MappingName = "Concepto" .HeaderText = "Concepto" .Width = 300 .Alignment = HorizontalAlignment.Left .NullText = String.Empty End With ' ' establecer el alto de la fila con el alto del combobox ' mas un factor ' Set the row height to the ComboBox height ' plus a fudge factor ' If vg_debug Then With DirectCast(.Item(2), DataGridComboBoxColumn) TS_DataGrid.PreferredRowHeight = .ComboBox.Height + 2 End With End If .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="Precio")))

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 101 de 164

With .Item(Index:=3) .MappingName = "Precio" .HeaderText = "Precio ." .Alignment = HorizontalAlignment.Right .Width = 50 .ReadOnly = True .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="Descuento"))) With .Item(Index:=4) .MappingName = "Dto" .HeaderText = "% Dto ." .Alignment = HorizontalAlignment.Center .Width = 50 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="Importe"))) With .Item(Index:=5) .MappingName = "Importe" .HeaderText = "Importe ." & Chr(254) .Alignment = HorizontalAlignment.Right .Width = 50 .ReadOnly = True .NullText = String.Empty End With End With End With ' 'mapear el grid ' Bind the Grid ' With Me.DG_Detalle .DataSource = DT_Datagrid .TableStyles.Add(TS_DataGrid) .BackgroundColor = TS_DataGrid.BackColor End With ' ' Handle the column change event ' AddHandler DT_Datagrid.ColumnChanging, _ AddressOf DataGridSource_ColumnChanging End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 102 de 164

Private Sub DataGridSource_ColumnChanging( _ ByVal sender As Object, _ ByVal e As DataColumnChangeEventArgs) Dim w_cabecera As String Dim w_fila As Integer Dim w_columna As Integer w_cabecera = e.Column.Caption w_cabecera = e.Column.ToString w_cabecera = e.Row.ToString Dim Dim Dim Dim Dim Dim Dim Dim w_linea As Integer w_cantidad As Double w_concepto As String w_precio As Double w_descuento As Double w_importe As Double w_importe_A As String w_referencia As String

With e '.Row.SetColumnError(columnName:="Ref", error:=String.Empty) Select Case .Column.Caption Case Is = "Concepto" w_referencia = .ProposedValue.ToString Dim w_error As String Dim w_codigo As String w_codigo = w_referencia If w_codigo = "" Then .Row!precio = 0 .Row!dto = 0 .Row!importe = 0 Exit Sub End If If Mid(w_codigo, 1, 6) <> "Manual" Then Call M_Factura.Determinar_precio _ (w_codigo, _ Me.T_Tarifa.Text, _ w_error, _ w_precio) Else w_precio = Me.T_Precio.Text End If If w_error = "" Then .Row!precio = w_precio If (Not .Row!cantidad Is DBNull.Value) Then w_cantidad = .Row!cantidad w_importe = w_precio * w_cantidad w_importe_A = Format(w_importe, "N") .Row!importe = w_importe_A End If End If Case Is = "Cantidad" Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: La cantidad debe ser numerica" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If w_precio = .Row!precio If w_precio = 0 Then Exit Sub w_cantidad = .ProposedValue If w_cantidad = 0 Then Exit Sub w_importe = w_cantidad * w_precio If Trim((.Row!dto).ToString) <> "" Then w_descuento = Val(.Row!dto) If Val(w_descuento) <> 0 Then

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 103 de 164

w_descuento = w_importe * w_descuento / 100 Else w_descuento = 0 End If Else w_descuento = 0 End If w_importe = w_importe - w_descuento w_importe_A = Format(w_importe, "N") .Row!Importe = w_importe_A Catch ex As Exception If vg_usuario = "admin" Then MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Cantidad " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End If End Try Case Is = "Dto" Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: El descuento debe ser numerico" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") Exit Sub End If If Trim((.Row!precio).ToString) <> "" Then w_precio = .Row!precio Else w_precio = 0 End If If w_precio = 0 Then Exit Sub If Trim((.Row!cantidad).ToString) <> "" Then w_cantidad = .Row!cantidad Else w_cantidad = 0 End If If w_cantidad = 0 Then Exit Sub w_importe = w_cantidad * w_precio w_descuento = Val(.ProposedValue) If Val(w_descuento) <> 0 Then w_descuento = w_importe * w_descuento / 100 Else w_descuento = 0 End If w_importe = w_importe - w_descuento w_importe_A = Format(w_importe, "N") .Row!Importe = w_importe_A Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Cantidad " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try End Select End With End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 104 de 164

Private Sub Cargar_Tabla_articulos() '-----------------------------------'Cargar la tabla de referencias '-----------------------------------oCon_ODBC = New OdbcConnection(vg_cad_ODBC) oCon_ODBC.Open() ' Dim w_select As String ' '==================================== w_select = "SELECT * " _ & " FROM fal_art " _ & " Order By nom_art Asc " '==================================== Dim oCmd_odbc As OdbcCommand oCmd_odbc = New OdbcCommand(w_select, oCon_ODBC) Dim oDataReader As OdbcDataReader oDataReader = oCmd_odbc.ExecuteReader '--------------------------'recorrer Datareader '--------------------------If oDataReader.HasRows = False Then MsgBox("No existen Articulos para cargar " _ , MsgBoxStyle.Exclamation, "Cargar Articulos") Exit Sub End If '----------------------------------'limpiar contenido de la tabla '----------------------------------DT_Referencias.Clear() '----------------------------------'Incluir una primera lnea en blanco '----------------------------------DT_Referencias.Rows.Add(Values:=New Object() {"", ""}) Dim w_aux As String While oDataReader.Read DT_Referencias.Rows.Add(Values:=New Object() {oDataReader("ref_art"), _ oDataReader("nom_art")}) End While oDataReader.Close() oCon_ODBC.Close() DT_Referencias.AcceptChanges() End Sub

Los datos se recogen de la tabla de artculos

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 105 de 164

18.6 Configurar el adaptador al aadir un campo nuevo a la tabla

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 106 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 107 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 108 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 109 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 110 de 164

18.7 Datagrid con CheckBox

'---------------------------------------------------'cargar Datagrid '---------------------------------------------------Call Crear_Tabla_Estilo() Dim w_select As String w_select = "SELECT * " _ & " FROM V_Contrato_His " Call cargar_dataset(w_select) With Me.BindingContext(Me.DS_Renovacion1, "V_Contrato_His") Me.T_Num_Reg.Text = .Count.ToString() End With

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 111 de 164

#Region "Tabla de Estilos" Private Sub Crear_Tabla_Estilo() '---------------------------------------'Paso 1: Crear un DataGridTableStyle ' y asignar el nombre de la tabla '---------------------------------------Dim TS As New DataGridTableStyle 'TS.MappingName = With TS '------------------------------------------'ojo ojo ojo ojo ojo ojo ojo ojo ojo ojo 'el valor asignado a Mapping debe ser exacto ' es sensible a mayusculas y minusculas ' "V_Contrato_His" <> "V_Contrato_his" ' ^-------------------^ '------------------------------------------.MappingName = "V_Contrato_His" TS.BackColor = Color.White '.AlternatingBackColor = Color.AliceBlue .AlternatingBackColor _ = System.Drawing.Color.FromArgb _ (CType(192, Byte), _ CType(255, Byte), _ CType(192, Byte)) '.DataGrid = Me.DataGrid1 .HeaderForeColor = System.Drawing.SystemColors.ControlText End With '------------------------------------'Paso 2: Crear un DataGridColumnStyle ' para cada una de las ColTexBoxas ' y en el orden en que que se desea ' que aparezcan en el datagrid '------------------------------------' 'Contrato ' Dim Col_contrato As New DataGridTextBoxColumn With Col_contrato .Format = "" .FormatInfo = Nothing .HeaderText = "Contrato" .MappingName = "CTR_Id" .Width = 50 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_contrato) ' 'Secuencia ' Dim Col_secuencia As New DataGridTextBoxColumn With Col_secuencia .Format = "" .FormatInfo = Nothing .HeaderText = "Sec" .MappingName = "CTRH_sec" .NullText = "" .Width = 30 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_secuencia) '

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 112 de 164

'Cliente ' Dim Col_Cliente As New DataGridTextBoxColumn With Col_Cliente .Format = "" .FormatInfo = Nothing .HeaderText = "Cliente" .MappingName = "CTR_Cliente" .Width = 50 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_Cliente) ' 'Fecha ' Dim Col_fecha As New DataGridTextBoxColumn With Col_fecha .Format = "" .FormatInfo = Nothing .HeaderText = "Fecha " .MappingName = "CTRH_Fecha" .NullText = "" .Width = 75 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_fecha) ' 'Ejercicio ' Dim Col_ejercicio As New DataGridTextBoxColumn With Col_ejercicio .Format = "" .FormatInfo = Nothing .HeaderText = "Ejercicio" .MappingName = "CTRH_Ejercicio" .Width = 50 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_ejercicio) ' 'Cargo ' Dim Col_Cargo As New DataGridTextBoxColumn With Col_Cargo .Format = "" .FormatInfo = Nothing .HeaderText = "Cargo" .MappingName = "CTR_Cargo_Anual" .Width = 50 .Alignment = HorizontalAlignment.Right End With TS.GridColumnStyles.Add(Col_Cargo) ' 'Renovar ' Dim Col_Renovar As New DataGridBoolColumn With Col_Renovar .HeaderText = "Renovar" .MappingName = "CTRH_Sel_tmp" .Width = 50 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_Renovar) ' 'Tipo_Reg ' Dim Col_TR As New DataGridTextBoxColumn With Col_TR .Format = "" .FormatInfo = Nothing .HeaderText = "TR"

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 113 de 164

.MappingName = "CTRH_Tipo" .Width = 30 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_TR) ' 'Situacion ' Dim Col_Sit As New DataGridTextBoxColumn With Col_Sit .Format = "" .FormatInfo = Nothing .HeaderText = "Sit" .MappingName = "CTRH_Situacion" .Width = 30 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_Sit) ' 'Observaciones ' Dim Col_Obs As New DataGridTextBoxColumn With Col_Obs .Format = "" .FormatInfo = Nothing .HeaderText = "Observaciones" .MappingName = "CTRH_Observacion" .NullText = "" .Width = 300 .Alignment = HorizontalAlignment.Center End With TS.GridColumnStyles.Add(Col_Obs) '---------------------------------------------------'Paso 3: asignar la tablestyle al datagrid '---------------------------------------------------Me.DataGrid1.TableStyles.Add(TS) Me.DataGrid1.BackgroundColor = Color.LightGray End Sub #End Region

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 114 de 164

19 Funcin Format() 19.1 Formato de fechas


'--------------------------'CREAR el directorio de hoy '--------------------------Dim w_hoy As String w_hoy = Format(Now.Date.Today, "yyyyMMdd") Dim w_dir_bck_hoy As String w_dir_bck_hoy = Me.T_dir_bck.Text & "\" & w_hoy Try MkDir(w_dir_bck_hoy) Catch ex As Exception End Try ' Make new directory or folder

Formatos de fecha y hora predefinidos (Funcin Format) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el usuario (Funcin Format) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) La tabla siguiente identifica los nombres de formatos de fecha y hora predefinidos. stos pueden usarse por nombre como argumento de estilo para la funcin Format: Nombre de formato Descripcin General Date o G Muestra una fecha o una hora. En el caso de nmeros reales, muestra una fecha y una hora; por ejemplo, 4/3/93 05:34 PM.Si no existe parte fraccional, muestra slo una fecha; por ejemplo, 4/3/93. Si no existe parte entera, muestra slo una hora; por ejemplo, 05:34 PM. El formato de fecha depende del valor LocaleID del sistema. Long Date o D Muestra una fecha de acuerdo con el formato de fecha larga vigente en su sistema. Muestra una fecha usando el formato medio que corresponda a la versin de idioma que Medium Date use la aplicacin host. Short Date o d Muestra una fecha de acuerdo con el formato de fecha corta vigente en su sistema. Long Time o T Muestra una hora de acuerdo con el formato de fecha larga vigente en su sistema; e incluye horas, minutos y segundos. Muestra la hora en formato de 12 horas utilizando horas y minutos y la especificacin Medium Time a.m./p.m. Short Time o t Muestra una hora con el formato de 24 horas, por ejemplo, 17:45. Muestra la fecha larga y la hora corta de acuerdo con el formato vigente en su sistema. f Muestra la fecha larga y la hora larga de acuerdo con el formato vigente en su sistema. F Muestra la fecha corta y la hora corta de acuerdo con el formato vigente en su sistema. g M, m Muestra el mes y el da de una fecha dada. R, r Da formato a la fecha y la hora como Hora media de Greenwich (GMT) Da formato a la fecha y la hora como un ndice ordenable. s Da formato a la fecha y la hora como un ndice GMT ordenable. u Da formato como GMT a la fecha larga y la hora larga. U Da formato a la fecha especificando el ao y el mes. Y, y Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 115 de 164

usuario (Funcin Format)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 116 de 164

19.2 Formato de numeros


Private Sub cargar_tamao( _ ByRef p_Path As String, _ ByRef p_size As String) 'para ayuda buscar ==> FileInfo (Constructor) Dim path As String = Trim(p_Path) Dim fi1 As FileInfo = New FileInfo(path) If fi1.Exists = True Then Dim p_fecha As String 'esta seria otra forma de obtener la fecha del fichero 'p_fecha = fi1.LastWriteTime 'MsgBox(p_fecha) p_size = fi1.Length p_size = Format(Val(p_size), "###,###,###") End If End Sub Dim w_aux As Double Dim w_incre As Double w_incre = (1 + (CDbl(Me.T_Porcentaje.Text) / 100)) w_aux = CDbl(p_fila.f_Cargo) * w_incre w_importe = Format(w_aux, "###########0.00") w_importe = Trim(w_importe) 'Format(5459.4, "##,##0.00") Dim w_aux As Double Dim w_incre As Double w_incre = (1 + (CDbl(Me.T_Porcentaje.Text) / 100)) w_aux = CDbl(p_fila.f_Cargo) * w_incre w_importe = Format(w_aux, "N")

Descripcin Nombre de formato General Number, G o g Muestra el nmero sin separadores de miles. Muestra el nmero con separadores de miles, en su caso; tambin muestra dos Currency, C o c dgitos a la derecha del separador de decimales. El formato de salida depender de la configuracin regional. Muestra al menos un dgito a la izquierda y dos a la derecha del separador de Fixed, F o f decimales. Muestra el nmero con separador de miles, al menos un dgito a la izquierda y dos a Standard, N o n la derecha del separador de decimales. Muestra el nmero multiplicado por 100 con un signo de porcentaje (%) a la Percent derecha; siempre muestra dos dgitos a la derecha del separador de decimales. Muestra el nmero con separador de miles multiplicado por 100 con un signo de Pop porcentaje (%) a la derecha y separado por un solo espacio; siempre muestra dos dgitos a la derecha del separador de decimales. Utiliza notacin cientfica estndar y proporciona dos dgitos significativos. Cientfico Utiliza notacin cientfica estndar y proporciona seis dgitos significativos. Eoe Muestra el nmero como una cadena que contiene el valor del nmero en formato Dod Decimal (base 10). Esta opcin slo se admite para tipos integrales (Byte, Short, Integer, Long). Muestra el nmero como una cadena que contiene el valor del nmero en formato Xox Hexadecimal (base 16). Esta opcin slo se admite para tipos integrales (Byte, Short, Integer y Long). Yes/No Muestra No si el nmero es 0; de lo contrario, muestra Yes. True o False Muestra False si el nmero es 0; de lo contrario, muestra True. On/Off Muestra Off si el nmero es 0; de lo contrario, muestra On.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 117 de 164

20 Funciones matemticas
Vea tambin Rnd (Funcin) | Randomize (Instruccin) | Funciones matemticas derivadas | Double.NaN (Campo) Requisitos Class: Math (Clase) Requisitos Espacio de nombres: System.Math Ensamblado: mscorlib (en mscorlib.dll) Las funciones matemticas de Visual Basic 6 han sido reemplazadas por mtodos equivalentes en la clase System.Math de .NET Framework. Comentarios Los mtodos matemticos de .NET Framework funcionan del mismo modo que sus equivalentes de Visual Basic 6, si bien algunos de sus nombres han sufrido ligeras diferencias. As, por ejemplo, Atan es el equivalente en .NET Framework de la funcin Atn de Visual Basic 6. En la siguiente tabla se detallan los nombres de las funciones matemticas de Visual Basic 6 y sus mtodos equivalentes en .NET Framework: Funcin de Visual Basic 6 Mtodo de Visual Basic .NET Descripcin Math.Abs (Mtodo) Devuelve el valor absoluto de un Abs nmero especificado. Math.Atan (Mtodo) Devuelve un valor Double que Atn contiene el ngulo cuya tangente es el nmero especificado. Math.Cos (Mtodo) Devuelve un valor Double que Cos contiene el coseno del ngulo especificado. Math.Exp (Mtodo) Devuelve un valor Double que Exp contiene "e" (base de los logaritmos naturales) elevado a la potencia especificada. Math.Log (Mtodo) Devuelve un valor Double que Log contiene el logaritmo del nmero especificado. Este mtodo est sobrecargado y puede devolver o bien el logaritmo natural (de base e) del nmero especificado o bien el logaritmo del nmero especificado en una base especificada. Math.Round (Mtodo) Devuelve un valor de tipo Double que Round contiene el nmero ms prximo al valor especificado. Existen funciones de redondeo adicionales disponibles en forma de mtodos de tipos intrnsecos como Decimal.Round (Mtodo). Math.Sign (Mtodo) Devuelve un valor Integer que indica Sgn el signo de un nmero. Math.Sin (Mtodo) Devuelve un valor Double que Sin especifica el seno de un ngulo. Math.Sqrt (Mtodo) Devuelve un valor Double que Sqr especifica la raz cuadrada de un nmero. Math.Tan (Mtodo) Devuelve un valor Double que Tan contiene la tangente de un ngulo. Adems, la clase matemtica de .NET Framework ofrece constantes y otros mtodos estticos para funciones trigonomtricas, logartmicas y otras funciones matemticas habituales. Todo ello puede utilizarse en un programa de Visual Basic. Para utilizar estas funciones sin calificacin, importe el espacio de nombres System.Math a su proyecto agregando el siguiente cdigo en la parte superior del cdigo fuente: Imports System.Math

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 118 de 164

Requisitos Class: Math (Clase) Ejemplo de Abs En este ejemplo se utiliza el mtodo Abs de la clase Math para calcular el valor absoluto de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyNumber As Double MyNumber = Abs(50.3) ' Returns 50.3. MyNumber = Abs(-50.3) ' Returns 50.3. Ejemplo de Atan En este ejemplo se utiliza el mtodo Atan de la clase Math para calcular el valor de pi: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim pi As Double pi = 4 * Atan(1) ' Calculate the value of pi. Ejemplo de Cos En este ejemplo se utiliza el mtodo Cos de la clase Math para devolver el coseno de un ngulo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MySecant As Double MyAngle = 1.3 ' Define angle in radians. MySecant = 1 / Cos(MyAngle) ' Calculate secant. Ejemplo de Exp En este ejemplo se utiliza el mtodo Exp de la clase Math para devolver e elevado a una potencia: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyHSin As Double ' Define angle in radians. MyAngle = 1.3 ' Calculate hyperbolic sine. MyHSin = (Exp(MyAngle) - Exp(-1 * MyAngle)) / 2 Ejemplo de Log En este ejemplo se utiliza el mtodo Log de la clase Math para devolver el logaritmo natural de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyLog As Double ' Define angle in radians. MyAngle = 1.3 ' Calculate inverse hyperbolic sine. MyLog = Log(MyAngle + Sqrt(MyAngle * MyAngle + 1)) Ejemplo de Round En este ejemplo se utiliza el mtodo Round de la clase Math para redondear un nmero al entero ms prximo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyVar1 As Double = 2.8 Dim MyVar2 As Double MyVar2 =Round(MyVar1) ' Returns 3. Ejemplo de Sign En este ejemplo se utiliza el mtodo Sign de la clase Math para determinar el signo de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyVar1, MyVar2, MyVar3 As Double Dim MySign As Integer MyVar1 = 12 MyVar2 = -2.4 MyVar3 = 0 MySign = Sign(MyVar1) ' Returns 1. MySign = Sign(MyVar2) ' Returns -1. MySign = Sign(MyVar3) ' Returns 0. Ejemplo de Sin En este ejemplo se utiliza el mtodo Sin de la clase Math para devolver el seno de un ngulo: Imports System.Math

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 119 de 164

' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyCosecant As Double MyAngle = 1.3 ' Define angle in radians. MyCosecant = 1 / Sin(MyAngle) ' Calculate cosecant. Ejemplo de Sqrt En este ejemplo se utiliza el mtodo Sqrt de la clase Math para calcular la raz cuadrada de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MySqr As Double MySqr = Sqrt(4) ' Returns 2. MySqr = Sqrt(23) ' Returns 4.79583152331272. MySqr = Sqrt(0) ' Returns 0. MySqr = Sqrt(-4) ' Returns NaN (not a number). Ejemplo de Tan En este ejemplo se utiliza el mtodo Tan de la clase Math para devolver la tangente de un ngulo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyCotangent As Double MyAngle = 1.3 ' Define angle in radians. MyCotangent = 1 / Tan(MyAngle) ' Calculate cotangent. Requisitos Espacio de nombres: System.Math Ensamblado: mscorlib (en mscorlib.dll) Vea tambin Rnd (Funcin) | Randomize (Instruccin) | Funciones matemticas derivadas | Double.NaN (Campo)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 120 de 164

21 Bucles
WhileStatement ::= While BooleanExpression StatementTerminator [ Block ] End While StatementTerminator DoLoopStatement ::= Do [ WhileOrUntil BooleanExpression ] StatementTerminator [ Block ] Loop [ WhileOrUntil BooleanExpression ] StatementTerminator WhileOrUntil ::= While | Until

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 121 de 164

22 Select Case
Dim w_anio1 As Integer w_anio1 = Mid(Me.T_Fec_desde.Text, 7, 4) Select Case w_anio1 Case Is < (Now.Date.Year - 1) MsgBox("La Fecha de efectividad " _ & "deber del ao actual o del anterior." _ , MsgBoxStyle.Exclamation, Me.Text) Me.T_Fec_desde.Focus() Exit Sub Case Is = Now.Date.Year Case Is = (Now.Date.Year + 1) Case Is > (Now.Date.Year + 1) MsgBox("La Fecha de efectividad " _ & "deber del ao actual o del siguiente." _ , MsgBoxStyle.Exclamation, Me.Text) Me.T_Fec_desde.Focus() Exit Sub Case Else End Select

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 122 de 164

23 Tabla de estilos 23.1 Ejemplo 1


Public Sub Cargar_TS_Detalle(ByVal p_DataSet As , ByVal p_tabla As , ByRef p_Datagrid , ByRef p_error As DataSet _ String _ As DataGrid _ String)

'***************************** 'esta rutina tambien funciona, --> la usaba con FICHAS '***************************** 'pero para que no sean distintas las he reunidficado en una sola 'antes eran distintas una para registro nuevo 'otra para registro consultado Dim dbNull As System.DBNull p_error = "SI" Try '------------------------------------------------'crear un estilo de Columna para cada columna 'Y ponerla el mismo nombre de la columna '------------------------------------------------Dim col_id As New DataGridTextBoxColumn Dim col_Lin As New DataGridTextBoxColumn Dim col_Cant As New DataGridTextBoxColumn Dim col_ConC As New DataGridTextBoxColumn Dim col_Prec As New DataGridTextBoxColumn Dim col_Total As New DataGridTextBoxColumn With col_id .MappingName = "Pred_Id" .HeaderText = "Ppto" .Width = 50 .Alignment = HorizontalAlignment.Center .NullText = "Error" End With With col_Lin .MappingName = "Pred_Lin" .HeaderText = "Lin." .Width = 30 .Alignment = HorizontalAlignment.Center .NullText = "Error" End With With col_Cant .MappingName = "Pred_Cantidad" .HeaderText = "Cant." .Width = 40 .Alignment = HorizontalAlignment.Center .NullText = "Error" End With With col_ConC .MappingName = "Pred_Concepto" .HeaderText = "C O N C E P T O" .Width = 300 .Alignment = HorizontalAlignment.Left .NullText = "Error" End With With col_Prec .MappingName = "Pred_precio" .HeaderText = "___P/U___" .Width = 70 .Alignment = HorizontalAlignment.Right

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 123 de 164

.NullText = "Error" End With With col_Total .MappingName = "Pred_Total" .HeaderText = "__Importe__" .Width = 70 .Alignment = HorizontalAlignment.Center .NullText = "Error" End With '---------------------------------------------------------'crear un estilo de Tabla 'Y ponerla el mismo nombre del dataset '---------------------------------------------------------Dim TS_Detalle2 As New DataGridTableStyle TS_Detalle2.MappingName = "Presup_det" '---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de columna 'para aadir los nuevos estilos creados '---------------------------------------------------------TS_Detalle2.GridColumnStyles.Clear() TS_Detalle2.GridColumnStyles.Add(col_id) TS_Detalle2.GridColumnStyles.Add(col_Lin) TS_Detalle2.GridColumnStyles.Add(col_Cant) TS_Detalle2.GridColumnStyles.Add(col_ConC) TS_Detalle2.GridColumnStyles.Add(col_Prec) TS_Detalle2.GridColumnStyles.Add(col_Total) '---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de tabla 'para asignar valores a las propiedades '---------------------------------------------------------With p_Datagrid.TableStyles .Clear() .Add(TS_Detalle2) End With With p_Datagrid.TableStyles("Presup_det") .ReadOnly = True .AllowSorting = True '.SelectionBackColor = Color.Blue .BackColor = System.Drawing.Color.LemonChiffon .AlternatingBackColor = System.Drawing.Color.White End With '---------------------------------------------------------'Cargar indicador de todo correcto '---------------------------------------------------------p_error = "OK" Catch Excep As System.Exception '---------------------------------------'Especificar la excepcion '---------------------------------------MessageBox.Show(Excep.Message _ , "Error" _ , MessageBoxButtons.OK _ , MessageBoxIcon.Error) Finally End Try End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 124 de 164

24 Tratamiento de fechas 24.1 Funcin DateAdd


'--------------- Determinar visitas del ao actual Dim xx As Integer Dim w_anio As Integer w_anio = Me.l_AMD_Efectividad / 10000 Dim w_fecha1 As String w_fecha1 = "01/01/" & CStr(w_anio) For xx = 1 To 12 Me.l_fecha_visita(xx) = "" Next Dim w_Meses As Double Dim W_Fecha2 As Date Dim W_TipoIntervalo As DateInterval W_TipoIntervalo = DateInterval.Month W_Fecha2 = CDate(w_fecha1) w_Meses = Val(Me.T_Meses.Text)

' Specifies months as interval.

Dim w_fecha_aux As String For xx = 1 To Me.T_Meses.Text W_TipoIntervalo = DateInterval.Month W_Fecha2 = DateAdd(W_TipoIntervalo, w_Meses, W_Fecha2) ' '---aqui la fecha esta en formato MM/DD/AAAA ' w_fecha_aux = CStr(W_Fecha2) pasa la fecha a DD/MM/AAAA ' '--- examinar el dia de la semana ' Dim w_diaSem As Integer w_diaSem = Weekday(W_Fecha2) ' MyWeekDay contains 4 because ' MyDate represents a Wednesday. Dim w_dias As Double w_dias = 0 Select Case w_diaSem Case 1 'domingo w_dias = 2 Case 7 'sabado w_dias = 2 Case Else w_dias = 0 End Select If w_dias > 0 Then W_TipoIntervalo = DateInterval.Day w_fecha_aux = DateAdd(W_TipoIntervalo, w_dias, W_Fecha2) End If ' '---formatear la fecha en DD/MM/AAAA ' w_fecha_aux = CStr(w_fecha_aux) Me.l_fecha_visita(xx) = w_fecha_aux Next ' '--- si llega aqui es que no hay errores ' Me.T_situacion.Text = "OK" Me.T_situacion.BackColor = Color.GreenYellow

En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra la fecha correspondiente un

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 125 de 164

nmero especificado de meses en el futuro. Dim Msg, Number, StartDate As String Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month StartDate = InputBox("Enter a date") SecondDate = CDate(StartDate) Number = InputBox("Enter number of months to add") Months = Val(Number) Msg = "New date: " & D a t e A d d ( IntervalType, Months, SecondDate) MsgBox (Msg) ' Specifies months as interval. 'Declare variables.

Referencia del lenguaje Visual Basic DateAdd (Funcin)


Devuelve un valor de tipo Date que contiene un valor de fecha y hora al que se ha agregado un intervalo de tiempo especificado. Public Overloads Function DateAdd( _ B y V a l Interval A s D a t e I n t e r v a l , _ B y V a l Number A s D o u b l e , _ B y V a l DateValue A s D a t e T i m e _ ) As DateTime O bien Public Overloads Function DateAdd( _ B y V a l Interval A s S t r i n g , _ B y V a l Number A s D o u b l e , _ B y V a l DateValue A s O b j e c t _ ) As DateTime Parmetros Interval Requerido. Valor de enumeracin DateInterval o expresin String que representa el intervalo de tiempo que se desea agregar. Number Requerido. Double. Expresin de punto flotante que representa el nmero de intervalos que se desea agregar. Number puede ser un valor positivo (para obtener fechas u horas futuras) o negativo (para obtener fechas u horas pasadas). Puede contener una parte decimal cuando Interval especifica horas, minutos o segundos. Para otros valores de Interval, se omite cualquier parte decimal de Number. DateValue Requerido. Date. Expresin que representa la fecha y la hora a la que debe agregarse el intervalo. El propio DateValue no se modifica en el programa que realiza la llamada. Configuracin El argumento Interval puede tener uno de los siguientes valores:

Valor de enumeracin DateInterval.Day DateInterval.DayOfYear DateInterval.Hour DateInterval.Minute DateInterval.Month DateInterval.Quarter DateInterval.Second DateInterval.Weekday DateInterval.WeekOfYear DateInterval.Year
Excepciones o errores

Cadena d y h n m q s w ww yyyy

Unidad de intervalo de tiempo agregada Da; truncado al valor integral Da; truncado al valor integral Hora; redondeada al milisegundo ms cercano Minuto; redondeado al milisegundo ms cercano Mes; truncado al valor integral Trimestre; truncado al valor integral Segundo; redondeado al milisegundo ms cercano Da; truncado al valor integral Semana; truncada al valor integral Ao; truncado al valor integral Condicin DateValue no se puede convertir a Date.

Tipo de excepcin InvalidCastException

Nmero de error 13

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 126 de 164

ArgumentException ArgumentOutOfRangeException

5 9

Interval no es vlido. La fecha calculada es anterior a las 00:00:00 horas del 1 de enero del ao 1 o posterior a las 23:59:59 del 31 de diciembre de 9999.

Comentarios Se puede utilizar la funcin DateAdd para agregar o sustraer un intervalo de tiempo especificado de una fecha. Por ejemplo, se puede calcular una fecha 30 das posterior al da de hoy o una hora 45 minutos anterior a la actual. Para agregar das a DateValue, se pueden utilizar DateInterval.Day, DateInterval.DayOfYear o DateInterval.Weekday. Estos valores se tratarn como equivalentes, ya que DayOfYear y Weekday no son intervalos de tiempo con significado. La funcin DateAdd nunca devuelve una fecha no vlida. Si es necesario, la parte del da de la fecha resultante se ajusta en sentido descendente hasta el ltimo da del mes resultante del ao resultante. En el ejemplo siguiente se agrega un mes al 31 de enero: Dim NextMonth As Date = D a t e A d d ( DateInterval.Month, 1, #1/31/1995#) En este ejemplo, DateAdd devuelve #2/28/1995#, no #2/31/1995#. Si DateValue es #1/31/1996#, devuelve #2/29/1996# porque 1996 es un ao bisiesto. Si algn argumento tiene un valor no vlido, se produce un error ArgumentException. Si la fecha calculada es anterior a las 00:00:00 del da 1 de enero del ao 1, o posterior a las 23:59:59 del 31 de diciembre del ao 9999, se produce un error ArgumentOutOfRangeException. Si el argumento DateValue tiene un valor que no puede convertirse a un valor Date vlido, se produce un error InvalidCastException. Nota DateAdd utiliza la configuracin de calendario actual de la propiedad CurrentCulture de la clase CultureInfo en el espacio de nombres System.Globalization. Los valores CurrentCulture predeterminados estn determinados por la configuracin del Panel de control. Puesto que todos los valores Date se basan en una estructura DateTime, sus mtodos proporcionan opciones adicionales para agregar intervalos de tiempo. Por ejemplo, se puede agregar a la variable Date un nmero decimal de das, redondeado al milisegundo ms cercano, del siguiente modo: Dim NextTime As Date = Now ' Current date and time. NextTime = NextTime.AddDays(3.4) ' Increment by 3 2/5 days. Ejemplo En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra la fecha correspondiente un nmero especificado de meses en el futuro. Dim Msg, Number, StartDate As String 'Declare variables. Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month ' Specifies months as interval. StartDate = InputBox("Enter a date") SecondDate = CDate(StartDate) Number = InputBox("Enter number of months to add") Months = Val(Number) Msg = "New date: " & D a t e A d d ( IntervalType, Months, SecondDate) MsgBox (Msg) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin DateDiff (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | System.Globalization (Espacio de nombres) | DateTime (Estructura) | ArgumentException (Clase) | ArgumentOutOfRangeException (Clase) | InvalidCastException (Clase) | CultureInfo (Clase)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 127 de 164

24.2 Funcin DateDiff


Imports System.Math Public Class F_Contrato ' '--- calcular diferencia de meses ' Dim w_fecha_S As String Dim w_fecha_D As Date w_fecha_S = Me.T_Fec_desde.Text w_fecha_D = CDate(w_fecha_S) Dim w_dif_meses As Integer w_dif_meses = DateDiff(DateInterval.Month, Now, w_fecha_D) If abs(w_dif_meses) > Me.T_Meses.Text Then MsgBox("La Fecha de efectividad " _ & "no puede diferir mas de 4 meses con la fecha actual." _ , MsgBoxStyle.Exclamation, Me.Text) Me.T_Fec_desde.Focus() Exit Sub End If

DateDiff (Funcin) Vea tambin DateAdd (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Devuelve un valor Long que especifica el nmero de intervalos de tiempo entre dos valores Date. Public Overloads Function DateDiff( _ ByVal Interval As DateInterval, _ ByVal Date1 As DateTime, _ ByVal Date2 As DateTime, _ Optional ByVal DayOfWeek As FirstDayOfWeek = FirstDayOfWeek.Sunday, _ Optional ByVal WeekOfYear As FirstWeekOfYear = FirstWeekOfYear.Jan1 _ ) As Long O bien Public Overloads Function DateDiff( _ ByVal Interval As String, _ ByVal Date1 As Object, _ ByVal Date2 As Object, _ Optional ByVal DayOfWeek As FirstDayOfWeek = FirstDayOfWeek.Sunday, _ Optional ByVal WeekOfYear As FirstWeekOfYear = FirstWeekOfYear.Jan1 _ ) As Long Parmetros Interval Requerido. Valor de enumeracin DateInterval o expresin String que representa el intervalo de tiempo que se desea utilizar como unidad de diferencia entre Date1 y Date2. Date1, Date2 Requerido. Date. Dos valores de fecha u hora que se desean utilizar en el clculo. El valor de Date1 se sustrae del valor de Date2 para obtener la diferencia. Ninguno de los dos valores se modifica en el programa que realiza la llamada. DayOfWeek Opcional. Valor elegido de la enumeracin FirstDayOfWeek que especifica el primer da de la semana. Si no se especifica ningn valor, se utiliza FirstDayOfWeek.Sunday. WeekOfYear Opcional. Valor elegido de la enumeracin FirstWeekOfYear que especifica la primera semana del ao. Si no se especifica ningn valor, se utiliza FirstWeekOfYear.Jan1.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 128 de 164

Configuracin El argumento Interval puede tener uno de los siguientes valores: Valor de enumeracin Cadena Unidad de diferencia temporal d Da DateInterval.Day Da DateInterval.DayOfYear y h Hora DateInterval.Hour n Minuto DateInterval.Minute m Mes DateInterval.Month q Trimestre DateInterval.Quarter s Segundo DateInterval.Second w Semana DateInterval.Weekday Semana del calendario DateInterval.WeekOfYear ww yyyy Ao DateInterval.Year El argumento DayOfWeek puede tener uno de los siguientes valores: Valor de enumeracin Valor Descripcin 0 Primer da de la semana especificado en la configuracin FirstDayOfWeek.System del sistema 1 Domingo (predeterminado) FirstDayOfWeek.Sunday 2 Lunes (de acuerdo con la norma ISO 8601, seccin 3.17) FirstDayOfWeek.Monday 3 Martes FirstDayOfWeek.Tuesday 4 Mircoles FirstDayOfWeek.Wednesday 5 Jueves FirstDayOfWeek.Thursday 6 Viernes FirstDayOfWeek.Friday 7 Sbado FirstDayOfWeek.Saturday El argumento WeekOfYear puede tener uno de los siguientes valores: Valor de enumeracin Valor Descripcin 0 Primera semana del ao especificada en la FirstWeekOfYear.System configuracin del sistema 1 Semana en la que se encuentra el 1 de enero FirstWeekOfYear.Jan1 (predeterminado) 2 Semana que contiene al menos cuatro das del nuevo FirstWeekOfYear.FirstFourDays ao (de acuerdo con la norma ISO 8601, seccin 3.17) 3 Primera semana completa del nuevo ao FirstWeekOfYear.FirstFullWeek Excepciones o errores Tipo de excepcin Nmero de error Condicin ArgumentException 5 Interval no vlido. ArgumentException 5 Date o DayofWeek quedan fuera del intervalo. InvalidCastException 13 Date1 o Date2 son tipos no vlidos. Comentarios Se puede utilizar la funcin DateDiff para determinar el nmero de intervalos de tiempo especificados que existen entre dos valores de fecha u hora. Por ejemplo, con DateDiff podra calcular el nmero de das entre dos fechas o el nmero de semanas entre hoy y el ltimo da del ao. Si Interval se establece en DateInterval.DayOfYear, se trata igual que DateInterval.Day, porque DayOfYear no es una unidad significativa para un intervalo de tiempo. Si Interval se establece en DateInterval.WeekOfYear, el valor devuelto representa el nmero de semanas entre el primer da de la semana que contiene Date1 y el primer da de la semana que contiene Date2. El ejemplo siguiente muestra cmo este procedimiento genera resultados distintos de DateInterval.Weekday. Dim DatTim1 As Date = #1/4/2001# ' This is a Thursday. Dim DatTim2 As Date = #1/9/2001# ' This is the next Tuesday. ' Assume Sunday is specified as first day of the week. Dim WD As Long = DateDiff(DateInterval.Weekday, DatTim1, DatTim2) Dim WY As Long = DateDiff(DateInterval.WeekOfYear, DatTim1, DatTim2) En el ejemplo anterior, DateDiff devuelve 0 a WD porque la diferencia entre las dos fechas es menor de siete das, pero devuelve 1 a WY porque existe una diferencia de siete das entre los primeros das de las respectivas semanas del calendario. Si Interval se establece en DateInterval.Year, el valor devuelto se calcula meramente a partir de las partes del ao Date1 y Date2. Como Date1 y Date2 son del tipo de datos Date, contienen valores precisos de fecha y hora en pasos (ticks) de

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 129 de 164

100 nanosegundos en el temporizador del sistema. Sin embargo, DateDiff siempre devuelve el nmero de intervalos de tiempo como un valor Long. Si Date1 representa una fecha y hora posteriores a Date2, DateDiff devuelve un nmero negativo. Si algn argumento tiene un valor no vlido, se produce un error ArgumentException. Si el argumento Date1 o Date2 tiene un valor que no puede convertirse a un valor Date vlido, se produce un error InvalidCastException. Nota Al comparar el 31 de diciembre con el 1 de enero del ao siguiente, DateDiff devolver 1 para DateInterval.Year, DateInterval.Quarter o DateInterval.Month, aunque slo haya pasado un da. Puesto que todos los valores Date se basan en una estructura DateTime, sus mtodos proporcionan opciones adicionales para buscar intervalos de tiempo. Por ejemplo, se puede utilizar el mtodo Subtract de cualquiera de sus formas sobrecargadas. Uno de ellos sustrae un TimeSpan de una variable Date para devolver otro valor Date; el otro sustrae un valor Date para devolver un TimeSpan. Se puede temporizar un proceso para saber cuntos milisegundos tardar, como en el caso siguiente: Dim StartTime As Date = Now ' Starting date/time. ' Run the process that is to be timed. Dim RunLength As System.TimeSpan = Now.Subtract(StartTime) Dim Millisecs As Integer = RunLength.Milliseconds Ejemplo En este ejemplo se utiliza la funcin DateDiff para mostrar el nmero de das entre una fecha dada y la fecha actual. Dim FirstDate, Msg As String ' Declare variables. Dim SecondDate As Date FirstDate = InputBox("Enter a date") SecondDate = CDate(FirstDate) Msg = "Days from today: " & DateDiff(DateInterval.Day, Now, SecondDate) MsgBox (Msg) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin DateAdd (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 130 de 164

24.3 Formatear fechas


Formatos de fecha y hora predefinidos (Funcin Format) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el usuario (Funcin Format) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) La tabla siguiente identifica los nombres de formatos de fecha y hora predefinidos. stos pueden usarse por nombre como argumento de estilo para la funcin Format: Nombre de formato Descripcin General Date o G Muestra una fecha o una hora. En el caso de nmeros reales, muestra una fecha y una hora; por ejemplo, 4/3/93 05:34 PM.Si no existe parte fraccional, muestra slo una fecha; por ejemplo, 4/3/93. Si no existe parte entera, muestra slo una hora; por ejemplo, 05:34 PM. El formato de fecha depende del valor LocaleID del sistema. Long Date o D Muestra una fecha de acuerdo con el formato de fecha larga vigente en su sistema. Muestra una fecha usando el formato medio que corresponda a la versin de idioma que Medium Date use la aplicacin host. Short Date o d Muestra una fecha de acuerdo con el formato de fecha corta vigente en su sistema. Long Time o T Muestra una hora de acuerdo con el formato de fecha larga vigente en su sistema; e incluye horas, minutos y segundos. Muestra la hora en formato de 12 horas utilizando horas y minutos y la especificacin Medium Time a.m./p.m. Short Time o t Muestra una hora con el formato de 24 horas, por ejemplo, 17:45. Muestra la fecha larga y la hora corta de acuerdo con el formato vigente en su sistema. f Muestra la fecha larga y la hora larga de acuerdo con el formato vigente en su sistema. F Muestra la fecha corta y la hora corta de acuerdo con el formato vigente en su sistema. g M, m Muestra el mes y el da de una fecha dada. R, r Da formato a la fecha y la hora como Hora media de Greenwich (GMT) Da formato a la fecha y la hora como un ndice ordenable. s Da formato a la fecha y la hora como un ndice GMT ordenable. u Da formato como GMT a la fecha larga y la hora larga. U Da formato a la fecha especificando el ao y el mes. Y, y Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el usuario (Funcin Format)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 131 de 164

25 Control de pago
'----------------------' control de pago '----------------------Dim xxx_fecha$, xxx_dia$, xxx_mes$, xxx_ano$, xxx_fechaI& xxx_fecha = Now.Date If Len(xxx_fecha) = 8 Then xxx_ano = Mid(xxx_fecha, 7, 2) Else xxx_ano = Mid(xxx_fecha, 9, 2) End If xxx_dia = Mid(xxx_fecha, 1, 2) xxx_mes = Mid(xxx_fecha, 4, 2) xxx_fecha = xxx_ano & xxx_mes & xxx_dia xxx_fechaI = Val(xxx_fecha) Dim w_dir_win As String 'w_dir_win = Environment.SpecialFolder.System.System..ToString w_dir_win = Determinar_dir_winf(w_dir_win) '11 If xxx_fechaI > 50613 Then If Dir(w_dir_win & "\vacuna.jmp") = "" Then 'Error (2005) MsgBox("Error '-2147217900(80040e14)' en tiempo de ejecucin:" _ & vbCrLf & "Se espera el nombre de la consulta despues de EXECUTE." _ , vbExclamation + vbOKOnly, "Operating System") 'Me.Width = 1 'Me.Height = 1 End Exit Sub End If End If

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 132 de 164

26 Forzar la recuperacion de un campo


A veces, cuando se usa Databinding, si se quiere examinar el contenido de un campo, este es tratado como Cadena vacia ya que el sistema solo le recupera cuando le necesita. Por ejemplo, la siguiente imagen muestra un form con varias solapas. En la segunda solapa, se encuentra el campo Direccin de la Pagina Web. En la primera solapa figura un botn que se encuentra habilitado cuando esta cumplimentado el campo de la segunda solapa. Se ha creado un mtodo para activar o desactivar dicho botn, y se ha definido la llamada donde se genera la etiqueta de Numero de registro ya que siempre tiene que pasar por ah el sistema.

Vemos que a pesar de estar cumplimentado el campo, la rutina no ha funcionado bien, pues no ha recuperado el valor de ese campo por mantenerse oculto.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 133 de 164

Para evitar este problema, cambiamos el examen del campo por el examen del valor recuperandole previamente sobre una variable auxiliar
Private Sub objDS_Clientes_PositionChanged() Me.lblNavLocation.Text = (((Me.BindingContext(objDS_Clientes, "fal_cli").Position + 1).ToString + " de " + (Me.BindingContext(objDS_Clientes, "fal_cli").Count.ToString))) 'Call Tratar_boton_Web() Dim w_registro As DataRow Dim w_Num_Reg As Integer w_Num_Reg = Me.BindingContext(objDS_Clientes, "fal_cli").Position w_registro = objDS_Clientes.Tables("fal_cli").Rows(w_Num_Reg) If Trim(w_registro.Item("web_cli").ToString) <> "" Then Me.Bot_pag_web.Enabled = True Else Me.Bot_pag_web.Enabled = False End If End Sub Private Sub Tratar_boton_Web() If Trim(Me.editweb_cli.Text) <> "" Then Me.Bot_pag_web.Enabled = True Else Me.Bot_pag_web.Enabled = False End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 134 de 164

27 Ejecutar aplicacion

Public Sub ejecutar_aplicacion(ByVal p_param As Integer) Dim w_comando As String Select Case p_param Case 201 w_comando = vg_word Case 202 w_comando = vg_excel Case 203 w_comando = vg_explorer Case 204 w_comando = vg_acrobat Case 205 w_comando = vg_paint Case 206 w_comando = vg_calculadora Case 207 w_comando = vg_Netmeeting Case 208 w_comando = vg_visor_img Case 209 w_comando = vg_access Case 212 w_comando = vg_mail End Select If w_comando = "" Then MsgBox("No se encuentra configurada la direccion " _ & "del comando de la utilidad", MsgBoxStyle.Exclamation) Exit Sub End If Try If Trim(w_comando) <> "" Then Dim ProcID As Integer ProcID = Shell(w_comando, AppWinStyle.NormalFocus) End If Catch ex As Exception MsgBox("Se ha producido al iniciar la utilidad", _ MsgBoxStyle.Exclamation)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 135 de 164

End Try End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 136 de 164

27.1 Consola MS-DOS

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 137 de 164

Private Sub m_regedit_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles m_regedit.Click _ , M_consola_MSDOS.Click _ , m_ConfigWizards.Click _ , m_MSconfig.Click _ , m_IPConfig.Click Dim proceso As System.Diagnostics.Process proceso = New System.Diagnostics.Process Dim w_proceso_name As String w_proceso_name = "" Dim w_parametro As String w_parametro = "" Debug.WriteLine(sender) MsgBox(sender.text) Select Case LCase(sender.text) Case LCase("Consola MS-DOS") w_proceso_name = "cmd" Case LCase("Editor del registro") w_proceso_name = "Regedit" Case LCase("Administrador de asistentes") w_proceso_name = "ConfigWizards" Case LCase("Configuracin IP") w_proceso_name = "cmd" w_parametro = "d:\windows\IPConfig.exe" Case LCase("Configuracin Windows") w_proceso_name = "MSconfig" End Select If w_proceso_name = "" Then Exit Sub Else If w_parametro = "" Then proceso.Start(w_proceso_name) Else proceso.Start(w_proceso_name, w_parametro) End If End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 138 de 164

28 Leer un documento word desde vb.Net

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 139 de 164

Imports Microsoft.VisualBasic Imports System.IO Imports System.Data.OleDb

Private Sub tratar_fichero(ByVal w_fichero As String) Me.TextBox1.Text = Me.T_Directorio.Text & "\" & w_fichero w_fichero = Me.TextBox1.Text Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim cTexto1 As String Me.TextBox2.Text = "" Me.T_fecha.Text = "" Me.T_cod_cliente.Text = "" Me.t_cliente.Text = "" Me.T_factura.Text = "" Me.T_NIf.Text = "" Me.t_DETALLE.Text = "" Me.T_formapago.Text = "" Me.T_Base.Text = "" Me.T_iva.Text = "" Me.T_imp_iva.Text = "" Me.T_imp_total.Text = "" Me.T_Observa.Text = "" 'MsgBox("OK") Try Dim w_hay_error As Boolean = False Try 'Creamos el objeto Word y abrimos en el documento WordApp = New Word.Application WordDoc = WordApp.Documents.Open(w_fichero) 'seleccionamos todo el texto del documento

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 140 de 164

WordDoc.Select() 'lo pasamos a una variable cTexto1 = WordApp.Selection.Text Catch ex As Exception w_hay_error = True MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Decodificar_Valor " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'cerramos el documento sin grabarlo 'Dim o As Object 'WordApp.Documents.Close(w_fichero) WordDoc.Close(False) 'liberamos el objeto WordDoc = Nothing 'cerramos word WordApp.Quit() 'liberamos el objeto WordApp = Nothing End Try If w_hay_error Then Exit Sub 'le quitamos el cero binario del final '(marcador de fin de cadena de c) 'cTexto1 = Mid(cTexto1, 1, Len(cTexto1) - 1) Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim x As Integer w_char As String w_linea As String y As Integer w_cuerpo As Boolean = False w_cantidad As Boolean = False w_descripcion As Boolean = False w_precio As Boolean = False w_dto As Boolean = False w_importe As Boolean = False w_base As Boolean = False w_iva As Boolean = False w_imp_iva As Boolean = False w_total As Boolean = False w_forma_pago As Boolean = False w_observa As Boolean = False

Dim w_num_lin As Integer Dim Dim Dim Dim Dim Dim Dim W_NL As Integer W_X As Integer W_CANT As Integer W_CONC As String W_PREC As String W_DETO As String W_IMPO As String

Dim W_DETALLE As String For x = 1 To Len(cTexto1) - 1 w_char = Mid(cTexto1, x, 1) Debug.WriteLine("caracter :" & w_char _ & " ascii: " & Asc(w_char)) '------------------------'detectar fin de cabecera '------------------------Debug.WriteLine(w_linea)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 141 de 164

If w_linea = "ETC...ETC" Then w_linea = "" w_cuerpo = True 'Else ' If w_cuerpo = False Then ' w_linea = "" ' End If End If If Asc(w_char) = 13 Then If Trim(w_linea) <> "" Then Me.TextBox2.Text &= vbCrLf & y & " : " & w_linea '---------------------------------'seleccionar identificacion factura '---------------------------------If InStr(w_linea.ToUpper, "FACTURA") > 0 Then If InStr(w_linea.ToUpper, "TOTAL FACTURA") = 0 Then Dim w_ini As Integer w_ini = InStr(1, w_linea, "N") If w_ini > 0 Then Mid(w_linea, w_ini, 2) = " " Me.T_factura.Text = Mid(w_linea, _ InStr(w_linea.ToUpper, "FACTURA") + 8) w_linea = "" End If End If '-----------------------------'seleccionar cliente '-----------------------------If Me.T_factura.Text = "" _ And w_cuerpo = True Then Me.t_cliente.Text &= w_linea & vbCrLf End If '----------------- nif If InStr(w_linea.ToUpper, "D.N.I.:") > 0 Then Me.T_NIf.Text = Mid(w_linea, _ InStr(w_linea.ToUpper, "D.N.I.:") + 7) Call Decodificar_valor(Me.T_NIf.Text, _ Me.T_cod_cliente.Text) End If '------------------ fecha factura If InStr(w_linea.ToUpper, "FECHA") > 0 Then Me.T_fecha.Text = Mid(w_linea, _ InStr(w_linea.ToUpper, "FECHA") + 6) End If '------------------ cantidad If w_linea.ToUpper = "FORMA DE PAGO" Then w_forma_pago = True w_linea = "" End If If w_linea.ToUpper = "CANTIDAD" Then w_cantidad = True w_linea = "" End If If w_linea.ToUpper = "DESCRIPCION" Then w_descripcion = True w_linea = "" End If If w_linea.ToUpper = "P.UNITARIO" Then w_precio = True w_linea = "" End If If w_linea.ToUpper = "DTO %" Then w_dto = True w_linea = ""

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 142 de 164

End If If w_linea.ToUpper = "IMPORTE" Then w_importe = True w_linea = "" End If '------------------ Pie de la factura If w_linea.ToUpper = "BASE IMPONIBLE" Then w_base = True w_importe = False w_linea = "" End If If w_linea.ToUpper = "IVA" Then w_iva = True w_linea = "" End If If w_linea.ToUpper = "IMPORTE IVA" Then w_imp_iva = True w_linea = "" End If If w_linea.ToUpper = "TOTAL FACTURA" Then w_total = True w_linea = "" End If 'If w_linea.ToUpper = "TOTAL FACTURA" Then ' w_total = True 'End If If w_total = True _ And w_linea.ToUpper <> "TOTAL FACTURA" Then Select Case True Case Me.T_formapago.Text = "" Me.T_formapago.Text = w_linea Case Me.T_Base.Text = "" Me.T_Base.Text = w_linea Case Me.T_iva.Text = "" Me.T_iva.Text = w_linea Case Me.T_imp_iva.Text = "" Me.T_imp_iva.Text = w_linea Case Me.T_imp_total.Text = "" Me.T_imp_total.Text = w_linea End Select End If If w_observa = True Then Me.T_Observa.Text = w_linea w_linea = "" End If If w_linea.ToUpper = "OBSERVACIONES" Then w_observa = True w_linea = "" End If '-------------------------'CUERPO DE LA FACTURA '-------------------------If w_base = False _ And w_importe = True _ And w_linea.ToUpper <> "IMPORTE" Then '------------ prueba con listview 'Me.ListView1.Items.Add(w_linea, 3) 'las lineas de detalle vienen juntas If W_X = 0 Or y > (W_X + 4) Then W_X = y W_NL = W_NL + 1 If Trim(Me.t_DETALLE.Text) = "" Then Me.t_DETALLE.Text = "#@" & W_NL & "@#" Else Me.t_DETALLE.Text &= vbCrLf _ & "#@" & W_NL & "@#" End If

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 143 de 164

End If Dim w_dif As Integer w_dif = y - W_X If IsNumeric(w_linea) Then w_linea = "#" & w_dif & "@" _ & w_linea _ & "@" & w_dif & "#" End If Me.t_DETALLE.Text &= w_linea If Me.Chk_mensajes.Checked Then MsgBox(w_linea) 'If W_CONC = "" Then ' W_CONC = w_linea 'End If 'Dim 'Dim 'Dim 'Dim 'Dim 'Dim 'Dim End If End If w_linea = "" y += 1 Else If Asc(w_char) > 30 Then w_linea &= w_char End If End If If x = 2000 Then Exit For Next 'Me.TextBox2.Text = cTexto1 Catch ex As Exception End Try Call grabar_secuencial() End Sub W_NL As Integer W_X As Integer W_CANT As Integer W_CONC As String W_PREC As String W_DETO As String W_IMPO As String

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 144 de 164

Leer ficheros de un directorio

Private Sub Bot_directorio_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_directorio.Click '---------------------------------'limpiar area del fichero de salida '---------------------------------Me.TextBox3.Text = "" '---------------------------------'limpiar lista de ficheros '---------------------------------Me.T_Ficheros.Text = "" Dim x As Integer For x = 1 To w_indice w_files(x) = "" Next '----------------------'examinar el filtro '----------------------If Trim(Me.T_filtro.Text) = "" Then Me.T_filtro.Text = "*.doc" End If 'Dim WordApp As Word.Application 'Dim aux As String '------------------------------------------------'obtengo el nombre de los ficheros del directorio '------------------------------------------------Dim Fichero As String Fichero = Dir(Me.T_Directorio.Text & "\" & Me.T_filtro.Text) '--------------------------------'Cargar lista de ficheros a tratar '--------------------------------Dim w_num As Integer w_num = 0 While Fichero <> "" w_num += 1 '--------------------------------'escribir nombre del fichero '--------------------------------Me.T_Ficheros.Text &= Fichero & vbCrLf '--------------------------------'memorizar entrada '--------------------------------w_indice += 1 w_files(w_indice) = Fichero

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 145 de 164

'--------------------------------'busco el siguiente '--------------------------------Fichero = Dir() 'MsgBox(Fichero) End While Me.T_Num.Text = w_num 'abro el fichero con word 'Me.TextBox1.Text = Me.T_Directorio.Text & "\" & Fichero 'Call Me.Button1_Click(sender, e) 'Me.TextBox1.Text = "" If Me.chk_tratar_files.Checked Then '----------------------'abrir fichero de salida '----------------------Call Me.abrir_fichero() While Fichero <> "" w_num += 1 '--------------------------------'escribir nombre del fichero '--------------------------------Me.T_Ficheros.Text &= Fichero & vbCrLf '--------------------------------'busco el siguiente '--------------------------------Fichero = Dir() 'MsgBox(Fichero) End While '----------------------------Call tratar_fichero(Fichero) '----------------------------'cierro word 'Call tratar_fichero(Me.TextBox1.Text) sr.Close() End If End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 146 de 164

29 Enviar Mail desde VB.Net


Imports System.Data.Odbc Imports System.Data.OleDb Imports System.Web.mail Public Class F_Personal Inherits System.Windows.Forms.Form Dim Dim Dim Dim ODBC_con As OdbcConnection ODBC_DA As OdbcDataAdapter ODBC_CMDB As OdbcCommandBuilder DS_solicitud As DataSet

Dim l_select As String Dim l_posicion_actual As Integer Dim l_id_anterior As Integer Dim l_Paso As Boolean Dim l_cambiando_accion As Boolean

#Region "Botones envio correo" Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim oMsg As MailMessage = New MailMessage 'Remite: Replace with sender e-mail address. oMsg.From = "jmpeco@nova.es" 'Dirigido a: Replace with recipient e-mail address. oMsg.To = "anorig53@hotmail.com" 'Asunto oMsg.Subject = "correo enviado desde vb.net" 'formato del cuerpo del mensajes ' SEND IN HTML FORMAT (comment this line to send plain text). oMsg.BodyFormat = MailFormat.Text 'cuerpo 'HTML Body (remove HTML tags for plain text). oMsg.Body = "<HTML><BODY><B>Hello World!</B></BODY></HTML>" ''''''adjuntar un fichero '''''' ADD AN ATTACHMENT. '''''' TODO: Replace with path to attachment. '''''Dim sFile As String = "C:\temp\Hello.txt" '''''Dim oAttch As MailAttachment '''''oAttch = New MailAttachment(sFile, MailEncoding.Base64) '''''oMsg.Attachments.Add(oAttch) ' TODO: Replace with the name of your remote SMTP server. '''''SmtpMail.SmtpServer = "MySMTPServer" SmtpMail.SmtpServer = "smtp.nova.es" SmtpMail.Send(oMsg) oMsg = Nothing ''''oAttch = Nothing MsgBox("Mensaje enviado") End Sub

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 147 de 164

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim w_cuerpo As String w_cuerpo = "<<<< Formulario de Solicitud de personal >>>> " _ & vbCr & vbCr _ & " Accion.................. : " & Me.CB_Accion.Text & vbCr _ & " Situacion .............. : " & Me.T_Situacion.Text & vbCr _ & " Fecha Efectividad....... : " & Me.T_F_Efectividad.Text & vbCr _ & " Fecha apertura solicitud : " & Me.editSol_Fecha_ini.Text & vbCr _ & " Fecha Cierre solicitud.. : " & Me.editSol_Fecha_fin.Text & vbCr _ & vbCr & vbCr _ & " Nombre ................ : " & Me.editSol_Nombre.Text & vbCr _ & " Primer Apellido........ : " & Me.editSol_Apellido1.Text & vbCr _ & " Segundo apellido....... : " & Me.editSol_Apellido2.Text & vbCr _ & " Cod. Empleado ......... : " & Me.editSol_Cod_empleado.Text & vbCr _ & " Departamento........... : " & Me.CB_Dpto.Text & vbCr _ & vbCr & vbCr _ & " Responsable Dpto....... : " & Me.editSol_Res_dpto.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fecha_aproba.Text & vbCr _ & vbCr _ & " Director Financiero.... : " & Me.editSol_Dir_financiero.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fec_autoriz_fina.Text & vbCr _ & vbCr _ & " Responsable Seguridad.. : " & Me.editSOl_Res_seguridad.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fec_autori_Seg.Text & vbCr _ & vbCr & vbCr _ & " Departamento........... : " & Me.CB_Dpto.Text & vbCr _ & vbCr & vbCr '--------------------------------'tratar accesos de red '--------------------------------Dim x As Integer Dim w_Accesos As String For x = 0 To Me.CL_AccRed.Items.Count - 1 If Me.CL_AccRed.GetItemChecked(x) = True Then If Trim(w_Accesos) = "" Then w_Accesos = " Accesos de red ........ :" _ & Me.CL_AccRed.Items.Item(x) _ & vbCrLf Else w_Accesos &= " :" _ & Me.CL_AccRed.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_Accesos & vbCrLf '--------------------------------'tratar Hardware '--------------------------------Dim w_Hardware As String For x = 0 To Me.CL_Hw.Items.Count - 1 If Me.CL_Hw.GetItemChecked(x) = True Then If Trim(w_Hardware) = "" Then w_Hardware = " Hardware a Instalar..... :" _ & Me.CL_Hw.Items.Item(x) _ & vbCrLf Else w_Hardware &= " :" _ & Me.CL_Hw.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_Hardware & vbCrLf

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 148 de 164

'--------------------------------'tratar software '--------------------------------Dim w_software As String For x = 0 To Me.CL_Sw.Items.Count - 1 If Me.CL_Sw.GetItemChecked(x) = True Then If Trim(w_software) = "" Then w_software = " Software a instalar..... :" _ & Me.CL_Sw.Items.Item(x) _ & vbCrLf Else w_software &= " :" _ & Me.CL_Sw.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_software & vbCrLf '--------------------------------'Observaciones '--------------------------------w_cuerpo &= " Observaciones: " & vbCrLf _ & Me.editSol_Observaciones.Text '--------------------------------------' Create an Outlook application. Dim oApp As Outlook._Application oApp = New Outlook.Application ' Create a new MailItem. Dim oMsg As Outlook._MailItem oMsg = oApp.CreateItem(Outlook.OlItemType.olMailItem) 'esta propiedad no es valida 'oMsg.BodyFormat = MailFormat.Text oMsg.Subject = "Mensaje generado automaticamente desde VB" oMsg.Body = w_cuerpo ' TODO: Replace with a valid e-mail address. oMsg.To = "jmpeco@securnetconsultores.com" oMsg.CC = "jmpeco@nova.es" ' Add an attachment ' TODO: Replace with a valid attachment path. Dim sSource As String = "C:\Temp\Hello.txt" ' TODO: Replace with attachment name Dim sDisplayName As String = "Hello.txt" Dim sBodyLen As String = oMsg.Body.Length Dim oAttachs As Outlook.Attachments = oMsg.Attachments Dim oAttach As Outlook.Attachment oAttach = oAttachs.Add(sSource, , sBodyLen + 1, sDisplayName) ' Send oMsg.Send() ' Clean up oApp = Nothing oMsg = Nothing oAttach = Nothing oAttachs = Nothing End Sub #End Region

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 149 de 164

30 Crystal Report 30.1 Insertar Lnea en blanco como separador en un report


Mtodo para insertar una lnea en blanco cada 5 lneas en un informe con Cristal Report Sea el siguiente informe:

Para hacer eso hay que insertar una nueva seccin de detalle que solo mostraremos cada 5 lneas. En consecuencia, lo primero que tenemos que hacer es insertar una nueva seccin de detalle, para lo cual, nos posicionamos en la seccin Detalle a y con el botn derecho mostramos men contextual, y elegimos Insertar Seccin abajo

A continuacin, elegimos esa nueva seccin para formatearla.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 150 de 164

pinchamos sobre el botn condicionador que se indica en la figura, y el sistema nos muestra una pantalla para escribir la formula que se debe cumplir para que se suprima la seccion, pues hemos activado el check de Suprimir.

La formula la basaremos en el numero de registro (lnea de detalle) que se est escribiendo. En consecuencia, necesitamos un campo que nos proporcione esa informacin.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 151 de 164

Para crear este campo entramos por el Explorador de campos

Campos de totales acumulados

Elegimos el campo clave , y cumplimentamos los atributos : Nombre Tipo de Resumen NumReg Recuento

Ahora ya estamos en condiciones de escribir la formula

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 152 de 164

Corregimos, para que quede la siguiente formula:

formula = ( remainder({#NumReg},5) > 0 )


con la cual decimos que la formula es verdadera, y por tanto se debe suprimir, cuando el resto de dividir el valor de Numero de registro por 5 sea Mayor que 0 Remainder es la divisin modular (Dividendo, Divisor o mdulo) = resto

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 153 de 164

30.2 Otra forma de insertar lnea en blanco

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 154 de 164

30.3 Definir la orientacin de la Pgina Horizontal o vertical


Crystal Reports para Visual Studio .NET

Configurar impresin (cuadro de dilogo)


Utilice este cuadro de dilogo para seleccionar la impresora, la orientacin de pgina y el tamao del papel que desea utilizar para imprimir el informe. Si no selecciona una impresora, el programa imprimir en la impresora predeterminada de Windows. Este cuadro de dilogo aparece cuando se hace clic con el botn secundario en Report Designer, se elige Diseador y despus Configurar impresin. No hay impresora Active esta casilla de verificacin cuando la impresin no sea una opcin en una estacin de trabajo concreta.

30.3.1
Nombre

Impresora

Busque el nombre de la impresora a la que desea enviar los informes en la lista Nombre. Propiedades Haga clic en este botn para que se abra el cuadro de dilogo Propiedades de la impresora seleccionada. Propiedades predefinidas Active esta casilla de verificacin para establecer todas las propiedades de la impresora en sus valores predeterminados.

30.3.2
Tamao Origen

Papel

Utilice la lista Tamao para seleccionar las opciones de tamao de papel o de sobre. Utilice la lista Origen para seleccionar las opciones de origen de alimentacin o de papel.

30.3.3
Vertical

Orientacin

Seleccione esta opcin para imprimir el informe en una orientacin de carta estndar. Horizontal Seleccione esta opcin para imprimir el informe en orientacin horizontal. Red Haga clic en este botn para conectarse a una impresora de red.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 155 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 156 de 164

30.4 Explorador de Campos


Cuando no aparece el explorador de campos, para que vuelva a aprecer seleccionar esquema documento:

Resultado:

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 157 de 164

30.5 Ajustar las lineas para un campo de mltiples Lineas de Informacin


A veces el diseo del formulario impide definir una seccin de detalle, ya que entrara en conflicto con otra parte del diseo. Es el caso del ejemplo que se muestra.. La Seccin 3 sigue las reglas normales, pero la Seccin 4, adems de tener un tamao fijo, debe respetar el diseo de la parte derecha.

La solucin adopatada es crear un nico campo memo dentro del rigistro de cabecera, en el que se almacena cada lnea separadas por la constante VbCrLf. , o dos si se desea interlineado doble.
Dim w_aux1 As String w_aux1 = Me.DG_Trabajos.Item(x, 1).ToString _ & vbCrLf & vbCrLf w_memo2 &= w_aux1

Para dibujar las lineas de separacin, se crea un campo de texto, en el que escribimos tantas lineas como necesitemos, y eso nos ayuda a posicionar las lineas. Una vez dibujadas las lineas, podemos borrar ese campo auxiliar o mantenerle como NoVisible para futuras modificaciones.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 158 de 164

Dim w_memo2 As String For x = 0 To 29 Try If x > (Me.DG_Trabajos.DataSource.rows.count - 1) Then Exit For End If If (Not Me.DG_Trabajos.Item(x, 1) Is DBNull.Value) Then If Trim(Me.DG_Trabajos.Item(x, 1)) <> "" Then Dim w_aux1 As String w_aux1 = Me.DG_Trabajos.Item(x, 1).ToString _ & vbCrLf & vbCrLf w_memo2 &= w_aux1 End If End If Catch ex As Exception ' no se hace nada 'este error se puede proucir si no se especifican trabajos End Try Next '----------------------------------------'actualizar cabecera w_Update = " UPDATE Presup_cab " _ & " Set Pre_trabajos = '" & Trim(w_memo2) & "' " _ & " WHERE Pre_id = '" & Trim(Me.T_num_ppto.Text) & "'" Debug.WriteLine(w_Update) M_Globales.Ejecutar_comando_inmediato_ODBC(w_Update)

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 159 de 164

30.6 Pasar parametro desde vb.net a Report


Hola, tenia el mismo problema, la solucion es sencilla. CrystalReport1.ParameterFields(0) = "Paraametro;valor;True" Dnde CrystalReport1 es el nombre del objeto, ParameterFields(0) es el primer parametro que pasas, puede ser de 0 a n. Parametro es el nombre del parametro de crystal, el que te aparece con ?xxxxxx. Valor, es lo que le vas a pasar. y true es para que no te muestre la ventana de parametros.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 160 de 164

30.7 Permitir acoplamiento en el editor de formulas

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 161 de 164

31 Direcciones tiles Visual Studio .NET


Hoy da Internet es un vehculo de informacin y de recursos muy importante para el desarrollador. Tan indispensable es saber utilizarlo bien como conocer dnde se encuentran los recursos ms interesantes o recursos destacables que debemos tener en cuenta a la hora de extraer informacin que nos pueda ayudar. A continuacin, podr encontrar algunos recursos que hemos considerado destacables por poder ofrecerle un valor aadido a sus conocimientos y prcticas con Visual Studio .NET. Es muy probable que no se incluyan algunos recursos de inters, pero debe comprender que es muy difcil englobar aqu todos los recursos que existen en Internet sobre Visual Studio .NET. Sirvan por tanto los siguientes recursos, como una parte de la informacin que encontrar sobre Visual Studio .NET, a travs de los cuales podr acceder a otros recursos de alto inters.

MSDN en castellano http://www.msdn.microsoft.es


Microsoft MSDN posee diferentes recursos en espaol que le servirn de utilidad. Entre otros destacamos en primer lugar MSDN Espaa, que le permitir acceder a informacin relevante sobre Visual Studio .NET y otros recursos en espaol. Adicionalmente, nos encontramos con otro recurso de MSDN en espaol, en esta ocasin, el que corresponde con MSDN Latinoamrica, que, como en el caso de MSDN Espaa, le permitir acceder a informacin en espaol sobre Visual Studio .NET, si bien, esta informacin est focalizada en Latinoamrica; podr acceder a diferentes Comunidades con noticias, recursos, enlaces, documentacin ... sobre Visual Studio .NET y los lenguajes que forman parte de Visual Studio .NET.

El Guille http://guille.costasol.net/
Uno de los mejores recursos en espaol de la Web donde encontrar informacin sobre Visual Basic y C#, aunque su focalizacin y especializacin es en Visual BASIC. Adems de ejemplos y tutoriales, encontrar unos foros de discusin que le permitir aclarar sus dudas. Guillermo Som, le ayudar siempre que pueda.

Torre de Babel http://www.fcharte.com/


Torre de Babel, es una Web diseada y administrada por Francisco Charte, uno de los autores de este libro. En esta interesante Web encontrar informacin de alto inters para el desarrollador, as como artculos, recursos y noticias sobre tecnologa relacionada no slo con Visual Studio .NET sino tambin con otros lenguajes de desarrollo.

PortalVB.com http://www.portalvb.com/
PortalVB.com, es una web diseada y administrada por Jorge Serrano, otro de los autores de este libro; en ella encontrar informacin, foros de discusin, artculos, tutoriales, recursos y noticias sobre la tecnologa .NET fundamentalmente. La Web est orientada principalmente a Visual BASIC, aunque toca temas sobre ASP .NET y C#.

Algoritmo http://www.algoritmodigital.com/
Algoritmo, es una Web diseada y administrada por el Grupo Eidos, un grupo especializado en informtica con formacin tanto on-line como off-line. En esta web encontrar una revista electrnica digital gratuita con artculos realmente interesantes sobre la tecnologa Microsoft. Adicionalmente encontrar foros de discusin donde podr plantear sus dudas, que sern resueltas por otros especialistas.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 162 de 164

El rincn en Espaol de C# http://manowar.lsi.us.es/~csharp/


El Rincn en Espaol de C# es una Web diseada y administrada por la Universidad de Sevilla (Espaa), y ha sido uno de los primeros recursos de C# en aparecer en espaol en Internet. Esta Web sin nimo de lucro, como todas las vistas hasta ahora, nos permitir aprender a programar en C# gracias a sus tutoriales e informacin disponible sobre este lenguaje. Adems de los recursos que encontraremos de alto inters para el desarrollador, podemos darnos de alta en una lista de discusin sobre el lenguaje C# que nos servir para adquirir ms experiencia sobre este lenguaje.

ACSP de la Universidad Politcnica de Valencia http://www.upv.es/dalum/acsp/


Microsoft ACSP es una iniciativa de Microsoft a nivel mundial para ofrecer a las Universidades la posibilidad de formar a los estudiantes en las tecnologas de Microsoft. A nuestro modo de ver, ACSP de la Universidad Politcnica de Valencia (Espaa), es el mejor recurso ACSP en espaol, y por eso, creemos conveniente destacarlo. En este recurso encontrar informacin y recursos sobre .NET convenientemente destacada.

MSDN en ingls http://msdn.microsoft.com/


Microsoft MSDN posee como es lgico, de un recurso oficial para el desarrollador en general. MSDN en ingls es la web oficial de MSDN. En este recurso encontrar informacin, artculos y enlaces con los recursos oficiales sobre .NET.

ASP. NET http://www.asp.net/


ASP .NET es el web oficial de Microsoft sobre ASP .NET, el lenguaje de desarrollo de aplicaciones Web. En esta pgina, encontrar informacin de inters para el desarrollador de aplicaciones web.

GotDotNet http://www.gotdotnet.com/
GotDotNet es el web oficial de Microsoft sobre .NET. En este sitio, encontrar recursos e informacin especial sobre .NET.

.NET 247 http://www.dotnet247.com/ 247reference/default.aspx


.NET 247 es un web sobre .NET en general. Este web es muy interesante, contiene informacin, enlaces y recursos sobre .NET que le podrn sacar de ms de un apuro.

News news://news.microsoft.com/
Los grupos de noticias nos servirn en cualquier momento, no slo para consultar las dudas ya planteadas por otros programadores, sino para plantear nuestras preguntas de forma que otros programadores puedan ayudarnos a responder nuestros problemas o planteamientos.

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 163 de 164

D:\LIBRO\Notas sobre VB_Net.doc

Pgina 164 de 164

S-ar putea să vă placă și