Wednesday, September 07, 2005

Crear una base de datos con ADO

Crear una base de datos con ADO, usando código de VB (29/Sep/2001)

Para poder crear una base de datos, desde Visual Basic, usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y crear un objeto del tipo Catalog.

Nota: Esta referencia es para la versión 2.6 de ADO, por tanto puede ser que, si la versión que tienes instalada es otra, en lugar de 2.6 aparezca otra numeración.ADOX sólo está disponible a partir de la versión 2.1 de ADO.

Veamos, de forma simple, cómo crear una base de datos:Dim cat As ADOX.Catalog

Set cat = New ADOX.Catalog
'
' Crear la base de datos
cat.Create "Provider=" & sProvider & ";" & _
"Data Source=" & sNombreBase & ";"

En este ejemplo, tenemos que tener asignadas las variables sProvider (el proveedor) y sNombreBase (el nombre y path de la base de datos).Para una base de datos del tipo Access 97, sProvider = "Microsoft.Jet.OLEDB.3.51"Para una base de datos del tipo Access 2000, sProvider = "Microsoft.Jet.OLEDB.4.0"

Nota: Si la base de datos ya existe, dará un error.
Para más información: Defining and Retrieving a Database’s Schema (MDAC Technical Articles)

Thursday, August 11, 2005

Registrar y proteger una aplicación.

Soy programador de Visual Basic. He estado realizando un aplicación para un cliente, y debido al buen resultado que se ha obtenido de la misma, me han hablado de la posibilidad de registrar la aplicación para su posterior venta. Mi consulta es la siguiente. ¿Cuales son los pasos a seguir para registrar la aplicación, y cuales para poder comercializar posteriormente la misma? ¿Es necesario entrar en algún libro de registro?

Antes de nada he de decirle que no soy abogado y mi respuesta no pretende ser sustituta de un buen consejo profesional en ese ámbito. Le hablo desde la experiencia personal y de ver lo que la gente del sector suele hacer.

Los programas de ordenador están bastante poco protegidos por la legislación actual y son considerados, a todos los efectos, como si de libros se tratase. Es decir, se rigen por las leyes de los derechos de autor como los libros.

Lo que debe hacer para protegerlos, aparte de incluir un Copyright en el "acerca de", es registrar el código fuente en el registro de la propiedad intelectual de su provincia, cediendo el derecho de explotación a alguna empresa.

Es un trámite sencillo y rápido, y su coste es muy bajo por lo que no debería tener problemas.

Otra medida adicional que suelen tomar muchos para obtener una protección adicional es guardar una copia del código fuente en una caja del banco o en un notario de forma que figure en un registro de confianza la entrega de dicho código en determinada fecha.

De este modo si alguien lo roba o lo copia usted podrá demostrar que lo poseía desde la fecha en la que lo registró.

Obtener información de disco en Visual Basic.

Estoy utilizando Visual Basic 6, y me gustaría saber como puedo encontrar los datos de cabecera que aparecen cada vez que se ejecuta el comando dir del DOS ya sea en el disco duro, en un disquete o en un CD-ROM; por ejemplo: El volumen de la unidad C no tiene etiqueta El numero de serie del volumen es 1740-1080 Directorio de C:
La función que necesita para averiguar toda esa información es la siguiente: Public Function InfoVolumen(ByVal Raiz As String, _ Optional ByRef Label As String, _ Optional ByRef NumSerie As Long, _ Optional ByRef TipoStmaArchivos As String) As Boolean Raiz = Raiz Label = Space$(255) & vbNullChar TipoStmaArchivos = Space$(255) & vbNullChar InfoVolumen = GetVolumeInformation(Raiz, Label,_ Len(Label), NumSerie, vbNull, vbNull, TipoStmaArchivos,_ Len(TipoStmaArchivos)) If InfoVolumen = True Then Dim Pos As Long Pos = InStr(Label, vbNullChar) Label = Left$(Label, Pos - 1) Pos = InStr(TipoStmaArchivos, vbNullChar) TipoStmaArchivos = Left$(TipoStmaArchivos, Pos - 1) End If End Function Para poder usarla deberá añadir las siguientes declaraciones a su módulo o formulario: Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long Como puede observar la información se devuelve en las variables que se le pasan como parámetro. Tiene que tener cuidado de que el nombre de la unidad incluya los dos puntos y la barra invertida al final (C:\, no C a secas, por ejemplo). Así para llamarla para el disco c:\ podría escribir: Dim Etiqueta As String Dim NumSerie As String Dim StmaArchs As String InfoVolumen "C:\", Etiqueta, NumSerie, StmaArchs Devolvería la etiqueta del volumen en la primera variable, el número de serie del volumen en la segunda y el tipo de sistema de archivos (NTFS, FAT, FAT32) en la tercera. José Manuel Alarcón Aguín

Comparar dos archivos de texto con VB.

Estoy tratando de hacer un programa en Visual Basic que compare los datos de dos Sequential Text files. Pero necesito ayuda.

La mejor manera de hacer lo que pregunta es abrir ambos ficheros y recorrer byte a byte su contenido comparándolo hasta que haya uno distinto, así:

Dim b1 As Byte, b2 As Byte Open "archivo1.txt" For Binary As #1 Open "archivo2.txt" For Binary As #2 'Si ya no tienen la misma longitud es que no son iguales If LOF(1) <> LOF(2) Then Close #2 Close #1 MsgBox "¡Son distintos!" Exit Sub End If Do Get #1, , b1 Get #2, , b2 If b1 <> b2 Then MsgBox "¡Son distintos!" Exit Sub End If Loop Until (EOF(1) Or EOF(2)) MsgBox "¡Son iguales!" Close #2 Close #1 Nada más.

Échele un vistazo al manual o a la ayuda que es el mejor sitio para aprender y todo esto se puede ver allí. José M. Alarcón

Obtener el contenido de un libro de Excel.

Necesito información de cómo identificar el nombre de una hoja de Excel desde Visual Basic sin abrir el archivo correspondiente. Necesito hacer consultas a tablas (hojas) pero sin abrirlas y sin saber qué tablas contiene. Cualquier información será de mucha ayuda.

Su problema se puede solucionar fácilmente mediante la automatización OLE. Para ello lo mejor es que obtenga una referencia a la hoja de cálculo de la que quiere obtener información mediante la función GetObject, y luego acceda a sus miembros mediante automatización. Si, por ejemplo, tuviese un archivo de hoja de cálculo Excel en c:\mis documentos\ llamada Libro1.xls, para averiguar el nombre de las hojas que contiene se haría así:

Dim objWB As Object
Set objWB = GetObject("c:\mis documentos\libro1.xls")
Dim i As Long
Dim Mensaje As String
Mensaje = "Este archivo de Excel contiene " & objWB.Sheets.Count & " hojas en su interior" & vbCrLf
Mensaje = Mensaje & "Los nombres de las hojas son:" & vbCrLf
For i = 1 To objWB.Sheets.Count
Mensaje = Mensaje & "Hoja nº " & i & ": " & objWB.Sheets(i).Name & vbCrLf
Next
MsgBox Mensaje
Set objWB = Nothing

Como vemos es muy sencillo. Sólo tiene que obtener una referencia al libro de trabajo sobre el que desee trabajar y recorrer la colección Sheets para obtener información sobre sus hojas de trabajo. Si quiere obtener más información sobre el modelo de objetos de MS Excel instale la ayuda de VBA de Excel desde el programa de instalación de Office y léasela. Puede obtener también información desde el inspector de objetos de Visual Basic si desde el menú Proyecto/Referencias agrega una referencia a Microsoft Excel Object Library.

Obtener el icono asociado a un archivo.

Necesito saber el icono asociado a un archivo al igual que como ocurre en el explorador de Windows. No deseo abrirlo sino tan sólo saber el icono asociado a un archivo para poder asignárselo. Utilizo Visual Basic versión 5.

Existe una función de la API Win32 llamada SHGetFileInfo que entre otras cosas puede facilitarnos directamente un manejador del icono asociado a un archivo, con lo cual sólo tenemos que pintar este icono a partir de su manejador en la superficie de contexto que deseemos. Por ejemplo suponga que tiene en un formulario un PictureBox llamado PictureBox1 de un tamaño cualquiera (hágalo mayor de 32x32 que es el tamaño normal de un icono) y con su propiedad AutoRedraw igual a True para no perder lo que se dibuje en él. Ahora necesita averiguar el icono asociado a un archivo cualquiera que tiene en tu disco duro. Imagine que este archivo es un archivo de texto por ejemplo, llamado prueba.txt. Tiene como icono asociado una especie de libreta de notas con una espiral (el 7icono de los archivos de texto). Para averiguar su icono y dibujarlo en el PictureBox necesita tan sólo tres líneas de código que conllevan dos llamadas a la API de Win32 así como la declaración de una variable del tipo de la API
SHFILEINFO:

Dim IcoInfor As SHFILEINFO
SHGetFileInfo "C:\prueba.txt", 0, IcoInfor, Len(IcoInfor), SHGFI_ICON
DrawIconEx Picture1.hDC, 0, 0, IcoInfor.hicon, 0, 0, 0, 0, DI_NORMAL

La función SHFileInfo hace que, en el parámetro SHGFI_ICON pasado por referencia al final, se escriba información referente al icono asociado al archivo c:\prueba.txt, concretamente nos interesa el miembro hIcon de la estructura IcoInfor que es del tipo SHFILEINFO (obtenga la declaración de este tipo así como de las dos funciones empleadas a través de la utilidad API Viewer que viene con Visual Basic). Ahora mediante la función DrawIconEx pintamos el icono buscado en el PictureBox. Uso DrawIconEx en lugar de DrawIcon porque esta última sólo pinta los iconos grandes "de toda la vida" (o sea, de tamaño 32x32) mientras que DrawIconEx permite dibujar los iconos a su tamaño adecuado con tan sólo poner ceros para el ancho y el alto en sus parámetros 5º y 6º. Para averiguar el icono pequeño asociado a un archivo, sólo debemos variar un poco el código anterior añadiendo a la llamada a SHGetFileInfo la constante SHGFI_SMALLICON:

Dim IcoInfor As SHFILEINFO
SHGetFileInfo "C:\temp\pru.txt", 0, IcoInfor, Len(IcoInfor), SHGFI_ICON Or SHGFI_SMALLICON
DrawIconEx Picture1.hDC, 0, 0, IcoInfor.hicon, 0, 0, 0, 0, DI_NORMAL

Tamaño de la BD desde una aplicación

Me gustaría saber si hay alguna forma de obtener las características y estructura de una base de datos Access desde una aplicación Visual Basic 6.0. ¿Es posible obtener el tamaño de la base de datos desde una aplicación?

Efectivamente existe la manera de hacer referencia a los objetos de una base de datos de forma genérica, y así obtener la información más interesante.

A continuación le mostramos un fragmento de código que permite obtener algunas características de una base de datos.
Private Sub Command1_Click()
For i = 0 To Data1.Database.TableDefs.Count 'nombre de cada una de las tablas
List1.AddItem Data1.Database.TableDefs(i).Name 'numero de campos de la tabla
i List1.AddItem Data1.Database.TableDefs(i).Fields.Count 'numero de Registros
List1.AddItem Data1.Database.TableDefs(i).RecordCount 'ultima actualizacion
List1.AddItem Data1.Database.TableDefs(i).LastUpdated 'así podrá obtener toda la información que necesite Next
End Sub

En cuanto al tamaño del fichero mdb puede utilizar la función Len( ) que le permite obtener el número de bytes necesarios para almacenar cualquier fichero, de tal manera que si conocemos el espacio necesario para su almacenamiento podremos obtener tamaño real de dicho fichero.

Como ejemplo adjuntamos otro pequeño fragmento de código que ilustra a la perfección lo que explicábamos en estas líneas.

Dim Tamaño As String Tamaño = InputBox("Nombre del fichero:", "Mostrar tamaño", "C:\Base.mdb")
If Len(Tamaño) Then MsgBox "El tamaño de " & Tamaño & vbCrLf & "es de " & FileLen(Tamaño) & " bytes" End If

Ignacio Céspedes Orduña

Thursday, July 14, 2005

Sentencia SQL exclusiva para inventarios con fecha de rango :

Select anxbas, anxcod, anxnom,doccod,docnum,last(emision), last(vencimiento), sum(dolares), sum(soles) from (Select anxbas,anxcod,anxnom,doccod,docnum,last(fecemi) as Emision,last(fecven) as Vencimiento,sum(impext) as Dolares,sum(impnac) as Soles from documento Where fecven < #" & CDate(Format(Desde, "mm/dd/yy")) & "# Group by anxbas,anxcod,anxnom,doccod,docnum Union (Select anxbas, anxcod, anxnom, doccod, docnum, last(fecemi) as Emision, last(fecven) as Vencimiento, sum(impext) as Dolares, sum(impnac) as Soles from documento Where fecven Between #" & CDate(Format(Desde, "mm/dd/yy")) & "# and #" & CDate(Format(Hasta, "mm/dd/yy")) & "# GROUP BY anxbas, anxcod, anxnom, doccod, docnum)) WHERE anxbas like '" & Mid(Combo1.Text, 1, 1) & "%' GROUP BY anxbas, anxcod, anxnom,doccod,docnum HAVING last(vencimiento) >= #" & CDate(Format(Desde, "mm/dd/yy")) & "#"A = A & "ORDER BY last(vencimiento) Asc

Manuel Javier Principe Acosta
Analista Programador de www.sviperu.com
San Miguel,Lima,Peru +511-9992-7212

Sunday, June 19, 2005

Funcion DateIFF

Diferencia de minutos en vb:

IF HOUR(FECHAINICIO)<=19 AND HOUR(FECHAFIN) <=19 THEN
DIFERENCIA =DATEDIFF(NN,FECHAINICIO,FECHAFIN)

Funcion de Validacion Datagrid

Valida en DataGrid.
Dentro del evento DBGrid1_AfterColUpdate escribir :

If dbgrid1.colummns.value <> 1 or dbgrid1.colummns.value <> 2 then
msgbox "Los valores aceptables con 1 o 2 "
dbgrid1.col = 1 ' Supongo que es la primera columna
else
dbgrid1.col = dbgrid1.col + 1
end if

Funcion StrConv

Funcion que convierte la primera letra en mayuscula, formato "Titulo":

Text1.Text = StrConv(Text1.Text, vbProperCase)

Funcion de busqueda de tabla MDB

Public Function BuscarTabla(sTabla As String) As Boolean
Dim dbsActual As Database
Dim cn As String
Set dbsActual = OpenDatabase("TuBase.mdb", False, False, ";pwd=" & DB_KLAVE)
For Each tdef In dbsActual.TableDefs
If tdef.Name = sTabla Then
BuscarTabla = True
Exit Function
End If
Next tdef
Set dbsActual = Nothing
End Function

Monday, June 06, 2005

Fecha de creacion de archivos

Trabajar con un objeto OSF (objet sistem file),

Dim osf As Object
Dim fichero as file
Dim fecha as string

Set osf = CreateObject("Scripting.FileSystemObject")
Set fichero = osf.getfile(ruta_de_acceso)

fecha = "la fecha es " & and fichero.DateLastModified

msgbox fecha

Nota :

DateLastModified = ultima ves que fue modificado
DateCreated = cuando fue creado.

Friday, May 27, 2005

Funcion para operaciones con horas

Función para obtener el mayor de dos horas en el formato que tu propones, le faltan agregar validaciones a ésta funcion, como verificar si el parametro pasado es una hora válida.

Function HoraMayor(ByVal vstrHora1 As String, vstrHora2 As String) As String

Dim strHora1 As String
Dim strHora2 As String

strHora1 = Format(vstrHora1, "short date")

strHora2 = Format(vstrHora2, "short date")

If CDate(strHora1) > CDate(strHora2) Then

HoraMayor = vstrHora1
Else
HoraMayor = vstrHora2
End If
End Function