AX7 - Query::Insert_Recordset

En este post explicaremos como insertar registros de forma masiva a través de una Query.

Muchos habréis utilizado el comando insert_recordset para insertar registros, pero cuando trabajamos con Queries esto no era posible hasta hace poco. No es una novedad de Ax ya en su versión 2012 R3 estaba disponible.

Para este ejemplo he creado una tabla llamada CustTableNames, la cual, tendrá un campo llamado AccountNum.

Si quisiéramos insertar todos los registros (Sólo insertaremos el campo AccountNum) de la tabla CustTable en la tabla CustTableNames a través de una Query, seguramente lo haríamos de la siguiente manera:

class InsertRecordQuery
{       
    /// <summary>
    /// Runs the class with the specified arguments.
    /// </summary>
    /// <param name = "_args">The specified arguments.</param>
    public static void main(Args _args)
    {     
        Query                   q = new Query();
        QueryRun                qr;

        CustTable               custTable;
        CustTableNames          custTableNames;

        q.addDataSource(tableNum(CustTable));

        qr = new QueryRun(q);

        while (qr.next())
        {
            CustTable = qr.get(tableNum(CustTable));

            custTableNames.clear();
            custTableNames.AccountNum = CustTable.AccountNum;
            custTableNames.insert();
        }

        while select custTableNames
        {
            info(custTableNames.AccountNum);
        }
    }


}


En el siguiente código realizaremos la misma acción pero utilizando el comando Query::insert_recordset.

class InsertRecordQuery
{       
    /// <summary>
    /// Runs the class with the specified arguments.
    /// </summary>
    /// <param name = "_args">The specified arguments.</param>
    public static void main(Args _args)
    {      
        Query                   q = new Query();
        QueryBuildDataSource    qbds;
        QueryBuildFieldList     fieldList;

        CustTableNames          custTableNames;
        Map                     fieldMapping;


        qbds = q.addDataSource(tableNum(CustTable));

        fieldList = qbds.fields();
        fieldList.addField(fieldNum(CustTable, AccountNum));       
        fieldList.dynamic(QueryFieldListDynamic::No);
       
        fieldMapping = new Map(Types::String, Types::Container);
        fieldMapping.insert(fieldStr(CustTableNames, AccountNum), [qbds.uniqueId(), fieldStr(CustTable, AccountNum)]);
                   
        query::insert_recordset(custTableNames, fieldMapping, q);

        while select custTableNames
        {
            info(custTableNames.AccountNum);
        }
    }


}


Explicaremos los puntos a tener en cuenta a la hora de utilizar este comando.
Por supuesto deberemos tener una query, aunque en este ejemplo es una query muy simple, se puede hacer consultas más complejas incluso enlazar distintas tablas.

 Query                   q = new Query();
 QueryBuildDataSource    qbds;

 qbds = q.addDataSource(tableNum(CustTable));


El siguiente paso será indicarle a la Query que campos retornará; en la propiedad dynamic le indicaremos No. Con esto le indicaremos a la consulta que no seleccione todos los campos de la tabla sino los indicados.


 fieldList = qbds.fields();
 fieldList.addField(fieldNum(CustTable, AccountNum));       
 fieldList.dynamic(QueryFieldListDynamic::No);


El mapa lo utilizaremos para añadir los campos que serán insertados en la consulta.


 Map                     fieldMapping;

 fieldMapping = new Map(Types::String, Types::Container);
        fieldMapping.insert(fieldStr(CustTableNames, AccountNum), [qbds.uniqueId(), fieldStr(CustTable, AccountNum)]);


Finalmente llamaremos a la función Insert_Recordset pasandole por parámetros la tabla en la que se insertarán los registros, el mapa con los campos seleccionados y por supuesto la Query.


query::insert_recordset(custTableNames, fieldMapping, q);


Si ejecutamos el código veremos como nos muestra todos los campos insertados en la tabla.



Si examinamos lo que ha hecho Ax con el Sql veremos que el comando ha convertido todo lo que hemos creado en un comando insert_recordset.




Aquí se ve mejor el comando ejecutado:


INSERT INTO CUSTTABLENAMES (ACCOUNTNUM,DATAAREAID,RECVERSION,PARTITION,RECID)
SELECT F1,DATAAREAID,RECVERSION,PARTITION,RECID+5637146388 
FROM [##ax_tmp_usmf1997_52_65622]

Comentarios