Prefacio
Cuando mi equipo estaba desarrollando el módulo del sistema tributario, descubrí que necesitaban dedicar el 80% de su tiempo a resolver problemas de cálculo, especialmente los cálculos en la cuadrícula. Este tiempo se dedicó a:
Escriba el código js de front-end (porque la entrada del usuario en la tabla afectará a otras celdas, por lo que el nuevo valor después del cálculo debe presentarse al usuario de inmediato) Escriba el código de back-end (porque los cambios del usuario en los datos de la tabla afectarán otras tablas, por lo que es necesario actualizar los datos de la tabla afectada cuando el usuario hace clic en guardar) Implementar métodos de cálculo modificados, lo que hace que los desarrolladores necesiten modificar el códigoEntonces investigué las funciones de otros módulos de impuestos y descubrí que el sistema tributario utiliza una gran cantidad de controles de tabla, que más o menos implican problemas de cálculo. Todos los métodos de cálculo están codificados.
El cálculo, esta acción de codificación común, en realidad recuerda mucho a las fórmulas de Excel, sin mencionar que el documento de requisitos en sí se proporciona en formato Excel. Cuando usamos Excel, podemos establecer fórmulas en las celdas. Al cambiar el valor de la celda de origen, Excel calculará automáticamente la fórmula de la celda y asignará el valor del resultado a la celda de destino. Entonces, ¿podemos referirnos a este modelo? Los desarrolladores ya no necesitan escribir una lógica de cálculo complicada y difícil, solo necesitan convertirla en declaraciones en un formato determinado de acuerdo con las fórmulas proporcionadas por la implementación y luego llamar a un determinado motor de cálculo. generar los resultados, presentar los resultados al usuario o conservarlos en la base de datos? La respuesta es sí, y el núcleo de todo esto es el motor de cálculo automático: AutoCalculate.
efecto
AutoCalculate es una solución para cálculos de tablas complejos que le permite guardar cientos o miles de líneas de código lógico de cálculo. De ahora en adelante, escribir código es tan fácil como escribir fórmulas de Excel.
Ámbito de aplicación
recepción:
Adecuado para operaciones complejas con fórmulas en todos los controles de tabla js, como tablas ElementUI, controles EasyUI Grid, ParamQuery Grid, etc.
Entre bastidores:
Aplicable, requiere motor V8
Uso de la recepción
AutoCalculate consta de dos partes, a saber, la fórmula y el motor de cálculo. La fórmula es una cadena escrita de acuerdo con una sintaxis específica, como por ejemplo: [Mes12,1]#3 = [Mes11,1] * 10. El motor de cálculo es AutoCalculate. .js Responsable de analizar fórmulas. Comencemos con cómo escribir fórmulas.
celúla
Supongamos que existe tal escenario, celda ① = celda ② + celda ③, la fórmula correspondiente es:
[Mes1,1] = [Mes1,2] + [Mes1,3]
Primero echemos un vistazo a lo que representa [Month1,1]
Primero, los corchetes [ ]
representan una celda, Mes1 es el nombre de la columna correspondiente a "Enero", seguido de una coma ,
y el siguiente 1 representa RowNo = 1. . Etcétera,
[Month1,2]
representa la celda cuya columna es "Enero" y RowNo = 2
[Month1,3]
representa la celda cuya columna es "Enero" y RowNo = 3
Entonces podemos usar [y,x]
para representar una celda, y es el nombre de la columna, también llamada ordenada, x es el valor de RowNo, también llamado abscisa.
¿Qué pasa si la tabla no tiene ninguna columna RowNo? Si quieres encontrar la respuesta, continúa leyendo.
Deja que la fórmula haga efecto
//Primero presentamos AutoCalculate.js importar AutoCalculate desde '../components/AutoCalculate'; ... //Definir una instancia de AutoCalculate, fórmulas es la matriz de fórmulas let autoCal = new AutoCalculate(formulas); /* Llama al método cal * gridDatas (obligatorio): datos de la tabla * refField (obligatorio): campo de referencia, es decir, qué valor de campo es x en la celda [y,x] */ autoCal.cal(gridDatas, refField);
fórmula de área
De hecho, además de enero, febrero, marzo… también existe una fórmula similar para octubre, a saber:
[Mes1,1] = [Mes1,2] + [Mes1,3] [Mes2,1] = [Mes2,2] + [Mes2,3] [Mes3,1] = [Mes3,2] + [Mes3,3] … … … [Mes10,1] = [Mes10,2] + [Mes10,3]
En otras palabras, necesitamos escribir 10 de estas fórmulas. Para escenarios simples, esto no es un problema. Sin embargo, para algunas tablas que contienen una gran cantidad de fórmulas, este método de escritura tiene algunas desventajas, como que es fácil cometer errores. y la fórmula es larga. También lleva más tiempo terminar de escribir. Por tanto, existe la fórmula del área.
Al observar las fórmulas anteriores, podemos encontrar que cada fórmula en realidad se puede reemplazar por una fórmula, como la siguiente fórmula:
[@,1] = [@,2] + [@,3]
Aquí no hay un nombre de columna claro, solo se usa un marcador de posición @, pero es suficiente para representar las 10 fórmulas anteriores. En este momento, solo necesitamos completar los nombres de las columnas en las posiciones apropiadas, por lo que la fórmula final es:
{Mes1, Mes2, Mes3, Mes4, Mes5, Mes6, Mes7, Mes8, Mes9, Mes10}[@,1] = [@,2] + [@,3]
Debe separar los nombres de las columnas con ,
colocarlos entre llaves { }
, de modo que 1 fórmula equivalga a 10 fórmulas.
Los marcadores de posición se pueden utilizar no sólo para las ordenadas, sino también para las abscisas, como se muestra en la siguiente fórmula:
//Fórmula 1: [TotalAño,3] = [Mes1,3] + [Mes2,3] + [Mes3,3] + [Mes4,3] + [Mes5,3] + [Mes6,3] + [Mes7,3] + [Mes8 ,3] + [Mes9,3] + [Mes10,3] //Fórmula 2: [TotalAño,4] = [Mes1,4] + [Mes2,4] + [Mes3,4] + [Mes4,4] + [Mes5,4] + [Mes6,4] + [Mes7,4] + [Mes8 ,4] + [Mes9,4] + [Mes10,4] //Fórmula 3: [TotalAño,5] = [Mes1,5] + [Mes2,5] + [Mes3,5] + [Mes4,5] + [Mes5,5] + [Mes6,5] + [Mes7,5] + [Mes8 ,5] + [Mes9,5] + [Mes10,5] //Fórmula 4: [TotalAño,6] = [Mes1,6] + [Mes2,6] + [Mes3,6] + [Mes4,6] + [Mes5,6] + [Mes6,6] + [Mes7,6] + [Mes8 ,6] + [Mes9,6] + [Mes10,6] //Fórmula 5: [TotalAño,2] = [Mes1,2] + [Mes2,2] + [Mes3,2] + [Mes4,2] + [Mes5,2] + [Mes6,2] + [Mes7,2] + [Mes8 ,2] + [Mes9,2] + [Mes10,2] //Fórmula 6: [TotalAño,7] = [Mes1,7] + [Mes2,7] + [Mes3,7] + [Mes4,7] + [Mes5,7] + [Mes6,7] + [Mes7,7] + [Mes8 ,7] + [Mes9,7] + [Mes10,7] //Fórmula 7: [TotalAño,9] = [Mes1,9] + [Mes2,9] + [Mes3,9] + [Mes4,9] + [Mes5,9] + [Mes6,9] + [Mes7,9] + [Mes8 ,9] + [Mes9,9] + [Mes10,9] //Fórmula 8: [TotalAño,12] = [Mes1,12] + [Mes2,12] + [Mes3,12] + [Mes4,12] + [Mes5,12] + [Mes6,12] + [Mes7,12] + [Mes8 ,12] + [Mes9,12] + [Mes10,12] //Fórmula 9: [TotalAño,13] = [Mes1,13] + [Mes2,13] + [Mes3,13] + [Mes4,13] + [Mes5,13] + [Mes6,13] + [Mes7,13] + [Mes8 ,13] + [Mes9,13] + [Mes10,13]
Usando la fórmula del área, esto se puede escribir como:
{2, 3, 4, 5, 6, 7, 9, 12, 13}[TotalAño,@] = [Mes1,@] + [Mes2,@] + [Mes3,@] + [Mes4,@] + [ Mes5,@] + [Mes6,@] + [Mes7,@] + [Mes8,@] + [Mes9,@] + [Mes10,@]
Se puede ver que la fórmula del área aporta una gran comodidad a la escritura de fórmulas.
Soporta sintaxis js
En escenarios reales, a menudo nos encontramos con algunas fórmulas complejas, como se muestra a continuación. La fórmula de celda usa la función Max que viene con Excel. Para dicha fórmula, podemos escribirla así:
[Mes1,9] = ([Mes1,6] - [Mes1,7] - [Mes1,8] > 0 ? [Mes1,6] - [Mes1,7] - [Mes1,8] : 0) + [Mes1 ,5]
Como puede ver, la fórmula admite la sintaxis js. Puede colocar una variable js o incluso una función js en el lado derecho del signo igual de la fórmula, siempre que sea una sintaxis reconocida por el motor de análisis js. .
Una cosa a tener en cuenta aquí es que no puede colocar elementos de matriz en fórmulas, porque los elementos de matriz js generalmente tienen símbolos "[]", lo que entra en conflicto con el indicador de celda "[]" en las fórmulas, por lo que los elementos de matriz están prohibidos, tenga en cuenta este.
[y]Fórmula
A continuación, echemos un vistazo a otro escenario, como se muestra en la figura, donde existe dicha relación:
Celda ① = Celda ② - Celda ③
Podrías escribir rápidamente la siguiente fórmula:
[columna3,1] = [columna2,1] - [columna1,1] [columna3,2] = [columna2,2] - [columna1,2]
No hay nada de malo en escribir de esta manera, pero debo recordarles que las filas aquí no son fijas, es decir, el número de filas en la tabla depende completamente de la situación de la base de datos en ese momento. Hoy solo hay 3 filas de datos, mañana 5 filas y pasado mañana habrá 50 líneas. Es imposible para nosotros agregar fórmulas a medida que aumenta el número de filas, por lo que para este tipo de tabla con un número incierto de filas, tenemos una nueva forma de escribirla, la llamo fórmula [y], porque en comparación con las fórmulas ordinarias. , no tiene coordenadas horizontales:
[columna3] = [columna2] - [columna1]
Con solo una fila de fórmulas, AutoCalculate aplicará la fórmula a todas las filas bajo el nombre de columna especificado.
Total de columnas y decimales
A veces, necesitamos encontrar la suma de una determinada columna. Aunque encontrar la suma de una determinada columna puede no ser nuestro objetivo final, es un paso necesario para completar el cálculo. Por ejemplo, existe la siguiente relación:
Celda ③ = Celda ① / Celda ②
La celda ② es el valor total de GroupApprovedTotal
, que usamos <列名>
para representar, es decir: <GroupApprovedTotal>
. Además, las filas aquí no son fijas y es necesario utilizar la fórmula [y], por lo que la fórmula debe escribirse como:
[Porcentaje total aprobado por grupo] = [Total aprobado por grupo] / <Total aprobado por grupo>
Sabemos que en la división el divisor no puede ser 0, por lo que la forma correcta de escribirlo debería ser:
[PorcentajeTotalAprobadoGrupo] = <TotalAprobadoGrupo> === 0 ?
Cuando ingresa esta fórmula en su código e inicia el programa, debe ser inteligente y descubrir rápidamente que el valor que obtiene no es lo suficientemente preciso. Por ejemplo, el valor que se muestra en la celda ③ anterior es 66,91% si su celda ① y Cell. ② tiene el mismo valor que la imagen de arriba. Su celda ③ es probablemente 67%.
De forma predeterminada, AutoCalculate mantendrá el resultado del cálculo en 2 decimales, 67%, que es 0,67. Si desea obtener 66,91%, que es 0,6691, debe mantener 4 decimales. En este momento, debe indicarle a AutoCalculate. que necesitas mantener 4 decimales por lo tanto, la escritura completa debe ser:
[PorcentajeTotalAprobadoGrupo]#4 = <TotalAprobadoGrupo> === 0 ?
A la izquierda del signo igual en la fórmula y a la derecha de la celda asignada, agregue un signo "#", seguido del número de decimales. Tenga en cuenta que no puede haber un espacio entre "#" y el número de decimales. decimales y puede haber espacios antes y después.
Tabla sin filaNo
Finalmente es hora de responder esta pregunta. Quiero preguntarles a todos, ¿cómo encontramos un punto en un avión? La respuesta es que necesitamos la abscisa y la ordenada de este punto. De manera similar, ¿cómo encontrar una celda en una tabla? Primero podemos determinar la ordenada porque se conocen todos los nombres de las columnas. La clave está en determinar la abscisa. Si usa RowNo para posicionar, definitivamente le resultará familiar, porque es muy similar al número de serie en el lado izquierdo de Excel, pero eso no significa que solo se puedan usar números como abscisas. Siempre que el valor sea único, es decir, no repetido, se puede utilizar como abscisa.
Por ejemplo, suponiendo que la siguiente tabla tiene dos filas fijas y ningún RowNo, pero se puede ver que el número de empresa (BuCode) es único, entonces BuCode se puede utilizar como campo de referencia y el valor de BuCode es la abscisa. entonces la fórmula se puede escribir como:
[SumDiffMonth1,F1136] = [GroupApprovalMonth1,F1136] - [Mes1,F1136] [SumDiffMonth1,F2056] = [GroupApprovalMonth1,F2056] - [Mes1,F2056]
Si hay RowNo, use RowNo como campo de referencia y escriba así:
[SumDiffMonth1,2] = [GroupApprovalMonth1,2] - [Mes1,2] [SumDiffMonth1,3] = [GroupApprovalMonth1,3] - [Mes1,3]
Computar a través de fuentes de datos
¿Qué es la informática de fuentes de datos cruzados? Los amigos que hayan utilizado fórmulas de Excel deberían poder comprender qué representa la fórmula de la siguiente celda. Obviamente, el valor de esta celda es el valor calculado de otros datos de la hoja. El cálculo de fuentes de datos cruzados está diseñado específicamente para manejar tales escenarios.
Rara vez o incluso nunca hacemos cálculos de fuentes de datos cruzados en primer plano. Aquí quiero decirle cómo escribir fórmulas y llamar a AutoCalculate para que pueda usarlo en el capítulo "Uso de backend".
Primero, para obtener datos de otras celdas de origen de datos, necesitamos expandir las celdas. Antes, nuestras celdas tenían este aspecto: [y,x]. Por ahora, también hay celdas como esta:[. y], se convierte en una sola celda. Ahora verás una sola celda como esta. Celda: [Fuente de datos externa, y, busque los datos que desee.
Esta es una fórmula que utiliza celdas de tres elementos:
[Mes1,4] = [Impuesto sobre la producción,Mes1,7]
Entre ellos, OutputTax es el nombre de una determinada fuente de datos. Puede nombrarla arbitrariamente. Cuanto más conciso, mejor; de lo contrario, las fórmulas complejas se escribirán durante mucho tiempo y serán difíciles de leer.
La siguiente fórmula tomará valores de dos fuentes de datos, OutputTax y TaxRate:
[Mes1,5] = [Impuesto sobre la producción,Mes1,10] * (1 + [Tasa impositiva,Mes1,1] / 100)
Creo que al leer el contenido de los capítulos anteriores, ya puede comprender el significado de las siguientes fórmulas. Las primeras tres filas de fórmulas utilizan fuentes de datos externas y se combinan con el método de escritura de fórmulas regionales.
Es hora de llamar a nuestro método de cálculo. Para demostrar el efecto, agregué un botón y escribí el método en el evento del botón.
Mira lo que hicimos:
① Obtenga OutputTaxDatas de una fuente de datos externa
② Obtenga la fuente de datos payableTaxDatas de la tabla actual
③ Obtenga otra fuente de datos externa taxRateDatas de la base de datos
④ Aquí está el punto clave. Echemos un vistazo al constructor de AutoCalculate. Hay dos parámetros:
fórmulas: fórmula, una matriz
opciones: parámetro opcional, un objeto objeto
Opciones tiene un atributo externalDatas, que representa una fuente de datos externa. Es una matriz, porque puede haber varios datos. Cada elemento de la matriz es un objeto y tiene 3 atributos.
nombre: El nombre de la fuente de datos externa. El nombre que se elige aquí corresponde al nombre de la fuente de datos externa en la fórmula.
refField: campo de referencia
datos: fuente de datos
Después de crear una instancia de AutoCalculate, aquí se llama a un nuevo método de cálculo, que tiene 2 parámetros:
gridDatas: los datos de la tabla que deben recalcularse, que es una matriz
refField: campo de referencia
AutoCalculate admite todos los controles de tabla js y se puede llamar en segundo plano con la ayuda de este método, porque no importa qué tipo de control de tabla js sea, puede extraer datos de la tabla (datos puros). una matriz. Siempre que esto Simplemente pase la matriz.
⑤ Después de llamar a calcular, el valor de payableTaxDatas ya es el último valor calculado. Ahora simplemente vincúlelo a la tabla actual.
La interfaz después de ejecutar el programa:
Después de hacer clic para obtener datos:
Uso de backend
Para llamar a AutoCalculate en segundo plano, necesitamos usar el motor V8. Otro punto importante es que también se necesitan fórmulas para llamar a AutoCalculate en segundo plano. Nuestro enfoque anterior era colocar todas las fórmulas en el archivo del controlador Extjs, como se muestra a continuación.
Para facilitar las llamadas en segundo plano, extraemos la fórmula como un archivo separado.
La llamada en segundo plano de AutoCalculate está encapsulada en el proyecto y es muy sencilla de usar.
El método de llamada es como se muestra en la figura:
O analízalo paso a paso:
① Guarde los datos de la tabla actual.
② Obtenga el directorio del archivo js donde se encuentra la fórmula
③ Obtenga dos fuentes de datos externas
④ Llame al método en segundo plano encapsulado y utilice los datos obtenidos en los pasos ② y ③, donde FormulaExpression es la expresión de la fórmula, es decir, utilice esta expresión para encontrar la fórmula en el archivo js que proporcionó.
⑤ Los nuevos datos devueltos en el paso anterior ya son los datos más recientes después del cálculo. Ahora guarde estos datos en la base de datos.
Cosas a tener en cuenta
Hay dos puntos a tener en cuenta al escribir fórmulas:
No se permiten espacios en las celdas.
/Forma correcta de escribir: [Mes12,1] = [Mes11,1] * 10 //escritura incorrecta: [Mes12,1] = [Mes11, 1] * 10
No debe haber espacios antes de la marca del decimal y del decimal.
//Escritura correcta: [Mes12,1] #3 = [Mes11,1] * 10 //escritura incorrecta: [Mes12,1] # 3 = [Mes11,1] * 10
Con esto concluye este artículo sobre cómo decir adiós a la codificación rígida y permitir que las tablas de front-end se calculen automáticamente. Para obtener más información sobre los cálculos automáticos de tablas de front-end, busque artículos anteriores en downcodes.com o continúe explorando los artículos relacionados a continuación. Espero que lo hagas en el futuro. ¡Apoya mucho a downcodes.com!