Funciones DPrim (DFirst), DÚltimo (DLast) - Access

A ver si me pueden ayudar por favor.

Tengo una consulta llamada Ingresos con los campos de: Numero de pedido y Fecha del pedido.

En la Fecha del pedido tengo el Criterio de: Entre [Fecha1 (FechaInicial dd/mm/aaaa)] Y [Fecha2 (FechaFinal dd/mm/aaaa)]    para que me devuelva mis resultados en el periodo que le indico.

Eso lo muestro en un Informe Ingresos correctamente.

En ese informe he creado tres Cuadros de Texto para que me muestren: el Conteo de registros, el Numero de pedido (NumeroInicial) y el Numero de pedido (NumerFinal) de ese periodo consultado.

En cuanto al conteo no tengo ningún problema.

Pero cuando quiero usar las funciones de DPrim y de DÚltimo que quiero poner en el Origen de control del cuadro de texto siempre meda error.

Me puede ayudar a poner correctamente el criterio que debo utilizar y también saber si lo puedo poner en el Origen de control como puse el del conteo?

1 Respuesta

Respuesta
1

Creo que el problema no va a estar tanto en el criterio de búsqueda como en la función a utilizar.

El caso es que las funciones Dfirst y Dlast nos van a obligar a tener la base de datos clasificada según el orden en que queramos encontrar el primer registro y el ultimo en la serie de valores.

Para evitar esta no clasificación de la BBDD yo te recomendaría utilizar las funciones DMin y Dmax para encontrar el valor mínimo ( o más pequeño) y máximo (o mayor) dentro de la BBDD sin tener en cuenta su clasificación.

Si no te funcionara con estas funciones, puedes mandarme el tozo de código donde las incluyes para poder averiguar donde podría estar el error.

Gracias por tu respuesta,

¿pero si estoy bien en ponerlo en el Origen de control del campo de Texto de mi informe o lo tengo que hacer por código en Visual?

lo que he puesto para el NumeroInical es: =DPrim([Numero de pedido],"Ingresos","[Fecha1 (FechaInicial dd/mm/aaaa)]=[Numero de pedido]")

Igual para el Numerofinal pero con Fecha2 claro.

Yo suelo asignar los valores a los campos a través de vba pero no hay problema en poner directamente la fórmula en el control como origen de datos.

No obstante, no acabo de ver clara tu función para encontrar el numero de pedido más bajo o más alto ya que en la condición del dprim estas mezclando un campo fecha con el numero de pedido y eso no te va a dar ningún resultado.

Desconozco como están creadas tus tablas pero, según lo que has ido explicando, creo que la función debería ser:

dmin("[numero de pedido]","ingresos","[fecha del pedido]>=" & fecha1 & " and [fecha del pedido]<=" & fecha2)

De esta forma te localiza el [numero de pedido] más pequeño comprendido entre [fecha1] y [fecha2]. Luego basta cambiar dmin por dmax para encontrar en [numero de pedido] más alto.

Ya me dirás si te ha funcionado.

¡Gracias! Daniel por dedicarme parte de tu tiempo; al final lo hice más simple, la verdad es que  estaba obcecado en las funciones.
Lo puse de esta manera:

=Mín([Numero de pedido])

=Máx([Numero de pedido])
Gracias.

Hola Daniel, no sé si me podrás ayudar con esto:

quisiera saber si se puede crear una Tabla temporal para poder ingresar los datos de otra tabla original, y una vez capturados los datos de los campos darle la función de copiar y pegar a la Tabla original. Esto es porque es para descontar del inventario unos artículos. Y si lo hago desde la tabla original y sin querer cometo el error de darle un clic en cualquier campo de la tabla original, me descuenta automáticamente la cantidad que tenga puesta sin esperar a la función de guardar.

O si me pueden decir si hay otra alternativa de bloqueo o retención de datos para ir capturando los datos en mi Subformulario (hoja de datos) y que le pueda indicar que cuando ya haya terminado todas mis capturas pueda darla opción de proceder a descontar del inventario.

Tengo la Tabla de Catálogo de Artículos que relaciona la tabla de Artículos de los pedidos y la del InventarioAlmacenes

De antemano te agradezco.

Si puedes tener una tabla temporal sobre la que trabajar un registro y luego volcarlo sobre tu tabla original. Lo que creo es que hacerlo así te va a dar más dolores de cabeza que soluciones.

No acabo de entender tu planteamiento de control de stock. Entiendo que tienes un formulario en que cada registro es un articulo y tienes un subformulario donde introduces las lineas de movimientos de stock.

Si esto es así, bastaría con poner un botón al pie de tu subformulario para realizar la regulación de stock en el momento que deseas con una programación algo parecida a esta:

forms.pantallaproductos.cantidadstock=dsum("cantidadmovimiento","tablamovimientosstock","idproducto=" & me.idproducto)

De esta forma sólo actualizas los valores en el momento que tu deseas. Eso si, tendrás que poner algun tipo de control para que los movimientos siempre queden reflejados en el stock. Tendrías que programar un evento al salir, por ejemplo, que te dijera que has de actualizar el stock o lo hiciera automáticamente.

Gracias Daniel por tu respuesta y tu tiempo. ya encontré mi error con ese problemilla, era todo cambiar el Evento que lo tenía "al salir" del Subformulario. Lo cambié y ya no me da ese problema, de echo lo puse en el LostFocus del PagoInicial1 que es el procedimiento de abajo. Pero no me está trabajando bien en cuanto a mandarme el mensaje de Msgbox que ya no hay existencias en el Inventario. La descarga no tengo problema si me la hace correctamente de cada Almacen, pero es el Msgbox el que no trabaja bien, porque cuando no tengo existencias o ya están en negativo con (-), a veces me aparece el mensaje y otras muchas no.

De echo quisiera poner una antesala en el evento de al perder el enfoque o al de después de actualizar del campo Cantidad de Artículos para que ahí en caso negativo o cero, ya me esté mandando el Msgbox antes de proceder a descargar. A ver si me puedes ayudar con esto... por favor.

Muchas gracias.

Private Sub PagoInicial1_LostFocus()

Dim rs As Recordset

Dim cnn As ADODB.Connection
Dim strSQL As String
Dim PEDIDO As Double
Dim subalma As Single
Dim sePudo As Boolean
Dim regMovimiento As Boolean
Dim arti As Double
Dim canti As Single

sePudo = False
PEDIDO = Me.Numero_de_pedido
If IsNull(Me.Texto17) Then
MsgBox "capturar un subalmacen"
GoTo salidaError
End If
subalma = Me.Texto17

On Error GoTo salidaError

Set rs = New ADODB.Recordset
Set cnn = Application.CurrentProject.Connection
strSQL = "SELECT [Clave del Articulo],[Cantidad de Articulos] FROM [Articulos de los pedidos] WHERE [Numero de pedido] = " & PEDIDO
rs.Open strSQL, cnn
rs.MoveFirst
inicioCiclo:
If rs.EOF Then
GoTo finCiclo
End If
arti = rs(0)
canti = rs(1)
sePudo = descargaAlmacen(arti, subalma, canti)
regMovimiento = registroMovimiento(arti, subalma, canti, PEDIDO)
If Not sePudo Then
MsgBox "Error al descargar el artículo " & arti & " del registro " & PEDIDO & vbCrLf & "FAVOR DE VOLVER A REVISAR SI NO TIENE EXISTENCIAS." & vbCrLf & "" & vbCrLf & "PUEDE DAR EL ALTA DESDE EL BOTÓN Consulta el Inventario DE LA PARTE SUPERIOR IZQUIERDA.", vbExclamation
End If
rs.MoveNext
GoTo inicioCiclo
finCiclo:
rs.Close
cnn.Close

VERIFICACION.Value = True

salidaError:

End Sub

Hola Daniel, gracias por tu apoyo, ya resolví lo de la antesala antes de proceder a descargar, ya me quedó y yo creo que con esto estará bien. De todas maneras si ves alguna incongruencia en mi programación que te envié, te agradecería mucho tus comentarios.

Saludos José. 

Hola Daniel,

Estoy pidiendo ayuda para ver si logro con código poner un botón para copiar mi carpeta donde tengo alojada mi base de datos que la tengo aparte del programa con mis Tablas Vinculadas.  Y poderla copiar aunque sea a “mis documentos” aunque claro que lo ideal sería que me pidiera una ruta donde poderla guardar, ya sea una USB, disco externo o lo que quiera elegir. Pido ayuda porque lo que he conseguido hasta ahora es solamente copiar y pegar archivos nada más, pero no lo logro ni con carpetas ni con basedatos.mdb

Gracias de antemano.

Para copiar carpetas, te paso el código:

Dim fso, MiArchivo

dim carpetaorigen, carpetadestino as string

carpetaorigen="pon aqui tu origen" (p.e. c:\trabajo\

carpetadestino="pon aqui tu destino" (p.e. c:\copia\)

Set fso = CreateObject("Scripting.FileSystemObject")
Set MiArchivo = fso.CopyFolder(carpetaorigen,carpetadestino, True)
Set MiArchivo = fso.CopyFile(carpetaorigen & "*.*",carpetadestino, True)

En cualquier caso puedes hacer que carpetadestino y carpetaorigen no sean fijos si no que los tengas que informar en un campo y los pasarías como variable:

carpetaorigen=me.campoorigen

carpetadestino=me.campodestino

Esto lo puedes poner en un evento onclick de tu botón para copiar y listo.

¡Gracias! Daniel. Muchas gracias.

Me sirvió perfectamente....

Hola Daniel, que tal como estás. Fíjate que tengo un informe que me muestra un listado de registros y quiero una vez ya dentro del Informe, poner un cuadro combinado (o un cuadro de texto no me importa) para poner el número de registro que busco y que me lleve y me ponga el foco en ese número de registro. Pero no lo consigo. Con Formularios no tengo problema, pero con el Informe no puedo ni con Recordset, ni con criterio en Macros… no sé vaya. A ver si me puedes ayudar, por favor.

Hola Daniel, tengo un formulario llamado: [FFiltro] con un botón para abrir un informe por mes y año solicitado, este informe  tiene tres Subinformes y cada uno tiene un consulta independiente a las otras.

Y en cada consulta pongo el mismo criterio en la fecha a cada uno: [Formularios]![FFiltro]![txtMes1]

En el formulario creo un cuadro de texto independiente llamado: [txtMes1] y un botón (macro) para llamar al informe,

para que al llamar el informe con la fecha me abra a la vez las tres consultas y no tenga que pedirme que ponga la fecha tres veces una por consulta.

En Access 32Bits, me funciona perfectamente, pero el problema lo tengo cuando lo quiero abrir en Access 64 Bits me sigue pidiendo los tres criterios de cada uno de los subinformes. Y no me funciona este procedimiento.

Me podrías ayudar por favor con eso, qué tengo que poner en el código del formulario o en el código del Informe para que respete ese procedimiento.

Es muy extraño esto que me comentas ya que los informes no tendrían que darte problemas al abrirse. Ni siquiera te deberían pedir la fecha ya que la tienes en un campo de un formulario.

Lo único que se me ocurre que te puede ocurrir es una pequeña apreciación de nomenclatura entre las versiones de 32 y 64 bits. En el criterio de fecha de cada consulta cambia las admiraciones por puntos. Es decir: forms.ffiltro.txtmes1

Así debería de funcionar. No obstante, si no te funcionara, puedes incluir cada consulta en el origen de datos de los subinformes. Como hacerlo: en el origen de datos marcas los ... en lugar de poner el nombre de una consulta ya creada y te aparecerá el generador de consultas donde tendrás que definir los campos y criterios de la misma forma que en la consulta que has creado. Parece que debería ser lo mismo pero realmente no lo es ya que, de esta manera, el subinforme trabaja sobre una tabla en lugar de sobre una consulta que, a su vez, trabaja sobre la tabla. Haciendo esto en los 3 subinformes debería funcionar.

En caso de que no te funcionara, ya deberíamos actuar sobre el rowsource (origen de datos) de los subinformes haciendo nosotros la selección en sql al pinchar en el botón que abre el informe general.

No se que vinculación tienen los 3 subinformes con el informe general. Si no te funciona me lo dices y miramos como hacerlo directamente en VBA.

¡Gracias! Daniel por tu atención. Ya detectamos que el problema viene porque la versión del Access de 64 Bits es en inglés y lo que yo estoy usando es en español (32Bits y ese no es el problema). Entonces el criterio lo tengo como Formulario: [Formularios]![FFiltro]![txtMes1]

Y al ponelo ya en inglés así: [Forms]![FFiltro]![txtMes1]

Se solucionó. GRACIAS OTRA VEZ POR TU APOYO.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas