Вы находитесь на странице: 1из 16

Con Acentos

Mdulo para realiza bsquedas con independencia de la acentuacin. Lo mismo encuentra Fernndez que
Fernandez. Llamando a la funcin desde una macro de teclado funciona en cualquier formulario,
subformulario u hoja de datos. Puedes usarlo como una librera, registrndolo en "Referencias", o importar
mdulo y macro.
Tambin, para los que no se limitan a Access y trabajan con Visual Basic, aado un mdulo .bas que se
puede incluir en cualquier proyecto y que funciona con una simple llamada a una funcin. En la pgina de
Acervo Visual Basic comentan este mdulo y le aaden mejoras.

Instalacin
La forma ms sencilla de usarlo es marcarlo como "Referencia" en el diseo del Mdulo, en el Men
"Herramientas".
A partir de ese momento, podemos llamar desde donde queramos a la funcion busca(repite), donde repite
tiene valor verdadero o falso, indicando si es nueva bsqueda (true) o repetimos la anterior (false)
Si importamos desde "Conacentos" la macro "AsignarTeclas" las teclas de funcin F3 y Maysculas+F3 se
encargarn de llamar a la funcin busca(0) y busca(-1) con slo pulsarlas en cualquier formulario,
subformulario u hoja de datos.

Cdigo comentado
Comentaremos slo las funciones ms interesantes.
Se plantean las siguientes cuestiones:
Cmo hacer que Access busque texto con independencia de los acentos.
Cmo saber en qu campo tenemos que buscar.
Como saber si nos encontramos en un formulario, subformulario u hoja de
datos.

Cmo hacer que Access busque texto con independencia de los acentos.
Es fcil, utilizamos el operador Like con corchetes "[]".
La siguiente funcin sustituye cualquier cadena de texto por otra donde hemos sustituido cada vocal por
unos corchetes con las distintas posibilidades de acentuacin de esa vocal. Por ejemplo "o" lo sustituimos
por "o0"; ntese que tambin hemos metido el cero, que suele confundirse, de manera que lo mismo
podramos hacer con cualquier letra con cualquier posible confusin.
Function Buscaacent(X)
Dim i As Variant, A As Integer, l As Integer, busc As Variant
Static letras(5) As Variant
l = Len(X)
busc = X
A = 1
letras(1) = "A"
letras(2) = "E"
letras(3) = "I"
letras(4) = "O0"
letras(5) = "U"
While A <= l
letra = Mid(busc, A, 1)
For Each i In letras
vocal = InStr(1, i, letra, 1)
If vocal > 0 Then
nuevaletra = "[" & i & "]"
busc = Left(busc, A - 1) & nuevaletra &
Right(busc, l_ - A)

A = A + 1 + Len(i)
l = l + 1 + Len(i)
Exit For
End If
Next
A = A + 1
Wend
If busc = "" Then
Buscaacent = X
Else
Buscaacent = busc
End If
' J.Bengoechea
End Function

Cmo saber en qu campo tenemos que buscar.


En formularios y subformularios usaremos Screen.ActiveControl.Name para saber el nombre del campo,
pero luego, para referirnos a l tendremos que hacerlo dentro de un Form o SubForm y necesitamos saber
cuales son.
En una hoja de datos el nombre del campo lo sabremos con
Screen.ActiveDatasheet.Form.ActiveControl.Name, pero debemos cerciorarnos primero de que hay un
Datasheet abierto o nos dar un error.
La funcin Fbusca localiza si estamos en un Datasheet, un formulario o un subformulario y realiza distintas
acciones dependiendo de ello para buscar el en RecordsetClone correspondiente y situarnos en el registro
correspondiente. No la incluimos aqu porque hace llamadas a otras funciones y, por eso, es ms fcil de
seguir en la misma base de datos.

Cmo saber si nos encontramos en un formulario, subformulario u hoja


de datos.
Lo de la hoja de datos es fcil, la funcin AbiertoDatasheet trata de abrir un objeto en el
Screen.ActiveDatasheet y si da un error es que no hay hoja de datos abierta.
Public Function AbiertoDatasheet () As Boolean
On Error GoTo ErrAbierto
AbiertoDatasheet = False
Dim Ff As Form
Set Ff = Screen.ActiveDatasheet.Form
AbiertoDatasheet = True
Exit Function
ErrAbierto:
Resume adis
adis:
End Function
Screen.Activeform.name nos da el nombre del formulario activo, pero si estamos buscando en un
Subformulario, el formulario activo sigue siendo el principal. Debemos, pues, averiguar en primer lugar si
estamos en un subformulario y, en tal caso, el nombre del objeto que lo contiene.
El procedimiento SubFrmActivo asciende desde el control activo buscando el .parent hasta encontrar uno
que sea tipo formulario o subformulario y si es subformulario devuelve el nombre de ste y el del control
que lo contiene.
Sub SubFrmActivo(Subf, cont)
Dim micontrol As Control, vale As Boolean, Ctrl As Control, miform As String
vale = False
miform = Screen.ActiveForm.Name
Set micontrol = Screen.ActiveControl
Set Ctrl = Screen.ActiveControl
While Not vale
If EsFrmAbierto(micontrol.Parent.Name) Then
vale = True
Else

If Left(UCase(TypeName(micontrol.Parent)), 4) =
"FORM_" Or
Left(UCase(TypeName(micontrol.Parent)), 5) =
"IFORM" Then
'ES un subformulario
Subf = micontrol.Parent.Name
vale = True
Else
Set micontrol = micontrol.Parent
End If
End If
Wend
'Despus de que hemos comprobado si el control activo est 'en un
subformulario, recorremos el formulario principal 'buscando el control que
contiene el subformulario
If Subf <> "" Then
For Each Ctrl In Forms(miform).Controls
If TypeName(Ctrl) = "SubForm" Then
If Ctrl.SourceObject = Subf
Then
Subf = Ctrl.Name
Exit For
End If
End If
Next
End If
cont = micontrol.Name
' J.Bengoechea
End Sub

Administrador de Informes

Aplicacin muy sencilla que permite tener todos los informes que se quieran en un solo formulario,
ordenado por temas, con comentarios, etc. Es un archivo MDB desde el que se deben importar todos los
objetos

Instalacin
No tiene instalacin. Debes importar todos sus objetos desde de base de datos en que lo quieras instalar.
Consta de dos formularios, el primero llamado "Reports" es el que se usar habitualmente para abrir los
informes. En la cabecera tiene un campo, que es donde debes introducir el tema por el que se agrupan los
informes, y las teclas de desplazamientos por registros. En el detalle del formulario nos encontramos con la
lista de los informes correspondientes a cada tema y unos campos que nos muestran para cada informe el
nombre, la descripcin y si necesita que haya una formulario abierto; finalmente, en el pie tenemos los
botones de "vista previa", "imprimir" y "salir"
El segundo formulario se llama "Aadir Informe" y sirve para rellenar la lista de informes del tema
seleccionado en el formulario "Reports", por eso le abrimos desde el formulario "Reports" pulsando el botn
con icono que hay a la derecha de la lista. "Aadir informe" muestra una lista con todos los informes que
tenemos en la base de datos, podemos irlos seleccionando, describiendo qu hacen y sealando si
necesitan un formulario abierto, y si queremos que lo abra, finalmente, pulsando la tecla "aadir" lo
aadimos a la lista del formulario "Reports" del registro desde el que hemos hecho la llamada.
Si pruebas esta utilidad con una base en blanco difcilmente encontrars como funciona, es cuando tienes
informes hechos cuando le encuentras utilidad. Al abrir el formulario "Reports" por primera vez estar todo
en blanco, mientras que "aadir informes" te mostrar los informes que hayas hecho.
Esta utilidad est pensada para utilizarla de dos maneras, la primera, la ms comn, para llamarla desde el
men principal o panel de control y que el usuario tenga a su disposicin todos los informes bien ordenados
por temas y con su descripcin y, la segunda, para ser llamada desde un formulario de manera que slo
muestre el tema que corresponde a ese formulario.
Cuando se trata de una aplicacin cerrada para un cliente es preferible bloquear el campo tema y ocultar
los botones de desplazamiento de registro y el que hace la llamada a "aadir informes". Basta con
cambiarles la propiedad visible a false. Nos evitamos as que un cliente inexperto nos descomponga todo,
pero fcilmente podemos recuperar para nosotros la operatividad si queremos aadir ms informes.

Cdigo comentado
El cdigo no tiene nada de especial.
Puede ser interesante comentar cmo se obtiene una lista que no est basada en ninguna tabla o consulta,
como es el caso de la lista de todos los informes o la de todos los formularios de la base de datos, aunque
no es nada original, est fusilado creo recordar que de Neptuno.mdb
Para la gente que est empezando, tambin puede ser interesante mostrar cmo se pueden obtener otros
campos a partir de la seleccin de la lista usando la propiedad column.

Cmo se obtiene una lista que no est basada en ninguna tabla o consulta.
Ojo! sta no es la mejor manera de obtener una lista de los formularios de la base de datos. En su
momento lo hice as y el ejemplo puede valer para otras cosas pero la forma ms rpida de obtener la lista
de Forms es con una consulta basada en la tabla MsysObjects seleccionando el campo "name" y poniendo
como condicin que "type" es igual a -32768 (con signo menos delante)

No fijaremos en el combobox "Formulario" del formulario "Aade_informe".


Debemos poner en la propiedad "tipo de origen de la fila" el nombre de una funcin que debemos crear, en
este caso la llamamos "ListaForms".
A continuacin creamos la funcin:
Private Function Listaforms(campo As Control, ID As Long, fila As Long, Col As
Long, cdigo As Integer)
Static lsforms(127), Entradas
Dim ValRetorno
ValRetorno = Nulo
Select Case cdigo
Case LB_INITIALIZE 'Inicializar.
Dim midb As Database, micontenedor As Container
Set midb = CurrentDb()
Set micontenedor = midb.Containers("Forms")
Entradas = micontenedor.Documents.Count
For zx = 0 To Entradas - 1
lsforms(zx) = micontenedor.Documents(zx).Name
Next zx
ValRetorno = Entradas
Case LB_OPEN 'Abrir.
ValRetorno = Timer 'ID nico para control.
Case LB_GETROWCOUNT 'Nmero de filas.
ValRetorno = Entradas
Case LB_GETCOLUMNCOUNT 'Nmero de columnas.
ValRetorno = 1
Case LB_GETCOLUMNWIDTH 'Anchura de columna.
ValRetorno = -1 'Usar la anchura predeterminada.
Case LB_GETVALUE 'Obtener los datos.
ValRetorno = lsforms(fila)
Case LB_END 'Terminar
For Entradas = 0 To 127
lsforms(Entradas) = ""
Next
End Select
Listaforms = ValRetorno
End Function
La funcin debe llevar forzosamente siempre esos parmetros.
Access ir llamando a esta funcin para obtener distintos valores a medida que los va necesitando, el valor
resultante depender del parmetro que pasa como "cdigo" y que se analizan en la funcin mediante una
estructura "select case". Esta estructura debe permanecer inamovible, lo mismo que el nombre de las
constantes LB_... de cada case; donde debemos intervenir es en los valores asignados a la variable
ValRetorno en cada case, especialmente con LB_INITIALIZE y con LB_GETVALUE.
Con LB_INITIALIZE debemos rellenar los valores que se van a mostrar en la lista y proporcionar una
variable con el nmero de elementos que va a contener. En este caso, utilizamos la coleccin "documents",
de la coleccin "containers" para rellenar una matriz (lsforms) con los nombres de los formularios de
nuestra base de datos.
Con LB_GETVALUE debemos asigna el valor que va a tener el control combobox. Si la lista se corresponde
con una matriz, normalmente ser el valor de la matriz para el ndice "fila" (lsforms(fila)).
En el resto de los "case" normalmente no debers intervenir, salvo en LB_END.
En este caso hemos utilizado una lista que no se modifica mientras est abierta, sin embargo, a veces nos
puede interesar ir cambiando los valores, por ejemplo, podramos ir pasando los formularios seleccionados
a otra lista. En ese caso, la funcin seguira prcticamente igual, pero la matriz con los valores la

definiramos a nivel de mdulo y los valores los iramos modificando desde fuera de la funcin y dentro de
la funcin deberamos controlar la variable "Entradas".

Cmo se pueden obtener otros campos a partir de la seleccin de la lista


usando la propiedad column.
Es una pregunta muy comn en las News, cmo obtener el valor de otros campos del mismo registro a
partir de un campos seleccionado en una lista, y es un error bastante comn en principiantes recurrir a
soluciones tipo dlookup etc.
El formulario "Reports" en modo diseo es bastante explcito: a simple vista se aprecia que la propiedad
"origen del control" es en varios controles "=[campo0].[Columna](0)", "=[campo0].[Columna](1)"... .
[Campo0] es la lista, pero de dnde sacamos los valores de las distintas columnas?. En la propiedad
origen de la fila hemos puesto una consulta con siete campos de salida, cada uno de ellos es una columna,
empezando la numeracin desde cero. Aunque slo mostremos una columna en la lista los valores de las
dems columnas estn disponibles.

Kal
Calendario emergente. Permite insertar una fecha con un simple doble-click. Lleva en una tabla el registro
de los festivos. Suma y resta fechas y convierte la diferencia en aos-meses-das. Se le llama con una
simple orden (kalendar) desde cualquier control o desde un men contextual que puedes importar.
Como daba algunos errores al pasarlo a la versin 2000, aado un MDB ya pasado

Instalacin
La forma ms sencilla de usarlo es marcarlo como "Referencia" en el diseo del Mdulo, en el Men
"Herramientas".
A partir de ese momento, podemos abrir el formulario desde cualquier control simplemente escribiendo
Kalendar en un procedimiento de evento.
Es interesante importar desde "kal.mdb" a la aplicacin en que queramos usarlo el men contextual
"ConKalendar".
Para ello, en el men principal de la base de datos seleccione Archivo - Obtener datos externos - Importar;
busque la ubicacin del archivo "kal.mdb". "kal2.mdb" o "kal.mde" y seleccinelo; se abrir una caja de
dilogo con los distintos tipos de objeto para importar; busque abajo a la derecha el botn "Opciones";

plselo y la caja mostrar en la parte de abajo nuevas opciones; marque "Mens y Barras de Herramientas"
y pulse el botn aceptar.
El men contextual "Conkalendar" es un men contextual de edicin al que se han aadido las opciones
"Hoy" y "Seleccione fecha", la primera inserta directamente la fecha actual en el control activo y la segunda
muestra el calendario donde elegir, con un doble-click, la fecha que queramos.
En el modo diseo del formulario, en las propiedades de cualquier control de texto o fecha, podemos
seleccionar en "men contextual" "ConKalendar", as en el modo vista del formulario tendremos disponible
este men con slo pulsar el botn derecho del ratn sobre el control.
Si queremos llamar a Kalendar desde una macro podemos usar la funcin Fkalendar() que hace lo mismo
que el procedimiento Kalendar.
Ya s que existe un control Calendario de Microsoft, y que existen OCX que hacen lo mismo que este
programilla de manera ms elegante, pero, quizs con las mquinas actuales no se note, el mo es ms
rpido; lo cre porque al pasarme a la versin 2.0 de Access, mi 486 con sus 4 megas de memoria no
poda con el Calendar de Microsoft; por otro lado, tienes el cdigo abierto: el control sobre todo lo que
puede hacer est en tus manos.
Si lo publico aqu es porque pienso que hay partes que pueden resultar interesantes, incluso con otros
calendarios.

Cdigo comentado
Prefiero no poner aqu ningn ejemplo del cdigo. Aunque he renovado algunas cosas o incorporado otras
nuevas, la mayor parte del cdigo est escrita hace varios aos para una versin ms antigua de Access y
en unos momentos en que yo an estaba inicindome en este lenguaje.
Funciona. Pero habr cosas que, seguramente pueden hacerse de forma ms elegante, o ms breve, o
ms eficaz; no quiero ponerlo como ejemplo de cmo se hacen las cosas.

P.D. Un colega nos escribe para decir que echa en falta una funcin que aada das hbiles a una fecha; es
decir, sin contar domingos ni festivos. As que me he puesto manos a la obra y aqu est:
Public Function SumaHbiles(fecha As Date, das) As Date
Dim i As Long, TempFecha As Date
Dim midb As Database, mirecord As Recordset
Set midb = CodeDb() 'Ojo, si trabajaramos en la misma base de datos sera
currentdb()
Set mirecord = midb.OpenRecordset("festivos", DB_OPEN_TABLE)
mirecord.Index = "PrimaryKey"
TempFecha = fecha
For i = 1 To das
TempFecha = TempFecha + 1
If WeekDay(TempFecha, vbMonday) = 7 Then ' es domingo
i = i - 1 'Quitamos 1 al contador
Else
mirecord.Seek "=", TempFecha
If Not mirecord.NoMatch Then ' es fiesta
i = i - 1 'Quitamos 1 al contador
End If
End If
Next i
mirecord.Close
set mirecord= nothing
midb.Close
SumaHbiles = TempFecha

End Function
La funcin la he incorporado a kalendar ya que es ah donde se guardan los festivos. Para anotar un festivo
en el kalendario basta con pulsar el botn derecho sobre la fecha deseada.

Descarga
Descargar archivo .MDB
Descargar archivo .MDE
Descargar .MDB v.2000
Descargar Versin 2

Nuevo
En principio, Kalendar estaba pensado para usar como calculadora de fechas:
sumbamos y restbamos fechas y nos daba el resultado en das-meses-aos. Sin
embargo, con el tiempo resulta que la inmensa mayora de las veces se le usa como
simple calendario, por tanto se imponen tres cambios: reducir tamao quitando las
opciones para clculo, sustituir el doble-clic por un simple clic para seleccionar la fecha y
posicionar el kalendario justo debajo del control que le llama. Este ltimo cambio exige un
poco de trabajo a nivel de cdigo que creo haber solucionado, aunque agradecera
comentarios. Si prefieres esta versin, bjatela: Descargar Versin 2

Listaprv (Shareware)
Es algo distinto. Si alguna vez te has visto, o has visto al usuario de tus aplicaciones, copiando en un papel
nombres de un listado o de un formulario, entonces lo necesitas.
Con una simple orden llamas a un pop-up que se autoinstala y al que puedes ir aadiendo campos desde el
formulario activo con el que interacta. Puedes aadir o quitar de uno en uno o todos a la vez, o quitar los
que coinciden con el formulario o los que no coinciden, o usarlo como filtro del formulario. Con los datos
trabajados puedes ir a otro formulario (incluso de otra base de datos) con el que aadir, quitar , filtrar...
Es la solucin a los filtros complejos: desde filtros sencillos vas aadiendo o quitando y, finalmente, usas el
resultado como filtro.
Durante un tiempo pretend que fuera shareware y le puse fecha de caducidad; ahora he desistido de ello y
ya no caduca.

Instalacin
La forma de usarlo es marcarlo como "Referencia" en el diseo del Mdulo, en el Men "Herramientas".
A partir de ese momento, podemos llamar desde cualquier otro procedimiento, por ejemplo, desde un
botn, al procedimiento listaprv simplemente escribiendo en el procedimiento de evento Listaprv.
La primera vez que lo llamamos desde una base de datos se inicia un asistente para inicializarlo, lo mismo

ocurrir con cada formulario la primera vez que sea llamado. Listaprv.mde almacena toda la informacin
necesaria de cada base de datos y cada formulario y de las listas que se usen. En la base de datos activa
la nica modificacin que realiza es vincular una tabla llamada listaprv para que el desarrollador pueda
disponer de ella como origen de listados, de consultas, etc.; puedes usarla sin temor pues no modifica nada
ms tu base de datos.

Introduccin
Determinadas aplicaciones tienen una tabla especialmente protagonista, si es de personal ser empleados,
si es de marketing ser el cliente... la mayora del resto de las tablas hacen referencia a esa protagonista y
el usuario constantemente trabaja informacin de ese sujeto desde distintos ngulos.
Imagnate una promocin muy especial donde se va a hacer un regalo caro a una serie de clientes y se
quiere afinar mucho para que al final salga rentable: deberas seleccionar determinado grupo de edad y de
nivel de estudios, pues son los que pueden estar interesados en el producto, pero tambin los que han
comprado un producto anterior porque ste es su complemento ideal, eso s excluyendo los que han tenido
problemas con los pagos, adems aadimos a todos los clientes de la agencia X porque es la que mejor
ndice de ventas tiene, a la mujer y a las amigas del jefe, que se apuntan a todos los regalos y a fulanita,
que me la quiero ligar.
Parece exagerado, pero hay muchas aplicaciones con las que se debe trabajar as. Un usuario normal es
incapaz de hacer un filtro semejante con tantas tablas, algunas quizs en distintas bases porque las trabaja

otro departamento; si son pocos los registros a seleccionar ir formulario a formulario aplicando filtros, los
que t le hayas puesto en la aplicacin, y apuntando y tachando nombres en un papel.
Ese papel, esa lista donde vas quitando y poniendo nombres es precisamente esta aplicacin, pero todo se
hace automticamente
Vas al formulario clientes haces un filtro por formulario y seleccionas los de determinada edad y nivel de
estudios, abres listaprv y pulsas el botn aadir todo, te pasas al formulario ventas por productos que tiene
un subformulario donde figura la fecha y el cliente, seleccionas el producto que queras, abres listaprv y
pulsas el botn aadir todo, te pasas al formulario agencias, quizs en otra base de datos, con su
subformulario clientes, seleccionas la agencia X, abres listaprv y pulsas el botn aadir todo, en pagos,
filtras los clientes problemticos, abres listaprv y pulsas el botn "quitar segn" y dejas slo los que no te
coincidan con ese formulario, finalmente, en clientes buscas a la mujer del jefe, a sus amigas y a fulanita y,
una por una, las metes en la lista. Aunque sean miles de registros, apenas has tardado unos minutos.
La lista resultante puede ser el filtro de cualquier otro formulario, simplemente llamando a listaprv y
pulsando "usar como filtro", pero tambin puede intervenir en cualquier consulta, pues, al inicializarla en la
base de datos activa, el asistente ha vinculado la tabla listaprv y est disponible. Es una herramienta
pensada para que el programador desarrolle otras cosas a partir de ella.

Llamadas a procedimientos
Listaprv tiene tres procedimientos pblicos y una funcin pblica:

Sub Listaprv: abre el formulario listaprv si es la primera vez que lo hace, abre un asistente de inicializacin.
Sub Listaprv_BorraForm("Nombre del formulario"): Borra las referencias en Listaprv.mde al formulario de la
base de datos activa que se indique. Est pensado para eliminar referencias que se hayan inicializado
errneamente.
Sub Listaprv_BorraBase ("Nombre de la base"): "): Borra las referencias en Listaprv.mde a la base de datos
que se indique y de todos los formularios de sta; si "Nombre de la base" es nulo, borra las referencias a la
base de datos activa. Tambin est pensado para eliminar referencias que se hayan inicializado
errneamente.
Function macroprv(). Est pensada para ser llamada desde una macro de teclado. Se puede importar
desde Listaprv.mde una macro de teclado que la llama. Si no est abierto el formulario Listaprv, lo abre, le
pasa el foco, le aade un elemento desde el formulario activo y devuelve el foco al campo del formulario
activo que lo tena antes. En combinacin con una macro de teclado (p.ej. Mays+F9) puedes ir buscando
en un formulario y, cada vez que pulse Mays+F9, aades a la lista el cliente por el que vayas y vuelves al
control en el que estabas.

Funcionamiento
El funcionamiento interno de Listaprv es fcil de entender:
Para cada base de datos nueva pregunta en que tabla se van a basar los datos y la vincula, luego pregunta
cul es el identificador nico de esa tabla y, a partir de l, crea una tabla llamada listaprv (listaprv1,
listaprv2... segn corresponda) con un nico campo idntico al identificador nico: esa es la verdadera lista
donde se van a ir aadiendo y quitando datos.

Pregunta tambin qu otros campos se quieren mostrar en la ventana de la lista y almacena sus nombres.
Toda la informacin que va pidiendo la va almacenando en un registro para cada base de datos.
Cuando llamamos a Listaprv desde un formulario, es necesario saber cul es el nombre del campo
identificador nico con el que va a trabajar la lista, y si se trata de un formulario o de un subformulario. Por
eso necesita inicializar cada formulario y almacenar esa informacin en un registro para cada formulario,
vinculado al registro de base de datos.
Como cada base de datos est identificada por el nombre, si trabajamos con una copia con otro nombre,
Listaprv no la reconocer y abrir el asistente de inicializacin, sin embargo, no es necesario repetir todo el
proceso: el asistente nos muestra una lista con todas las bases que tiene registradas, seleccionamos la
original y la opcin "Copiar todas las especificaciones" y se copiarn automticamente todas las
especificaciones de la base y de cada formulario.
A veces distintas bases de datos tratan el mismo tema y por eso queremos compartir la misma Lista; si en
la inicializacin elegimos una base ya registrado y seleccionamos "Copiar las Especificaciones Generales",
ambas bases compartirn la misma lista y lo que se aada o quite en una as quedar en la otra y
viceversa.
ListaPrv funciona perfectamente en red, incluso es aqu donde se puede obtener un mayor provecho de
ella, sin embargo es necesario realizar algunos ajustes. Si quieres usarla en red, escrbeme.

Descarga
Descargar archivo .MDE
J.Bengoechea, 2 de septiembre de 1999

Listaprv es una herramienta con la que llevo trabajando aos. Para m es muy til y muy fcil de usar, estoy
seguro que a cualquiera que entienda su manejo le resultar tambin til y fcil. Sin embargo, no s si s
explicar en qu consiste y cmo es el manejo de algo que, por ser para m tan familiar, no conozco sus
pegas. Si la probis, agradecera que me escribierais con vuestra opinin sobre la herramienta y con las
dificultades que habis encontrado para entenderme. Gracias.

Establecer el nmero de copias impresas de un Informe en el diseo


Propiedades como la orientacin del papel o la calidad de impresin de un informe resultan fciles de
guardar junto con ste si las modificamos antes de guardar cambios en el modo diseo; sin embargo, no
ocurre lo mismo con el nmero de copias impresas. Habitualmente, se recurre al expediente de repetir la
orden doCmd Openreport tantas veces como copias queramos, sin embargo puede suceder, y as le
suceda nuestro colega Gabriel, que nos plante este tema, que se sature la memoria y se nos cuelgue el
ordenador.

La solucin ms elegante est en el manejo de la propiedad PrtDevMode que slo puede hacerse desde el
cdigo. La ayuda de Access nos ha facilitado el camino para que, sin apenas modificaciones, nos valiera
uno de sus ejemplos para ello. Ojo, utilizar esta propiedad para intentar modificar otras cosas puede ser
peligroso!, yo ya me he cargado un par de informes en las pruebas.
La propiedad PrtdevMode es una cadena de 94 bytes donde se almacena distinta informacin sobre la
impresin del informe: impresora, calidad, tamao del papel, nmero de copias... la posicin de esa
informacin dentro de la cadena est definida por la estructura Type que se declara en el cdigo de ms
abajo. Sin embargo, la ayuda de Access es muy insuficiente para este tema y manejar alguna de estas
propiedades me ha dado serios problema: prometo que cuando los tenga solucionados colocar en la Web

un form con la solucin completa, entretanto nos conformamos con en nmero de copias y, por si acaso,
mejor trabajar primero sobre una copia del report.
Lo mejor que he encontrado acerca de este tema est en:
http://www.mvps.org/access/reports/rpt0009.htm
http://www.mcwtech.com/downloads.htm http://www.microsoft.com/AccessDev/Articles/GetzCh10.HTM

Para modificar el nmero de copias de un informe debes copiar el siguiente cdigo en un mdulo y, luego,
llamar a la funcin (rptNombre As String, copias As Integer), bien desde la ventana de depuracin o bien
desde una macro o un formulario al efecto. La funcin abre el informe que le indiquemos en rptNombre en
modo diseo y le pone el nmero de copias que le digamos en la variable copias; luego debes cerrar el
informe a mano ( o le aades el cdigo para que lo haga la funcin) guardando los cambios. Cuando hayas
modificado todos los informes que quieras ya puedes eliminar el mdulo en la base de datos pues slo es
necesario en la fase de diseo. No olvides que las estructuras Type deben declararse a nivel de mdulo.

Type cad_DEVMODE
RGB As String * 94
End Type
Type type_DEVMODE
cadNombreDispositivo As String * 16
entVersinEspec As Integer
entVersinControlador As Integer
entTamao As Integer
entControladorExtra As Integer
lngCampos As Long
entOrientacin As Integer
entTamaoPapel As Integer
entLongitudPapel As Integer
entAnchoPapel As Integer
entEscala As Integer
entCopias As Integer
entOrigenPredeterminado As Integer
entCalidadDeImpresin As Integer
entColor As Integer
entDplex As Integer

entResolucin As Integer
entOpcinTT As Integer
entIntercalar As Integer
cadNombreFormulario As String * 16
lngRelleno As Long
lngBits As Long
lngPW As Long
lngPH As Long
lngDFI As Long
lngDFr As Long
End Type
Function ConCopias(rptNombre As String, copias As Integer) as Boolean
Dim DevString As cad_DEVMODE
Dim DM As type_DEVMODE
Dim cadModoDispositivoExterno As String
Dim rpt As Report
' Abre el informe en la vista Diseo.
DoCmd.OpenReport rptNombre, acDesign
Set rpt = Reports(rptNombre)
If Not IsNull(rpt.PrtDevMode) Then
cadModoDispositivoExterno = rpt.PrtDevMode ' Obtiene la estructura DEVMODE
actual.
DevString.RGB = cadModoDispositivoExterno
LSet DM = DevString
'cambiamos aqu los campos del registo que queramos
DM.entCopias = copias
LSet DevString = DM ' Actualiza la propiedad.
Mid(cadModoDispositivoExterno, 1, 94) = DevString.RGB
rpt.PrtDevMode = cadModoDispositivoExterno
End If

End Function

LneasRpt
En los informes de Access las lneas del detalle finalizan en el ltimo registro, quedando el resto de la
seccin en blanco. En muchas ocasiones, por simple esttica o porque queremos ajustarnos a la forma de
un formulario impreso, queremos que la ltima pgina tenga exactamente el mismo nmero de lneas que
las dems, completando con lneas en blanco las que falten a partir del ltimo registro.

Entrefechas
Clase para manejar dos cuadros de texto de fecha y obtener un texto equivalente con el que poder filtrar
entre dos fechas cualquier tabla, consulta, formulario o informe

Euros
Ya sabemos que Access 2000 existe la funcin Round(), pero en Access 97 no es as; adems Round() a
veces no redondea como nosotros queremos.
Redondear, EurosaPesetas y PesetasaEuros, tres magnficas funciones para trabajar con euros que remiti
Eduardo Olaz eduardo@olaz.net desde la calle Estafeta de Pamplona a los grupos de noticias sobre
Access y que ahora, con su permiso, publicamos aqu.
Por si se produce algn error al copiar y pegar, adems, puedes bajrtelas en un zip.
Public Function EurosAPesetas(cantidad As Currency) As Currency
Const concurPesetasEuro As Currency = 166.386
Dim curEuros As Currency
curEuros = concurPesetasEuro * cantidad
EurosAPesetas = Redondear(curEuros)
End Function
Public Function PesetasAEuros(cantidad As Currency) As Currency
Const concurPesetasEuro As Currency = 166.386
Dim curPesetas As Currency
curPesetas = cantidad / concurPesetasEuro
PesetasAEuros = Redondear(curPesetas, 2)

End Function
Public Function Redondear(ByVal Valor As Currency, _
Optional NumeroDecimales As Long = 0) _
As Currency
' Esta funcin emula a la funcin Round() de VBA
On Error GoTo errorEnProcedimiento
Dim lngDivisor As Long
Dim curParteDecimal As Currency
Dim curParteEntera As Currency
Select Case NumeroDecimales
Case Is > 4
Redondear = Valor
Case 0 To 4
curParteEntera = Fix(Valor)
curParteDecimal = Valor - curParteEntera
lngDivisor = 10 ^ NumeroDecimales
curParteDecimal = curParteDecimal * lngDivisor
curParteDecimal = CInt(curParteDecimal)
curParteDecimal = curParteDecimal / lngDivisor
Redondear = curParteEntera + curParteDecimal
Case Else
Redondear = Valor
Err.Raise 5, _
" Funcin Redondear", _
Error(5) _
& vbCrLf & vbCrLf _
& "(No tiene sentido un nmero negativo de decimales)"
End Select
Salir:
Exit Function
errorEnProcedimiento:
MsgBox "Se ha producido el error N " _
& Err.Number _
& vbCrLf _
& Err.Description _
, vbCritical, _
"Error en funcin Redondear"
Resume Salir
(c) Eduardo Olaz
End Function

Combos
Una pequeo archivo MDB con ejemplos de utilizacin de Cuadros Combinados, pensados en su mayora
para principiantes aunque alguno de ellos puede resultar interesante a los expertos. Las explicaciones son

mnimas (mi intencin es desarrollar este tema algn da), pero muchos de los ejemplos se entienden
fcilmente y, adems, se pueden usar directamente copiando y pegando.

QuitaShift
Es un MDB para cambiar slo la propiedad AllowByPassKey, es decir, para poder saltarse el inicio
pulsando Maysculas. Es el embrin de la aplicacin "Propiedades". Si te fijas en el cdigo, casi nada es
mo.

necesito saber como crear distintas contraseas para distintos usuarios , o sea, que cada
persona entre al programa con distinta contrasea
Necesitas asegurar la BD a nivel de usuario. Hasta que uno entiende como funciona resulta
bastante arduo, pero una vez conoces el mecanismo, el esfuerzo ha merecido la pena.
La ayuda de Access al respecto es lo ms completo que conozco, pero la informacin no
siempre se consigue bien estructurada. Mi consejo es que empieces probando con una copia y
utilizando el "asistente para seguridad por usuarios" que puedes encontrar en el men
Herramientas->Seguridad. Sigue paso a paso todas las indicaciones y vete mirando
continuamenta la ayuda.

Вам также может понравиться