Obtener el total de registros de una tabla sin cargar la lista


([N3] ereitmann) #1

Hola, buenos dias, es posible (supongo que si) obtener el número total de registros de una tabla sin el proceso cargar lista? ya que enlenteceria el funcionamiento del evento que quiero hacer, solo preciso en valor para hacer unos cálculos estadísticos y no para seleccionar registros.
Agradecido por cualquier aporte


([N4] velavisual) #2

@ereitman

Mirándolo desde otro punto de vista, yo haría lo siguiente:

Disponer de una tabla para registrar los registros que contienen las tablas que me interesen:

Nombre:StdTbls
Campos:

  • ID,Tabla, NumTotalRegitros
    Indices:
    -Tabla(único)

En el trigger posterior al alta de registros en cada tabla, actualizar la tabla StdTbls con el número de registros.

De esta forma no lo notarías nada, al menos yo no lo noto y lo tengo de esta forma.


([N1] wikan) #3

Realmente notas lentitud en:
Cargar lista
set NUM-REG = sysListSize

Sin realizar operaciones


([N3] ereitmann) #4

Manuel, estoy equivocado o tenia entendido que el proceso de cargar lista si esta era muy extensa y en un vserer en la nube penalizaba?


([N1] wikan) #5

Simplemente has la prueba, mientras no operes con la lista, no debería “laguearte” mucho la aplicación.


([N3] pacosatu) #6

Hola.

Estoy de acuerdo en que la operación “Cargar Lista” no ralentiza si se ejecuta en 3º plano. Por lo tanto es independiente de si estás en Cloud o en Local.

Saludos
Paco Satué


([N4] eic) #7

Hola.

Puede que esté equivocado, pero haría la siguiente apreciación: si usamos un sólo índice (por ejemplo, en este caso, típicamente #ID), no hay diferencia entre llamar a Cargar lista en 1º plano, o llamar a un proceso en 3º plano que cargue la lista y la devuelva.

Pero… lo que se quiere es obtener el número de registros sin más… por lo que podríamos evitar que devuelva la lista. Es decir, tener un proceso en 3º plano que cargue la lista, obtenga el nº de registros y no devuelva nada, más que el valor del nº de registros. Eso debería funcionar, creo, más rápido que hacer el cargar lista en local, o que llamar a un proceso en 3º plano que devuelva la lista.

Por supuesto, esto sólo tendrá una incidencia reseñable en el rendimiento si la tabla es muy, muy grande.


([N3] pacosatu) #8

Hola Fran.

Por supuesto me refería a ejecutar “Cargar Lista” en 3º plano sin el comando “Añadir lista a la salida”.

¡Hombre!, si son 10 millones de registros, algo se notará, pero sin conocer nada en absoluto de la arquitectura del vServer no hay más remedio que probar y ver que pasa.

Saludos
Paco Satué


([N3] ereitmann) #9

Ok, hoy ya es otro día y tengo la mente mas clara, un proceso p una función en tercer plano y que pase a una variable global en memoria el resultado, es así?

Gracias por sus ideas es que a veces uno se embota y pierde el horizonte


([N1] VictorMC) #10

Saludos cordiales a tod@s

Ereitmann, desconozco cual es tu objetivo final de lo que planteas, sin embargo en base al titulo de esta entrada respondo: SI

Si es posible conocer el total de registros de una tabla SIN hacer un “Cargar lista” ya que efectivamente aunque solo requieras el n o sysListSize de registros, la función requiere realizar el conteo, por ende consumirá tiempo mayor o menor, ya sea en local o en servidor.

Con Velneo para obtener un numero de registros sin recorrer listas solo es necesario crear una tabla Padre y agregar una actualización hacia esta, desde luego la tabla padre puede contener los campos que requieras y la actualización puede tener diversos componentes de actualización y estos a su vez condiciones para modificar.
Pero si quieres solo un dato, es tan simple como colocar un componente de actualización a un campo de la tabla Padre: “No. registros” Modo: Acumular, Fórmula: 1

Saludos.


([N3] ereitmann) #11

Gracias Victor MC muy útil tu estrategia, y es simplemente para obtener el % del total de registros de una tabla con el total de registros de una búsqueda, por ejemplo que % de sinistros de un determinado tipo de una compania de seguros laborales con respecto al total de todo tipo siniestros en un período. y tu solución es muy similar a la de velavisual
Gracias


([N1] VictorMC) #12

La manera de hacerlo sería:
Tabla Padre: TOTALES
Campos: TotalSiniestros, NumIncendios, NumAccidentes, %Incendios, %Accidentes

Tabla Hija: SINIESTROS
Componetes de actualización hacia TOTALES:
Campo: TotalSiniestros, Modo:Acumular, Fórmula:1, Condición para modificar:“Ninguna”
Campo: NumIncendios, Modo:Acumular, Fórmula:1, Condición para modificar:TIPO=Incendios
Campo: NumAccidentes, Modo:Acumular, Fórmula:1, Condición para modificar:TIPO=Accidentes

Por último asegurarse que en tabla TOTALES:
Campo: %Incendios, Contenido Inicial: #NumIncendios/(#TotalSiniestros|1)*100
Campo: %Accidentes, Contenido Inicial: #Accidentes/(#TotalSiniestros|1)*100

La diferencia entre la solución de mi amigo Antonio es que en su solución se utilizarían “triggers” y en tal caso debes de asegurarte agregar estos eventos por si es alta o baja, así mismo ingeniarte la manera de evaluar, promediar o calcular, en tanto con las actualizaciones lo tienes prácticamente resuelto.

Bueno, esa es mi manera de hacerlo, seguro habrá mejores.

Saludos cordiales a tod@s.


([N3] ereitmann) #13

Me lo haz dejado todo resuelto!!, Muchisimas gracias nuevamente y a todos por su interés


([N4] velneador) #14

@erietman

La mía es muy simple también.Cuando damos un alta nos devuelve el ID que se le ha asignado al registro y este ID lo grabo en la tabla de totales de registros.Sólo lo hago el las altas y siempre comparo este ID con el anterior por si ha sido sustituido por un registro de baja.