¿Tengo la necesidad de asignarle un consecutivo a una tabla para saber cuantos movimientos tengo por depto, pedí, tipo, imp? Como se muestra en el siguiente ejemplo. Detpo pedi tipo impc impa cons 100 10 d 5.00 1 100 10 d 5.00 2 100 10 h 5.00 1 101 2 d 3.50 1 101 2 h 3.50 1 101 2 h 3.50 2 101 2 h 3.50 3
Parto de la hipótesis de que sabes VBA y que no vas a borrar registros, porque si no no te funcionaría. Lo primero que tienes que hacer si no tienes buen manejo del sql, es generarte una consulta de agrupados con los campos detpo pedí tipo impc impa y que te aplicando el campo cuenta sobre alguno de los campos, de tal forma que te de el resultado que de la cantidad de registros que hay según la agrupación que has hecho: el resultado debería ser algo así según tu ejemplo: 100 10 d 5.00 2 100 10 h 5.00 1 101 2 d 3.50 1 101 2 h 3.50 3 El último número es el del campo cuenta. A continuación create una función en módulos a la que le pases como parámetros los campos que agrupas : detpo pedí tipo impc impa. Dentro de la función llamas ejecutas la instrucción sql similar a la consulta que realizaste anteriormente pero filtrando los datos que has pasado como parámetros, por lo que el resultado de la misma debe ser un solo registro en el que el último campo te de la cantidad de registros que tienes con esas características. Captura este campo, le sumas uno y haces que la función devuelva este valor. Esta función se la aplicas al campo cons para rellenarlo. Espero que te sirva de ayuda. Si encuentras mucha dificultad en el tema, vuelve a escribirme e intentaré escribirte un poco de código. (Me pillas en el trabajo y no puedo extenderme demasiado).
Experto apenas estoy comenzando con access y la verdad no se VBA, me podrías mandar un ejemplo, cabe mencionar que el campo consec si existe pero aun no tine ningún valor, lo puse como ejemplo de como quedaría una vez que se le asigna el consecutivo, la tabla original esta así detpo pedí tipo impc impa cons 100 10 d 5.00 100 10 d 5.00 100 10 h 5.00 101 2 d 3.50 101 2 h 3.50 101 2 h 3.50 101 2 h 3.50 el resultado ya asignandole el consecutivo quedaria asi: detpo pedi tipo impc impa cons 100 10 d 5.00 0.00 1 100 10 d 5.00 0.00 2 100 10 h 0.00 5.00 1 101 2 d 3.50 0.00 1 101 2 h 0.00 3.50 1 101 2 h 0.00 3.50 2 101 2 h 0.00 3.50 3 Como veras no necesito agrupar sino unicamente asignarle un consecutivo de acuerdo a la llave depto&pedí&tipoimpc para el tipo c y depto&pedí&tipoimpa para el tipo "a" Saludos Y nuevamente gracias por tu tiempo Mi mail es [email protected]
Te adjunto el código a poner por ejemplo dentro de un módulo, que genera el número que buscas en función de los parámetros que se le meten: Public Function Contador(depto As Long, Pedido As Long, tipoP As String, imp1 As Long, imp2 As Long) As Long Dim db As Database Dim rst As dao.Recordset Dim sqlcad As String Set db = CurrentDb sqlcad = "SELECT detpo, Pedi, tipo, impc, impa, Count(Tabla2.impa) AS CuentaDeimpa FROM Tabla2 GROUP BY detpo, Pedi, tipo, impc, impa having (((detpo)=" & depto & ") and ((pedi)=" & Pedido & ") and ((tipo)=" & Chr$(34) & CStr(tipoP) & Chr$(34) & ") and ((impc)=" & imp1 & ") and ((impa)=" & imp2 & "));" Set rst = db.OpenRecordset(sqlcad) If Not rst.EOF Then Contador = rst!cuentadeimpa + 1 Else Contador = 1 End If Rst. Close Db. Close End Function Los tipos de datos(long, string), tienes que adaptarlos en función de tu definición de tabla. Esta consulta que se almacena en sqlcad(por cierto asegurate que entra en una línea) y se ejecuta, lo que hace es simplemente consultar a la base datos para saber cuantos registros iguales hay. Si no filtro (HAVING), me aparecen todos las combinaciones posibles y tendrían que recorrer el recordset o la consulta registro a registro. Por eso aplico el filtro y así se que tengo uno o ningún registro. En este caso el contador la función devuelve 1. Si hay uno devuelve el valor de cuentaimpa y le suma uno. Ya se que lo que quieres es que se numere de forma automática, pero eso en principio no es posible directamente. Una forma de hacerlo, sería crear un formulario continuo o no, que cuando termines de meter los datos o bien le des a un botón y te lo calcule el campo consec o bien, que lo programes de tal forma que al perder el foco el último control antes de consec, automáticamente llame a la función contador y rellene el campo conx. El código del formulario podría ser algo así: Private Sub Comando14_Click() Me.txtvalor = Contador(Me.txtdetpo, Me.txtPedi, Me.txttipo, Me.txtimpc, Me.txtimpa) End Sub Aquí llamamos a a la función contador cuando pulsamos el botón comando14 para que rellene el campo consec(para mi me.txtvalor) con lo valores que has rellenado previamente. Si lo haces con perdida de foco podría ser: Private Sub txtimpa_LostFocus() Me.txtvalor = Contador(Me.txtdetpo, Me.txtPedi, Me.txttipo, Me.txtimpc, Me.txtimpa) End Sub Aquí cuando sales del control txtimpa se ejecuta la función. A ambas habría que añadirle, un pequeño control de tal forma que si el campo consec ya esta relleno, no lo vuelva a calcular, porque el resultado podría ser erróneo. Espero que puedas "jugar" un poquito con el código que te paso. Quizás sea un poco complicado, pero no existe una forma automática que te cuente como tu quieres.