Etiquetado: Convertir Codeunit a Integer
- Este debate tiene 10 respuestas, 2 mensajes y ha sido actualizado por última vez el hace 2 años, 11 meses por
administracion@riversa.es.
CUE con multiples filtros a multiples tablas relacionadas
-
administracion@riversa.esParticipanteadministracion@riversa.esBuenos días:
He creado una CUE donde quiero obtener las líneas de Albaranes Pendientes de facturar, pero que esté filtrado por un determinado campo que aparece en la cabecera del albaranes (es un campo desarrollado llamada Demo y otro Deposito) y también filtrado por el ID de usuario que aparece en su pedido correspondiente, que será el ID del usuario que entra a BC.
No se si me explico.
El campo que he creado en la tabla es el siguiente, con esto consigo mostrar en la CUE aquellas líneas que están pendientes de facturarse y que son de tipo producto, recurso o cuenta, lo que no se es como añadir al Where los filtros que me faltan relacionándolo con las diferentes tablas, para que cuente solo las líneas de albaranes pendientes de facturar de Demos del usuario que accede al BC.
field(50102; JTRSalesShipmentPending; Integer)
{
Caption = ‘Normal Sales Shipment Pending Invoicing’, Comment = ‘ESP=”Albaranes Venta Pendientes Facturar”‘;
Editable = false;
FieldClass = FlowField;
CalcFormula = count (“Sales Shipment Line” where(“Type” = Filter(Item | Resource | “G/L Account”), “Qty. Shipped Not Invoiced” = Filter(<> 0)));
}Gracias,
17 abril 2020 a las 12:12 #1015852
Cristina NicolàsSuperadministradorCristina NicolàsHola,
No podrás hacerlo con un FlowField, puesto que no podrás filtrar por campos que no están en “Sales Shipment Line” sino que están en “Sales Shipment Header”.
Fíjate en las colas que existen en el estándar. Es cierto que la mayoría de cosas que muestra las consigue con un FlowField.
Pero hay algunas que no las puede conseguir con un FlowField. Entonces crea un campo normal y lo calcula en el OnOpenPage de la página que muestra la cola. Para ello, crea una función que tiene el desarrollo necesario para calcular el número a mostrar.
Después además crea otra función para el trigger OnDrillDown para que el usuario pueda navegar.Un saludo,
Cristina Nicolàs17 abril 2020 a las 16:16 #1015868
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
He creado la siguiente query, la cual no se si está del todo correcta (aun no entiendo muy bien como es el funcionamiento de las query), pero sino lo he entendio mal he ido enlazando desde la tabla “Sales Shipment Line” –> “Sales Shipment Header” –> “Sales Header” poniendo los campos por los que voy a tener que filtrar en la codeunit a crear
query 50100 “JTRCalcCueData”
{
QueryType = Normal;elements
{
dataitem(S_S_L; “Sales Shipment Line”)
{
column(Qty_S_N_I; “Line No.”)//Lineas a contar según los filtros que pongamos para mostrarlo en el CUE
{
Method = Sum;
}filter(Type_Line; “Type”)//Para filtrar en la Codeunit por este campo Item | Resource | “G/L Account”
{}
filter(Q_S_N_I; “Qty. Shipped Not Invoiced”)//Para filtrar en la Codeunit por este campo <>0
{}
dataitem(S_S_H; “Sales Shipment Header”)
{
DataItemLink = “No.” = S_S_L.”Document No.”; //Enlazamos por el No. del documento ambas tablas Sales Shipment Line y Sales Shipment Header
SqlJoinType = InnerJoin;
dataitem(S_H; “Sales Header”)
{
DataItemTableFilter = “Document Type” = CONST(Order); // Filtramos para que solo mire en pedidos de venta
DataItemLink = “No.” = S_S_H.”Order No.”; //Enlazamos por el No. del documento ambas tablas Sales Shipment Header y Sales Header
filter(User_ID; “Assigned User ID”) //Para poder filtrar en la Codeunit por el ID usuario asignado al pedido
{}
}
}
}
}
}Gracias,
18 abril 2020 a las 02:06 #1015883
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
En la query he modificado el valor del method por Count
Este:
column(Qty_S_N_I; «Line No.»)//Lineas a contar según los filtros que pongamos para mostrarlo en el CUE
{
Method = Sum;
}por
column(Qty_S_N_I)//Lineas a contar según los filtros que pongamos para mostrarlo en el CUE
{
Method = Count;
}He creado una codeunit para aplicar los filtros y que me muestre el valor, pero el total que me muestra es diferente que el que se muestra y si lo calculo con: CalcFormula = count (“Sales Shipment Line” where(“Type” = Filter(Item | Resource | “G/L Account”), “Qty. Shipped Not Invoiced” = Filter(<> 0)));
La Codeunit es:
codeunit 50100 “JTRQueryCodeUnit”
{
trigger OnRun()
begin
//Filtramos para mostrar solo las líneas de los albaranes pendientes de facturar
VQueryCalcCueData.SetFilter(VQueryCalcCueData.Type_Line, ‘Item | Resource | G/L Account’);
VQueryCalcCueData.SetFilter(VQueryCalcCueData.Qty_S_N_I, ‘<>0’);VQueryCalcCueData.Open();
VQueryCalcCueData.Read();
Message(Format(VQueryCalcCueData.Qty_S_N_I));
VQueryCalcCueData.Close();
end;var
VQueryCalcCueData: Query JTRCalcCueData;
}No deberían de mostrar el mismo valor??
Gracias,
21 abril 2020 a las 00:44 #1016053
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
Ya he encontrado el error estaba en: VQueryCalcCueData.SetFilter(VQueryCalcCueData.Qty_S_N_I, ‘<>0’); no era el campo correcto, el correcto era: VQueryCalcCueData.SetFilter(VQueryCalcCueData.Q_S_N_I, ‘<>0’);
La duda que tengo ahora es ¿Cómo se abre la página nueva al hacer el drilldown con los mismos filtros que he utilizado en la query para hacer el cálculo? es decir, que muestre los registros filtrados.
Gracias,
22 abril 2020 a las 01:08 #1016098
Cristina NicolàsSuperadministradorCristina NicolàsPara hacer el DrillDown tendrás que hacer algo parecido a lo que has hecho con la Query… pero sin la Query… cosa que no es nada fácil porque para abrir una página solo podrás poner filtros sobre los registros de la tabla que muestra la página, y no podrás poner filtros sobre otras tablas como estás haciendo con la Query.
Aquí tienes varias opciones:
1. Abres la página sin poder poner los filtros que realmente quisieras, de modo que el usuario verá más registros de la cuenta
2. Creas una página temporal, con lo que tendrás que buscar los registros a mostrar y hacer un Insert en el OnOpenPage
3. Creas en la tabla los campos necesarios para poder filtrar por ellos y que no tengas que buscar en 3 tablas distintasYo dependiendo de la situación, de la importancia de los filtros, de cuanto desarrollo me supone cada una de las opciones, etc., he utilizado las 3 alternativas.
A veces abro la página normal aunque no tenga los filtros.
A veces creo la página temporal.
A veces opto por crear (y mantener) los campos que necesito para poder filtrar.Un saludo,
Cristina Nicolàs22 abril 2020 a las 12:05 #1016113
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
Voy a intentar hacerlo con la opción 2 lo de la página temporal para evitar crear campos extendiendo la tabla de líneas de albaranes.
Hay alguna parte donde pueda ver como se crea esa página temporal, actualmente he creado una página con los campos que necesita ver cada usuario, obteniendo los datos de la tabla de líneas de albaranes, y sería que apareciera filtrado esos datos por los que la cantidad pendiente de facturar sea <>0, por 1 o 2 campos de la cabecera del albarán correspondiente y por el id del usuario del pedido de ese albarán.
Gracias,
24 abril 2020 a las 23:35 #1016198
Cristina NicolàsSuperadministradorCristina NicolàsPara hacer una página temporal, tienes que poner en la página la propiedad
SourceTableTemporary = true;Con esto, tienes que pensar que la variable global Rec es como si fuera una variable temporal.
De inicio la página estará vacía y no mostrará nada.
En estos casos, lo que hacemos es en el trigger OnOpenPage() vamos a buscar la información que necesitamos y hacemos Inserts sobre la variable Rec.Un saludo,
Cristina Nicolàs29 abril 2020 a las 10:30 #1016285
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
Ya he conseguido abrir una página aplicando múltiples filtros, gracias a la pista que me dieron en el ScaleUp2020.
He cambiado la Query por un procedimiento donde hago un filtro de una tabla y concateno el resultado con “|” en una variable que luego aplico como filtro en la otra tabla.
El código por si a alguien le puede servir:
……
begin
//Filtramos los Documentos de Ventas por Tipo Pedido y por el Id Del usuario
SalesHeader.SetFilter(“Document Type”, ‘Order’);
SalesHeader.SetFilter(“Assigned User ID”, database.UserId());//Concatenamos por el caracter | todos los Nº de Pedidos del Usuario
if SalesHeader.Find(‘-‘) then
repeat
OrderSales += SalesHeader.”No.” + ‘|’;
until (SalesHeader.Next() = 0);SalesHeader.SetFilter(“No.”, ”); // Es para quitar el aviso de que se tiene que modificar.
SalesHeader.Reset();OrderSales := DelChr(OrderSales, ‘>’, ‘|’); // Es para eliminar el último caracter de la cadena concatenada
SalesShipmentLine.SetFilter(“Type”, ‘Item | Resource | G/L Account’);
SalesShipmentLine.SetFilter(“Qty. Shipped Not Invoiced”, ‘<>0’);
SalesShipmentLine.SetFilter(“Order No.”, OrderSales);…….
Y luego un page.Run(PAGE::JTRSalesShipPendInvo, SalesShipmentLine);
Gracias,
29 junio 2020 a las 23:07 #1017377
administracion@riversa.esParticipanteadministracion@riversa.esBuenas noches:
He creado otro procedimiento similar al anterior para contar el número de líneas para poder mostrarlo en el contador del Cue
procedure CountShipment(Opcion: text) CountLine: integer
……….
case Opcion of
‘CountNormalShipment’:
begin
;
CountLine := SalesShipmentLine.count();
exit(CountLine);……….
Esto en principio cuenta correctamente.
Ahora en la página donde se recogen los campos de los Cue que se muestran llamo al procedimiento para insertar el valor en el campo field
…..
field(JTRSalesShipmentPending; CountLine) //No puede ser de tipo Codeunit
{….
El valor no puede ser Codeunit por lo que como convierto de Codeunit a Integer por ejemplo.
He definido estas variables:
CountNormalShipment: Codeunit JTRQueryCodeUnit;
CountLine: Integer;Llamo a la función del procedimiento:
CountNormalShipment.CountShipment(‘CountNormalShipment’);
CountLine := CountNormalShipment; // Esto da error
No se como poner el resultado devuelto al llamar a la codeunit dentro de una varible para poderla insertar como valor en el campo field.
No se si me he explicado.
Gracias,
, en una codeunit. Este lo llamo desde la página Cue para insertar el resultado en el campo field
En el campo field de la página Cue se puede poner una variable como el tipo de campo
29 junio 2020 a las 23:43 #1017378
administracion@riversa.esParticipante1 julio 2020 a las 00:07 #1017386
Debe iniciar sesión para responder a este tema.