• Este debate tiene 10 respuestas, 2 mensajes y ha sido actualizado por última vez el hace 2 meses, 3 semanas por Avataradministracion@riversa.es.
Viendo 11 entradas - de la 1 a la 11 (de un total de 11)

Respuestas del foro


  • administracion@riversa.es

    Buenos 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,

    #1015852
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Hola,

    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às

    #1015868
    administracion@riversa.es

    Buenas 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,

     

    #1015883
    administracion@riversa.es

    Buenas 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,

    #1016053
    administracion@riversa.es

    Buenas 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,

    #1016098
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Para 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 distintas

    Yo 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às

    #1016113
    administracion@riversa.es

    Buenas 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,

    #1016198
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Para 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às

    #1016285
    administracion@riversa.es

    Buenas 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,

     

     

     

    #1017377
    administracion@riversa.es

    Buenas 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

    #1017378
    administracion@riversa.es

    Buenas noches:

    Ya se ha resuelto misteriosamente creando una variable de tipo integer con otro nombre al que estaba utilizando.

    Puede que fuese porque se estaba utilizando ese mismo nombre dentro del procedimiento.

    Gracias,

    #1017386
Viendo 11 entradas - de la 1 a la 11 (de un total de 11)

Debe iniciar sesión para responder a este tema.