I´m trying to create an editable grid in which the user can add or delete several rows.
I have four columns (Material,Unit Price, Quantity, Total Price), and TotalPrice is the product of Price and Quantity (when the user enters both values, the product is created automatically). But the fact is that, even though the product is created correctly, it seems like it is not saved correctly like the other data values
Here is a picture of the interface
In the next picture you can see the column "Importe Total" and its values don´t appear
To create the editable grid and save the values temporarily (because after that I write them to a record) I created a local variable (data). Basically, I followed the instruction of an Appian Community Video about editable grids from scratch. I leave here the code and some captures.
In the end, I updated the records directly in the interface. I don´t know if it is a correct way to do it, or if I should write the records in the process model as a best practice:
Any help would be useful. Thanks a lot!
a!localVariables( local!data, { a!sectionLayout( label: "", contents: { a!columnsLayout( columns: { a!columnLayout( contents: { a!textField( label: "Id Factura", labelPosition: "ABOVE", value: ri!recordFact['recordType!{51d44df6-c727-4443-8114-aef8a7509b41}CPF Maestro Facturas.fields.{6f993c32-7f64-424a-859f-d779194c4a18}id_factura'], saveInto: ri!recordLineasFact['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{9c440183-9c71-423b-a300-eb4c3ea747fb}idFactura'], refreshAfter: "UNFOCUS", validations: {} ) } ), a!columnLayout( contents: { a!textField( label: "Id Pedido", labelPosition: "ABOVE", value: ri!recordFact['recordType!{51d44df6-c727-4443-8114-aef8a7509b41}CPF Maestro Facturas.fields.{e8009662-ca1c-43da-9c72-2840463214be}id_pedido'], saveInto: ri!recordLineasFact['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{60774c8e-9b47-486f-9fea-b32c525c05fd}idPedido'], refreshAfter: "UNFOCUS", validations: {} ) } ), a!columnLayout( contents: { a!textField( label: "Proveedor", labelPosition: "ABOVE", value: ri!recordFact['recordType!{51d44df6-c727-4443-8114-aef8a7509b41}CPF Maestro Facturas.fields.{c2a60669-567e-41b8-acdd-29729912b3e5}nomProveedor'], saveInto: ri!recordLineasFact['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{844be35b-6de5-434e-9c69-e7c7b8a148dd}proveedor'], refreshAfter: "UNFOCUS", validations: {} ) } ) } ) } ), a!gridLayout( label: "A continuación, incorpore las líneas de factura correspondientes y pulse el botón de creación", headerCells: { a!gridLayoutHeaderCell(label: "Material"), a!gridLayoutHeaderCell(label: "Precio Unitario"), a!gridLayoutHeaderCell(label: "Cantidad"), a!gridLayoutHeaderCell(label: "Importe Total"), a!gridLayoutHeaderCell() }, columnConfigs: { a!gridLayoutColumnConfig(width:"DISTRIBUTE"), a!gridLayoutColumnConfig(width:"DISTRIBUTE"), a!gridLayoutColumnConfig(width:"DISTRIBUTE"), a!gridLayoutColumnConfig(width:"DISTRIBUTE"), a!gridLayoutColumnConfig(width:"ICON") }, rows: a!forEach( items: local!data, expression: a!gridRowLayout( contents: { a!textField(value:fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{019eb28b-727b-4e2c-8160-1bcf8a747ef1}material'], saveInto: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{019eb28b-727b-4e2c-8160-1bcf8a747ef1}material'] ), a!floatingPointField( value: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'], saveInto: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'], required: true, validations: {if(a!isNotNullOrEmpty(fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'])=false,"", if( fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'] < 0, "El precio unitario debe ser superior a cero", "" ))}), a!integerField( value: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad'], saveInto: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad'], required: true, validations: {if(a!isNotNullOrEmpty(fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad'])=false,"", if( fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad'] < 1, "La cantidad debe ser superior a cero", "" ))}), a!floatingPointField( value: if( or(isnull(fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad']), isnull(fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'])), 0, fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{b1b5fc0b-5be4-45be-8342-381cdc56017d}cantidad'] * fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{eda9bda7-ae57-44e7-a651-d097c8581021}precioUnit'] ), saveInto: fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{53f231a2-9bf7-40a1-af07-74373fa7bd9f}importe'], required: true, validations: {if(a!isNotNullOrEmpty(fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{53f231a2-9bf7-40a1-af07-74373fa7bd9f}importe'])=false,"", if( fv!item['recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura.fields.{53f231a2-9bf7-40a1-af07-74373fa7bd9f}importe'] < 0, "El importe debe ser superior a cero", "" ))}, align: "RIGHT" ), a!richTextDisplayField( value: { a!richTextIcon( icon: "times-circle", link: a!dynamicLink( value: remove(local!data, fv!index), saveInto: local!data ), linkstyle: "STANDALONE", color: "NEGATIVE" ) } ) } ) ), addrowlink: a!dynamicLink( label: "Añadir nueva Línea de Factura", value: append( local!data, 'recordType!{6e637180-b344-49d2-a1f7-f87eed0041ba}CPF Lineas Factura'() ), saveInto: local!data ) ) , a!buttonLayout( primaryButtons: { a!buttonWidget( label: "Completar Creación Factura", saveInto: a!writeRecords( records:local!data, onSuccess: a!save(local!data, fv!recordsUpdated) ), submit: true, style: "PRIMARY", validate:true ) }, secondaryButtons: { a!buttonWidget( label: "Cancelar", value: true, saveInto: ri!cancel2, submit: true, style: "NORMAL", validate: false ) } ) } )
Discussion posts and replies are publicly visible
The problem is, that you try to display the calculated value only in the field without writing it into the underlying data. I think that I already tried to explain that to you in another conversation.
I suggest to do the calculation in the saveInto of the two fields that are used to calculate the value and write the result to "importe".
Alright, I understand. I´m trying to use this code but it is still saving a null value:
Am I doing anything incorrect in the code?
Which field is this? The "Importe Total"? If yes, I suggest to read again the last sentence in my last post.
I misunderstood you Stefan. I thought you were referring to put the calculation inside the save into of "Importe total".
If I´m correct, I have to put the calculation in the "save into" of both fields ("Precio Unitario" and "Cantidad"). But the fact is that I already have a "Save Into" code in those cases, to store the value of the field. I don´t know how to add the calculation there
How can I add my expression without deleting the actual one?
The saveInto parameter takes a list. Use curly brackets and a!save() to create any number of assignments you need.