Ejemplos Practicos de Vb Net

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

Transcript of Ejemplos Practicos de Vb Net

D:\LIBRO\Notas sobre VB_Net.doc Página 1 de 164

Notas sobre VB.Net

1 Propiedades de un proyecto.......................................................................................................................... 4

2 Evitar multiples instancias de una aplicacion .Net ..................................................................................... 5

3 Carpetas especiales........................................................................................................................................ 8

4 Variables del entorno .................................................................................................................................... 9

5 Detectar la pulsación de una tecla.............................................................................................................. 12

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

7 Structure....................................................................................................................................................... 14

8 Combobox .................................................................................................................................................... 17 8.1 Estilo Single .................................................................................................................................................. 17 8.2 Estilo DropDown........................................................................................................................................... 17 8.3 Estilo DropDownList..................................................................................................................................... 17

9 InputBox....................................................................................................................................................... 18

10 CheckedListBox........................................................................................................................................... 19

11 Control ToolTip ........................................................................................................................................... 20

12 Barra de herramientas:............................................................................................................................... 21 12.1 Cómo saber el nombre del botón pulsado...................................................................................................... 21 12.1.1 Usando el evento ........................................................................................................................................... 21 12.1.2 Usando el nombre del remitente (sender)...................................................................................................... 22

13 Forms............................................................................................................................................................ 23 13.1 Colección de forms........................................................................................................................................ 23 13.2 Consultar colección de forms y controles en cada form ................................................................................ 24 13.3 Commondialog .............................................................................................................................................. 25 13.3.1 Ejemplo de FolderDialog .............................................................................................................................. 26 13.3.2 Ejemplo de OpenFileDialog.......................................................................................................................... 27 13.3.3 Ejemplo de SaveFileDialog ........................................................................................................................... 28 13.3.4 Ejemplo de ColorDialog................................................................................................................................ 29 13.3.5 Ejemplo de FontDialog ................................................................................................................................. 30 13.4 Salvar en fichero atributos y recuperarles...................................................................................................... 31 13.4.1 Salvar Color y atributos del Font.................................................................................................................. 31 13.4.2 Recuperar y asignar Color de fondo y atributos del font .............................................................................. 33 13.5 Repintar fondo cuando se cambia el tamaño ................................................................................................. 38 13.6 Dibujar línea roja........................................................................................................................................... 39

14 Form MDI .................................................................................................................................................... 40 14.1 Problema con las llamadas entre forms ......................................................................................................... 40 14.2 Patrón Singleton con formularios MDI ......................................................................................................... 42 14.3 Invocar un Form Hijo .................................................................................................................................... 43 14.4 Color de fondo en un formulario MDI .......................................................................................................... 44

15 Asistente form de datos ............................................................................................................................... 49 15.1 Cadena de conexión:...................................................................................................................................... 49 15.2 Modificar la select generada por el asistente ................................................................................................. 50 15.3 Cómo rellena el asistente un DataGrid de datos ............................................................................................ 51 15.4 Cómo modificar el adaptador cuando se añaden columnas ........................................................................... 53

D:\LIBRO\Notas sobre VB_Net.doc Página 2 de 164

15.5 Ejemplo 2: Añadir un campo booleano ......................................................................................................... 59

16 SQL............................................................................................................................................................... 62 16.1 Ejecutar comando inmediato ......................................................................................................................... 62 16.2 Clausula Delete.............................................................................................................................................. 63 16.3 Clausula insert ............................................................................................................................................... 64 16.4 Clausula SELECT ......................................................................................................................................... 65 16.4.1 Select count(*) ............................................................................................................................................... 65 16.4.2 Where con Like , Order by ASC/DESC ......................................................................................................... 69 16.4.3 Where con campo tipo booleano ................................................................................................................... 71 16.4.4 Where con campos nulos ............................................................................................................................... 72 16.4.5 No mostrar filas duplicadas con DISTINCT................................................................................................. 73 16.5 Vistas ............................................................................................................................................................. 75 16.6 Tipos de concurrencia.................................................................................................................................... 76 16.6.1 Optimista ....................................................................................................................................................... 76

17 Acceso a datos .............................................................................................................................................. 77 17.1 Transacciones con .NET................................................................................................................................ 77 17.2 Recuperar el valor de un campo con ExecuteScalar...................................................................................... 80 17.3 Ejecutar comando que no devuelve un conjunto de registros : ExecuteNonQuery ....................................... 81 17.4 Recuperar un conjunto de registros con Datareader ...................................................................................... 82 17.5 Rellenar un datagrid con Adaptador sin asistente.......................................................................................... 83 17.6 Form_cliente_detalle_pedidos....................................................................................................................... 86

18 Datagrid........................................................................................................................................................ 87 18.1 Cómo saber en que celda de un Datagrid se pulsa......................................................................................... 87 18.2 Cómo referenciar una celda de un Datagrid .................................................................................................. 88 18.3 Mantenimiento de una tabla en un único Form ............................................................................................. 89 18.3.1 Tabla de Artículos: Seleccionar celdas de una fila ....................................................................................... 89 18.4 Datagrid con Tabla de memoria .................................................................................................................... 90 18.5 DataGrid con Manejador ............................................................................................................................... 93 18.5.1 Ejemplo 1....................................................................................................................................................... 93 18.5.2 Ejemplo 2....................................................................................................................................................... 99 18.6 Configurar el adaptador al añadir un campo nuevo a la tabla...................................................................... 106 18.7 Datagrid con CheckBox............................................................................................................................... 111

19 Función Format()....................................................................................................................................... 115 19.1 Formato de fechas........................................................................................................................................ 115 19.2 Formato de numeros .................................................................................................................................... 117

20 Funciones matemáticas ............................................................................................................................. 118

21 Bucles.......................................................................................................................................................... 121

22 Select Case.................................................................................................................................................. 122

23 Tabla de estilos........................................................................................................................................... 123 23.1 Ejemplo 1 .................................................................................................................................................... 123

24 Tratamiento de fechas............................................................................................................................... 125 24.1 Función DateAdd......................................................................................................................................... 125 24.2 Función DateDiff......................................................................................................................................... 128 24.3 Formatear fechas ......................................................................................................................................... 131

25 Control de pago.......................................................................................................................................... 132

26 Forzar la recuperacion de un campo ....................................................................................................... 133

27 Ejecutar aplicacion.................................................................................................................................... 135 27.1 Consola MS-DOS........................................................................................................................................ 137

28 Leer un documento word desde vb.Net ................................................................................................... 139

D:\LIBRO\Notas sobre VB_Net.doc Página 3 de 164

29 Enviar Mail desde VB.Net ........................................................................................................................ 147

30 Crystal Report ........................................................................................................................................... 150 30.1 Insertar Línea en blanco como separador en un report ................................................................................ 150 30.2 Otra forma de insertar línea en blanco......................................................................................................... 154 30.3 Definir la orientación de la Página Horizontal o vertical ............................................................................ 155 30.3.1 Impresora .................................................................................................................................................... 155 30.3.2 Papel............................................................................................................................................................ 155 30.3.3 Orientación.................................................................................................................................................. 155 30.4 Explorador de Campos ................................................................................................................................ 157 30.5 Ajustar las lineas para un campo de múltiples Lineas de Información........................................................ 158 30.6 Pasar parametro desde vb.net a Report........................................................................................................ 160

31 Direcciones útiles Visual Studio .NET ..................................................................................................... 162

D:\LIBRO\Notas sobre VB_Net.doc Página 4 de 164

1 Propiedades de un proyecto

D:\LIBRO\Notas sobre VB_Net.doc Página 5 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 aplicación '------------------------------------------ '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 Página 6 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 ejecución " _ & "otra instancia de esta aplicacion" _ , MsgBoxStyle.Exclamation, _ "Abriendo Aplicación 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 Página 7 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 'End the current instance of the application. End Sub 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 Página 8 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 Página 9 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 Página 10 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 Página 11 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 12 de 164

5 Detectar la pulsación de una tecla

Ahora tenemos que hacer más cosas cuando se detecta la pulsación de la tecla suprimir en el evento KeyDown, ya que tenemos que saber qué elementos están 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 atrás hacia adelante... ¿por qué? porque si lo hiciéramos desde el principio de la lista, al eliminar un elemento de dicha lista, el número de elementos variaría y tendríamos problemas cuando llegásemos al final, ya que no será el mismo número de elementos después 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á más al principio que el recién borrado y no tendremos problemas... sé que no te has enterado, pero no importa, confía en mi, (¡que remedio te queda!), y ya tendrás tiempo de comprobarlo por tu cuenta.

Veamos primero el código que habría que usar y después 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". Sólo decirte que IF... THEN... sirve para hacer comparaciones o para comprobar si una o más cosas están 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 continuación... ¿todo lo que viene a continuación? NO, sólo hasta que encontremos End If, pero de esto ya hablaremos en otra ocasión.

D:\LIBRO\Notas sobre VB_Net.doc Página 13 de 164

6 Manejo de las solapas de un TabControl

6.1 Seleccionar una solapa determinada Cualquiera de los dos métodos usados a continuación, en caso de error nos presenta la solapa donde se encuentra el campo y posiciona el cursor en el valor erróneo 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 Página 14 de 164

7 Structure Structure (Instrucción) Vea también Dim (Instrucción) | Implements (Instrucción) | Event (Instrucción) | Property (Instrucción) Se utiliza en el nivel de módulo o clase para declarar una estructura y definir las características 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 múltiples se separan por comas. Public Opcional. Las estructuras declaradas con la palabra clave Public tienen acceso público. No hay restricciones para obtener acceso a las estructuras públicas. Protected Opcional. Las estructuras declaradas mediante la palabra clave Protected tienen acceso protegido. Sólo son accesibles desde su propia clase o desde una clase derivada. El acceso protegido sólo 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 declaración y desde otra sección 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 código del mismo programa, así como el código de clases derivadas. El acceso de tipo amigo sólo se puede especificar en miembros de clases. Private Opcional. Las estructuras declaradas mediante el modificador Private tienen acceso de tipo privado. Sólo son accesibles desde dentro del contexto de su declaración, incluidos los miembros de cualquier tipo anidado como los procedimientos. Shadows Opcional. Indica que esta estructura sombrea un elemento de programación denominado de forma idéntica, 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 válido. Implements Opcional. Indica que esta estructura implementa los miembros de una o más interfaces. interfacenames Es obligatorio si se utiliza la instrucción Implements. Nombres de las interfaces implementadas por esta estructura. Si utiliza la instrucción Implements, debe colocarla inmediatamente detrás de la instrucción Structure, y debe implementar cada miembro definido por cada interfaz que se especifique. variabledeclarations Requerido. Una o más 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. También pueden definirse constantes y propiedades en la estructura, pero debe declararse por lo menos un evento o variable no compartido. proceduredeclarations Opcional. Cero o más declaraciones de los procedimientos Function, Property o Sub que sirven como miembros del método 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 válido. attrargs

D:\LIBRO\Notas sobre VB_Net.doc Página 15 de 164

Opcional. Lista de argumentos por posición de este atributo. Los argumentos múltiples se separan por comas. attrinit Opcional. Lista de inicializadores de campos o propiedades de este atributo. Los inicializadores múltiples se separan por comas. Comentarios La instrucción Structure sólo puede aparecer en el nivel de módulo, espacio de nombres o archivo. Esto es, puede declarar estructuras en un archivo de código fuente o dentro de un módulo, una interfaz o una clase, pero no dentro de un procedimiento. También puede definirse una estructura dentro de otra, pero ello imposibilita el acceso a sus miembros a través 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 módulo o clase en que se declaran. De forma predeterminada una estructura es Friend. Para especificar la accesibilidad de manera más detallada, incluya Public, Protected, Friend, Protected Friend o Private en la instrucción Structure. Debe declarar cada miembro de datos de una estructura. Esto significa que cada instrucción 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 también la cláusula As en cada declaración de miembro. Los miembros declarados con Dim tienen acceso de tipo Public de manera predeterminada, y los miembros declarados sin la cláusula 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 declaración. Se debe inicializar un miembro de datos mediante un constructor parametrizado en la estructura o asignar un valor al miembro después de crear una instancia de la estructura. Las estructuras admiten muchas de las mismas características como clases. Por ejemplo, las estructuras pueden tener propiedades y métodos, pueden implementar interfaces y pueden tener constructores con parámetros. No obstante, existen diferencias de consideración entre las estructuras y las clases en materias como la herencia, las declaraciones y la utilización. Ejemplo En este ejemplo se utiliza la instrucción 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. También 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 también Dim (Instrucción) | Implements (Instrucción) | Event (Instrucción) | Property (Instrucción)

D:\LIBRO\Notas sobre VB_Net.doc Página 16 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 17 de 164

8 Combobox

8.1 Estilo Single

8.2 Estilo DropDown

8.3 Estilo DropDownList

D:\LIBRO\Notas sobre VB_Net.doc Página 18 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 automático: Abortado" _ , MsgBoxStyle.Exclamation, Me.Text) Exit Sub Case Else End Select End While

D:\LIBRO\Notas sobre VB_Net.doc Página 19 de 164

10 CheckedListBox

D:\LIBRO\Notas sobre VB_Net.doc Página 20 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 aplicación. 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 ejecución resulta:

D:\LIBRO\Notas sobre VB_Net.doc Página 21 de 164

12 Barra de herramientas:

12.1 Cómo saber el nombre del botón 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 Página 22 de 164

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

Y, usando Select sería: '---------------------------------------- '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 Página 23 de 164

13 Forms

13.1 Colección 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 Página 24 de 164

13.2 Consultar colección de forms y controles en cada form

D:\LIBRO\Notas sobre VB_Net.doc Página 25 de 164

13.3 Commondialog Buscar en Ayuda: CommonDialog (control) En esta sección ColorDialog (Componente, formularios Windows Forms) Permite que el usuario seleccione un color de una paleta en un cuadro de diálogo 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 diálogo preconfigurado. PageSetupDialog (Componente, formularios Windows Forms) Establece los detalles de impresión de la página a través de un cuadro de diálogo preconfigurado. PrintDialog (Componente, formularios Windows Forms) Selecciona una impresora, elige las páginas que se van a imprimir y determina otros valores de configuración relacionados con la impresión. 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 guardarán. Información adicional Cuadros de diálogo en formularios Windows Forms Describe cómo crear un cuadro de diálogo para un formulario Windows Forms. ColorDialog (Clase) Proporciona información de referencia acerca de la clase ColorDialog y sus miembros. FontDialog (Clase) Proporciona información de referencia acerca de la clase FontDialog y sus miembros. OpenFileDialog (Clase) Proporciona información de referencia acerca de la clase OpenFileDialog y sus miembros. PageSetupDialog (Clase) Proporciona información de referencia acerca de la clase PageSetupDialog y sus miembros. PrintDialog (Clase) Proporciona información de referencia acerca de la clase PrintDialog y sus miembros. PrintPreviewDialog (Clase) Proporciona información de referencia acerca de la clase PrintPreviewDialog y sus miembros. SaveFileDialog (Clase) Proporciona información de referencia acerca de la clase SaveFileDialog y sus miembros.

D:\LIBRO\Notas sobre VB_Net.doc Página 26 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 Página 27 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 aplcación (*.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 Página 28 de 164

13.3.3 Ejemplo de SaveFileDialog

D:\LIBRO\Notas sobre VB_Net.doc Página 29 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 implementación ColorDialog de CommonDialog y se indica cómo crear y mostrar un cuadro de diálogo. Este ejemplo supone que se llama al método 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 Página 30 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 Página 31 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 Página 32 de 164

Else '------------------- 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 Este es el resultado:

D:\LIBRO\Notas sobre VB_Net.doc Página 33 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 Página 34 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 Página 35 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 - 2) 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 - 2) 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 - 2) b = Val(Bs) 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) = "Color" pp2(2) = "FontName" pp2(3) = "Fontsize" pp2(4) = "FontColor" pp2(5) = "FontItalic" pp2(6) = "Fontbold" pp2(7) = "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 Página 36 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 Página 37 de 164

End Sub

D:\LIBRO\Notas sobre VB_Net.doc Página 38 de 164

13.5 Repintar fondo cuando se cambia el tamaño 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 Página 39 de 164

13.6 Dibujar línea 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 atrás '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 Página 40 de 164

14 Form MDI

14.1 Problema con las llamadas entre forms Planteamiento inicial: Básicamente 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 botón situado en el form

PADRE

Form_MDI Tiene un menú desde el que llama al form_Padre mediante la siguiente opción 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 botón desde el que llama al form_hijo Además tiene un contador (por simplificar el problema) de una variable que debe pasar al hijo para visualizarla cuando se pulse el botón1

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 botón de abrir hijo, se abre el form_hijo y muestra el valor pasado Si desde el form_Padre pulsamos de nuevo sobre el botón 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. Solución 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 Página 41 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 botón de abrir el form_hijo se abre una nueva instancia del form_hijo con lo cual tendríamos dos instancias del mismo objeto form_hijo Solución: Definir el objeto form_hijo a nivel de módulo … 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 Página 42 de 164

14.2 Patrón Singleton con formularios MDI

En días anteriores estaba creando una aplicación en la cual requería crear una sola instancia de los formularios hijos de una MDI padre. Buscando en la documentación de Microsoft encontré este patrón llamado Singleton. Acá les muestro una sencilla implementación 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 aplicación. 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 pública. Private Shared ChildInstance As frmChild = Nothing Finalmente crearemos una función shared que será la que finalmente controlara la creación o manejo de la instancia del formulario, logrando obtener solo un formulario abierto para este frmChild. 'controla que sólo 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 fácil y es de mucha ayuda. Origen: Web El Guille, Fecha: 30 de junio de 2004 Autor: Camilo Andrés Jaramillo Álvarez - [email protected]

D:\LIBRO\Notas sobre VB_Net.doc Página 43 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" ' Añadimos 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 Página 44 de 164

14.4 Color de fondo en un formulario MDI

Option Explicit On Imports System.Data Imports System.Data.OleDb Imports System.MarshalByRefObject Imports System.Drawing.Drawing2D.LinearGradientBrush Imports System.Drawing.Brush Imports 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 Página 45 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 Página 46 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 Página 47 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‚ Ram¢n Pastor Compa¤ÿ [email protected] Cuando empecé con Visual Basic 6, siempre tenia la manía 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 instalación. Cuando empecé con VB .NET me di cuenta de que el color de fondo de un formulario no se puede cambiar, siempre aparecía ese color "tosco" que no me gusta nada, así que investigando encontré un artículo en Microsoft que explicaba como cambiar el color de fondo. Yo lo he mejorado un poco y además de cambiar el color, creo degradados de fondo en el área cliente MDI.

Para cambiar el color de fondo de un MDI añade el siguiente código 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 función 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 Página 48 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 código.

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 Página 49 de 164

15 Asistente form de datos Cuando se elige el asistente para generar un form de datos, este genera automáticamente una serie de métodos o procedimientos de forma automática. En este apartado vamos a hacer hincapié en los puntos que se pueden modificar sin tocar para nada los métodos y propiedades generados por el asistente:

15.1 Cadena de conexión: El asistente por defecto ha generado una cadena de conexión en base a los parámetros que nosotros hemos definido al asistente. En tiempo de ejecución, si queremos cambiar los valores de direccionamientos, nombre, etc. De la cadena de conexión, 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 Conexión 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 núcleo

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 Página 50 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 automáticamente.

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 Página 51 de 164

15.3 Cómo rellena el asistente un DataGrid de datos Una vez que hemos cargado el comando Select, para ejecutarle invocamos el método : BtnLoad, es decir, hacemos como si pulsáramos el botón 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 código de control de errores. 'Mostrar mensaje de error, si hay alguno. System.Windows.Forms.MessageBox.Show(eLoad.Message) End Try End Sub Este método simplemente se limita a Invocar al método 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 'requeriría 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 código 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 código de control de errores. Throw eLoadMerge End Try End Sub El asistente, en cualquier caso da toda la información que se muestra en el código 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 Página 52 de 164

Public Sub FillDataSet(ByVal dataSet As MJmpBase.DS_Parametros_App) 'Desactive la comprobación 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 conexión. Me.OleDbConnection1.Open() 'Intente rellenar el conjunto de datos a través de OleDbDataAdapter1. Me.OleDbDataAdapter1.Fill(dataSet) Catch fillException As System.Exception 'Agregar aquí el código de control de errores. Throw fillException Finally 'Volver a activar la comprobación de restricciones. dataSet.EnforceConstraints = True 'Cerrar la conexión independientemente de si se inició una excepción 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 método 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 Página 53 de 164

15.4 Cómo modificar el adaptador cuando se añaden columnas

D:\LIBRO\Notas sobre VB_Net.doc Página 54 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 55 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 56 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 57 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 58 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 59 de 164

15.5 Ejemplo 2: Añadir 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 Página 60 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 61 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 62 de 164

16 SQL

16.1 Ejecutar comando inmediato Public Sub Ejecutar_comando_inmediato_ODBC(ByVal p_sql As String) '------------------------------------ 'Definir objeto de conexión 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 Página 63 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 Página 64 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 Página 65 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 p_Top As Integer Dim p_Left As Integer Dim p_Height As Integer Dim p_Width As Integer Dim 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 'ejecución 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 As String pp1 = vg_usuario pp2 = w_Form pp3 = w_valor 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())

D:\LIBRO\Notas sobre VB_Net.doc Página 66 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 Página 67 de 164

Public Sub leer_ParmApp_nucleo _ (ByRef p_codigo As Integer, _ ByRef p_valor As String) '------------------------------------ 'Definir objeto de conexión 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 Página 68 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 Página 69 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 '%" & w_cad_buscar & "%'" _ & " or raz_cli like '%" & w_cad_buscar & "%'" _ & " or obs_cli like '%" & w_cad_buscar & "%'" _ & " or dni_cli like '%" & w_cad_buscar & "%'" _ & " or dir_cli like '%" & w_cad_buscar & "%'" _ & " or pob_cli like '%" & w_cad_buscar & "%'" _ & " or fax_cli like '%" & w_cad_buscar & "%'" _ & " or tel_cli like '%" & 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 like '%" & Me.T_Ir_a.Text & "' " Me.T_Buscar.Text = "" Me.T_Nombre.Text = "" Case "Bot_Nombre" w_where = " Where nom_cli like '%" & Me.T_Nombre.Text & "%' " _ & " or raz_cli like '%" & Me.T_Nombre.Text & "%' " Me.T_Buscar.Text = "" Me.T_Ir_a.Text = "" Case "Bot_Buscar" w_where = " Where tel_cli like '%" & Me.T_Buscar.Text & "%' " _ & " or fax_cli like '%" & Me.T_Buscar.Text & "%' " _ & " or pob_cli like '%" & Me.T_Buscar.Text & "%' " _ & " or pro_cli like '%" & Me.T_Buscar.Text & "%' " _ & " or dni_cli like '%" & Me.T_Buscar.Text & "%' " _ & " or obs_cli like '%" & Me.T_Buscar.Text & "%' " Me.T_Ir_a.Text = "" Me.T_Nombre.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_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 Página 70 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 Página 71 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 Página 72 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 Página 73 de 164

16.4.5 No mostrar filas duplicadas con DISTINCT

w_Select = "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 Página 74 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 añadir los nuevos estilos creados '---------------------------------------------------------- TS_Detalle2.GridColumnStyles.Clear() TS_Detalle2.GridColumnStyles.Add(col_id) ‘0 TS_Detalle2.GridColumnStyles.Add(col_Lin) ‘1 TS_Detalle2.GridColumnStyles.Add(col_Cant) ‘2 TS_Detalle2.GridColumnStyles.Add(col_ConC) ‘3 TS_Detalle2.GridColumnStyles.Add(col_Prec) ‘4 TS_Detalle2.GridColumnStyles.Add(col_Total) ‘5

D:\LIBRO\Notas sobre VB_Net.doc Página 75 de 164

16.5 Vistas

D:\LIBRO\Notas sobre VB_Net.doc Página 76 de 164

16.6 Tipos de concurrencia

16.6.1 Optimista

D:\LIBRO\Notas sobre VB_Net.doc Página 77 de 164

17 Acceso a datos

17.1 Transacciones con .NET Concepto de transacción: 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 transacción debe ser una unidad atómica de trabajo, o se hace todo o no se hace nada. Coherencia: Debe dejar los datos en un estado coherente luego de realizada la transacción. 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 transacción 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 más tablas y si no uso procedimientos almacenados uso comandos desde mi programa; pues bien, entonces sería 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 actualización de sueldos. Pero que pasa si se realiza la primera operación y no la segunda. ¡Huy! Que rabia, o que pasa si solo se realiza parte de la primera, más ¡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 transacción decimos que se realice todo o no se realice nada (atomicidad) pues si surge algún error se deshace todo lo realizado anteriormente en la transacción. Ahora desde vb.NET (Comandos independientes)

D:\LIBRO\Notas sobre VB_Net.doc Página 78 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 botón escribimos lo siguiente en el evento clic del botón, 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 añadiremos en la tabla persona 3 registro, pero si quisiéramos convertirle a transacción para que se ejecuten todos o ninguno si encuentra un error deberíamos hacer lo siguiente. Fíjese en los datos para el campo código 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 transacción con myTrans = Conn.BeginTransaction() y finalizamos con myTrans.Commit() y en caso de algún error ejecutamos myTrans.Rollback() para cancelar todo lo realizado en la transacción. Para comprobar que la transacción se cancela al encontrar un error cambiamos los valores del campo código 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 Página 79 de 164

Al ejecutar nos saldrá un mensaje que indica que existió una violación de primary key. Si verificamos los datos, no habrá ningún registro añadido pues como está en una transacción o se agregan todos o no se agrega ninguno.

D:\LIBRO\Notas sobre VB_Net.doc Página 80 de 164

17.2 Recuperar el valor de un campo con ExecuteScalar Este método 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 = '" & pp1 & "'" _ & " AND t4_param = '" & 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 Página 81 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 = '" & pp1 & "'" _ & " AND t4_param = '" & 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 Página 82 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 Página 83 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 Página 84 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 Página 85 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 Página 86 de 164

17.6 Form_cliente_detalle_pedidos

D:\LIBRO\Notas sobre VB_Net.doc Página 87 de 164

18 Datagrid

18.1 Cómo saber en que celda de un Datagrid se pulsa El siguiente método 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 Página 88 de 164

18.2 Cómo 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 botón Seleccionar

D:\LIBRO\Notas sobre VB_Net.doc Página 89 de 164

18.3 Mantenimiento de una tabla en un único Form

18.3.1 Tabla de Artículos: Seleccionar celdas de una fila

Este formulario presenta por una parte una relación 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 Página 90 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) '--------------------------------------------- ' Añadir 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 Página 91 de 164

Definición 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 Página 92 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 Página 93 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 además, 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") ' '--------------------------------------------- ' Añadir 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 Página 94 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 añadimos 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 Página 95 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 Página 96 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 w_linea As Integer Dim w_cantidad As Double Dim w_concepto As String Dim w_precio As Double Dim w_descuento As Double Dim w_importe As Double Dim w_importe_A As String Dim 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 Página 97 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 Página 98 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 Página 99 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 cálculo se realiza de nuevo al cambiar de columna

D:\LIBRO\Notas sobre VB_Net.doc Página 100 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") ' '---------------------------------- ' Añadir 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 '--------------------------------------------- ' Añadir 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 Página 101 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 Página 102 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 Página 103 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 w_linea As Integer Dim w_cantidad As Double Dim w_concepto As String Dim w_precio As Double Dim w_descuento As Double Dim w_importe As Double Dim w_importe_A As String Dim 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 Página 104 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 Página 105 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 línea 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 artículos

D:\LIBRO\Notas sobre VB_Net.doc Página 106 de 164

18.6 Configurar el adaptador al añadir un campo nuevo a la tabla

D:\LIBRO\Notas sobre VB_Net.doc Página 107 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 108 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 109 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 110 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 111 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 Página 112 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 Página 113 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 Página 114 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 Página 115 de 164

19 Función 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) ' Make new directory or folder Catch ex As Exception End Try Formatos de fecha y hora predefinidos (Función Format) Vea también Format (Función) | Formatos numéricos predefinidos (Función Format) | Formatos de fecha y hora definidos por el usuario (Función Format) Requisitos Espacio de nombres: Microsoft.VisualBasic Módulo: Strings Ensamblado: Tiempo de ejecución 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 función Format: Nombre de formato Descripción General Date o G Muestra una fecha o una hora. En el caso de números reales, muestra una fecha y una

hora; por ejemplo, 4/3/93 05:34 PM.Si no existe parte fraccional, muestra sólo una fecha; por ejemplo, 4/3/93. Si no existe parte entera, muestra sólo 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. Medium Date Muestra una fecha usando el formato medio que corresponda a la versión de idioma que

use la aplicación 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. Medium Time Muestra la hora en formato de 12 horas utilizando horas y minutos y la especificación

a.m./p.m. Short Time o t Muestra una hora con el formato de 24 horas, por ejemplo, 17:45. f 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. g Muestra la fecha corta y la hora corta de acuerdo con el formato vigente en su sistema. M, m Muestra el mes y el día de una fecha dada. R, r Da formato a la fecha y la hora como Hora media de Greenwich (GMT) s Da formato a la fecha y la hora como un índice ordenable. u 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. Y, y Da formato a la fecha especificando el año y el mes. Requisitos Espacio de nombres: Microsoft.VisualBasic Módulo: Strings Ensamblado: Tiempo de ejecución de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea también Format (Función) | Formatos numéricos predefinidos (Función Format) | Formatos de fecha y hora definidos por el

D:\LIBRO\Notas sobre VB_Net.doc Página 116 de 164

usuario (Función Format)

D:\LIBRO\Notas sobre VB_Net.doc Página 117 de 164

19.2 Formato de numeros Private Sub cargar_tamaño( _ 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") Nombre de formato Descripción General Number, G o g Muestra el número sin separadores de miles. Currency, C o c Muestra el número con separadores de miles, en su caso; también muestra dos

dígitos a la derecha del separador de decimales. El formato de salida dependerá de la configuración regional.

Fixed, F o f Muestra al menos un dígito a la izquierda y dos a la derecha del separador de decimales.

Standard, N o n Muestra el número con separador de miles, al menos un dígito a la izquierda y dos a la derecha del separador de decimales.

Percent Muestra el número multiplicado por 100 con un signo de porcentaje (%) a la derecha; siempre muestra dos dígitos a la derecha del separador de decimales.

P o p Muestra el número con separador de miles multiplicado por 100 con un signo de porcentaje (%) a la derecha y separado por un solo espacio; siempre muestra dos dígitos a la derecha del separador de decimales.

Científico Utiliza notación científica estándar y proporciona dos dígitos significativos. E o e Utiliza notación científica estándar y proporciona seis dígitos significativos. D o d Muestra el número como una cadena que contiene el valor del número en formato

Decimal (base 10). Esta opción sólo se admite para tipos integrales (Byte, Short, Integer, Long).

X o x Muestra el número como una cadena que contiene el valor del número en formato Hexadecimal (base 16). Esta opción sólo se admite para tipos integrales (Byte, Short, Integer y Long).

Yes/No Muestra No si el número es 0; de lo contrario, muestra Yes. True o False Muestra False si el número es 0; de lo contrario, muestra True. On/Off Muestra Off si el número es 0; de lo contrario, muestra On.

D:\LIBRO\Notas sobre VB_Net.doc Página 118 de 164

20 Funciones matemáticas Vea también Rnd (Función) | Randomize (Instrucción) | Funciones matemáticas derivadas | Double.NaN (Campo) Requisitos Class: Math (Clase) Requisitos Espacio de nombres: System.Math Ensamblado: mscorlib (en mscorlib.dll) Las funciones matemáticas de Visual Basic 6 han sido reemplazadas por métodos equivalentes en la clase System.Math de .NET Framework. Comentarios Los métodos matemáticos 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 función Atn de Visual Basic 6. En la siguiente tabla se detallan los nombres de las funciones matemáticas de Visual Basic 6 y sus métodos equivalentes en .NET Framework: Función de Visual Basic 6 Método de Visual Basic .NET Descripción Abs Math.Abs (Método) Devuelve el valor absoluto de un

número especificado. Atn Math.Atan (Método) Devuelve un valor Double que

contiene el ángulo cuya tangente es el número especificado.

Cos Math.Cos (Método) Devuelve un valor Double que contiene el coseno del ángulo especificado.

Exp Math.Exp (Método) Devuelve un valor Double que contiene "e" (base de los logaritmos naturales) elevado a la potencia especificada.

Log Math.Log (Método) Devuelve un valor Double que contiene el logaritmo del número especificado. Este método está sobrecargado y puede devolver o bien el logaritmo natural (de base e) del número especificado o bien el logaritmo del número especificado en una base especificada.

Round Math.Round (Método) Devuelve un valor de tipo Double que contiene el número más próximo al valor especificado. Existen funciones de redondeo adicionales disponibles en forma de métodos de tipos intrínsecos como Decimal.Round (Método).

Sgn Math.Sign (Método) Devuelve un valor Integer que indica el signo de un número.

Sin Math.Sin (Método) Devuelve un valor Double que especifica el seno de un ángulo.

Sqr Math.Sqrt (Método) Devuelve un valor Double que especifica la raíz cuadrada de un número.

Tan Math.Tan (Método) Devuelve un valor Double que contiene la tangente de un ángulo.

Además, la clase matemática de .NET Framework ofrece constantes y otros métodos estáticos para funciones trigonométricas, logarítmicas y otras funciones matemáticas habituales. Todo ello puede utilizarse en un programa de Visual Basic. Para utilizar estas funciones sin calificación, importe el espacio de nombres System.Math a su proyecto agregando el siguiente código en la parte superior del código fuente: Imports System.Math

D:\LIBRO\Notas sobre VB_Net.doc Página 119 de 164

Requisitos Class: Math (Clase) Ejemplo de Abs En este ejemplo se utiliza el método Abs de la clase Math para calcular el valor absoluto de un número: 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 método 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 método 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 método 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 método Log de la clase Math para devolver el logaritmo natural de un número: 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 método Round de la clase Math para redondear un número al entero más próximo: 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 método Sign de la clase Math para determinar el signo de un número: 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 método Sin de la clase Math para devolver el seno de un ángulo: Imports System.Math

D:\LIBRO\Notas sobre VB_Net.doc Página 120 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 método Sqrt de la clase Math para calcular la raíz cuadrada de un número: 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 método 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 también Rnd (Función) | Randomize (Instrucción) | Funciones matemáticas derivadas | Double.NaN (Campo)

D:\LIBRO\Notas sobre VB_Net.doc Página 121 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 Página 122 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 año 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 año 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 Página 123 de 164

23 Tabla de estilos

23.1 Ejemplo 1 Public Sub Cargar_TS_Detalle(ByVal p_DataSet As DataSet _ , ByVal p_tabla As String _ , ByRef p_Datagrid As DataGrid _ , ByRef p_error As 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 Página 124 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 añadir 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 Página 125 de 164

24 Tratamiento de fechas

24.1 Función DateAdd '--------------- Determinar visitas del año 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 ' Specifies months as interval. W_Fecha2 = CDate(w_fecha1) w_Meses = Val(Me.T_Meses.Text) 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 función DateAdd, se muestra la fecha correspondiente un

D:\LIBRO\Notas sobre VB_Net.doc Página 126 de 164

número 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: " & DateAdd(IntervalType, Months, SecondDate)

MsgBox (Msg)

Referencia del lenguaje Visual Basic

DateAdd (Función) Devuelve un valor de tipo Date que contiene un valor de fecha y hora al que se ha agregado un intervalo de tiempo especificado. P u b l i c O v e r l o a d s F u n c t i o n D a t e A d d ( _ 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 _ ) A s D a t e T i m e O bien P u b l i c O v e r l o a d s F u n c t i o n D a t e A d d ( _ 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 _ ) A s D a t e T i m e Parámetros Interval Requerido. Valor de enumeración DateInterval o expresión String que representa el intervalo de tiempo que se desea agregar. Number Requerido. Double. Expresión de punto flotante que representa el número 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. Expresión 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. Configuración El argumento Interval puede tener uno de los siguientes valores:

Valor de enumeración Cadena Unidad de intervalo de tiempo agregada DateInterval.Day d Día; truncado al valor integral DateInterval.DayOfYear y Día; truncado al valor integral DateInterval.Hour h Hora; redondeada al milisegundo más cercano DateInterval.Minute n Minuto; redondeado al milisegundo más cercano DateInterval.Month m Mes; truncado al valor integral DateInterval.Quarter q Trimestre; truncado al valor integral DateInterval.Second s Segundo; redondeado al milisegundo más cercano DateInterval.Weekday w Día; truncado al valor integral DateInterval.WeekOfYear ww Semana; truncada al valor integral DateInterval.Year yyyy Año; truncado al valor integral

Excepciones o errores

Tipo de excepción Número de error Condición InvalidCastException 13 DateValue no se puede convertir

a Date.

D:\LIBRO\Notas sobre VB_Net.doc Página 127 de 164

ArgumentException 5 Interval no es válido.

ArgumentOutOfRangeException 9 La fecha calculada es anterior a las 00:00:00 horas del 1 de enero del año 1 o posterior a las 23:59:59 del 31 de diciembre de 9999.

Comentarios Se puede utilizar la función DateAdd para agregar o sustraer un intervalo de tiempo especificado de una fecha. Por ejemplo, se puede calcular una fecha 30 días posterior al día de hoy o una hora 45 minutos anterior a la actual. Para agregar días a DateValue, se pueden utilizar DateInterval.Day, DateInterval.DayOfYear o DateInterval.Weekday. Estos valores se tratarán como equivalentes, ya que DayOfYear y Weekday no son intervalos de tiempo con significado. La función DateAdd nunca devuelve una fecha no válida. Si es necesario, la parte del día de la fecha resultante se ajusta en sentido descendente hasta el último día del mes resultante del año 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 año bisiesto. Si algún argumento tiene un valor no válido, se produce un error ArgumentException. Si la fecha calculada es anterior a las 00:00:00 del día 1 de enero del año 1, o posterior a las 23:59:59 del 31 de diciembre del año 9999, se produce un error ArgumentOutOfRangeException. Si el argumento DateValue tiene un valor que no puede convertirse a un valor Date válido, se produce un error InvalidCastException. Nota DateAdd utiliza la configuración de calendario actual de la propiedad CurrentCulture de la clase CultureInfo en el espacio de nombres System.Globalization. Los valores CurrentCulture predeterminados están determinados por la configuración del Panel de control. Puesto que todos los valores Date se basan en una estructura DateTime, sus métodos proporcionan opciones adicionales para agregar intervalos de tiempo. Por ejemplo, se puede agregar a la variable Date un número decimal de días, redondeado al milisegundo más 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 función DateAdd, se muestra la fecha correspondiente un número 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 Módulo: DateAndTime Ensamblado: Tiempo de ejecución de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea también DateDiff (Función) | DatePart (Función) | Day (Función) | Format (Función) | Now (Propiedad) | Weekday (Función) | Year (Función) | 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 Página 128 de 164

24.2 Función 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 (Función) Vea también DateAdd (Función) | DatePart (Función) | Day (Función) | Format (Función) | Now (Propiedad) | Weekday (Función) | Year (Función) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase) Requisitos Espacio de nombres: Microsoft.VisualBasic Módulo: DateAndTime Ensamblado: Tiempo de ejecución de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Devuelve un valor Long que especifica el número 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 Parámetros Interval Requerido. Valor de enumeración DateInterval o expresión 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 cálculo. 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 enumeración FirstDayOfWeek que especifica el primer día de la semana. Si no se especifica ningún valor, se utiliza FirstDayOfWeek.Sunday. WeekOfYear Opcional. Valor elegido de la enumeración FirstWeekOfYear que especifica la primera semana del año. Si no se especifica ningún valor, se utiliza FirstWeekOfYear.Jan1.

D:\LIBRO\Notas sobre VB_Net.doc Página 129 de 164

Configuración El argumento Interval puede tener uno de los siguientes valores: Valor de enumeración Cadena Unidad de diferencia temporal DateInterval.Day d Día DateInterval.DayOfYear y Día DateInterval.Hour h Hora DateInterval.Minute n Minuto DateInterval.Month m Mes DateInterval.Quarter q Trimestre DateInterval.Second s Segundo DateInterval.Weekday w Semana DateInterval.WeekOfYear ww Semana del calendario DateInterval.Year yyyy Año El argumento DayOfWeek puede tener uno de los siguientes valores: Valor de enumeración Valor Descripción FirstDayOfWeek.System 0 Primer día de la semana especificado en la configuración

del sistema FirstDayOfWeek.Sunday 1 Domingo (predeterminado) FirstDayOfWeek.Monday 2 Lunes (de acuerdo con la norma ISO 8601, sección 3.17) FirstDayOfWeek.Tuesday 3 Martes FirstDayOfWeek.Wednesday 4 Miércoles FirstDayOfWeek.Thursday 5 Jueves FirstDayOfWeek.Friday 6 Viernes FirstDayOfWeek.Saturday 7 Sábado El argumento WeekOfYear puede tener uno de los siguientes valores: Valor de enumeración Valor Descripción FirstWeekOfYear.System 0 Primera semana del año especificada en la

configuración del sistema FirstWeekOfYear.Jan1 1 Semana en la que se encuentra el 1 de enero

(predeterminado) FirstWeekOfYear.FirstFourDays 2 Semana que contiene al menos cuatro días del nuevo

año (de acuerdo con la norma ISO 8601, sección 3.17) FirstWeekOfYear.FirstFullWeek 3 Primera semana completa del nuevo año Excepciones o errores Tipo de excepción Número de error Condición ArgumentException 5 Interval no válido. ArgumentException 5 Date o DayofWeek quedan fuera del

intervalo. InvalidCastException 13 Date1 o Date2 son tipos no válidos. Comentarios Se puede utilizar la función DateDiff para determinar el número de intervalos de tiempo especificados que existen entre dos valores de fecha u hora. Por ejemplo, con DateDiff podría calcular el número de días entre dos fechas o el número de semanas entre hoy y el último día del año. 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 número de semanas entre el primer día de la semana que contiene Date1 y el primer día de la semana que contiene Date2. El ejemplo siguiente muestra cómo 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 días, pero devuelve 1 a WY porque existe una diferencia de siete días entre los primeros días 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 año 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 Página 130 de 164

100 nanosegundos en el temporizador del sistema. Sin embargo, DateDiff siempre devuelve el número de intervalos de tiempo como un valor Long. Si Date1 representa una fecha y hora posteriores a Date2, DateDiff devuelve un número negativo. Si algún argumento tiene un valor no válido, se produce un error ArgumentException. Si el argumento Date1 o Date2 tiene un valor que no puede convertirse a un valor Date válido, se produce un error InvalidCastException. Nota Al comparar el 31 de diciembre con el 1 de enero del año siguiente, DateDiff devolverá 1 para DateInterval.Year, DateInterval.Quarter o DateInterval.Month, aunque sólo haya pasado un día. Puesto que todos los valores Date se basan en una estructura DateTime, sus métodos proporcionan opciones adicionales para buscar intervalos de tiempo. Por ejemplo, se puede utilizar el método 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 cuántos 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 función DateDiff para mostrar el número de días 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 Módulo: DateAndTime Ensamblado: Tiempo de ejecución de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea también DateAdd (Función) | DatePart (Función) | Day (Función) | Format (Función) | Now (Propiedad) | Weekday (Función) | Year (Función) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase)

D:\LIBRO\Notas sobre VB_Net.doc Página 131 de 164

24.3 Formatear fechas Formatos de fecha y hora predefinidos (Función Format) Vea también Format (Función) | Formatos numéricos predefinidos (Función Format) | Formatos de fecha y hora definidos por el usuario (Función Format) Requisitos Espacio de nombres: Microsoft.VisualBasic Módulo: Strings Ensamblado: Tiempo de ejecución 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 función Format: Nombre de formato Descripción General Date o G Muestra una fecha o una hora. En el caso de números reales, muestra una fecha y una

hora; por ejemplo, 4/3/93 05:34 PM.Si no existe parte fraccional, muestra sólo una fecha; por ejemplo, 4/3/93. Si no existe parte entera, muestra sólo 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. Medium Date Muestra una fecha usando el formato medio que corresponda a la versión de idioma que

use la aplicación 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. Medium Time Muestra la hora en formato de 12 horas utilizando horas y minutos y la especificación

a.m./p.m. Short Time o t Muestra una hora con el formato de 24 horas, por ejemplo, 17:45. f 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. g Muestra la fecha corta y la hora corta de acuerdo con el formato vigente en su sistema. M, m Muestra el mes y el día de una fecha dada. R, r Da formato a la fecha y la hora como Hora media de Greenwich (GMT) s Da formato a la fecha y la hora como un índice ordenable. u 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. Y, y Da formato a la fecha especificando el año y el mes. Requisitos Espacio de nombres: Microsoft.VisualBasic Módulo: Strings Ensamblado: Tiempo de ejecución de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea también Format (Función) | Formatos numéricos predefinidos (Función Format) | Formatos de fecha y hora definidos por el usuario (Función Format)

D:\LIBRO\Notas sobre VB_Net.doc Página 132 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 ejecución:" _ & 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 Página 133 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 Dirección de la Pagina Web. En la primera solapa figura un botón que se encuentra habilitado cuando esta cumplimentado el campo de la segunda solapa. Se ha creado un método para activar o desactivar dicho botón, 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 Página 134 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 Página 135 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 Página 136 de 164

End Try End Sub

D:\LIBRO\Notas sobre VB_Net.doc Página 137 de 164

27.1 Consola MS-DOS

D:\LIBRO\Notas sobre VB_Net.doc Página 138 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("Configuración IP") w_proceso_name = "cmd" w_parametro = "d:\windows\IPConfig.exe" Case LCase("Configuración 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 Página 139 de 164

28 Leer un documento word desde vb.Net

D:\LIBRO\Notas sobre VB_Net.doc Página 140 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 Página 141 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 x As Integer Dim w_char As String Dim w_linea As String Dim y As Integer Dim w_cuerpo As Boolean = False Dim w_cantidad As Boolean = False Dim w_descripcion As Boolean = False Dim w_precio As Boolean = False Dim w_dto As Boolean = False Dim w_importe As Boolean = False Dim w_base As Boolean = False Dim w_iva As Boolean = False Dim w_imp_iva As Boolean = False Dim w_total As Boolean = False Dim w_forma_pago As Boolean = False Dim w_observa As Boolean = False Dim w_num_lin As Integer Dim W_NL As Integer Dim W_X As Integer Dim W_CANT As Integer Dim W_CONC As String Dim W_PREC As String Dim W_DETO As String Dim 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 Página 142 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 Página 143 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 Página 144 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 W_NL As Integer 'Dim W_X As Integer 'Dim W_CANT As Integer 'Dim W_CONC As String 'Dim W_PREC As String 'Dim W_DETO As String 'Dim W_IMPO As String 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

D:\LIBRO\Notas sobre VB_Net.doc Página 145 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 Página 146 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 Página 147 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 ODBC_con As OdbcConnection Dim ODBC_DA As OdbcDataAdapter Dim ODBC_CMDB As OdbcCommandBuilder Dim 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 = "[email protected]" 'Dirigido a: Replace with recipient e-mail address. oMsg.To = "[email protected]" '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 Página 148 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 Aprobación....... : " & Me.editSol_fecha_aproba.Text & vbCr _ & vbCr _ & " Director Financiero.... : " & Me.editSol_Dir_financiero.Text & vbCr _ & " Fecha Aprobación....... : " & Me.editSol_fec_autoriz_fina.Text & vbCr _ & vbCr _ & " Responsable Seguridad.. : " & Me.editSOl_Res_seguridad.Text & vbCr _ & " Fecha Aprobación....... : " & 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 Página 149 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 = "[email protected]" oMsg.CC = "[email protected]" ' 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 Página 150 de 164

30 Crystal Report

30.1 Insertar Línea en blanco como separador en un report Método para insertar una línea en blanco cada 5 líneas en un informe con Cristal Report Sea el siguiente informe:

Para hacer eso hay que insertar una nueva sección de detalle que solo mostraremos cada 5 líneas. En consecuencia, lo primero que tenemos que hacer es insertar una nueva sección de detalle, para lo cual, nos posicionamos en la sección “Detalle a” y con el botón derecho mostramos menú contextual, y elegimos “Insertar Sección abajo”

A continuación, elegimos esa nueva sección para formatearla.

D:\LIBRO\Notas sobre VB_Net.doc Página 151 de 164

pinchamos sobre el botón 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 (línea de detalle) que se esté escribiendo. En consecuencia, necesitamos un campo que nos proporcione esa información.

D:\LIBRO\Notas sobre VB_Net.doc Página 152 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 NumReg Tipo de Resumen Recuento

Ahora ya estamos en condiciones de escribir la formula

D:\LIBRO\Notas sobre VB_Net.doc Página 153 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 división modular (Dividendo, Divisor o módulo) = resto

D:\LIBRO\Notas sobre VB_Net.doc Página 154 de 164

30.2 Otra forma de insertar línea en blanco

D:\LIBRO\Notas sobre VB_Net.doc Página 155 de 164

30.3 Definir la orientación de la Página Horizontal o vertical Crystal Reports para Visual Studio .NET Configurar impresión (cuadro de diálogo)

Utilice este cuadro de diálogo para seleccionar la impresora, la orientación de página y el tamaño 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 diálogo aparece cuando se hace clic con el botón secundario en Report Designer, se elige Diseñador y después Configurar impresión.

No hay impresora Active esta casilla de verificación cuando la impresión no sea una opción en una estación de trabajo concreta.

30.3.1 Impresora Nombre

Busque el nombre de la impresora a la que desea enviar los informes en la lista Nombre. Propiedades

Haga clic en este botón para que se abra el cuadro de diálogo Propiedades de la impresora seleccionada. Propiedades predefinidas

Active esta casilla de verificación para establecer todas las propiedades de la impresora en sus valores predeterminados.

30.3.2 Papel Tamaño

Utilice la lista Tamaño para seleccionar las opciones de tamaño de papel o de sobre. Origen

Utilice la lista Origen para seleccionar las opciones de origen de alimentación o de papel.

30.3.3 Orientación Vertical

Seleccione esta opción para imprimir el informe en una orientación de carta estándar. Horizontal

Seleccione esta opción para imprimir el informe en orientación horizontal. Red

Haga clic en este botón para conectarse a una impresora de red.

D:\LIBRO\Notas sobre VB_Net.doc Página 156 de 164

D:\LIBRO\Notas sobre VB_Net.doc Página 157 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 Página 158 de 164

30.5 Ajustar las lineas para un campo de múltiples Lineas de Información

A veces el diseño del formulario impide definir una sección de detalle, ya que entraría en conflicto con otra parte del diseño. Es el caso del ejemplo que se muestra.. La Sección 3 sigue las reglas normales, pero la Sección 4, además de tener un tamaño fijo, debe respetar el diseño de la parte derecha.

La solución adopatada es crear un único campo memo dentro del rigistro de cabecera, en el que se almacena cada línea 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 separación, 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 Página 159 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 Página 160 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" Dónde 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 Página 161 de 164

30.7 Permitir acoplamiento en el editor de formulas

D:\LIBRO\Notas sobre VB_Net.doc Página 162 de 164

31 Direcciones útiles Visual Studio .NET Hoy día Internet es un vehículo de información y de recursos muy importante para el desarrollador. Tan indispensable es saber utilizarlo bien como conocer dónde se encuentran los recursos más interesantes o recursos destacables que debemos tener en cuenta a la hora de extraer información que nos pueda ayudar. A continuación, podrá encontrar algunos recursos que hemos considerado destacables por poder ofrecerle un valor añadido a sus conocimientos y prácticas con Visual Studio .NET. Es muy probable que no se incluyan algunos recursos de interés, pero debe comprender que es muy difícil englobar aquí todos los recursos que existen en Internet sobre Visual Studio .NET. Sirvan por tanto los siguientes recursos, como una parte de la información que encontrará sobre Visual Studio .NET, a través de los cuales podrá acceder a otros recursos de alto interés.

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

Microsoft MSDN posee diferentes recursos en español que le servirán de utilidad. Entre otros destacamos en primer lugar MSDN España, que le permitirá acceder a información relevante sobre Visual Studio .NET y otros recursos en español. Adicionalmente, nos encontramos con otro recurso de MSDN en español, en esta ocasión, el que corresponde con MSDN Latinoamérica, que, como en el caso de MSDN España, le permitirá acceder a información en español sobre Visual Studio .NET, si bien, esta información está focalizada en Latinoamérica; podrá acceder a diferentes Comunidades con noticias, recursos, enlaces, documentación ... 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 español de la Web donde encontrará información sobre Visual Basic y C#, aunque su focalización y especialización es en Visual BASIC. Además de ejemplos y tutoriales, encontrará unos foros de discusión 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 diseñada y administrada por Francisco Charte, uno de los autores de este libro. En esta interesante Web encontrará información de alto interés para el desarrollador, así como artículos, recursos y noticias sobre tecnología relacionada no sólo con Visual Studio .NET sino también con otros lenguajes de desarrollo. PortalVB.com http://www.portalvb.com/ PortalVB.com, es una web diseñada y administrada por Jorge Serrano, otro de los autores de este libro; en ella encontrará información, foros de discusión, artículos, tutoriales, recursos y noticias sobre la tecnología .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 diseñada y administrada por el Grupo Eidos, un grupo especializado en informática con formación tanto on-line como off-line. En esta web encontrará una revista electrónica digital gratuita con artículos realmente interesantes sobre la tecnología Microsoft. Adicionalmente encontrará foros de discusión donde podrá plantear sus dudas, que serán resueltas por otros especialistas.

D:\LIBRO\Notas sobre VB_Net.doc Página 163 de 164

El rincón en Español de C# http://manowar.lsi.us.es/~csharp/ El Rincón en Español de C# es una Web diseñada y administrada por la Universidad de Sevilla (España), y ha sido uno de los primeros recursos de C# en aparecer en español 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 información disponible sobre este lenguaje. Además de los recursos que encontraremos de alto interés para el desarrollador, podemos darnos de alta en una lista de discusión sobre el lenguaje C# que nos servirá para adquirir más experiencia sobre este lenguaje. ACSP de la Universidad Politécnica 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 tecnologías de Microsoft. A nuestro modo de ver, ACSP de la Universidad Politécnica de Valencia (España), es el mejor recurso ACSP en español, y por eso, creemos conveniente destacarlo. En este recurso encontrará información y recursos sobre .NET convenientemente destacada. MSDN en inglés http://msdn.microsoft.com/ Microsoft MSDN posee como es lógico, de un recurso oficial para el desarrollador en general. MSDN en inglés es la web oficial de MSDN. En este recurso encontrará información, artículos 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 página, encontrará información de interés 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 información 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 información, enlaces y recursos sobre .NET que le podrán sacar de más de un apuro. News news://news.microsoft.com/ Los grupos de noticias nos servirán en cualquier momento, no sólo 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 Página 164 de 164