- Este debate tiene 5 respuestas, 2 mensajes y ha sido actualizado por última vez el hace 3 años, 6 meses por
Diego Ré.
Grouping TablaDate
-
Diego RéParticipanteDiego 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
9 julio 2019 a las 16:02 #13095
Cristina NicolàsSuperadministradorCristina NicolàsHola,
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.
11 julio 2019 a las 10:07 #13144
Cristina NicolàsSuperadministradorCristina NicolàsTe 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;11 julio 2019 a las 10:12 #13146
Cristina NicolàsSuperadministradorCristina NicolàsHola 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às11 julio 2019 a las 13:50 #13151
Debe iniciar sesión para responder a este tema.