• Este debate tiene 5 respuestas, 2 mensajes y ha sido actualizado por última vez el hace 1 año, 2 meses por AvatarDiego Ré.
Viendo 6 entradas - de la 1 a la 6 (de un total de 6)

Respuestas del foro


  • Avatar
    Diego Ré
    Participante
    Diego Ré

    Buenos dias,

    Una consulta por si se hayan topado con similar escenario, cuales son las opciones de Group by que tenemos dentro de C/AL?  el equivalente al Group By de SQL? dentro de las propiedades de la tabla en el Dev al menos no encuentro ninguna opcion, he conseguido un resultado parecido utilizando SETCURRENTKEY pero creo que no es exactamente la forma, alguna sugerencia?, otra consulta hay posibilidad de que alguien muestre la forma de recorrer una query desde C/AL he repasado uno de los cursos pero se centra mas bien en la declaración que en la manipulación de la query desde un report como abrir, recorrer cerrar, etc, muchas gracias de antemano.

     

    saludos

    #13095
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Hola,

    En C/AL lo de las agrupaciones no es trivial.
    El SETCURRENTKEY te permite ordenar de una forma determinada, pero te devuelve todos los registros uno a uno. Las agrupaciones después te las tendrías que hacer tu.

    El único objeto que puede hacer agrupaciones es precisamente la Query.

    Para después recorrer la query, seria algo así:

    MyFirstQuery.OPEN;
    WHILE MyFirstQuery.READ DO
    OutputData(MyFirstQuery.Item_No,
    MyFirstQuery.Month_Posting_Date,
    MyFirstQuery.Sum_Quantity,
    MyFirstQuery.Source_No,
    MyFirstQuery.Description,
    MyFirstQuery.Name,
    MyFirstQuery.Customer_Posting_Group);

    La función OutputData seria una función que te definirías para después procesar el resultado. Era una mera forma de ver como acceder a los valores de cada una de las columnas de la Query.

    También podría agrupar datos el report, en su layout. En los dataitems y al crear el dataset se le pasan todos los datos, pero después, a la hora de definir el layout, Reporting Services tiene opciones de agrupación.

    #13144
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Te paso un ejemplo de una query que desarrollé con NAV2013 a modo de pruebas, que es la que precisamente después recorro con ese código de la respuesta anterior.

    OBJECT Query 50000 My First Query
    {
    OBJECT-PROPERTIES
    {
    Date=04/11/12;
    Time=21:23:26;
    Modified=Yes;
    Version List=;
    }
    PROPERTIES
    {
    }
    ELEMENTS
    {
    { 1100286000;;DataItem; ;
    DataItemTable=Table32;
    DataItemTableFilter=Entry Type=CONST(Sale) }

    { 1100286002;1;Column; ;
    DataSource=Item No. }

    { 1100286003;1;Column; ;
    DataSource=Posting Date;
    MethodType=Date;
    Method=Month }

    { 1100286004;1;Column; ;
    DataSource=Quantity;
    ReverseSign=Yes;
    MethodType=Totals;
    Method=Sum }

    { 1100286005;1;Column; ;
    DataSource=Source No. }

    { 1100286001;1;DataItem; ;
    DataItemTable=Table27;
    DataItemLink=No.=Item_Ledger_Entry.»Item No.» }

    { 1100286006;2;Column; ;
    DataSource=Description }

    { 1100286007;2;DataItem; ;
    DataItemTable=Table18;
    DataItemLink=No.=Item_Ledger_Entry.»Source No.» }

    { 1100286008;3;Column; ;
    DataSource=Name }

    { 1100286009;3;Column; ;
    DataSource=Customer Posting Group }

    }
    CODE
    {

    BEGIN
    END.
    }
    }

    Y la función que la recorre:

    PROCEDURE QueryFunction@1100286001();
    VAR
    MyFirstQuery@1100286000 : Query 50000;
    BEGIN
    MyFirstQuery.OPEN;
    WHILE MyFirstQuery.READ DO
    OutputData(MyFirstQuery.Item_No,
    MyFirstQuery.Month_Posting_Date,
    MyFirstQuery.Sum_Quantity,
    MyFirstQuery.Source_No,
    MyFirstQuery.Description,
    MyFirstQuery.Name,
    MyFirstQuery.Customer_Posting_Group);
    END;

    PROCEDURE OutputData@1100286000(ItemNo@1100286006 : Code[10];Month@1100286000 : Integer;QuantitySum@1100286001 : Decimal;SourceNo@1100286002 : Code[10];ItemDescription@1100286003 : Text[50];CustomerName@1100286004 : Text[50];CustomerPostingGroup@1100286005 : Code[10]);
    BEGIN
    Counter := Counter + 1;
    END;

    #13146
    Avatar
    Diego Ré
    Participante
    Diego Ré

    Buenos dias Cristina,

    Muchas gracias estaré probando el código, efectivamente, las agrupaciones las estoy haciendo desde el Layout en RS, pero de pronto demora mucho en la carga del reporte por ello me gustaría probar agrupándolo directamente desde el dataset, gracias de nuevo

     

    saludos

    #13150
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Hola Diego,

    Pues si tienes un problema de lentitud, realmente el hecho de optar por una query es lo suyo.

    Cuando hice esta prueba de esta query que te he pasado, hice también una función con puro C/AL recorriendo los mismos datos y haciendo las mismas agrupaciones, y hice la comparación de tiempos.
    Recorrer los datos con un FINDSET y después REPEAT UNTIL, y ir haciéndome las sumas que necesitaba, me tardaba 14 segundos.
    Recorrer los mismos datos y hacer las mismas agrupaciones pero con una Query, me tardaba 150 milisegundos.
    Una diferencia abismal.

    Un saludo,
    Cristina Nicolàs

    #13151
    Avatar
    Diego Ré
    Participante
    Diego Ré

    Totalmente Cristina, de ahí mi interes en probarlo desde la Query, se que tu codigo nos servira a varios en la comunidad

     

    saludos

    #13153
Viendo 6 entradas - de la 1 a la 6 (de un total de 6)

Debe iniciar sesión para responder a este tema.