Ejemplos Practicos de VB Net
Ejemplos Practicos de VB Net
Ejemplos Practicos de VB Net
Net
1 2 3 4 5 6 6.1 7 8 8.1 8.2 8.3 9 10 11 12 12.1 12.1.1 12.1.2 13 13.1 13.2 13.3 13.3.1 13.3.2 13.3.3 13.3.4 13.3.5 13.4 13.4.1 13.4.2 13.5 13.6 14 14.1 14.2 14.3 14.4 15 15.1 15.2 15.3 15.4 Propiedades de un proyecto.......................................................................................................................... 4 Evitar multiples instancias de una aplicacion .Net ..................................................................................... 5 Carpetas especiales........................................................................................................................................ 8 Variables del entorno .................................................................................................................................... 9 Detectar la pulsacin de una tecla.............................................................................................................. 12 Manejo de las solapas de un TabControl .................................................................................................. 13 Seleccionar una solapa determinada.............................................................................................................. 13 Structure....................................................................................................................................................... 14 Combobox .................................................................................................................................................... 17 Estilo Single .................................................................................................................................................. 17 Estilo DropDown........................................................................................................................................... 17 Estilo DropDownList..................................................................................................................................... 17 InputBox....................................................................................................................................................... 18 CheckedListBox........................................................................................................................................... 19 Control ToolTip ........................................................................................................................................... 20 Barra de herramientas:............................................................................................................................... 21 Cmo saber el nombre del botn pulsado...................................................................................................... 21 Usando el evento ........................................................................................................................................... 21 Usando el nombre del remitente (sender)...................................................................................................... 22 Forms............................................................................................................................................................ 23 Coleccin de forms........................................................................................................................................ 23 Consultar coleccin de forms y controles en cada form ................................................................................ 24 Commondialog .............................................................................................................................................. 25 Ejemplo de FolderDialog .............................................................................................................................. 26 Ejemplo de OpenFileDialog.......................................................................................................................... 27 Ejemplo de SaveFileDialog ........................................................................................................................... 28 Ejemplo de ColorDialog................................................................................................................................ 29 Ejemplo de FontDialog ................................................................................................................................. 30 Salvar en fichero atributos y recuperarles...................................................................................................... 31 Salvar Color y atributos del Font.................................................................................................................. 31 Recuperar y asignar Color de fondo y atributos del font .............................................................................. 33 Repintar fondo cuando se cambia el tamao ................................................................................................. 38 Dibujar lnea roja........................................................................................................................................... 39 Form MDI .................................................................................................................................................... 40 Problema con las llamadas entre forms ......................................................................................................... 40 Patrn Singleton con formularios MDI ......................................................................................................... 42 Invocar un Form Hijo .................................................................................................................................... 43 Color de fondo en un formulario MDI .......................................................................................................... 44 Asistente form de datos ............................................................................................................................... 49 Cadena de conexin:...................................................................................................................................... 49 Modificar la select generada por el asistente ................................................................................................. 50 Cmo rellena el asistente un DataGrid de datos ............................................................................................ 51 Cmo modificar el adaptador cuando se aaden columnas ........................................................................... 53
Pgina 1 de 164
15.5 16 16.1 16.2 16.3 16.4 16.4.1 16.4.2 16.4.3 16.4.4 16.4.5 16.5 16.6 16.6.1 17 17.1 17.2 17.3 17.4 17.5 17.6 18 18.1 18.2 18.3 18.3.1 18.4 18.5 18.5.1 18.5.2 18.6 18.7 19 19.1 19.2 20 21 22 23 23.1 24 24.1 24.2 24.3 25 26 27 27.1 28
Ejemplo 2: Aadir un campo booleano ......................................................................................................... 59 SQL............................................................................................................................................................... 62 Ejecutar comando inmediato ......................................................................................................................... 62 Clausula Delete.............................................................................................................................................. 63 Clausula insert ............................................................................................................................................... 64 Clausula SELECT ......................................................................................................................................... 65 Select count(*) ............................................................................................................................................... 65 Where con Like , Order by ASC/DESC ......................................................................................................... 69 Where con campo tipo booleano ................................................................................................................... 71 Where con campos nulos ............................................................................................................................... 72 No mostrar filas duplicadas con DISTINCT................................................................................................. 73 Vistas ............................................................................................................................................................. 75 Tipos de concurrencia.................................................................................................................................... 76 Optimista ....................................................................................................................................................... 76 Acceso a datos .............................................................................................................................................. 77 Transacciones con .NET................................................................................................................................ 77 Recuperar el valor de un campo con ExecuteScalar...................................................................................... 80 Ejecutar comando que no devuelve un conjunto de registros : ExecuteNonQuery ....................................... 81 Recuperar un conjunto de registros con Datareader ...................................................................................... 82 Rellenar un datagrid con Adaptador sin asistente.......................................................................................... 83 Form_cliente_detalle_pedidos....................................................................................................................... 86 Datagrid........................................................................................................................................................ 87 Cmo saber en que celda de un Datagrid se pulsa......................................................................................... 87 Cmo referenciar una celda de un Datagrid .................................................................................................. 88 Mantenimiento de una tabla en un nico Form ............................................................................................. 89 Tabla de Artculos: Seleccionar celdas de una fila ....................................................................................... 89 Datagrid con Tabla de memoria .................................................................................................................... 90 DataGrid con Manejador ............................................................................................................................... 93 Ejemplo 1....................................................................................................................................................... 93 Ejemplo 2....................................................................................................................................................... 99 Configurar el adaptador al aadir un campo nuevo a la tabla...................................................................... 106 Datagrid con CheckBox............................................................................................................................... 111 Funcin Format()....................................................................................................................................... 115 Formato de fechas........................................................................................................................................ 115 Formato de numeros .................................................................................................................................... 117 Funciones matemticas ............................................................................................................................. 118 Bucles.......................................................................................................................................................... 121 Select Case.................................................................................................................................................. 122 Tabla de estilos........................................................................................................................................... 123 Ejemplo 1 .................................................................................................................................................... 123 Tratamiento de fechas............................................................................................................................... 125 Funcin DateAdd......................................................................................................................................... 125 Funcin DateDiff......................................................................................................................................... 128 Formatear fechas ......................................................................................................................................... 131 Control de pago.......................................................................................................................................... 132 Forzar la recuperacion de un campo ....................................................................................................... 133 Ejecutar aplicacion.................................................................................................................................... 135 Consola MS-DOS........................................................................................................................................ 137 Leer un documento word desde vb.Net ................................................................................................... 139
Pgina 2 de 164
Enviar Mail desde VB.Net ........................................................................................................................ 147 Crystal Report ........................................................................................................................................... 150 Insertar Lnea en blanco como separador en un report ................................................................................ 150 Otra forma de insertar lnea en blanco......................................................................................................... 154 Definir la orientacin de la Pgina Horizontal o vertical ............................................................................ 155 Impresora .................................................................................................................................................... 155 Papel............................................................................................................................................................ 155 Orientacin.................................................................................................................................................. 155 Explorador de Campos ................................................................................................................................ 157 Ajustar las lineas para un campo de mltiples Lineas de Informacin........................................................ 158 Pasar parametro desde vb.net a Report........................................................................................................ 160 Direcciones tiles Visual Studio .NET ..................................................................................................... 162
Pgina 3 de 164
1 Propiedades de un proyecto
Pgina 4 de 164
Pgina 5 de 164
'-----------------------------------------'Application.Run(o_F_acceso) 'Application.Run(New F_Logon) ' otra forma de abrirla '-----------------------------------------Else '-----------------------------'Error: Ya hay otrqa instancia '-----------------------------MsgBox("Ya se encuentra en ejecucin " _ & "otra instancia de esta aplicacion" _ , MsgBoxStyle.Exclamation, _ "Abriendo Aplicacin TER ...") End If End Sub End Module
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
Pgina 6 de 164
Dim objProcess As New Process 'Variable to hold individual Process Dim objProcesses() As Process 'Collection of all the Processes running on local machine objProcesses = Process.GetProcesses() ''Get all processes into the collection For Each objProcess In objProcesses ''Check and exit if we have SMS running already If UCase(objProcess.MainWindowTitle) = UCase(argStrAppToFind)
Then
MsgBox("Another instance of " & argStrAppToFind & " is already running on this machine. You cannot run TWO instances at a time. Please use the other instance.") PrevHndl = objProcess.MainWindowHandle.ToInt32() Exit For End If Next If PrevHndl = 0 Then Exit Sub 'if No previous instance found exit the application. ''If found result = OpenIcon(PrevHndl) 'Restore the program. result = SetForegroundWindow(PrevHndl) 'Activate the application. End Sub End 'End the current instance of the application.
As a result of this code, the first instance of the program is given focus and the second instance is closed. If the first instance of the application was minimized, it will be restored to a normal window automatically. Though this code is written in VB.NET, it can easily be converted into C# or JScript easily on similar grounds. Raj Chidipudi
Pgina 7 de 164
3 Carpetas especiales
Private Sub lstFolders_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstFolders.SelectedIndexChanged Dim sf As Environment.SpecialFolder ' GetSpecialFolderFromList is a method ' in the hidden "Enum Handling" region ' above. It returns a member of the ' Environment.SpecialFolder enumeration, ' and is specific to this demonstration. sf = GetSpecialFolderFromList() ' GetFolderPath is a method provided by ' the System.Environment namespace. ' Specifically, you could call the GetFolderPath ' method like this: ' YourPath = GetFolderPath(SpecialFolder.Favorites) ' GetFolderPath is actually System.Environment.GetFolderPath. ' See the Imports statement at the top of this file. lblSpecialFolder.Text = GetFolderPath(sf) End Sub
Pgina 8 de 164
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
Pgina 9 de 164
'------------------------------------------------------------'recuperar el indice dentro de la lista de carpetas especiales '------------------------------------------------------------' GetSpecialFolderFromList is a method ' in the hidden "Enum Handling" region ' above. It returns a member of the ' Environment.SpecialFolder enumeration, ' and is specific to this demonstration. sf = GetSpecialFolderFromList("LocalApplicationData") '------------------------------------------------------------'recuperar el valor asociado al indice '------------------------------------------------------------' GetFolderPath is a method provided by ' the System.Environment namespace. ' Specifically, you could call the GetFolderPath ' method like this: ' YourPath = GetFolderPath(SpecialFolder.Favorites) ' GetFolderPath is actually System.Environment.GetFolderPath. ' See the Imports statement at the top of this file. ' -------------------------'======>> Imports System.Environment ' -------------------------p_folder = GetFolderPath(sf) End Sub
Private Function GetSpecialFolderFromList( _ ByVal p_carpeta As String) _ As Environment.SpecialFolder ' lstFolders.SelectedItem returns the name of the ' special folder. System.Enum.Parse will turn that ' into an object corresponding to the enumerated value ' matching the specific text. CType then converts the ' object into an Environment.SpecialFolder object. ' This is all required because Option Strict is on. Return CType( _ System.Enum.Parse(GetType(Environment.SpecialFolder), _ p_carpeta), _ Environment.SpecialFolder) End Function
Pgina 10 de 164
Pgina 11 de 164
Pgina 12 de 164
Pgina 13 de 164
7 Structure
Structure (Instruccin) Vea tambin Dim (Instruccin) | Implements (Instruccin) | Event (Instruccin) | Property (Instruccin) Se utiliza en el nivel de mdulo o clase para declarar una estructura y definir las caractersticas de sus miembros. [ <attrlist> ] [{ Public | Protected | Friend | Protected Friend | Private }] [ Shadows ] Structure name [ Implements interfacenames ] variabledeclarations [ proceduredeclarations ] End Structure Partes attrlist Opcional. Lista de atributos que se aplican a esta estructura. Los atributos mltiples se separan por comas. Public Opcional. Las estructuras declaradas con la palabra clave Public tienen acceso pblico. No hay restricciones para obtener acceso a las estructuras pblicas. Protected Opcional. Las estructuras declaradas mediante la palabra clave Protected tienen acceso protegido. Slo son accesibles desde su propia clase o desde una clase derivada. El acceso protegido slo se puede especificar en miembros de clases. No es un supraconjunto del acceso de tipo amigo. Friend Opcional. Las estructuras declaradas con la palabra clave Friend tienen acceso de tipo amigo. Son accesibles desde dentro de su contexto de declaracin y desde otra seccin del mismo programa. Protected Friend Opcional. Las estructuras declaradas mediante los modificadores Protected Friend tienen acceso combinado de tipo protegido y amigo. Puede utilizarlas el cdigo del mismo programa, as como el cdigo de clases derivadas. El acceso de tipo amigo slo se puede especificar en miembros de clases. Private Opcional. Las estructuras declaradas mediante el modificador Private tienen acceso de tipo privado. Slo son accesibles desde dentro del contexto de su declaracin, incluidos los miembros de cualquier tipo anidado como los procedimientos. Shadows Opcional. Indica que esta estructura sombrea un elemento de programacin denominado de forma idntica, o un conjunto de elementos sobrecargados, en una clase base. Puede hacer que cualquier tipo de elemento declarado prevalezca sobre cualquier otro tipo. Un elemento sombreado no est disponible desde la clase derivada que lo sombrea, a menos que el elemento que produce el sombreado no est accesible, por ejemplo, si es Private. name Requerido. Nombre de la estructura. Debe ser un identificador de Visual Basic vlido. Implements Opcional. Indica que esta estructura implementa los miembros de una o ms interfaces. interfacenames Es obligatorio si se utiliza la instruccin Implements. Nombres de las interfaces implementadas por esta estructura. Si utiliza la instruccin Implements, debe colocarla inmediatamente detrs de la instruccin Structure, y debe implementar cada miembro definido por cada interfaz que se especifique. variabledeclarations Requerido. Una o ms instrucciones Dim, Event, Friend, Private o Public declaran variables que declaran variables y eventos que sirven como miembros de datos de la estructura. Estas declaraciones siguen las mismas reglas que rigen fuera de una estructura. Tambin pueden definirse constantes y propiedades en la estructura, pero debe declararse por lo menos un evento o variable no compartido. proceduredeclarations Opcional. Cero o ms declaraciones de los procedimientos Function, Property o Sub que sirven como miembros del mtodo de la estructura. Estas declaraciones siguen las mismas reglas que rigen fuera de una estructura. Cada atributo de la parte attrlist tiene la siguiente sintaxis y partes: attrname [({ attrargs | attrinit })] Partes attrlist attrname Requerido. Nombre del atributo. Debe ser un identificador de Visual Basic vlido. attrargs
Pgina 14 de 164
Opcional. Lista de argumentos por posicin de este atributo. Los argumentos mltiples se separan por comas. attrinit Opcional. Lista de inicializadores de campos o propiedades de este atributo. Los inicializadores mltiples se separan por comas. Comentarios La instruccin Structure slo puede aparecer en el nivel de mdulo, espacio de nombres o archivo. Esto es, puede declarar estructuras en un archivo de cdigo fuente o dentro de un mdulo, una interfaz o una clase, pero no dentro de un procedimiento. Tambin puede definirse una estructura dentro de otra, pero ello imposibilita el acceso a sus miembros a travs de la otra. En lugar de ello, debe declararse una variable del tipo de datos de la estructura interna. Se puede tener acceso a las estructuras desde cualquier lugar del mdulo o clase en que se declaran. De forma predeterminada una estructura es Friend. Para especificar la accesibilidad de manera ms detallada, incluya Public, Protected, Friend, Protected Friend o Private en la instruccin Structure. Debe declarar cada miembro de datos de una estructura. Esto significa que cada instruccin de la parte variabledeclarations debe contener Dim, Friend, Private o Public. Los miembros de una estructura no pueden ser Protected o Protected Friend porque no se puede heredar nada de una estructura. Sin embargo, la propia estructura puede ser Protected o Protected Friend. Si Option Strict es On, debe incluir tambin la clusula As en cada declaracin de miembro. Los miembros declarados con Dim tienen acceso de tipo Public de manera predeterminada, y los miembros declarados sin la clusula As utilizan de manera predeterminadas el tipo de datos Object. En una estructura debe declararse por lo menos un evento o variable no compartido. No pueden utilizarse nicamente constantes, propiedades y procedimientos, aunque algunos sean no compartidos. El mbito de todos los miembros de la estructura es la estructura completa. No se podr inicializar el valor de cualquier miembro de datos de una estructura como parte de su declaracin. Se debe inicializar un miembro de datos mediante un constructor parametrizado en la estructura o asignar un valor al miembro despus de crear una instancia de la estructura. Las estructuras admiten muchas de las mismas caractersticas como clases. Por ejemplo, las estructuras pueden tener propiedades y mtodos, pueden implementar interfaces y pueden tener constructores con parmetros. No obstante, existen diferencias de consideracin entre las estructuras y las clases en materias como la herencia, las declaraciones y la utilizacin. Ejemplo En este ejemplo se utiliza la instruccin Structure para definir un conjunto de datos relacionados de un empleado. Se muestra el uso de los miembros Public, Friend y Private para reflejar la confidencialidad de los elementos de datos. Tambin se muestran los miembros de evento, propiedad y procedimiento. Public Structure Employee ' Public members, accessible throughout declaration region. Public FirstName As String Public MiddleName As String Public LastName As String ' Friend members, accessible anywhere within the same program. Friend EmployeeNumber As Integer Friend WorkPhone As Long ' Private members, accessible only within the structure itself. Private HomePhone As Long Private Level As Integer Private Salary As Double Private Bonus As Double ' Procedure member, which can access structure's private members. Friend Sub CalculateBonus(ByVal Rate As Single) Bonus = Salary * CDbl(Rate) End Sub ' Property member to return employee's eligibility. Friend ReadOnly Property Eligible() As Boolean Get Return Level >= 25 End Get End Property ' Event member, raised when business phone number has changed. Public Event ChangedWorkPhone(ByVal NewPhone As Long) End Structure Vea tambin Dim (Instruccin) | Implements (Instruccin) | Event (Instruccin) | Property (Instruccin)
Pgina 15 de 164
Pgina 16 de 164
8 Combobox 8.1 Estilo Single 8.2 Estilo DropDown 8.3 Estilo DropDownList
Pgina 17 de 164
9 InputBox
Dim w_aux As Boolean = True Dim w_opcion As String While w_aux w_opcion = MsgBox("Poner Lapiz de Memoria en dispositivo " _ & vbCrLf _ & vbCrLf & "Pulse <SI> cuando est listo el dispositivo" _ & vbCrLf & " <NO> Para NO REALIZAR el backup" _ & vbCrLf & " <CANCEL> en cualquier otro caso" _ , MsgBoxStyle.Information + MsgBoxStyle.YesNoCancel _ , Me.Text) Select Case w_opcion Case MsgBoxResult.Yes Exit While Case MsgBoxResult.No MsgBox("BACKUP diario automtico: Abortado" _ , MsgBoxStyle.Exclamation, Me.Text) Exit Sub Case Else End Select End While
Pgina 18 de 164
10 CheckedListBox
Pgina 19 de 164
11 Control ToolTip
Este control sirve para mostrar entre otras cosas mensajes que pueden servir en los comienzos pero son innecesarios cuando se conoce ya la aplicacin. Para poder asociar un mensaje a un campo es preciso incluir previamente un tooltip de la barra de companentes.
selccionando todos los controles a los que quiero asignar un mismo mensaje, resulta
Pgina 20 de 164
12
Barra de herramientas:
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)
Pgina 21 de 164
'-------------------------------------------' En este ejemplo se usa el nombre del botn '-------------------------------------------If e.Button Is Me.clientes Then Call Me.M_manto_clientes_Click(o1, o1) End If
12.1.2
Pgina 22 de 164
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
Pgina 23 de 164
Pgina 24 de 164
13.3 Commondialog
Buscar en Ayuda: CommonDialog (control) En esta seccin ColorDialog (Componente, formularios Windows Forms) Permite que el usuario seleccione un color de una paleta en un cuadro de dilogo preconfigurado y que agregue colores personalizados a la paleta. FolderBrowserDialog (Componente, formularios Windows Forms) Permite a los usuarios buscar y seleccionar carpetas. FontDialog (Componente, formularios Windows Forms) Expone las fuentes actualmente instaladas en el sistema. OpenFileDialog (Componente, formularios Windows Forms) Permite que los usuarios abran archivos mediante un cuadro de dilogo preconfigurado. PageSetupDialog (Componente, formularios Windows Forms) Establece los detalles de impresin de la pgina a travs de un cuadro de dilogo preconfigurado. PrintDialog (Componente, formularios Windows Forms) Selecciona una impresora, elige las pginas que se van a imprimir y determina otros valores de configuracin relacionados con la impresin. PrintPreviewDialog (Control, formularios Windows Forms) Muestra un documento tal como aparecer cuando se imprima. SaveFileDialog (Componente, formularios Windows Forms) Selecciona los archivos que se van a guardar y el lugar en el que se guardarn. Informacin adicional Cuadros de dilogo en formularios Windows Forms Describe cmo crear un cuadro de dilogo para un formulario Windows Forms. ColorDialog (Clase) Proporciona informacin de referencia acerca de la clase ColorDialog y sus miembros. FontDialog (Clase) Proporciona informacin de referencia acerca de la clase FontDialog y sus miembros. OpenFileDialog (Clase) Proporciona informacin de referencia acerca de la clase OpenFileDialog y sus miembros. PageSetupDialog (Clase) Proporciona informacin de referencia acerca de la clase PageSetupDialog y sus miembros. PrintDialog (Clase) Proporciona informacin de referencia acerca de la clase PrintDialog y sus miembros. PrintPreviewDialog (Clase) Proporciona informacin de referencia acerca de la clase PrintPreviewDialog y sus miembros. SaveFileDialog (Clase) Proporciona informacin de referencia acerca de la clase SaveFileDialog y sus miembros.
Pgina 25 de 164
13.3.1
Ejemplo de FolderDialog
Private Sub Bot_sel_dir_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Sel_dir.Click Dim folderBrowserDialog1 As New FolderBrowserDialog ' Establecer el texto en el area de Descripcion del dialogo Dim w_texto As String w_texto = "Directorio destino " folderBrowserDialog1.Description = _ "Seleccione el Directorio que desea " _ & "usar como " & w_texto & " por defecto..." ' Permitir que aparezca el boton Nueva carpeta folderBrowserDialog1.ShowNewFolderButton = True ' Raiz: POr defecto Mi Pc folderBrowserDialog1.RootFolder = _ Environment.SpecialFolder.MyComputer '''' Raiz: POr defecto Mis Documentos '''folderBrowserDialog1.RootFolder = _ ''' Environment.SpecialFolder.Personal Dim result As DialogResult = folderBrowserDialog1.ShowDialog() If (result = DialogResult.OK) Then Me.T_dir_destino.Text = folderBrowserDialog1.SelectedPath End If End Sub
Pgina 26 de 164
13.3.2
Ejemplo de OpenFileDialog
Private Sub Bot_Sel_Origen_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Sel_Origen.Click Dim w_texto As String w_texto = "Seleccione el archivo Origen" Dim myStream As String Dim openFileDialog1 As New OpenFileDialog openFileDialog1.InitialDirectory = "c:\" openFileDialog1.Filter = "Ficheros ejecutables (*.exe)|*.exe|" _ & "Ficheros de DATOS de aplcacin (*.dat)|*.dat|" _ & "Ficheros Procesos por lotes (*.bat)|*.bat|" _ & "Ficheros del sistema (*.com)|*.com|" _ & "Administrador de ODBC (odbcad*.*)|odbcad*.*|" _ & "Todos los archivos (*.*)|*.*" openFileDialog1.FilterIndex = 1 openFileDialog1.Title = w_texto openFileDialog1.RestoreDirectory = True openFileDialog1.ShowReadOnly = True 'openFileDialog1.ShowDialog() Dim w_valor As String If openFileDialog1.ShowDialog() = DialogResult.OK Then w_valor = openFileDialog1.FileName Me.T_File_origen.Text = w_valor End If End Sub
Pgina 27 de 164
13.3.3
Ejemplo de SaveFileDialog
Pgina 28 de 164
13.3.4
Ejemplo de ColorDialog
Private Sub Bt_Color_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bt_Color.Click 'Ejemplo() de la ayuda Introduccion al commondialog 'En el siguiente ejemplo se utiliza la implementacin ColorDialog de CommonDialog y se indica cmo crear y mostrar un cuadro de dilogo. Este ejemplo supone que se llama al mtodo desde un formulario existente, en el cual se colocan un control TextBox y otro Button. Dim MyDialog As New ColorDialog '-------------------------------------' para permitir colores personalizados '-------------------------------------MyDialog.AllowFullOpen = True MyDialog.ShowHelp = True '-------------------------------------' establecer el color activo actual '-------------------------------------MyDialog.Color = Me.TN_ficha.ForeColor '-------------------------------------' Establecer el color seleccionado '-------------------------------------If (MyDialog.ShowDialog() = DialogResult.OK) Then Me.TN_ficha.BackColor = MyDialog.Color Me.LB_Ficha.BackColor = MyDialog.Color End If End Sub
Pgina 29 de 164
13.3.5
Ejemplo de FontDialog
Private Sub btn_Fuente_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btn_fuente.Click Dim fontDialog1 As New FontDialog fontDialog1.ShowColor = True fontDialog1.Font = Me.TN_ficha.Font fontDialog1.Color = Me.TN_ficha.ForeColor Dim w_font_size As String If fontDialog1.ShowDialog() <> DialogResult.Cancel Then vg_fontSize = fontDialog1.Font.Size vg_fontName = fontDialog1.Font.Name vg_fontColor = fontDialog1.Color.Name vg_fontBold = fontDialog1.Font.Bold vg_fontItalic = fontDialog1.Font.Italic vg_fontStrikeOut = fontDialog1.Font.Strikeout If vg_debug Then Dim w_aux As String w_aux = "Fontsize : " & vg_fontSize & vbCrLf _ & "Fontname : " & vg_fontName & vbCrLf _ & "Fontcolor : " & vg_fontColor & vbCrLf _ & "FontBold : " & vg_fontBold & vbCrLf _ & "FontItalic : " & vg_fontItalic & vbCrLf _ & "Fontstrikeout : " & vg_fontStrikeOut MsgBox(w_aux) End If Me.LB_Ficha.Font = fontDialog1.Font Me.TN_ficha.Font = fontDialog1.Font Me.TN_ficha.ForeColor = fontDialog1.Color End If End Sub
Pgina 30 de 164
13.4.1
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
Pgina 31 de 164
'------------------- hay que modificar Dim w_update As String w_update = " UPDATE parm_user " _ & " SET t4_valor = '" & pp3(x) & "'" _ & " WHERE t4_usuario = '" & pp1 & "'" _ & " AND t4_param ='" & pp2(x) & "'" w_sql = w_update End If If vg_debug Then MsgBox(pp2(x) & vbCrLf & pp3(x) & vbCrLf & w_sql) End If Dim cmdsql As New OleDbCommand(w_sql, oCon_Nucleo) Dim w_reg As Integer w_reg = cmdsql.ExecuteNonQuery() Next MsgBox("Se ha salvado correctamente") Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try End Sub
Else
Este es el resultado:
Pgina 32 de 164
13.4.2
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
Pgina 33 de 164
If vg_fontBold = True Then w_estilo = FontStyle.Bold If vg_fontItalic = True Then w_estilo = FontStyle.Italic If vg_fontStrikeOut = True Then w_estilo = FontStyle.Strikeout Dim font As System.Drawing.Font If vg_fontName = Nothing Then vg_fontName = "Courier New" w_size = 10 w_estilo = FontStyle.Regular End If font = New System.Drawing.Font(vg_fontName, _ w_size, _ w_estilo) Me.TN_ficha.Font = font Me.LB_Ficha.Font = font '-----------------------------------'Pintar linea Roja '-----------------------------------' se pinta sola con el metodo paint ' el degradado del fondo tambien se repinta solo '-----------------------------------'colocar panel de utilidades '-----------------------------------Me.Pan_nota_uti.Top = Me.Pan_color_font.Top Me.Pan_nota_uti.Left = Me.Pan_color_font.Left Me.Pan_color_font.Visible = False Me.Pan_nota_uti.Visible = True Me.Pan_Objeto_nuevo.Visible = False Me.bt_Fijar.Enabled = False '-----------------------------------'activar solapas en funcion del usuario '-----------------------------------If Me.T0_Usuario.Text = vg_usuario_admin Then Me.Tab_ficha.TabPages(5).Visible = True Else Me.Tab_ficha.TabPages(5).Visible = False End If End Sub
Public Sub cargar_color_usuario(ByVal p_form As Form, _ ByRef r As Integer, _ ByRef g As Integer, _ ByRef b As Integer) Try '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT t4_valor " _ & " FROM Parm_user " _ & " WHERE t4_usuario = '" & vg_usuario & "'" _ & " AND t4_param = 'Color'" oCon_Nucleo.Open() Dim ColorCMD As OleDbCommand ColorCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_color As String w_color = ColorCMD.ExecuteScalar()
Pgina 34 de 164
If w_color = Nothing Then w_color = "Color [A=255, R=249, G=253, B=176]" End If 'Color [A=255, R=128, G=255, B=255] Dim w_pos_ini, w_pos_fin As Integer Dim Rs, Gs, Bs As Integer w_pos_ini = InStr(1, w_color, "R=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Rs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini r = Val(Rs) w_pos_ini = InStr(1, w_color, "G=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Gs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini g = Val(Gs) w_pos_ini = InStr(1, w_color, "B=") w_pos_fin = InStr(w_pos_ini + 1, w_color, Bs = Mid(w_color, w_pos_ini + 2, _ w_pos_fin - w_pos_ini b = Val(Bs)
Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try End Sub
Public Sub cargar_font_usuario(ByRef p_fontName As String) Dim pp2(7), pp3(7) As String pp2(1) pp2(2) pp2(3) pp2(4) pp2(5) pp2(6) pp2(7) = = = = = = = "Color" "FontName" "Fontsize" "FontColor" "FontItalic" "Fontbold" "FontStrike"
Try '---------------------------------------------'Establecer la conexion con la BD del nucleo '---------------------------------------------oCon_Nucleo.Open() Dim x As Integer For x = 1 To 7 '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT t4_valor " _ & " FROM Parm_user " _ & " WHERE t4_usuario = '" & vg_usuario & "'" _
Pgina 35 de 164
& "
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
Pgina 36 de 164
End Sub
Pgina 37 de 164
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
Pgina 38 de 164
Pgina 39 de 164
Pgina 40 de 164
Con lo cual, el problema aparentemente queda solucionado, pero si se cierra el form_padre (manteniendo abierto el form_hijo) y se vuelve a abrir el form_padre, al pulsar sobre el botn de abrir el form_hijo se abre una nueva instancia del form_hijo con lo cual tendramos dos instancias del mismo objeto form_hijo Solucin: Definir el objeto form_hijo a nivel de mdulo y ciertamente el problema queda resuelto, Pero si se cierra el form_hijo y se vuelve a invocar, se genera un error de system.objectdisposedException en system.windows.forms.dll
Pgina 41 de 164
Luego lo que haremos ser crear una variable global en este mismo formulario hijo para que controle la instancia y la haremos shared para que pueda ser accesada desde el formulario padre.
'Variable pblica. Private Shared ChildInstance As frmChild = Nothing
Finalmente crearemos una funcin shared que ser la que finalmente controlara la creacin o manejo de la instancia del formulario, logrando obtener solo un formulario abierto para este frmChild.
'controla que slo exista una instancia del formulario. Public Shared Function Instance() As frmChild If ChildInstance Is Nothing OrElse ChildInstance.IsDisposed = True Then ChildInstance = New frmChild End If ChildInstance.BringToFront() Return ChildInstance End Function
Ahora en el formulario padre escribiremos el llamado al formulario hijo para crear una instancia, o si ya esta creada, entonces pondr el formulario hijo en frente para que lo podamos ver.
dim frmChildInstance as frmChild = frmChildInstance.Instance frmChildInstance.MdiParent = me frmChildInstance.Show Espero que les parezca fcil y es de mucha ayuda. Origen: Web El Guille, Fecha: 30 de junio de 2004 Autor: Camilo Andrs Jaramillo lvarez - caja911@yahoo.com
Pgina 42 de 164
Pgina 43 de 164
Option Explicit On Imports System.Data Imports System.Data.OleDb Imports Imports Imports Imports System.MarshalByRefObject System.Drawing.Drawing2D.LinearGradientBrush System.Drawing.Brush System.Drawing.Drawing2D
Public Class AppFicha Inherits System.Windows.Forms.Form '----------------------------------'cambiar color de fondo del form MDI '----------------------------------'necesitamos esta variable global Dim ctlMDI As MdiClient
Pgina 44 de 164
Private Sub M_color_fondo_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles M_color_fondo.Click Dim color1 As Color Dim w_valor_parm As String If M_color_fondo.Checked Then Me.M_color_fondo.Checked = False color1 = Color.Gray w_valor_parm = "NO" Else Me.M_color_fondo.Checked = True color1 = Color.AntiqueWhite w_valor_parm = "SI" End If Call pintar_fondo(color1) Dim o As Object Call Me.F_MDI_Resize(o, o) End Sub Private Sub pintar_fondo(ByVal color1 As Color) 'necesitamos est variable global Dim ctlMDI As MdiClient Dim ctl As Control 'Estamos buscando en control que 'representa el area cliente MDI For Each ctl In Me.Controls Try Select Case ctl.Name Case "STatusBar1" Case Else ctlMDI = CType(ctl, MdiClient) ' Asignamos el color de fondo ctlMDI.BackColor = Color.AntiqueWhite 'Aqu asignamos el manejador para pintar 'el fondo con degradados o lo que queramos. 'Si solo queremos cambiar el color de fondo 'no hace falta, 'ni las funciones siguientes tampoco AddHandler ctlMDI.Paint, AddressOf PintarFondo End Select Catch ex As InvalidCastException MsgBox("Error: " _ & Err.Number _ & " - " & ex.Message _ & vbCrLf & ctl.Name) End Try Next End Sub
Pgina 45 de 164
Private Sub AppFicha_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, _ New PaintEventArgs(Me.ctlMDI.CreateGraphics, _ New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub
Private Sub PintarFondo(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Dim w_color1, w_color2 As Color If Me.m_color_fondo.Checked Then w_color1 = Color.Blue w_color2 = Color.Black Else w_color1 = Color.Gray w_color2 = Color.Beige End If If ctlMDI.Width = 0 _ Or ctlMDI.Height = 0 Then Exit Sub End If Dim GradientePanel As _ New LinearGradientBrush( _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height), _ w_color1, _ w_color2, _ LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, _ New RectangleF(0, _ 0, _ ctlMDI.Width, _ ctlMDI.Height)) End Sub
Pgina 46 de 164
Y pintar en el
Ref: El guille : Color de fondo en un formulario MDI Y pintar en el rea cliente MDI Fecha: 04/03/2004 (06/Mar/2004) Autor: Jos Ramn Pastor Compa jrpc@ono.com Cuando empec con Visual Basic 6, siempre tenia la mana de cambiar el color de fondo de los formularios MDI y cuando ya sabia algo mas, les dibujaba degradados al estilo de los programas de instalacin. Cuando empec con VB .NET me di cuenta de que el color de fondo de un formulario no se puede cambiar, siempre apareca ese color "tosco" que no me gusta nada, as que investigando encontr un artculo en Microsoft que explicaba como cambiar el color de fondo. Yo lo he mejorado un poco y adems de cambiar el color, creo degradados de fondo en el rea cliente MDI. Para cambiar el color de fondo de un MDI aade el siguiente cdigo en el evento load del formulario: Nota: Necesitamos la variable global ctlMDI
Dim ctlMDI as MdiClient Private Sub TfrmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ctl As Control 'Estamos buscando en control que representa el area cliente MDI For Each ctl In Me.Controls Try ctlMDI = CType(ctl, MdiClient) ' Asignamos el color de fondo ctlMDI.BackColor = Color.AntiqueWhite 'Aqu asignamos el manejador para pintar el fondo con degradados o lo que 'queramos. Si solo queremos cambiar el color de fondo no hace falta, ni las funciones siguientes tampoco AddHandler ctlMDI.Paint, AddressOf PintarFondo Catch ex As InvalidCastException End Try Next End Sub
Vale, ahora necesitamos la funcin que pinta el fondo del area cliente:
Private Sub PintarFondo(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Dim GradientePanel As New LinearGradientBrush(New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height), Color.Blue, Color.Black,LinearGradientMode.Vertical) e.Graphics.FillRectangle(GradientePanel, New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height)) End Sub
Pgina 47 de 164
Esto es as porque me he dado cuenta de que cuando se redimensiona el formulario no se pinta bien el degradado, as que si "capturamos" el evento y forzamos a que se repinte, todo ir bien. Este es el cdigo.
Private Sub TfrmMain_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize If Not (Me.ctlMDI Is Nothing) Then Me.PintarFondo(Me.ctlMDI, New PaintEventArgs(Me.ctlMDI.CreateGraphics, New Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size))) End If End Sub
Pgina 48 de 164
Donde la variable vg_cad_Nucleo hace referencia a la Variable Global Cadena de Conexin de la Base de datos '------------------------------------------------'generar la cadena de conexion con el nucleo local '------------------------------------------------vg_cad_Nucleo = "provider=microsoft.jet.oledb.4.0.;" _ & "data source=" & vg_PBD_nucleo Debug.WriteLine(vg_PBD_nucleo) Donde la variable vg_PBD_Nucleo hace referencia a la Variable Global Path de la Base de datos del ncleo Dim Base_jmp_ref As String Base_jmp_ref = w_dir_win & "\" & w_base_local '-------------------------------------------'validar que existe la BD local '-------------------------------------------If Dir(Base_jmp_ref) = "" Then MsgBox("E0100: No Existe el Nucleo especificado" _ & vbCr & " ejecute el SETUP" _ , MsgBoxStyle.Exclamation) Exit Sub Else vg_PBD_nucleo = Base_jmp_ref End If
Pgina 49 de 164
Pgina 50 de 164
Este mtodo simplemente se limita a Invocar al mtodo LoadDataSet para Cargar el dataset
Public Sub LoadDataSet() 'Crear un conjunto de datos para alojar los registros 'devueltos de la llamada a FillDataSet. 'Se utiliza un conjunto de datos temporal porque 'el relleno del conjunto de datos existente 'requerira que se volvieran a enlazar los enlaces de datos. Dim objDataSetTemp As MJmpBase.DS_Parametros_App objDataSetTemp = New MJmpBase.DS_Parametros_App Try 'Intente rellenar el conjunto de datos temporal. Me.FillDataSet(objDataSetTemp) Catch eFillDataSet As System.Exception 'Agregar aqu el cdigo de control de errores. Throw eFillDataSet End Try Try grdParmApp.DataSource = Nothing 'Vaciar los registros obsoletos del conjunto de datos. objDS_Parametros_App.Clear() 'Combinar los registros en el conjunto de datos principal. objDS_Parametros_App.Merge(objDataSetTemp) grdParmApp.SetDataBinding(objDS_Parametros_App, "ParmApp") Me.t_num_reg.Text = Me.objDS_Parametros_App.Tables("ParmApp").Rows.Count Catch eLoadMerge As System.Exception 'Agregar aqu el cdigo de control de errores. Throw eLoadMerge End Try End Sub
El asistente, en cualquier caso da toda la informacin que se muestra en el cdigo mostrado. l se limita a generar un fichero temporal, por si algo esta mal, que no se borren los datos que contiene actualmente el DataGrid Una vez relleno de acuerdo con la nueva select, borra los datos del Dataset que ya estaba asociado anteriormente al datagrid, y mezcla su contenido con el temporal nuevo.
Pgina 51 de 164
Public Sub FillDataSet(ByVal dataSet As MJmpBase.DS_Parametros_App) 'Desactive la comprobacin de restricciones 'antes de rellenar el conjunto de datos. 'De esta forma los adaptadores pueden rellenar 'el conjunto de datos sin preocuparse 'de las dependencias entre las tablas. dataSet.EnforceConstraints = False Try 'Abra la conexin. Me.OleDbConnection1.Open() 'Intente rellenar el conjunto de datos a travs de OleDbDataAdapter1. Me.OleDbDataAdapter1.Fill(dataSet) Catch fillException As System.Exception 'Agregar aqu el cdigo de control de errores. Throw fillException Finally 'Volver a activar la comprobacin de restricciones. dataSet.EnforceConstraints = True 'Cerrar la conexin independientemente de si se inici una excepcin o no. Me.OleDbConnection1.Close() End Try End Sub
Y, como muy bien dice el comentario del asistente, es el OledbAdapter1, creado por el aistente quien selecciona y ejecuta el comando asociado al mtodo invocado (Fill)
'OleDbDataAdapter1 ' Me.OleDbDataAdapter1.DeleteCommand = Me.OleDbDeleteCommand1 Me.OleDbDataAdapter1.InsertCommand = Me.OleDbInsertCommand1 Me.OleDbDataAdapter1.SelectCommand = Me.OleDbSelectCommand1 Me.OleDbDataAdapter1.TableMappings.AddRange(New System.Data.Common.DataTableMapping() {New System.Data.Common.DataTableMapping("Table", "ParmApp", New System.Data.Common.DataColumnMapping() {New System.Data.Common.DataColumnMapping("Parm_Descripcion", "Parm_Descripcion"), New System.Data.Common.DataColumnMapping("Parm_Id", "Parm_Id"), New System.Data.Common.DataColumnMapping("Parm_tipo", "Parm_tipo"), New System.Data.Common.DataColumnMapping("Parm_Valor", "Parm_Valor")})}) Me.OleDbDataAdapter1.UpdateCommand = Me.OleDbUpdateCommand1
Me.OleDbSelectCommand1.CommandText = w_select
Pgina 52 de 164
Pgina 53 de 164
Pgina 54 de 164
Pgina 55 de 164
Pgina 56 de 164
Pgina 57 de 164
Pgina 58 de 164
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) & "'"
Pgina 59 de 164
Pgina 60 de 164
Pgina 61 de 164
Pgina 62 de 164
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)
Pgina 63 de 164
Pgina 64 de 164
Public Sub grabar_posicion_form(ByVal p_Form As Form) '--------------------------'renombrar variables '--------------------------Dim w_Form As String w_Form = Trim(p_Form.Name) Dim Dim Dim Dim Dim p_Top As Integer p_Left As Integer p_Height As Integer p_Width As Integer p_Resto As String
p_Top = p_Form.Top p_Left = p_Form.Left p_Height = p_Form.Height p_Width = p_Form.Width p_Resto = p_Form.Name '------------------------------------------'Preparar 1 variable con toda la informacion '------------------------------------------Dim w_valor As String w_valor = Space(70) Mid$(w_valor, 1, 5) = CStr(p_Top) Mid$(w_valor, 6, 5) = CStr(p_Left) Mid$(w_valor, 11, 5) = CStr(p_Height) Mid$(w_valor, 16, 5) = CStr(p_Width) Mid$(w_valor, 21, 50) = p_Resto & Space(50) 'Nota Al maximizar un formulario en tiempo de 'ejecucin se genera un evento Resize. 'La propiedad WindowState refleja el estado 'actual de la ventana. 'Si establece la propiedad WindowState a 2 '(maximizada), el formulario se maximizar, 'independientemente de los valores que haya 'en las propiedades MaxButton y BorderStyle. Dim pp1 pp2 pp3 Try '---------------------------------------------'Examinar si existe en la BS de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT count(*) " _ & " FROM ParmForm " _ & " WHERE pf_usuario = '" & vg_usuario & "'" _ & " AND pf_form = '" & w_Form & "'" oCon_Nucleo.Open() Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) pp1, pp2, pp3 As String = vg_usuario = w_Form = w_valor
Pgina 65 de 164
Dim w_sql As String If w_conta = 0 Then '------ Hay que dar de alta Dim w_insert As String w_insert = " INSERT INTO ParmForm " _ & "(PF_usuario, PF_form, " _ & " PF_height, PF_left, " _ & " PF_top, PF_Width, " _ & " PF_cadena) " _ & " VALUES " _ & "('" & vg_usuario & "'," _ & "'" & w_Form & "'" _ & "," & p_Height & "," & p_Left _ & "," & p_Top & "," & p_Width _ & ",'" & pp3 & "')" w_sql = w_insert Else '------------------- hay que modificar Dim w_update As String w_update = " UPDATE ParmForm " _ & " SET PF_height = " & p_Height & "," _ & " PF_left = " & p_Left & "," _ & " PF_top = " & p_Top & "," _ & " PF_width = " & p_Width & "," _ & " PF_cadena = '" & pp3 & "' " _ & " WHERE PF_usuario = '" & vg_usuario & "'" _ & " AND PF_Form ='" & w_Form & "'" w_sql = w_update End If Debug.WriteLine(w_sql) Dim cmdInsert As New OleDbCommand _ (w_sql, oCon_Nucleo) cmdInsert.ExecuteNonQuery() Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "Mod_ficha.grabar_posicion_form " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally '-----------------------------------------------------'siempre se ejecuta, incluso con exit sub dentro de Try Try oCon_Nucleo.Close() Catch ex As Exception End Try End Try End Sub
Pgina 66 de 164
Public Sub leer_ParmApp_nucleo _ (ByRef p_codigo As Integer, _ ByRef p_valor As String) '-----------------------------------'Definir objeto de conexin con la BD '-----------------------------------oCon_Nucleo = New OleDbConnection(vg_cad_Nucleo) ' '-----------------------------------' Crear Adaptador '-----------------------------------Dim oDA_Nucleo = New OleDbDataAdapter Dim w_valor As String Try '---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------Dim w_select As String w_select = "SELECT count(*) " _ & " FROM ParmApp " _ & " WHERE Parm_Id = " & p_codigo oCon_Nucleo.Open() Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) '-----------------------------'NO existe un registro esperado '-----------------------------If w_conta = 0 Then MsgBox("Error: No existe el codigo " _ & p_codigo & " en ParmApp del nucleo" _ & vbCrLf _ & "Contacte con su distribuidor de la aplicacion." _ , vbOK, "Error de aplicacion (JMP Soft)") Exit Sub End If '---------------------------'existe un registro '---------------------------' se pueden recuperar los registrso de 2 formas: 'modo 1 'pasar todos los registros que cumplen la condicion 'a un dataset y recorrer luego las filas (solo hay una) 'modo 2 'Acceder directamente al registro 'que cumple la condicion Dim modo_recuperacion As String modo_recuperacion = 2 Select Case modo_recuperacion Case "1" w_select = _ "SELECT * " _ & " FROM ParmApp " _ & " WHERE Parm_id = '" & p_codigo oDA_Nucleo = New OleDbDataAdapter _ (w_select, oCon_Nucleo) oDS_Nucleo.Clear() oDA_Nucleo.Fill(oDS_Nucleo, "Nucleo") '------------------------------
Pgina 67 de 164
'examinar registros recuperados '-----------------------------Dim objRow As DataRow For Each objRow In _ oDS_Nucleo.Tables("Nucleo").Rows() w_valor = objRow("Parm_valor") Next Case "2" 'en este caso solo se recupera un valor w_select = _ "SELECT parm_Valor " _ & " FROM ParmApp " _ & " WHERE Parm_Id = " & p_codigo Dim CMDselect As OleDbCommand CMDselect = New OleDbCommand _ (w_select, oCon_Nucleo) w_valor = CMDselect.ExecuteScalar() End Select Catch exp As System.Exception '---------------------------------------------------'este catch es para atrapar un error inexperado '---------------------------------------------------'Notar que en este caso se usa messageBox y no MsgBox MessageBox.Show(exp.Message & " Source: " & exp.Source _ , "M_Globales.leer_parametro_nucleo " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'siempre se ejecuta, incluso con exit sub dentro de Try oCon_Nucleo.Close() End Try '------------------------------------------'Devolver el valor recogido como texto '------------------------------------------p_valor = w_valor End Sub
Pgina 68 de 164
16.4.2
Dim w_select As String w_select = "SELECT * " _ & "FROM fal_cli " _ & "WHERE nom_cli like & " or raz_cli like & " or obs_cli like & " or dni_cli like & " or dir_cli like & " or pob_cli like & " or fax_cli like & " or tel_cli like
_ _ _ _ _ _ _
Private Sub Bot_Buscar_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Buscar.Click, _ Bot_Ir_A.Click, _ Bot_Nombre.Click Dim w_select As String Dim w_where As String Select Case sender.name Case "Bot_Ir_A" w_where = " Where cod_cli Me.T_Buscar.Text = "" Me.T_Nombre.Text = "" Case "Bot_Nombre" w_where = " Where nom_cli & " or raz_cli Me.T_Buscar.Text = "" Me.T_Ir_a.Text = "" Case "Bot_Buscar" w_where = " Where tel_cli & " or fax_cli & " or pob_cli & " or pro_cli & " or dni_cli & " or obs_cli Me.T_Ir_a.Text = "" Me.T_Nombre.Text = "" End Select
like '%" & Me.T_Nombre.Text & "%' " _ like '%" & Me.T_Nombre.Text & "%' "
_ _ _ _ _
If Trim(Me.T_Ir_a.Text) = "" _ And sender.name = "Bot_Ir_A" Then w_where = "" End If If Trim(Me.T_Nombre.Text) = "" _ And sender.name = "Bot_Alias" Then w_where = "" End If If Trim(Me.T_Buscar.Text) = "" _ And sender.name = "Bot_Buscar" Then w_where = "" End If '------------- order by Dim w_order As String If Me.RB_codigo.Checked Then w_order = "Order By Cod_cli" Else w_order = "Order by Nom_cli"
Pgina 69 de 164
End If If Me.CB_Asc.Checked Then w_order &= " ASC " Else w_order &= " Desc" End If w_select = & & & "SELECT * " _ " FROM fal_cli " _ w_where _ w_order
Pgina 70 de 164
16.4.3
Pgina 71 de 164
16.4.4
'
'siempre se seleccionan registros "AC" ' w_where &= " AND (CTRH_tipo = 'AC' )" w_where &= " AND (CTRH_Num_Fac Is Null or CTRH_Num_Fac = '')"
Pgina 72 de 164
16.4.5
w_Select = & & & &
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
Pgina 73 de 164
Esta ventana sirve para recoger el valor seleccionado y trasladarle a otro Datagrid
Private Sub DG_Sel_conc_CurrentCellChanged( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles DG_Sel_conc.CurrentCellChanged Dim w_fila As Integer With DirectCast(sender, DataGrid).CurrentCell w_fila = .RowNumber End With DG_Detalle.Item(l_fila, 2) = Me.DG_Sel_conc.Item(w_fila, 3).ToString DG_Detalle.Item(l_fila, 3) = Me.DG_Sel_conc.Item(w_fila, 4).ToString End Sub
A pesar de que solo se muestran 2 columnas, no se produce error alguno al hacer el movimiento de la informacion entre datagrids ya que el indice viene definido en la tabla de estilos que usamos.
'---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de columna 'para aadir los nuevos estilos creados '---------------------------------------------------------TS_Detalle2.GridColumnStyles.Clear() TS_Detalle2.GridColumnStyles.Add(col_id) TS_Detalle2.GridColumnStyles.Add(col_Lin) TS_Detalle2.GridColumnStyles.Add(col_Cant) TS_Detalle2.GridColumnStyles.Add(col_ConC) TS_Detalle2.GridColumnStyles.Add(col_Prec) TS_Detalle2.GridColumnStyles.Add(col_Total) 0 1 2 3 4 5
Pgina 74 de 164
16.5 Vistas
Pgina 75 de 164
Pgina 76 de 164
Pero nos encontramos con un problema, que las dos sentencias deben hacerse siempre unidas, como si fueran una sola pues perteneces a una actualizacin de sueldos. Pero que pasa si se realiza la primera operacin y no la segunda. Huy! Que rabia, o que pasa si solo se realiza parte de la primera, ms Huy! Pues no se sabe hasta que punto se hizo o no se hizo nada, pues nada hay que me garantice esto. Aqu surgen las transacciones.
Begin Tran Update Persona set Sueldo=sueldo * 1.5 Update Grupos set estado=1 where estado=0 Commit Tran
Al encerrar en una transaccin decimos que se realice todo o no se realice nada (atomicidad) pues si surge algn error se deshace todo lo realizado anteriormente en la transaccin.
Pgina 77 de 164
Teniendo una base de datos llamada Ejemplo y una tabla de nombre persona que tiene los siguientes campos Codigo varchar(10) Nombres varchar(50) Sueldo int Estado varchar(1) En un formulario que posee un botn escribimos lo siguiente en el evento clic del botn, sin olvidarse hacer antes el imports a system.data.sqlClient:
Dim Conn As SqlConnection = New SqlConnection("Data Source=INFORM77;Initial Catalog=EJEMPLO;User Id=sa") Conn.Open() Try Dim Comando As New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG1','JOSE',200,'A')", Conn) Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG2','LUIS',180,'B')", Conn) Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('JG3','PEDRO',400,'A')", Conn) Comando.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) End Try Conn.Close() MsgBox("Datos Ingresados")
Como vemos aadiremos en la tabla persona 3 registro, pero si quisiramos convertirle a transaccin para que se ejecuten todos o ninguno si encuentra un error deberamos hacer lo siguiente. Fjese en los datos para el campo cdigo pues ahora son tr1, tr2, tr3.
Dim Conn As SqlConnection = New SqlConnection("Data Source=INFORM77;Initial Catalog=EJEMPLO;User Id=sa") Conn.Open() Dim myTrans As SqlTransaction Dim Comando As SqlClient.SqlCommand myTrans = Conn.BeginTransaction() Try Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr1','JOSE',200,'A')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr2','LUIS',180,'B')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo, nombres, sueldo, estado) Values('tr3','PEDRO',400,'A')", Conn) Comando.Transaction = myTrans Comando.ExecuteNonQuery() myTrans.Commit() MsgBox("Datos Ingresados") Catch ex As Exception myTrans.Rollback() MsgBox(ex.Message) End Try Conn.Close()
Ahora al ejecutar insertar los nuevos 3 registros sin novedad, pero lo har usando transacciones para lo cual iniciamos la transaccin con myTrans = Conn.BeginTransaction() y finalizamos con myTrans.Commit() y en caso de algn error ejecutamos myTrans.Rollback() para cancelar todo lo realizado en la transaccin. Para comprobar que la transaccin se cancela al encontrar un error cambiamos los valores del campo cdigo por tr1 por ab1 y tr2 por ab2, dejando tr3 en el tercer registro pues as dar un error de clave duplicada porque ya existe un registro con esta clave previamente grabada.
Pgina 78 de 164
Al ejecutar nos saldr un mensaje que indica que existi una violacin de primary key. Si verificamos los datos, no habr ningn registro aadido pues como est en una transaccin o se agregan todos o no se agrega ninguno.
Pgina 79 de 164
'---------------------------------------------'Examinar si existe en la BD de parametros '---------------------------------------------oCon_Nucleo.Open() Dim w_select As String w_select = "SELECT count(*) " & " FROM Parm_user " & " WHERE t4_usuario & " AND t4_param = _ _ = '" & pp1 & "'" _ '" & pp2 & "'"
Dim ContaCMD As OleDbCommand ContaCMD = New OleDbCommand(w_select, oCon_Nucleo) Dim w_conta As Int32 w_conta = CInt(ContaCMD.ExecuteScalar()) oCon_Nucleo.Close()
Pgina 80 de 164
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")
Pgina 81 de 164
Pgina 82 de 164
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
Pgina 83 de 164
Private Sub cargar_registro_actual() Dim oDataRow As DataRow oDataRow = Me.oDataSet.Tables("Contrato").Rows(Me.iPosicionFilaActual) Me.T_cod_cli.Text = oDataRow("CTR_cliente") Me.T_situacion.Text = oDataRow("CTR_Situacion") Me.T_Fec_Firma.Text = oDataRow("CTR_fecha_firma") Me.T_Maquina.Text = oDataRow("CTR_maquina") Me.T_Modelo.Text = oDataRow("CTR_modelo") Me.T_Numero.Text = oDataRow("CTR_numero") Me.T_Fec_visita_next.Text = oDataRow("CTR_fec_visita_prox") Me.T_Observa.Text = oDataRow("CTR_observaciones") Me.T_Id_contrato.Text = oDataRow("Ctr_Id") 'mostrar la posicion actual del registro Me.l_num_reg.Text = Me.iPosicionFilaActual + 1 Me.l_num_reg.Text &= " de " Me.l_num_reg.Text &= Me.oDataSet.Tables("Contrato").Rows.Count End Sub Private Sub Btn_Buscar_cadena_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Btn_Buscar_cad.Click 'If Trim(Me.T_Cadena_buscada.Text) = "" Then ' 'MsgBox("Para Buscar una cadena antes hay que especificarla") ' 'Exit Sub 'End If Dim w_cad_buscar As String If Trim(Me.T_Cadena_buscada.Text) = "" Then w_cad_buscar = "%" Else w_cad_buscar = Me.T_Cadena_buscada.Text End If w_cad_buscar = Trim(Me.T_Cadena_buscada.Text) Dim w_select As String w_select = "SELECT * " _ & "FROM Contrato " _ & "WHERE CTR_Maquina like '%" & w_cad_buscar & "%'" _ & " or CTR_Modelo like '%" & w_cad_buscar & "%'" _ & " or CTR_Numero like '%" & w_cad_buscar & "%'" _ & " or CTR_Observaciones like '%" & w_cad_buscar & "%'" 'OleDbSelectCommand1 es el objeto que contiene la cadena Select Me.OleDbSelectCommand1.CommandText = w_select Call cargar_dataset(w_select) Call Me.cargar_registro_actual() Me.l_num_reg.Text = Me.l_num_reg.Text Me.T_Id_buscado.Text = "" End Sub Private Sub Bot_Primero_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Primero.Click Me.iPosicionFilaActual = 0 Call Me.cargar_registro_actual() End Sub Private Sub Bot_prev_Click( _ ByVal sender As System.Object, _
Pgina 84 de 164
ByVal e As System.EventArgs) _ Handles Bot_prev.Click If Me.iPosicionFilaActual = 0 Then MsgBox("Ya est en el primer registro.", _ MsgBoxStyle.Exclamation, Me.Text) Exit Sub End If Me.iPosicionFilaActual -= 1 Call Me.cargar_registro_actual() End Sub Private Sub Bot_Next_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Next.Click Dim w_ultimo As Integer w_ultimo = Me.oDataSet.Tables("Contrato").Rows.Count - 1 If Me.iPosicionFilaActual = w_ultimo Then MsgBox("Ya est en el ltimo registro.", _ MsgBoxStyle.Exclamation, Me.Text) Exit Sub End If Me.iPosicionFilaActual += 1 Call Me.cargar_registro_actual() End Sub Private Sub Bot_Ultimo_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Bot_Ultimo.Click Dim w_ultimo As Integer w_ultimo = Me.oDataSet.Tables("Contrato").Rows.Count - 1 Me.iPosicionFilaActual = w_ultimo Call Me.cargar_registro_actual() End Sub #End Region
Pgina 85 de 164
17.6 Form_cliente_detalle_pedidos
Pgina 86 de 164
Pgina 87 de 164
En este caso solo se quiere saber cual es la fila seleccionada, para copiar los valores de dicha fila a otro datagrid cuando se pulsa el botn Seleccionar
Pgina 88 de 164
Este formulario presenta por una parte una relacin de todas los registros que contiene, y en la parte inferior muestra el detalle de la fila seleccionada.
Private Sub grdfal_art_Click( _ ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles grdfal_art.Click Call Cargar_Detalle_articulo() End Sub Private Sub Cargar_Detalle_articulo() Me.T_referencia_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 0) Me.Combo_Familias.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 1).ToString Me.T_Nombre_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 2).ToString Me.T_Familia.Text = Me.Combo_Familias.Text Me.T_Precio1_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 3).ToString Me.T_precio2_art.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 4).ToString Me.T_Iva.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 5).ToString Me.T_observa.Text = Me.grdfal_art.Item _ (Me.grdfal_art.CurrentRowIndex, 6).ToString End Sub
Pgina 89 de 164
Pgina 90 de 164
El resultado es el siguiente:
Pgina 91 de 164
Cuando queremos cargar esta tabla con determinados valores, por ejemplo, al consultar un presupuesto ya existente, hacemos lo siguiente:
Private Sub Cargar_Detalle_Trabajos() Me.t_num_lin_Trab.Text = 0 Dim w_select As String w_select = "SELECT * " _ & " FROM Presup_Trab " _ & " WHERE PreT_id = '" & Me.T_num_ppto.Text & "'" _ & " ORDER by PreT_lin" oDA_OLE = New OleDbDataAdapter(w_select, oCon_OLE) Dim oDS_Tra As New DataSet oDS_Tra.Clear() oDA_OLE.Fill(oDS_Tra, "Presup_Trab") Me.t_num_lin_Trab.Text = oDS_Tra.Tables("Presup_Trab").Rows.Count '-------------------------------------'cargar tabla de trabajos '-------------------------------------Dim w_trabajo(30) As String Dim oTabla As DataTable oTabla = oDS_Tra.Tables("Presup_Trab") Dim oFila As DataRow Dim w_lin As Integer = 0 For Each oFila In oTabla.Rows w_lin += 1 w_trabajo(w_lin) = oFila.Item("PreT_Trabajo") Next With DT_Datagrid2 'asi se crea la tabla en memoria, con estas columnas 'With .Columns ' .Add(columnName:="PreT_Lin", Type:=GetType(Integer)) ' .Add(columnName:="PreT_Trabajo", Type:=GetType(String)) ' .Add(columnName:="PreT_Id", Type:=GetType(String)) 'End With Dim x As Integer Dim w_ref As String Dim w_concepto As String '----------------------------------'limpiar tabla de lineas de trabajos '----------------------------------Me.DT_Datagrid2.Clear() ' 'Cargar tabla con las ocurrencias que tenga y nuevas hasta 30 ' With DT_Datagrid2 For x = 1 To 30 If x <= w_lin Then Dim w_valor As String w_valor = w_trabajo(x) .Rows.Add(values:=New Object() {x, w_valor}) Else .Rows.Add(values:=New Object() {x}) End If Next .AcceptChanges() End With End With End Sub
Pgina 92 de 164
Al especificar una cantidad y un precio, el sistema calcula el importe, que adems, es un campo protegido
Private Sub Crear_y_Cargar_DT_Detalle() '******************************************** 'crear y cargar una tabla de datos en memoria 'para contener las lineas de detalle del ppto '******************************************** ' En el caso de modificaciones, 'esta tabla coincidira con Presup_det 'por eso la creamos con la misma estructura '-------------------------------------------DT_Datagrid = New DataTable("DT_Detalle") ' '--------------------------------------------' Aadir columnas y filas de datos al datagrid '--------------------------------------------With DT_Datagrid With .Columns .Add(columnName:="PreD_Lin", Type:=GetType(Integer)) .Add(columnName:="PreD_Cantidad", Type:=GetType(String)) .Add(columnName:="PreD_Concepto", Type:=GetType(String)) .Add(columnName:="PreD_Precio", Type:=GetType(String)) .Add(columnName:="PreD_total", Type:=GetType(String)) .Add(columnName:="PreD_id", Type:=GetType(String)) End With Dim x As Integer Dim w_ref As String Dim w_concepto As String ' 'inicializar la tabla con 8 lineas a blanco (el impreso no admite mas) ' For x = 1 To 8 With .Rows '.Add(values:=New Object() {x,0 , "", "", , , }) .Add(values:=New Object() {x}) End With Next .AcceptChanges() End With Call Definir_Tabla_estilos_Detalle(DT_Datagrid) '--------------------------------'mapear el grid ... Bind the Grid '--------------------------------With Me.DG_Detalle .DataSource = DT_Datagrid .TableStyles.Add(TS_DataGrid) '.BackgroundColor = TS_DataGrid.BackColor End With ' End Sub
Pgina 93 de 164
Private Sub Definir_Tabla_estilos_Detalle( _ ByRef p_DataTable As DataTable) ' '-----------------------------------------' Get a handle to the currency manager 'crear un manejador para recorrer la tabla '-----------------------------------------Dim CM As CurrencyManager CM = DirectCast(Me.BindingContext(p_DataTable), CurrencyManager) ' '-----------------------------------------' Handle the column change event 'manejar los eventos de las columnas '-----------------------------------------AddHandler p_DataTable.ColumnChanging, _ AddressOf Tratar_cambio_de_Col_en_DG_Detalle '-------------------------------------' Crear El estilo de tabla (tablestyle) '-------------------------------------'Dim TS_DataGrid As New DataGridTableStyle With TS_DataGrid .AlternatingBackColor = Color.AliceBlue .BackColor = Color.White .MappingName = p_DataTable.TableName .AllowSorting = True With .GridColumnStyles ' 'a la tabla de estilos la aadimos el estilo de columna ' .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Linea"))) 'TS_linea es el nombre del estilo de la columna Linea ' en la Tabla de estilos With .Item(Index:=0) .MappingName = "Pred_Lin" .HeaderText = "Linea" .Alignment = HorizontalAlignment.Center .Width = 50 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Cantidad"))) With .Item(Index:=1) .MappingName = "PreD_Cantidad" .HeaderText = "Cantidad " .Alignment = HorizontalAlignment.Center .Width = 70 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Concepto"))) With .Item(Index:=2) .MappingName = "PreD_Concepto" .HeaderText = "Concepto" .Alignment = HorizontalAlignment.Left .Width = 300 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Precio")))
Pgina 94 de 164
With .Item(Index:=3) .MappingName = "Pred_Precio" .HeaderText = "___P/U___" .Alignment = HorizontalAlignment.Right .Width = 70 .ReadOnly = False .NullText = String.Empty End With .Add(column:=New DataGridTextBoxColumn _ (CM.GetItemProperties.Item(Name:="TS_Importe"))) With .Item(Index:=4) .MappingName = "Pred_Total" .HeaderText = "__Importe__" .Alignment = HorizontalAlignment.Right .Width = 70 .ReadOnly = True .NullText = String.Empty End With End With End With ' 'MsgBox("saliendo de la rutina de creacion") End Sub
Pgina 95 de 164
Private Sub Tratar_cambio_de_Col_en_DG_Detalle( _ ByVal sender As Object, _ ByVal e As DataColumnChangeEventArgs) If l_Validando Then Exit Sub Dim w_cabecera As String Dim w_fila As Integer Dim w_columna As Integer w_cabecera = e.Column.Caption 'MsgBox("Caption:" & w_cabecera) w_cabecera = e.Column.ToString 'MsgBox("Columna:" & w_cabecera) w_cabecera = e.Row.ToString 'MsgBox("row:" & w_cabecera) Dim Dim Dim Dim Dim Dim Dim Dim w_linea As Integer w_cantidad As Double w_concepto As String w_precio As Double w_descuento As Double w_importe As Double w_importe_A As String w_referencia As String
With e '.Row.SetColumnError(columnName:="Ref", error:=String.Empty) Select Case (.Column.Caption).ToLower Case Is = ("Concepto").ToLower, ("Pred_Concepto").ToLower 'MsgBox("No se valida nada") Case Is = ("Cantidad").ToLower, ("pred_Cantidad").ToLower Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: La cantidad debe ser numerica" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If If (.Row!Pred_precio Is DBNull.Value) Then .Row!Pred_Total = "" Exit Sub Else If Trim(.Row!Pred_precio) = "" Then .Row!Pred_Total = "" Exit Sub End If End If w_precio = .Row!PreD_precio.ToString If w_precio = 0 Then Exit Sub If .ProposedValue Is DBNull.Value Then .Row!Pred_Total = "" Exit Sub End If w_cantidad = .ProposedValue If w_cantidad = 0 Then .Row!Pred_Total = "" Exit Sub End If '--------------------------------------------'el siguiente tratamiento hay que hacerle 'ya que se ha definido la columna como string 'y por cultura, el punto decimal es la coma '--------------------------------------------'******************************** 'tratar las cantidades no enteras '******************************** Dim w_aux As String Dim w_pos As Integer w_aux = e.ProposedValue.ToString
Pgina 96 de 164
If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_aux = CStr(.ProposedValue) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_cantidad = w_aux If w_cantidad = 0 Then Exit Sub '******************************** 'tratar los precios no enteros '******************************** w_aux = .Row!PreD_precio If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_precio = w_aux If w_precio = 0 Then Exit Sub w_importe = w_cantidad * w_precio w_importe_A = Format(w_importe, "#######0.00") .Row!Pred_Total = w_importe_A Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Cantidad " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try Case Is = ("Precio").ToLower, ("Pred_precio").ToLower Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: El Precio debe ser numerico" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") .Row!Pred_total = "" Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If '--------------------'recoger cantidad '--------------------If (.Row!PreD_Cantidad Is DBNull.Value) Then .Row!Pred_total = "" Exit Sub End If w_cantidad = .Row!PreD_cantidad If w_cantidad = 0 Then Exit Sub '--------------------'recoger precio '--------------------'******************** todo ok 'w_precio = .ProposedValue 'If w_precio = 0 Then Exit Sub 'w_importe = w_precio * w_cantidad 'w_importe_A = Format(w_importe, "N") '.Row!Importe = w_importe_A '******************** todo ok 'CAMBIO EL TIPO DE LA ROW A STRING '******************************** 'tratar las cantidades no enteras '******************************** Dim w_aux As String Dim w_pos As Integer w_aux = .Row!PreD_cantidad If Trim(w_aux) = "" Then Exit Sub 'MsgBox(w_aux) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_cantidad = w_aux
Pgina 97 de 164
If w_cantidad = 0 Then .Row!Pred_total = "" Exit Sub End If '******************************** 'tratar los precios no enteras '******************************** w_aux = e.ProposedValue.ToString If Trim(w_aux) = "" Then .Row!Pred_total = "" Exit Sub End If 'MsgBox(w_aux) w_aux = CStr(.ProposedValue) w_pos = InStr(1, w_aux, ".") If w_pos > 0 Then Mid(w_aux, w_pos, 1) = "," End If w_precio = w_aux If w_precio = 0 Then Exit Sub w_importe = w_precio * w_cantidad w_importe_A = Format(w_importe, "######0.00") .Row!Pred_Total = w_importe_A 'formatear campo precio 'no se puede reformatear porque se realimenta 'Dim w_precio_A As String 'w_precio_a = Format(w_precio, "N") 'If w_precio_a <> .Row!Precio Then ' .Row!precio = w_importe_A 'End If Catch ex As Exception MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Tratar Precio " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) End Try End Select End With End Sub
Pgina 98 de 164
18.5.2
Ejemplo 2
Al hacer clic en la columna concepto, queremos que salga una lista con todos los conceptos que tenemos tabulados.
Eso ocurre cuando cambiamos de columna, por ejemplo al seleccionar columna Cantidad
Pgina 99 de 164
Public Class F_Factura Inherits System.Windows.Forms.Form Private DT_Referencias As DataTable Private DT_Datagrid As DataTable
Private Sub Cargar_DT_Ref_y_DT_Datagrid() 'Thread.CurrentThread.CurrentCulture = New CultureInfo("es-ES") 'ver en documentacion: CultureInfo (Clase) Dim TS_DataGrid As New DataGridTableStyle Dim CM As CurrencyManager '------------------------------------------'se crean 2 tablas de datos ' 1: para contener las referencias ' 2: para mostrar en el datagrid '------------------------------------------DT_Referencias = New DataTable("Referencias") DT_Datagrid = New DataTable("DataGrid") ' '---------------------------------' Aadir columnas y filas de datos '---------------------------------Dim oDA_odbc = New OdbcDataAdapter Dim oDs_odbc = New DataSet Dim CMDselect As OdbcCommand Dim w_select As String Dim objRow As DataRow With DT_Referencias '-----------------------------------'Definir las columnas de la tabla '-----------------------------------With .Columns .Add(columnName:="Referencia", Type:=GetType(String)) .Add(columnName:="Concepto", Type:=GetType(String)) '.Add(columnName:="familia", Type:=GetType(String)) End With Call Cargar_Tabla_articulos() End With '--------------------------------------------' Aadir columnas y filas de datos al datagrid '--------------------------------------------With DT_Datagrid With .Columns .Add(columnName:="Linea", Type:=GetType(Integer)) .Add(columnName:="Cantidad", Type:=GetType(Double)) .Add(columnName:="Concepto", Type:=GetType(String)) .Add(columnName:="Precio", Type:=GetType(Double)) .Add(columnName:="Dto", Type:=GetType(Double)) .Add(columnName:="Importe", Type:=GetType(Double)) '.Add(columnName:="Ref", Type:=GetType(String)) End With Dim x As Integer Dim w_ref As String Dim w_concepto As String For x = 1 To 30 'w_ref = Me.Combo_ref.Items(x) With .Rows '.Add(values:=New Object() {x,0 , "", "", , , }) .Add(values:=New Object() {x}) End With Next .AcceptChanges() End With ' '------------------------------------' Get a handle to the currency manager '-------------------------------------
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")))
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
Private Sub DataGridSource_ColumnChanging( _ ByVal sender As Object, _ ByVal e As DataColumnChangeEventArgs) Dim w_cabecera As String Dim w_fila As Integer Dim w_columna As Integer w_cabecera = e.Column.Caption w_cabecera = e.Column.ToString w_cabecera = e.Row.ToString Dim Dim Dim Dim Dim Dim Dim Dim w_linea As Integer w_cantidad As Double w_concepto As String w_precio As Double w_descuento As Double w_importe As Double w_importe_A As String w_referencia As String
With e '.Row.SetColumnError(columnName:="Ref", error:=String.Empty) Select Case .Column.Caption Case Is = "Concepto" w_referencia = .ProposedValue.ToString Dim w_error As String Dim w_codigo As String w_codigo = w_referencia If w_codigo = "" Then .Row!precio = 0 .Row!dto = 0 .Row!importe = 0 Exit Sub End If If Mid(w_codigo, 1, 6) <> "Manual" Then Call M_Factura.Determinar_precio _ (w_codigo, _ Me.T_Tarifa.Text, _ w_error, _ w_precio) Else w_precio = Me.T_Precio.Text End If If w_error = "" Then .Row!precio = w_precio If (Not .Row!cantidad Is DBNull.Value) Then w_cantidad = .Row!cantidad w_importe = w_precio * w_cantidad w_importe_A = Format(w_importe, "N") .Row!importe = w_importe_A End If End If Case Is = "Cantidad" Try If (Not IsNumeric(.ProposedValue)) _ And (Not .ProposedValue Is DBNull.Value) Then MsgBox("ERROR: La cantidad debe ser numerica" _ , MsgBoxStyle.Exclamation _ , "T.E.R.") Exit Sub '.Row.SetColumnError(columnName:="Zip", _ ' error:="Postal Code must be a number") End If w_precio = .Row!precio If w_precio = 0 Then Exit Sub w_cantidad = .ProposedValue If w_cantidad = 0 Then Exit Sub w_importe = w_cantidad * w_precio If Trim((.Row!dto).ToString) <> "" Then w_descuento = Val(.Row!dto) If Val(w_descuento) <> 0 Then
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
Private Sub Cargar_Tabla_articulos() '-----------------------------------'Cargar la tabla de referencias '-----------------------------------oCon_ODBC = New OdbcConnection(vg_cad_ODBC) oCon_ODBC.Open() ' Dim w_select As String ' '==================================== w_select = "SELECT * " _ & " FROM fal_art " _ & " Order By nom_art Asc " '==================================== Dim oCmd_odbc As OdbcCommand oCmd_odbc = New OdbcCommand(w_select, oCon_ODBC) Dim oDataReader As OdbcDataReader oDataReader = oCmd_odbc.ExecuteReader '--------------------------'recorrer Datareader '--------------------------If oDataReader.HasRows = False Then MsgBox("No existen Articulos para cargar " _ , MsgBoxStyle.Exclamation, "Cargar Articulos") Exit Sub End If '----------------------------------'limpiar contenido de la tabla '----------------------------------DT_Referencias.Clear() '----------------------------------'Incluir una primera lnea en blanco '----------------------------------DT_Referencias.Rows.Add(Values:=New Object() {"", ""}) Dim w_aux As String While oDataReader.Read DT_Referencias.Rows.Add(Values:=New Object() {oDataReader("ref_art"), _ oDataReader("nom_art")}) End While oDataReader.Close() oCon_ODBC.Close() DT_Referencias.AcceptChanges() End Sub
'---------------------------------------------------'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
#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) '
'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"
.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
Formatos de fecha y hora predefinidos (Funcin Format) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el usuario (Funcin Format) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) La tabla siguiente identifica los nombres de formatos de fecha y hora predefinidos. stos pueden usarse por nombre como argumento de estilo para la funcin Format: Nombre de formato Descripcin General Date o G Muestra una fecha o una hora. En el caso de nmeros reales, muestra una fecha y una hora; por ejemplo, 4/3/93 05:34 PM.Si no existe parte fraccional, muestra slo una fecha; por ejemplo, 4/3/93. Si no existe parte entera, muestra slo una hora; por ejemplo, 05:34 PM. El formato de fecha depende del valor LocaleID del sistema. Long Date o D Muestra una fecha de acuerdo con el formato de fecha larga vigente en su sistema. Muestra una fecha usando el formato medio que corresponda a la versin de idioma que Medium Date use la aplicacin host. Short Date o d Muestra una fecha de acuerdo con el formato de fecha corta vigente en su sistema. Long Time o T Muestra una hora de acuerdo con el formato de fecha larga vigente en su sistema; e incluye horas, minutos y segundos. Muestra la hora en formato de 12 horas utilizando horas y minutos y la especificacin Medium Time a.m./p.m. Short Time o t Muestra una hora con el formato de 24 horas, por ejemplo, 17:45. Muestra la fecha larga y la hora corta de acuerdo con el formato vigente en su sistema. f Muestra la fecha larga y la hora larga de acuerdo con el formato vigente en su sistema. F Muestra la fecha corta y la hora corta de acuerdo con el formato vigente en su sistema. g M, m Muestra el mes y el da de una fecha dada. R, r Da formato a la fecha y la hora como Hora media de Greenwich (GMT) Da formato a la fecha y la hora como un ndice ordenable. s Da formato a la fecha y la hora como un ndice GMT ordenable. u Da formato como GMT a la fecha larga y la hora larga. U Da formato a la fecha especificando el ao y el mes. Y, y Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: Strings Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin Format (Funcin) | Formatos numricos predefinidos (Funcin Format) | Formatos de fecha y hora definidos por el
Descripcin Nombre de formato General Number, G o g Muestra el nmero sin separadores de miles. Muestra el nmero con separadores de miles, en su caso; tambin muestra dos Currency, C o c dgitos a la derecha del separador de decimales. El formato de salida depender de la configuracin regional. Muestra al menos un dgito a la izquierda y dos a la derecha del separador de Fixed, F o f decimales. Muestra el nmero con separador de miles, al menos un dgito a la izquierda y dos a Standard, N o n la derecha del separador de decimales. Muestra el nmero multiplicado por 100 con un signo de porcentaje (%) a la Percent derecha; siempre muestra dos dgitos a la derecha del separador de decimales. Muestra el nmero con separador de miles multiplicado por 100 con un signo de Pop porcentaje (%) a la derecha y separado por un solo espacio; siempre muestra dos dgitos a la derecha del separador de decimales. Utiliza notacin cientfica estndar y proporciona dos dgitos significativos. Cientfico Utiliza notacin cientfica estndar y proporciona seis dgitos significativos. Eoe Muestra el nmero como una cadena que contiene el valor del nmero en formato Dod Decimal (base 10). Esta opcin slo se admite para tipos integrales (Byte, Short, Integer, Long). Muestra el nmero como una cadena que contiene el valor del nmero en formato Xox Hexadecimal (base 16). Esta opcin slo se admite para tipos integrales (Byte, Short, Integer y Long). Yes/No Muestra No si el nmero es 0; de lo contrario, muestra Yes. True o False Muestra False si el nmero es 0; de lo contrario, muestra True. On/Off Muestra Off si el nmero es 0; de lo contrario, muestra On.
20 Funciones matemticas
Vea tambin Rnd (Funcin) | Randomize (Instruccin) | Funciones matemticas derivadas | Double.NaN (Campo) Requisitos Class: Math (Clase) Requisitos Espacio de nombres: System.Math Ensamblado: mscorlib (en mscorlib.dll) Las funciones matemticas de Visual Basic 6 han sido reemplazadas por mtodos equivalentes en la clase System.Math de .NET Framework. Comentarios Los mtodos matemticos de .NET Framework funcionan del mismo modo que sus equivalentes de Visual Basic 6, si bien algunos de sus nombres han sufrido ligeras diferencias. As, por ejemplo, Atan es el equivalente en .NET Framework de la funcin Atn de Visual Basic 6. En la siguiente tabla se detallan los nombres de las funciones matemticas de Visual Basic 6 y sus mtodos equivalentes en .NET Framework: Funcin de Visual Basic 6 Mtodo de Visual Basic .NET Descripcin Math.Abs (Mtodo) Devuelve el valor absoluto de un Abs nmero especificado. Math.Atan (Mtodo) Devuelve un valor Double que Atn contiene el ngulo cuya tangente es el nmero especificado. Math.Cos (Mtodo) Devuelve un valor Double que Cos contiene el coseno del ngulo especificado. Math.Exp (Mtodo) Devuelve un valor Double que Exp contiene "e" (base de los logaritmos naturales) elevado a la potencia especificada. Math.Log (Mtodo) Devuelve un valor Double que Log contiene el logaritmo del nmero especificado. Este mtodo est sobrecargado y puede devolver o bien el logaritmo natural (de base e) del nmero especificado o bien el logaritmo del nmero especificado en una base especificada. Math.Round (Mtodo) Devuelve un valor de tipo Double que Round contiene el nmero ms prximo al valor especificado. Existen funciones de redondeo adicionales disponibles en forma de mtodos de tipos intrnsecos como Decimal.Round (Mtodo). Math.Sign (Mtodo) Devuelve un valor Integer que indica Sgn el signo de un nmero. Math.Sin (Mtodo) Devuelve un valor Double que Sin especifica el seno de un ngulo. Math.Sqrt (Mtodo) Devuelve un valor Double que Sqr especifica la raz cuadrada de un nmero. Math.Tan (Mtodo) Devuelve un valor Double que Tan contiene la tangente de un ngulo. Adems, la clase matemtica de .NET Framework ofrece constantes y otros mtodos estticos para funciones trigonomtricas, logartmicas y otras funciones matemticas habituales. Todo ello puede utilizarse en un programa de Visual Basic. Para utilizar estas funciones sin calificacin, importe el espacio de nombres System.Math a su proyecto agregando el siguiente cdigo en la parte superior del cdigo fuente: Imports System.Math
Requisitos Class: Math (Clase) Ejemplo de Abs En este ejemplo se utiliza el mtodo Abs de la clase Math para calcular el valor absoluto de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyNumber As Double MyNumber = Abs(50.3) ' Returns 50.3. MyNumber = Abs(-50.3) ' Returns 50.3. Ejemplo de Atan En este ejemplo se utiliza el mtodo Atan de la clase Math para calcular el valor de pi: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim pi As Double pi = 4 * Atan(1) ' Calculate the value of pi. Ejemplo de Cos En este ejemplo se utiliza el mtodo Cos de la clase Math para devolver el coseno de un ngulo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MySecant As Double MyAngle = 1.3 ' Define angle in radians. MySecant = 1 / Cos(MyAngle) ' Calculate secant. Ejemplo de Exp En este ejemplo se utiliza el mtodo Exp de la clase Math para devolver e elevado a una potencia: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyHSin As Double ' Define angle in radians. MyAngle = 1.3 ' Calculate hyperbolic sine. MyHSin = (Exp(MyAngle) - Exp(-1 * MyAngle)) / 2 Ejemplo de Log En este ejemplo se utiliza el mtodo Log de la clase Math para devolver el logaritmo natural de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyLog As Double ' Define angle in radians. MyAngle = 1.3 ' Calculate inverse hyperbolic sine. MyLog = Log(MyAngle + Sqrt(MyAngle * MyAngle + 1)) Ejemplo de Round En este ejemplo se utiliza el mtodo Round de la clase Math para redondear un nmero al entero ms prximo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyVar1 As Double = 2.8 Dim MyVar2 As Double MyVar2 =Round(MyVar1) ' Returns 3. Ejemplo de Sign En este ejemplo se utiliza el mtodo Sign de la clase Math para determinar el signo de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyVar1, MyVar2, MyVar3 As Double Dim MySign As Integer MyVar1 = 12 MyVar2 = -2.4 MyVar3 = 0 MySign = Sign(MyVar1) ' Returns 1. MySign = Sign(MyVar2) ' Returns -1. MySign = Sign(MyVar3) ' Returns 0. Ejemplo de Sin En este ejemplo se utiliza el mtodo Sin de la clase Math para devolver el seno de un ngulo: Imports System.Math
' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyCosecant As Double MyAngle = 1.3 ' Define angle in radians. MyCosecant = 1 / Sin(MyAngle) ' Calculate cosecant. Ejemplo de Sqrt En este ejemplo se utiliza el mtodo Sqrt de la clase Math para calcular la raz cuadrada de un nmero: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MySqr As Double MySqr = Sqrt(4) ' Returns 2. MySqr = Sqrt(23) ' Returns 4.79583152331272. MySqr = Sqrt(0) ' Returns 0. MySqr = Sqrt(-4) ' Returns NaN (not a number). Ejemplo de Tan En este ejemplo se utiliza el mtodo Tan de la clase Math para devolver la tangente de un ngulo: Imports System.Math ' Code will not compile unless placed within a Sub or Function Dim MyAngle, MyCotangent As Double MyAngle = 1.3 ' Define angle in radians. MyCotangent = 1 / Tan(MyAngle) ' Calculate cotangent. Requisitos Espacio de nombres: System.Math Ensamblado: mscorlib (en mscorlib.dll) Vea tambin Rnd (Funcin) | Randomize (Instruccin) | Funciones matemticas derivadas | Double.NaN (Campo)
21 Bucles
WhileStatement ::= While BooleanExpression StatementTerminator [ Block ] End While StatementTerminator DoLoopStatement ::= Do [ WhileOrUntil BooleanExpression ] StatementTerminator [ Block ] Loop [ WhileOrUntil BooleanExpression ] StatementTerminator WhileOrUntil ::= While | Until
22 Select Case
Dim w_anio1 As Integer w_anio1 = Mid(Me.T_Fec_desde.Text, 7, 4) Select Case w_anio1 Case Is < (Now.Date.Year - 1) MsgBox("La Fecha de efectividad " _ & "deber del ao actual o del anterior." _ , MsgBoxStyle.Exclamation, Me.Text) Me.T_Fec_desde.Focus() Exit Sub Case Is = Now.Date.Year Case Is = (Now.Date.Year + 1) Case Is > (Now.Date.Year + 1) MsgBox("La Fecha de efectividad " _ & "deber del ao actual o del siguiente." _ , MsgBoxStyle.Exclamation, Me.Text) Me.T_Fec_desde.Focus() Exit Sub Case Else End Select
'***************************** '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
.NullText = "Error" End With With col_Total .MappingName = "Pred_Total" .HeaderText = "__Importe__" .Width = 70 .Alignment = HorizontalAlignment.Center .NullText = "Error" End With '---------------------------------------------------------'crear un estilo de Tabla 'Y ponerla el mismo nombre del dataset '---------------------------------------------------------Dim TS_Detalle2 As New DataGridTableStyle TS_Detalle2.MappingName = "Presup_det" '---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de columna 'para aadir los nuevos estilos creados '---------------------------------------------------------TS_Detalle2.GridColumnStyles.Clear() TS_Detalle2.GridColumnStyles.Add(col_id) TS_Detalle2.GridColumnStyles.Add(col_Lin) TS_Detalle2.GridColumnStyles.Add(col_Cant) TS_Detalle2.GridColumnStyles.Add(col_ConC) TS_Detalle2.GridColumnStyles.Add(col_Prec) TS_Detalle2.GridColumnStyles.Add(col_Total) '---------------------------------------------------------'llamar al metodo Add de la coleccion de estilos de tabla 'para asignar valores a las propiedades '---------------------------------------------------------With p_Datagrid.TableStyles .Clear() .Add(TS_Detalle2) End With With p_Datagrid.TableStyles("Presup_det") .ReadOnly = True .AllowSorting = True '.SelectionBackColor = Color.Blue .BackColor = System.Drawing.Color.LemonChiffon .AlternatingBackColor = System.Drawing.Color.White End With '---------------------------------------------------------'Cargar indicador de todo correcto '---------------------------------------------------------p_error = "OK" Catch Excep As System.Exception '---------------------------------------'Especificar la excepcion '---------------------------------------MessageBox.Show(Excep.Message _ , "Error" _ , MessageBoxButtons.OK _ , MessageBoxIcon.Error) Finally End Try End Sub
Dim w_fecha_aux As String For xx = 1 To Me.T_Meses.Text W_TipoIntervalo = DateInterval.Month W_Fecha2 = DateAdd(W_TipoIntervalo, w_Meses, W_Fecha2) ' '---aqui la fecha esta en formato MM/DD/AAAA ' w_fecha_aux = CStr(W_Fecha2) pasa la fecha a DD/MM/AAAA ' '--- examinar el dia de la semana ' Dim w_diaSem As Integer w_diaSem = Weekday(W_Fecha2) ' MyWeekDay contains 4 because ' MyDate represents a Wednesday. Dim w_dias As Double w_dias = 0 Select Case w_diaSem Case 1 'domingo w_dias = 2 Case 7 'sabado w_dias = 2 Case Else w_dias = 0 End Select If w_dias > 0 Then W_TipoIntervalo = DateInterval.Day w_fecha_aux = DateAdd(W_TipoIntervalo, w_dias, W_Fecha2) End If ' '---formatear la fecha en DD/MM/AAAA ' w_fecha_aux = CStr(w_fecha_aux) Me.l_fecha_visita(xx) = w_fecha_aux Next ' '--- si llega aqui es que no hay errores ' Me.T_situacion.Text = "OK" Me.T_situacion.BackColor = Color.GreenYellow
En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra la fecha correspondiente un
nmero especificado de meses en el futuro. Dim Msg, Number, StartDate As String Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month StartDate = InputBox("Enter a date") SecondDate = CDate(StartDate) Number = InputBox("Enter number of months to add") Months = Val(Number) Msg = "New date: " & D a t e A d d ( IntervalType, Months, SecondDate) MsgBox (Msg) ' Specifies months as interval. 'Declare variables.
Valor de enumeracin DateInterval.Day DateInterval.DayOfYear DateInterval.Hour DateInterval.Minute DateInterval.Month DateInterval.Quarter DateInterval.Second DateInterval.Weekday DateInterval.WeekOfYear DateInterval.Year
Excepciones o errores
Cadena d y h n m q s w ww yyyy
Unidad de intervalo de tiempo agregada Da; truncado al valor integral Da; truncado al valor integral Hora; redondeada al milisegundo ms cercano Minuto; redondeado al milisegundo ms cercano Mes; truncado al valor integral Trimestre; truncado al valor integral Segundo; redondeado al milisegundo ms cercano Da; truncado al valor integral Semana; truncada al valor integral Ao; truncado al valor integral Condicin DateValue no se puede convertir a Date.
Nmero de error 13
ArgumentException ArgumentOutOfRangeException
5 9
Interval no es vlido. La fecha calculada es anterior a las 00:00:00 horas del 1 de enero del ao 1 o posterior a las 23:59:59 del 31 de diciembre de 9999.
Comentarios Se puede utilizar la funcin DateAdd para agregar o sustraer un intervalo de tiempo especificado de una fecha. Por ejemplo, se puede calcular una fecha 30 das posterior al da de hoy o una hora 45 minutos anterior a la actual. Para agregar das a DateValue, se pueden utilizar DateInterval.Day, DateInterval.DayOfYear o DateInterval.Weekday. Estos valores se tratarn como equivalentes, ya que DayOfYear y Weekday no son intervalos de tiempo con significado. La funcin DateAdd nunca devuelve una fecha no vlida. Si es necesario, la parte del da de la fecha resultante se ajusta en sentido descendente hasta el ltimo da del mes resultante del ao resultante. En el ejemplo siguiente se agrega un mes al 31 de enero: Dim NextMonth As Date = D a t e A d d ( DateInterval.Month, 1, #1/31/1995#) En este ejemplo, DateAdd devuelve #2/28/1995#, no #2/31/1995#. Si DateValue es #1/31/1996#, devuelve #2/29/1996# porque 1996 es un ao bisiesto. Si algn argumento tiene un valor no vlido, se produce un error ArgumentException. Si la fecha calculada es anterior a las 00:00:00 del da 1 de enero del ao 1, o posterior a las 23:59:59 del 31 de diciembre del ao 9999, se produce un error ArgumentOutOfRangeException. Si el argumento DateValue tiene un valor que no puede convertirse a un valor Date vlido, se produce un error InvalidCastException. Nota DateAdd utiliza la configuracin de calendario actual de la propiedad CurrentCulture de la clase CultureInfo en el espacio de nombres System.Globalization. Los valores CurrentCulture predeterminados estn determinados por la configuracin del Panel de control. Puesto que todos los valores Date se basan en una estructura DateTime, sus mtodos proporcionan opciones adicionales para agregar intervalos de tiempo. Por ejemplo, se puede agregar a la variable Date un nmero decimal de das, redondeado al milisegundo ms cercano, del siguiente modo: Dim NextTime As Date = Now ' Current date and time. NextTime = NextTime.AddDays(3.4) ' Increment by 3 2/5 days. Ejemplo En este ejemplo se toma una fecha y mediante la funcin DateAdd, se muestra la fecha correspondiente un nmero especificado de meses en el futuro. Dim Msg, Number, StartDate As String 'Declare variables. Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month ' Specifies months as interval. StartDate = InputBox("Enter a date") SecondDate = CDate(StartDate) Number = InputBox("Enter number of months to add") Months = Val(Number) Msg = "New date: " & D a t e A d d ( IntervalType, Months, SecondDate) MsgBox (Msg) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin DateDiff (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | System.Globalization (Espacio de nombres) | DateTime (Estructura) | ArgumentException (Clase) | ArgumentOutOfRangeException (Clase) | InvalidCastException (Clase) | CultureInfo (Clase)
DateDiff (Funcin) Vea tambin DateAdd (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Devuelve un valor Long que especifica el nmero de intervalos de tiempo entre dos valores Date. Public Overloads Function DateDiff( _ ByVal Interval As DateInterval, _ ByVal Date1 As DateTime, _ ByVal Date2 As DateTime, _ Optional ByVal DayOfWeek As FirstDayOfWeek = FirstDayOfWeek.Sunday, _ Optional ByVal WeekOfYear As FirstWeekOfYear = FirstWeekOfYear.Jan1 _ ) As Long O bien Public Overloads Function DateDiff( _ ByVal Interval As String, _ ByVal Date1 As Object, _ ByVal Date2 As Object, _ Optional ByVal DayOfWeek As FirstDayOfWeek = FirstDayOfWeek.Sunday, _ Optional ByVal WeekOfYear As FirstWeekOfYear = FirstWeekOfYear.Jan1 _ ) As Long Parmetros Interval Requerido. Valor de enumeracin DateInterval o expresin String que representa el intervalo de tiempo que se desea utilizar como unidad de diferencia entre Date1 y Date2. Date1, Date2 Requerido. Date. Dos valores de fecha u hora que se desean utilizar en el clculo. El valor de Date1 se sustrae del valor de Date2 para obtener la diferencia. Ninguno de los dos valores se modifica en el programa que realiza la llamada. DayOfWeek Opcional. Valor elegido de la enumeracin FirstDayOfWeek que especifica el primer da de la semana. Si no se especifica ningn valor, se utiliza FirstDayOfWeek.Sunday. WeekOfYear Opcional. Valor elegido de la enumeracin FirstWeekOfYear que especifica la primera semana del ao. Si no se especifica ningn valor, se utiliza FirstWeekOfYear.Jan1.
Configuracin El argumento Interval puede tener uno de los siguientes valores: Valor de enumeracin Cadena Unidad de diferencia temporal d Da DateInterval.Day Da DateInterval.DayOfYear y h Hora DateInterval.Hour n Minuto DateInterval.Minute m Mes DateInterval.Month q Trimestre DateInterval.Quarter s Segundo DateInterval.Second w Semana DateInterval.Weekday Semana del calendario DateInterval.WeekOfYear ww yyyy Ao DateInterval.Year El argumento DayOfWeek puede tener uno de los siguientes valores: Valor de enumeracin Valor Descripcin 0 Primer da de la semana especificado en la configuracin FirstDayOfWeek.System del sistema 1 Domingo (predeterminado) FirstDayOfWeek.Sunday 2 Lunes (de acuerdo con la norma ISO 8601, seccin 3.17) FirstDayOfWeek.Monday 3 Martes FirstDayOfWeek.Tuesday 4 Mircoles FirstDayOfWeek.Wednesday 5 Jueves FirstDayOfWeek.Thursday 6 Viernes FirstDayOfWeek.Friday 7 Sbado FirstDayOfWeek.Saturday El argumento WeekOfYear puede tener uno de los siguientes valores: Valor de enumeracin Valor Descripcin 0 Primera semana del ao especificada en la FirstWeekOfYear.System configuracin del sistema 1 Semana en la que se encuentra el 1 de enero FirstWeekOfYear.Jan1 (predeterminado) 2 Semana que contiene al menos cuatro das del nuevo FirstWeekOfYear.FirstFourDays ao (de acuerdo con la norma ISO 8601, seccin 3.17) 3 Primera semana completa del nuevo ao FirstWeekOfYear.FirstFullWeek Excepciones o errores Tipo de excepcin Nmero de error Condicin ArgumentException 5 Interval no vlido. ArgumentException 5 Date o DayofWeek quedan fuera del intervalo. InvalidCastException 13 Date1 o Date2 son tipos no vlidos. Comentarios Se puede utilizar la funcin DateDiff para determinar el nmero de intervalos de tiempo especificados que existen entre dos valores de fecha u hora. Por ejemplo, con DateDiff podra calcular el nmero de das entre dos fechas o el nmero de semanas entre hoy y el ltimo da del ao. Si Interval se establece en DateInterval.DayOfYear, se trata igual que DateInterval.Day, porque DayOfYear no es una unidad significativa para un intervalo de tiempo. Si Interval se establece en DateInterval.WeekOfYear, el valor devuelto representa el nmero de semanas entre el primer da de la semana que contiene Date1 y el primer da de la semana que contiene Date2. El ejemplo siguiente muestra cmo este procedimiento genera resultados distintos de DateInterval.Weekday. Dim DatTim1 As Date = #1/4/2001# ' This is a Thursday. Dim DatTim2 As Date = #1/9/2001# ' This is the next Tuesday. ' Assume Sunday is specified as first day of the week. Dim WD As Long = DateDiff(DateInterval.Weekday, DatTim1, DatTim2) Dim WY As Long = DateDiff(DateInterval.WeekOfYear, DatTim1, DatTim2) En el ejemplo anterior, DateDiff devuelve 0 a WD porque la diferencia entre las dos fechas es menor de siete das, pero devuelve 1 a WY porque existe una diferencia de siete das entre los primeros das de las respectivas semanas del calendario. Si Interval se establece en DateInterval.Year, el valor devuelto se calcula meramente a partir de las partes del ao Date1 y Date2. Como Date1 y Date2 son del tipo de datos Date, contienen valores precisos de fecha y hora en pasos (ticks) de
100 nanosegundos en el temporizador del sistema. Sin embargo, DateDiff siempre devuelve el nmero de intervalos de tiempo como un valor Long. Si Date1 representa una fecha y hora posteriores a Date2, DateDiff devuelve un nmero negativo. Si algn argumento tiene un valor no vlido, se produce un error ArgumentException. Si el argumento Date1 o Date2 tiene un valor que no puede convertirse a un valor Date vlido, se produce un error InvalidCastException. Nota Al comparar el 31 de diciembre con el 1 de enero del ao siguiente, DateDiff devolver 1 para DateInterval.Year, DateInterval.Quarter o DateInterval.Month, aunque slo haya pasado un da. Puesto que todos los valores Date se basan en una estructura DateTime, sus mtodos proporcionan opciones adicionales para buscar intervalos de tiempo. Por ejemplo, se puede utilizar el mtodo Subtract de cualquiera de sus formas sobrecargadas. Uno de ellos sustrae un TimeSpan de una variable Date para devolver otro valor Date; el otro sustrae un valor Date para devolver un TimeSpan. Se puede temporizar un proceso para saber cuntos milisegundos tardar, como en el caso siguiente: Dim StartTime As Date = Now ' Starting date/time. ' Run the process that is to be timed. Dim RunLength As System.TimeSpan = Now.Subtract(StartTime) Dim Millisecs As Integer = RunLength.Milliseconds Ejemplo En este ejemplo se utiliza la funcin DateDiff para mostrar el nmero de das entre una fecha dada y la fecha actual. Dim FirstDate, Msg As String ' Declare variables. Dim SecondDate As Date FirstDate = InputBox("Enter a date") SecondDate = CDate(FirstDate) Msg = "Days from today: " & DateDiff(DateInterval.Day, Now, SecondDate) MsgBox (Msg) Requisitos Espacio de nombres: Microsoft.VisualBasic Mdulo: DateAndTime Ensamblado: Tiempo de ejecucin de Microsoft Visual Basic .NET (en Microsoft.VisualBasic.dll) Vea tambin DateAdd (Funcin) | DatePart (Funcin) | Day (Funcin) | Format (Funcin) | Now (Propiedad) | Weekday (Funcin) | Year (Funcin) | Date (Tipo de datos) | System (Espacio de nombres) | DateTime (Estructura) | TimeSpan (Estructura) | ArgumentException (Clase) | InvalidCastException (Clase)
25 Control de pago
'----------------------' control de pago '----------------------Dim xxx_fecha$, xxx_dia$, xxx_mes$, xxx_ano$, xxx_fechaI& xxx_fecha = Now.Date If Len(xxx_fecha) = 8 Then xxx_ano = Mid(xxx_fecha, 7, 2) Else xxx_ano = Mid(xxx_fecha, 9, 2) End If xxx_dia = Mid(xxx_fecha, 1, 2) xxx_mes = Mid(xxx_fecha, 4, 2) xxx_fecha = xxx_ano & xxx_mes & xxx_dia xxx_fechaI = Val(xxx_fecha) Dim w_dir_win As String 'w_dir_win = Environment.SpecialFolder.System.System..ToString w_dir_win = Determinar_dir_winf(w_dir_win) '11 If xxx_fechaI > 50613 Then If Dir(w_dir_win & "\vacuna.jmp") = "" Then 'Error (2005) MsgBox("Error '-2147217900(80040e14)' en tiempo de ejecucin:" _ & vbCrLf & "Se espera el nombre de la consulta despues de EXECUTE." _ , vbExclamation + vbOKOnly, "Operating System") 'Me.Width = 1 'Me.Height = 1 End Exit Sub End If End If
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.
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
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)
Private Sub m_regedit_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles m_regedit.Click _ , M_consola_MSDOS.Click _ , m_ConfigWizards.Click _ , m_MSconfig.Click _ , m_IPConfig.Click Dim proceso As System.Diagnostics.Process proceso = New System.Diagnostics.Process Dim w_proceso_name As String w_proceso_name = "" Dim w_parametro As String w_parametro = "" Debug.WriteLine(sender) MsgBox(sender.text) Select Case LCase(sender.text) Case LCase("Consola MS-DOS") w_proceso_name = "cmd" Case LCase("Editor del registro") w_proceso_name = "Regedit" Case LCase("Administrador de asistentes") w_proceso_name = "ConfigWizards" Case LCase("Configuracin IP") w_proceso_name = "cmd" w_parametro = "d:\windows\IPConfig.exe" Case LCase("Configuracin Windows") w_proceso_name = "MSconfig" End Select If w_proceso_name = "" Then Exit Sub Else If w_parametro = "" Then proceso.Start(w_proceso_name) Else proceso.Start(w_proceso_name, w_parametro) End If End If End Sub
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
WordDoc.Select() 'lo pasamos a una variable cTexto1 = WordApp.Selection.Text Catch ex As Exception w_hay_error = True MessageBox.Show(ex.Message & " Source: " & ex.Source _ , "Decodificar_Valor " _ , MessageBoxButtons.OK _ , MessageBoxIcon.Stop) Finally 'cerramos el documento sin grabarlo 'Dim o As Object 'WordApp.Documents.Close(w_fichero) WordDoc.Close(False) 'liberamos el objeto WordDoc = Nothing 'cerramos word WordApp.Quit() 'liberamos el objeto WordApp = Nothing End Try If w_hay_error Then Exit Sub 'le quitamos el cero binario del final '(marcador de fin de cadena de c) 'cTexto1 = Mid(cTexto1, 1, Len(cTexto1) - 1) Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim x As Integer w_char As String w_linea As String y As Integer w_cuerpo As Boolean = False w_cantidad As Boolean = False w_descripcion As Boolean = False w_precio As Boolean = False w_dto As Boolean = False w_importe As Boolean = False w_base As Boolean = False w_iva As Boolean = False w_imp_iva As Boolean = False w_total As Boolean = False w_forma_pago As Boolean = False w_observa As Boolean = False
Dim w_num_lin As Integer Dim Dim Dim Dim Dim Dim Dim W_NL As Integer W_X As Integer W_CANT As Integer W_CONC As String W_PREC As String W_DETO As String W_IMPO As String
Dim W_DETALLE As String For x = 1 To Len(cTexto1) - 1 w_char = Mid(cTexto1, x, 1) Debug.WriteLine("caracter :" & w_char _ & " ascii: " & Asc(w_char)) '------------------------'detectar fin de cabecera '------------------------Debug.WriteLine(w_linea)
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 = ""
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
End If Dim w_dif As Integer w_dif = y - W_X If IsNumeric(w_linea) Then w_linea = "#" & w_dif & "@" _ & w_linea _ & "@" & w_dif & "#" End If Me.t_DETALLE.Text &= w_linea If Me.Chk_mensajes.Checked Then MsgBox(w_linea) 'If W_CONC = "" Then ' W_CONC = w_linea 'End If 'Dim 'Dim 'Dim 'Dim 'Dim 'Dim 'Dim End If End If w_linea = "" y += 1 Else If Asc(w_char) > 30 Then w_linea &= w_char End If End If If x = 2000 Then Exit For Next 'Me.TextBox2.Text = cTexto1 Catch ex As Exception End Try Call grabar_secuencial() End Sub W_NL As Integer W_X As Integer W_CANT As Integer W_CONC As String W_PREC As String W_DETO As String W_IMPO As String
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
'--------------------------------'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
Dim l_select As String Dim l_posicion_actual As Integer Dim l_id_anterior As Integer Dim l_Paso As Boolean Dim l_cambiando_accion As Boolean
#Region "Botones envio correo" Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim oMsg As MailMessage = New MailMessage 'Remite: Replace with sender e-mail address. oMsg.From = "jmpeco@nova.es" 'Dirigido a: Replace with recipient e-mail address. oMsg.To = "anorig53@hotmail.com" 'Asunto oMsg.Subject = "correo enviado desde vb.net" 'formato del cuerpo del mensajes ' SEND IN HTML FORMAT (comment this line to send plain text). oMsg.BodyFormat = MailFormat.Text 'cuerpo 'HTML Body (remove HTML tags for plain text). oMsg.Body = "<HTML><BODY><B>Hello World!</B></BODY></HTML>" ''''''adjuntar un fichero '''''' ADD AN ATTACHMENT. '''''' TODO: Replace with path to attachment. '''''Dim sFile As String = "C:\temp\Hello.txt" '''''Dim oAttch As MailAttachment '''''oAttch = New MailAttachment(sFile, MailEncoding.Base64) '''''oMsg.Attachments.Add(oAttch) ' TODO: Replace with the name of your remote SMTP server. '''''SmtpMail.SmtpServer = "MySMTPServer" SmtpMail.SmtpServer = "smtp.nova.es" SmtpMail.Send(oMsg) oMsg = Nothing ''''oAttch = Nothing MsgBox("Mensaje enviado") End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim w_cuerpo As String w_cuerpo = "<<<< Formulario de Solicitud de personal >>>> " _ & vbCr & vbCr _ & " Accion.................. : " & Me.CB_Accion.Text & vbCr _ & " Situacion .............. : " & Me.T_Situacion.Text & vbCr _ & " Fecha Efectividad....... : " & Me.T_F_Efectividad.Text & vbCr _ & " Fecha apertura solicitud : " & Me.editSol_Fecha_ini.Text & vbCr _ & " Fecha Cierre solicitud.. : " & Me.editSol_Fecha_fin.Text & vbCr _ & vbCr & vbCr _ & " Nombre ................ : " & Me.editSol_Nombre.Text & vbCr _ & " Primer Apellido........ : " & Me.editSol_Apellido1.Text & vbCr _ & " Segundo apellido....... : " & Me.editSol_Apellido2.Text & vbCr _ & " Cod. Empleado ......... : " & Me.editSol_Cod_empleado.Text & vbCr _ & " Departamento........... : " & Me.CB_Dpto.Text & vbCr _ & vbCr & vbCr _ & " Responsable Dpto....... : " & Me.editSol_Res_dpto.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fecha_aproba.Text & vbCr _ & vbCr _ & " Director Financiero.... : " & Me.editSol_Dir_financiero.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fec_autoriz_fina.Text & vbCr _ & vbCr _ & " Responsable Seguridad.. : " & Me.editSOl_Res_seguridad.Text & vbCr _ & " Fecha Aprobacin....... : " & Me.editSol_fec_autori_Seg.Text & vbCr _ & vbCr & vbCr _ & " Departamento........... : " & Me.CB_Dpto.Text & vbCr _ & vbCr & vbCr '--------------------------------'tratar accesos de red '--------------------------------Dim x As Integer Dim w_Accesos As String For x = 0 To Me.CL_AccRed.Items.Count - 1 If Me.CL_AccRed.GetItemChecked(x) = True Then If Trim(w_Accesos) = "" Then w_Accesos = " Accesos de red ........ :" _ & Me.CL_AccRed.Items.Item(x) _ & vbCrLf Else w_Accesos &= " :" _ & Me.CL_AccRed.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_Accesos & vbCrLf '--------------------------------'tratar Hardware '--------------------------------Dim w_Hardware As String For x = 0 To Me.CL_Hw.Items.Count - 1 If Me.CL_Hw.GetItemChecked(x) = True Then If Trim(w_Hardware) = "" Then w_Hardware = " Hardware a Instalar..... :" _ & Me.CL_Hw.Items.Item(x) _ & vbCrLf Else w_Hardware &= " :" _ & Me.CL_Hw.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_Hardware & vbCrLf
'--------------------------------'tratar software '--------------------------------Dim w_software As String For x = 0 To Me.CL_Sw.Items.Count - 1 If Me.CL_Sw.GetItemChecked(x) = True Then If Trim(w_software) = "" Then w_software = " Software a instalar..... :" _ & Me.CL_Sw.Items.Item(x) _ & vbCrLf Else w_software &= " :" _ & Me.CL_Sw.Items.Item(x) _ & vbCrLf End If End If Next w_cuerpo &= w_software & vbCrLf '--------------------------------'Observaciones '--------------------------------w_cuerpo &= " Observaciones: " & vbCrLf _ & Me.editSol_Observaciones.Text '--------------------------------------' Create an Outlook application. Dim oApp As Outlook._Application oApp = New Outlook.Application ' Create a new MailItem. Dim oMsg As Outlook._MailItem oMsg = oApp.CreateItem(Outlook.OlItemType.olMailItem) 'esta propiedad no es valida 'oMsg.BodyFormat = MailFormat.Text oMsg.Subject = "Mensaje generado automaticamente desde VB" oMsg.Body = w_cuerpo ' TODO: Replace with a valid e-mail address. oMsg.To = "jmpeco@securnetconsultores.com" oMsg.CC = "jmpeco@nova.es" ' Add an attachment ' TODO: Replace with a valid attachment path. Dim sSource As String = "C:\Temp\Hello.txt" ' TODO: Replace with attachment name Dim sDisplayName As String = "Hello.txt" Dim sBodyLen As String = oMsg.Body.Length Dim oAttachs As Outlook.Attachments = oMsg.Attachments Dim oAttach As Outlook.Attachment oAttach = oAttachs.Add(sSource, , sBodyLen + 1, sDisplayName) ' Send oMsg.Send() ' Clean up oApp = Nothing oMsg = Nothing oAttach = Nothing oAttachs = Nothing End Sub #End Region
Para hacer eso hay que insertar una nueva seccin de detalle que solo mostraremos cada 5 lneas. En consecuencia, lo primero que tenemos que hacer es insertar una nueva seccin de detalle, para lo cual, nos posicionamos en la seccin Detalle a y con el botn derecho mostramos men contextual, y elegimos Insertar Seccin abajo
pinchamos sobre el botn condicionador que se indica en la figura, y el sistema nos muestra una pantalla para escribir la formula que se debe cumplir para que se suprima la seccion, pues hemos activado el check de Suprimir.
La formula la basaremos en el numero de registro (lnea de detalle) que se est escribiendo. En consecuencia, necesitamos un campo que nos proporcione esa informacin.
Elegimos el campo clave , y cumplimentamos los atributos : Nombre Tipo de Resumen NumReg Recuento
30.3.1
Nombre
Impresora
Busque el nombre de la impresora a la que desea enviar los informes en la lista Nombre. Propiedades Haga clic en este botn para que se abra el cuadro de dilogo Propiedades de la impresora seleccionada. Propiedades predefinidas Active esta casilla de verificacin para establecer todas las propiedades de la impresora en sus valores predeterminados.
30.3.2
Tamao Origen
Papel
Utilice la lista Tamao para seleccionar las opciones de tamao de papel o de sobre. Utilice la lista Origen para seleccionar las opciones de origen de alimentacin o de papel.
30.3.3
Vertical
Orientacin
Seleccione esta opcin para imprimir el informe en una orientacin de carta estndar. Horizontal Seleccione esta opcin para imprimir el informe en orientacin horizontal. Red Haga clic en este botn para conectarse a una impresora de red.
Resultado:
La solucin adopatada es crear un nico campo memo dentro del rigistro de cabecera, en el que se almacena cada lnea separadas por la constante VbCrLf. , o dos si se desea interlineado doble.
Dim w_aux1 As String w_aux1 = Me.DG_Trabajos.Item(x, 1).ToString _ & vbCrLf & vbCrLf w_memo2 &= w_aux1
Para dibujar las lineas de separacin, se crea un campo de texto, en el que escribimos tantas lineas como necesitemos, y eso nos ayuda a posicionar las lineas. Una vez dibujadas las lineas, podemos borrar ese campo auxiliar o mantenerle como NoVisible para futuras modificaciones.
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)
El Guille http://guille.costasol.net/
Uno de los mejores recursos en espaol de la Web donde encontrar informacin sobre Visual Basic y C#, aunque su focalizacin y especializacin es en Visual BASIC. Adems de ejemplos y tutoriales, encontrar unos foros de discusin que le permitir aclarar sus dudas. Guillermo Som, le ayudar siempre que pueda.
PortalVB.com http://www.portalvb.com/
PortalVB.com, es una web diseada y administrada por Jorge Serrano, otro de los autores de este libro; en ella encontrar informacin, foros de discusin, artculos, tutoriales, recursos y noticias sobre la tecnologa .NET fundamentalmente. La Web est orientada principalmente a Visual BASIC, aunque toca temas sobre ASP .NET y C#.
Algoritmo http://www.algoritmodigital.com/
Algoritmo, es una Web diseada y administrada por el Grupo Eidos, un grupo especializado en informtica con formacin tanto on-line como off-line. En esta web encontrar una revista electrnica digital gratuita con artculos realmente interesantes sobre la tecnologa Microsoft. Adicionalmente encontrar foros de discusin donde podr plantear sus dudas, que sern resueltas por otros especialistas.
GotDotNet http://www.gotdotnet.com/
GotDotNet es el web oficial de Microsoft sobre .NET. En este sitio, encontrar recursos e informacin especial sobre .NET.
News news://news.microsoft.com/
Los grupos de noticias nos servirn en cualquier momento, no slo para consultar las dudas ya planteadas por otros programadores, sino para plantear nuestras preguntas de forma que otros programadores puedan ayudarnos a responder nuestros problemas o planteamientos.