sábado, 30 de julio de 2011

8.5 Suma de los datos de una columna y multiplicacion de columnas

8.5.1 Obtener la suma una columna completa.

Lo que tenemos que hacer es dado una columna, tenemos que recorrer todas las filas (recordemos que empezamos de (0,1,...,nºfilas-1), e ir sumando el valor que contiene.

Nos vamos a la zona 4 de introducir funciones y añadimos el siguiente código:
'---------------------------------------------------
' FUNCION DE SUMA DE COLUMNA
'---------------------------------------------------
PUBLIC FUNCTION suma(columna AS Integer) AS Float
DIM a AS Integer
DIM suma AS Float
FOR a = 0 TO ME.rows.count - 1
TRY suma += Val(revisa(ME[a, columna].text))
IF ERROR THEN Message.Error("Error al intentar hacer la suma, puede que algun valor se texto en vez de numero")
NEXT
RETURN suma
END

Nota: es necesario que probemos con TRY si se produce un error en la conversión (por ejemplo si el dato de la celda no es numérico), nos daría un error, asi con la sentencia If Error Then.. nos muestra un mensaje de error, no salimos del programa bruscamente y podemos seguir trabajando.


8.5.2 Obtener una nueva columna resultado de la multiplicacion de columnas y la suma total de esa columna


Esta funcion le vamos a dar como mínimo dos columnas a multiplicar, pudiendose como máximo multiplicar hasta 5 columnas (las columnas 3, 4, 5 son opcionales).
Si no existe, nos va a crear una nueva columna en nuestro supergridviews, con el nombre "Operación Producto", donde se va a ir colocando el resultado de la multiplicacion de las columnas.
También nos devuelve el resultado de la suma de esa columna.

Nos vamos a la zona 4, e introducimos el siguiente código:

'---------------------------------------------------
' FUNCION DE Producto DE COLUMNAS
'---------------------------------------------------
PUBLIC FUNCTION sumaproducto(columna1 AS Integer, columna2 AS Integer, OPTIONAL columna3 AS Integer, OPTIONAL columna4 AS Integer, OPTIONAL columna5 AS Integer) AS Float
DIM a AS Integer
DIM producto AS Float
DIM suma AS Float
DIM crearnuevacolumna AS String
DIM columnamultiplica AS Integer
suma = 0
producto = 0
'creo una nueva columna para almacenar el producto
'compruebo que no existe una columna con el título "operacion Producto"
crearnuevacolumna = ""
FOR a = 0 TO ME.columns.count 1
'comprueba que si existe la columna
IF ME.columns[a].title = "Operación Producto" OR ME.columns[a].title = "↓Operación Producto" OR ME.columns[a].title = "↑Operación Producto" THEN
crearnuevacolumna = ("no")
columnamultiplica = a
ENDIF
NEXT
IF crearnuevacolumna = "" THEN
'creo la columna
ME.columns.count += 1
columnamultiplica = ME.Columns.count - 1
ME.columns[ME.columns.count - 1].title = "Operación Producto"
ME.columns[ME.columns.count - 1].width = 150
IF titulosiniciales <> "" THEN
titulosiniciales = titulosiniciales & ME.columns[ME.columns.count - 1].title & "|"
ELSE
guardartitulosiniciales()
titulosiniciales = titulosiniciales & ME.columns[ME.columns.count - 1].title & "|"
ENDIF
ENDIF
guardartitulosiniciales()
'-------------------------
'EMPIEZO A MULTIPLICAR
'-------------------------
FOR a = 0 TO ME.rows.count - 1
producto = 0
IF Val(revisa(ME[a, columna1].text)) = NULL THEN
ME[a, columnamultiplica].text = "N/A"
producto = 0
GOTO antesfinnext
ENDIF

IF Val(revisa(ME[a, columna2].text)) = NULL THEN
ME[a, columnamultiplica].text = "N/A"
producto = 0
GOTO antesfinnext
ELSE
producto = Val(revisa(ME[a, columna1].text)) * Val(revisa(ME[a, columna2].text))
ENDIF

IF columna3 > 0 THEN
IF Val(revisa(ME[a, columna3].text)) = NULL THEN
ME[a, columnamultiplica].text = "N/A"
producto = 0
GOTO antesfinnext
ELSE
producto = producto * Val(revisa(ME[a, columna3].text))
ENDIF
ENDIF
IF columna4 > 0 THEN
IF Val(revisa(ME[a, columna4].text)) = NULL THEN
ME[a, columnamultiplica].text = "N/A"
producto = 0
GOTO antesfinnext
ELSE
producto = producto * Val(revisa(ME[a, columna4].text))
ENDIF
ENDIF
IF columna5 > 0 THEN
IF Val(revisa(ME[a, columna5].text)) = NULL THEN
ME[a, columnamultiplica].text = "N/A"
producto = 0
GOTO antesfinnext
ELSE
producto = producto * Val(revisa(ME[a, columna5].text))
ENDIF
ENDIF
antesfinnext:
suma += producto

IF ME[a, columnamultiplica].text <> "N/A" THEN ME[a, columnamultiplica].text = Str$(producto)

NEXT

finnext:


colorear()
RETURN suma
END


Nota: al igual que nos pasaba con la funcion de suma es importante que si el contenido de la celda no es un numero, controlar (mediante NULL), que no operemos con ella, para no producir un error, aquí se hemos considerado la colocacion de “N/A”, (como en las hojas de cálculo), para decir que ese valor no esta disponible.



No hay comentarios:

Publicar un comentario