5 diciembre, 2022

REALIZAR UNA CONSULTA INNER JOIN CON TYPESCRIPT EN EXCEL

Hola a todos,

Hace varios días que no publico nada en Excel Signum, el motivo es que he estado enfermo y me ha sido imposible ponerme. Hoy ya me encuentro mucho mejor y tengo ganas de escribir!.

Vamos a tratar, como es habitual desde hace bastante tiempo, sobre Typescript. En el ejemplo de hoy voy a generar una consulta Inner Join pero sin utizar SQL y los comandos habituales de este lenguaje. Lo haré anidando dos instrucciones For.

La idea es la siguiente: Imaginad que tenemos dos hojas con los siguientes datos;

Hoja1:

En la Hoja2:

Lo que se necesita es realizar una consulta que nos devuelva solo los registros que están en la hoja1 y en la hoja2 y además, mostrar una tabla con información de ambas hojas, de la hoja1: ID, Nombre y Sección y de la hoja2: Edad, Sexo y Estudios.

El resultado lo pasaremos a la Hoja3.

Para realizar vamos a utilizar el siguiente script que acabo de programar:

function main(workbook: ExcelScript.Workbook) {
    //Creamos variables de cada hoja
    var miHoja1 = workbook.getWorksheet("Hoja1");
    var miHoja2 = workbook.getWorksheet("Hoja2");
    // determinamos rango hoja1
    var miRangoHoja1 = miHoja1.getUsedRange();
    //contamos filas hoja1
    var finRowhoja1 = miRangoHoja1.getRowCount();
    //contamos columnas hoja1
    var fincolumn1 = miRangoHoja1.getColumnCount();
    //determinamos rango hoja2
    var miRangoHoja2 = miHoja2.getUsedRange();
    //contamos filas hoja2
    var finRowhoja2 = miRangoHoja2.getRowCount();
    //contamos columnas hoja2
    var fincolumn2 = miRangoHoja2.getColumnCount();
    //establecemos los indices del rango de datos de cada hoja
    var infohoja1 = miHoja1.getRangeByIndexes(1, 0, finRowhoja1, fincolumn1).getValues();
    var infohoja2 = miHoja2.getRangeByIndexes(1, 0, finRowhoja2, fincolumn2).getValues();
    //creamos matriz para recoger el resultado de la consulta Inner e indicamos nombre de los títulos
    var resultado: (string | number | boolean)[][] = [["ID", "NOMBRE", "SECCION", "EDAD", "SEXO", "ESTUDIOS"]];
    //mediante un loop for anidado recorremos y comparamos los Id's de las dos hojas
    for (var i = 0; i < finRowhoja1; i++) {
    //si el Id existe en las dos hojas añadimos campos de la hoja1 y de la hoja2
      var miInfo1 = infohoja1[i];
        for (var j = 0; j < finRowhoja2; j++) {
          var miInfo2 = infohoja2[j];
            if (miInfo1[0] === miInfo2[0]){
                resultado.push([miInfo1[0], miInfo1[1], miInfo1[2], miInfo2[1], miInfo2[2], miInfo2[3]])
            }
        }
    }
    //pasamos informacion a la hoja3
    var hojaDest = workbook.getWorksheet("Hoja3");
    var tablaFin = hojaDest.getRangeByIndexes(0, 0, resultado.length, resultado[4].length);
    tablaFin.setValues(resultado); 
}

Aunque en cada línea de código comento el porqué de cada acción, básicamente me he tomado tiempo para automatizar la tarea de forma completa, he parametrizado las columnas y las filas de cada hoja para determinar el rango de cualquier dato que se añada y una vez definido el rango, lo he indexado para ser procesado en las instrucciones For.

Una vez anidamos los bucles procedemos a crear una condición que comparé los Id’s de cada hoja para determinar cuáles se repiten en ambas, luego añadimos el resto de campos con la función push().

El resultado lo pasamos a la Hoja3:

Y esto es todo, espero que os haya resultado interesante. En próximos post voy a tratar el resto de consultas con esta metodología. Y más adelante profundizaré en SQL en Typescript (y en concreto en Office Script).

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies