Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Contador en SubFormulario

602 views
Skip to first unread message

manuel

unread,
Oct 25, 2003, 5:54:41 PM10/25/03
to
Saludos al grupo.
Quisiera poner un contador de registros en un subformulario. Me explico:
Por ejemplo:
Tengo un formulario principal donde doy números de factura según el
esquema:
Valor Predeterminado =DMáx("[iddFactura]";"[TablaFacturas]")+1

En el mismo Formulario tengo un SubFormulario de Líneas de Conceptos visto
como Hoja de datos,
conectado según el campo iddFactura. Es decir, por cada número de factura
tendré varios conceptos facturados.
Su tabla asociada, [TablaConceptos] tene los campos [iddFactura],
[iddConcepto], [Descripción] y [Tarifa].
Conforme introduzco conceptos en una determinada factura, Access va metiendo
el valor principal de [iddFactura] en el campo asociado [iddFactura] del
subformulario.

Ahora, necesito que con cada nueva línea de concepto, se vaya introduciendo
como valor predeterminado de [iddConcepto] una numeración correlativa
creciente, en la forma que tome el mayor de la serie y le sume una unidad.
(No valen autonuméricos)

Quedaría algo del estilo:
Factura Concepto Descripción Tarifa
001 001 Tornillos 45
001 002 Tuercas 34
001 003 Martillo 12
001 004 Clavos 10
...
002 001 Yeso 20
002 002 Cola 33
...
003 001 Papel 15
003 002 Bolígrafos 8
003 003 >>> Eliminado<<<
003 004 Grapas 25
...

* Si utilizo en el SubFormulario la expresión
Valor Predeterminado =DMáx("[iddConcepto]";"[TablaConceptos]")+1
funciona mal, pues se actualiza tarde y repite valores.
* Si utilizo, desde VBA, el RecordsetClone de la Hoja de Datos del
Subformulario,
¿Cómo he de escribir la expresión para que no me dé errores?
He creado la función siguiente para el Valor Predeterminado, pero me da
error:

Function retDMax(FormName As String, SubFormName As String, FieldName As
String) As Long
With Forms(FormName).Controls(SubFormName).Form
.Requery
retDMax = application.DMax(FieldName, .RecordsetClone)
End With
End Function

¿Qué propuestas teneis? Imagino que debe ser fácil, pero hasta que sale....
Gracias.
--

Saludos,
Manuel.


Juan M. Afan de Ribera

unread,
Oct 25, 2003, 6:41:00 PM10/25/03
to
Te haré primero una pregunta: ¿Hay alguna razón especial por la que quieras
tener esas líneas numeradas correlativamente empezando por 1?

Esto te lo digo, porque a lo mejor te haría el mismo servicio un campo
autonumérico, y de esa forma no tendrías que gastar tiempo en escribir
código. Ese campo autonumérico siempre te conservaría un orden de mayor a
menor.

Por otro lado, si aún así quieres ese código, podría ser este:


=DMáx("[iddConcepto]";"[TablaConceptos]";"[iddFactura]=Forms!NombreFormulari
o!iddFactura")+1

(para la sintaxis correcta, deberás revisar que los nombres sean los
correctos)

Espero que te sirva

--
Saludos desde Barcelona
Juan M. Afan de Ribera
<MVP Ms Access>
http://www.juanmafan.tk
http://www.clikear.com/webs4/juanmafan


"manuel" <manuel_...@worldonline.es> escribió en el mensaje
news:uAYJnL0m...@TK2MSFTNGP09.phx.gbl...

Chea

unread,
Oct 25, 2003, 6:40:45 PM10/25/03
to
Está bien crear un contador parcial, pero no debes usarlo en un campo tip id
porque se supone que éste debe ser un identificador de registro único y, en
tu caso, se repite. Tampoco es necesario, ni conveniente, que el campo se
guarde en una tabla; puede ser un campo calculado.

Te copio más abajo una función que puedes meter en el módulo de un
subformulario. Luego, puedes crear un campo calculado a partir de esa
función poniendo en el eorigen de datos
= lngContador.

Public Function lngContador() As Long
On Error GoTo lngContador_err
Me.RecordsetClone.Bookmark = Me.Bookmark
lngContador = 1 + Me.RecordsetClone.AbsolutePosition
Exit Function
lngContador_err:
If Err = 3021 Then
'no hay registro activo
lngContador = 0
Else
' patatín-patatán... el control de errores te toca a tí
End If
End Function

--
Saludos.

José Bengoechea Ibaceta [MS-MVP Access]
http://usuarios.lycos.es/jbchea/


"manuel" <manuel_...@worldonline.es> escribió en el mensaje
news:uAYJnL0m...@TK2MSFTNGP09.phx.gbl...

Emmanuel

unread,
Oct 27, 2003, 1:46:03 AM10/27/03
to
y si necesito un numerador de registros en una consulta sql, ¿podrían
decirme cómo?
ejemplo:
Número consecutivo dato1 dato2 etc
1 x x z
2 y x y
3 y y z
... ... ... ...


Chea

unread,
Oct 27, 2003, 9:41:07 AM10/27/03
to
No. Ahí no sé hacerlo, y de entrada, me parece muy complicado.

--
Saludos.

José Bengoechea Ibaceta [MS-MVP Access]
http://usuarios.lycos.es/jbchea/

"Emmanuel" <emm...@mexico.com> escribió en el mensaje
news:uwDBGYFn...@TK2MSFTNGP12.phx.gbl...

manuel

unread,
Oct 28, 2003, 4:48:15 PM10/28/03
to
Casi funciona lo que me decís.
El problema es que la función DCount() no me numera bien.
Cuando abres el formulario, con el suformulario en vista Hoja de datos, todo
va bien:
1, 2, 3,... y el nuevo registro 4.
Pero si entro en 4, el nuevo registro que añade lo vuelve a numerar con 4.
Después sigue bien, con 5, 6, 7...
...
Cuando utilizo la función DMax(), me da error por que no sé 'escribir' de
qué campo, de qué dominio y con qué criterios ha de buscar el máximo. El
campo es un numérico del recordsetclone del subformulario. 'Mu complicao pa
mi'.
De todas maneras, muchas gracias.


0 new messages