Un foro de discusión para nuestra comunidad de hispano hablante

Moderator: amosbatto

By gguerrero
#823712
Estimados(as),

Estoy tratando de sumar toda la columna de una grid y mostrar ese valor en un textbox utilizando este código
Code: Select all
$("#total_compra_grid").getSummary("total_compra")
Puse ese código en la fórmula del textbox (total_compra) y no muestra nada. También me preocupé de que el valor del textbox fuese integer y que el campo estuviera desabilitado para cambios (disabled) y aún así no funciona.

Ojalá alguien me ayude a encontrar en qué me estoy equivocando, de antemano gracias!

Saludos
By gguerrero
#823741
Amoss,

Entiendo el ejemplo, pero no puedo adaptarlo a lo que quiero.... Mi idea es calcular la sumatoria de la columna subtotal (de tu ejemplo) y agregar ese valor en un textbox que esté fuera de la grid y que se actualice a medida que hayan variaciones en los valores y/o cantidad de columnas de la grid.

Otra cosa que me gustaría conseguir es hacer algo parecido, pero con strings... por ejemplo si en una grid tengo un dropdown con 5 opciones y una persona llena esa grilla con 3 filas y cada una con la opcione "1", "2" y "5" respectivamente, me gustaría obtener en un textbox la unión de estas, es decir "1, 2, 5" y si por ejemplo son 4 filas seleccionando las opciones "2", "2", "3" y "4" que en el textbox se obtenga "2,3,4".

Ojalá sea posible de hacer, muchas gracias de antemano

Saludos
By gguerrero
#823744
Amoss,

Adapté el código que pusiste para obtener lo que necesito, pero no me obtiene la suma...
Code: Select all
var gridId = "total_compra_grid";  //set to grid's ID
var subtotalId = 'total_compra'; //set to the ID of the "subtotal" grid field
var subtotalColNo = 1;       //set to the column number of the "subtotal" grid field


var formId = $("form").prop("9205468475a8b16551ba0b4035219473");

//execute when value in form changes:
$("#"+formId).setOnchange( function(fieldId, newVal, oldVal) {
    recalculateGrid();
});

recalculateGrid(); //execute when Dynaform loads

$("#"+gridId).onDeleteRow( function(oGrid, aRow, rowIndex) {
  recalculateGrid();
});


//function to recalculate the percentOfTotal in every row of grid
function recalculateGrid() {
  var oGrid = $("#"+gridId);
  var total = oGrid.getSummary(subtotalId);
  $("total_acumulado").setValue(total);

}
User avatar
By amosbatto
#823752
gguerrero wrote:Adapté el código que pusiste para obtener lo que necesito, pero no me obtiene la suma...
No has conseguido la ID del Dynaform correctamente.

Puedes setear la ID del Dynaform en tu código:
var formId = "9205468475a8b16551ba0b4035219473";

o puedes usar JavaScript para obtener la ID:
var formId = $("form").prop("id");

Pruebalo así:
Code: Select all
var gridId = "total_compra_grid"; //set to grid's ID
var subtotalId = 'total_compra'; //set to the ID of the "subtotal" grid field
var subtotalColNo = 1; //set to the column number of the "subtotal" grid field
var formId = "9205468475a8b16551ba0b4035219473"; //set to ID of Dynaform

//execute when value in form changes:
$("#"+formId).setOnchange( function(fieldId, newVal, oldVal) {
 recalculateGrid();
});

recalculateGrid(); //execute when Dynaform loads

$("#"+gridId).onDeleteRow( function(oGrid, aRow, rowIndex) {
 recalculateGrid();
});

//function to recalculate the percentOfTotal in every row of grid
function recalculateGrid() {
 var oGrid = $("#"+gridId);
 var total = oGrid.getSummary(subtotalId);
 $("total_acumulado").setValue(total);
}
User avatar
By amosbatto
#823754
gguerrero wrote: Wed Apr 03, 2019 8:46 am Otra cosa que me gustaría conseguir es hacer algo parecido, pero con strings... por ejemplo si en una grid tengo un dropdown con 5 opciones y una persona llena esa grilla con 3 filas y cada una con la opcione "1", "2" y "5" respectivamente, me gustaría obtener en un textbox la unión de estas, es decir "1, 2, 5" y si por ejemplo son 4 filas seleccionando las opciones "2", "2", "3" y "4" que en el textbox se obtenga "2,3,4".
Puedes usar codigo como este:
Code: Select all
var gridId = "total_compra_grid"; //set to grid's ID
var dropdownId = 'seleccionar'; //set to the ID of the dropdown in grid
var dropdownColNo = 3; //set to the column number of the dropdown in grid
var formId = "9205468475a8b16551ba0b4035219473"; //set to ID of Dynaform

//set to ID of field holding list of options selected in dropdown in grid:
var selectedListId = 'lista_seleccionados';  

var reChangedDropdown = RegExp("^\\["+gridId+"\\]\\[(\\d+)\\]\\["+dropdownId+"\\]$");

//execute when value in form changes:
$("#"+formId).setOnchange( function(fieldId, newVal, oldVal) {
  if (fieldId.match(reChangedDropdown)) {
    fillSelectedList();
  }
});

fillSelectedList(); //execute when Dynaform loads

//execute when a grid row is deleted:
$("#"+gridId).onDeleteRow( function(oGrid, aRow, rowIndex) {
  fillSelectedList();
});

//function to place a list of the selected options in a dropdown in a grid 
//in a text field outside the grid:
function fillSelectedList() {
  var aSelectedOpts = [];
  var oGrid = $("#"+gridId);
  var rowCount = oGrid.getNumberRows();
  
  for (var i = 1; i <= rowCount; i++) {
    aSelectedOpts.push( oGrid.getValue(i, dropdownColNo) );
  }
  
  //eliminate duplicate selected options:
  var aUniqueOpts = [];
  $.each(aSelectedOpts, function(i, opt) {
    if (aUniqueOpts.indexOf(opt) === -1) { 
      aUniqueOpts.push(opt);
    }
  });
  
  var optsList = aUniqueOpts.join(", ");
  $("#"+selectedListId).setValue(optsList);
}
By gguerrero
#823777
Amos,

En primer lugar muchas gracias por tu ayuda, pero lamentablemente no me está funcionando del todo. El código para la suma no me imprime el valor en el textbox, pero más allá de eso revisé qué tenía la variable total y resulta que siempre es 0, por lo que no está sumando. Por otro lado el código para las palabras funciona casi perfecto, salvo que imprime las id´s de las opciones en el dropbox y no el valor del label que es el que necesito.

Adjunto Dynaform para que veas cómo me funcionan.

Saludos y gracias nuevamente
Attachments
(42.72 KiB) Downloaded 23 times
User avatar
By amosbatto
#823788
gguerrero wrote:Por otro lado el código para las palabras funciona casi perfecto, salvo que imprime las id´s de las opciones en el dropbox y no el valor del label que es el que necesito.
Para conseguir los labels, puedes usar este código:
Code: Select all
//ACUMULADOR DE PALABRAS
var gridId2 = "tipo_compra_grid"; //set to grid's ID
var dropdownId = 'tipo_compra_detalle'; //set to the ID of the dropdown in grid
var dropdownColNo = 1; //set to the column number of the dropdown in grid

var formId = $("form").prop("id"); //get the ID of Dynaform

//set to ID of field holding list of options selected in dropdown in grid:
var selectedListId = 'tipo_compra_acumulado';  

var reChangedDropdown = RegExp("^\\["+gridId2+"\\]\\[(\\d+)\\]\\["+dropdownId+"\\]$");

//execute when value in form changes:
$("#"+formId).setOnchange( function(fieldId, newVal, oldVal) {
  console.log(reChangedDropdown, fieldId);
  if (fieldId.match(reChangedDropdown)) {
    fillSelectedList();
  }
});

fillSelectedList(); //execute when Dynaform loads

//execute when a grid row is added:
$("#"+gridId2).onAddRow( function(oGrid, aRow, rowIndex) {
  fillSelectedList();
});

//execute when a grid row is deleted:
$("#"+gridId2).onDeleteRow( function(oGrid, aRow, rowIndex) {
  fillSelectedList();
});

//function to place a list of the selected options in a dropdown in a grid 
//in a text field outside the grid:
function fillSelectedList() {
  var aSelectedOpts = [];
  var oGrid = $("#"+gridId2);
  var rowCount = oGrid.getNumberRows();
  var aOptsList = getFieldById(gridId2).getInfo().columns[0].options;
  
  for (var i = 1; i <= rowCount; i++) {
    var selectedVal = oGrid.getValue(i, dropdownColNo);
    
    //find the label for the selected option's value and add it to aSelectedOpts array
    $.each(aOptsList, function(i, oOption) {
       if (oOption.value == selectedVal) {
         aSelectedOpts.push( oOption.label );
         return false;
       }
    });
  }
  
  //eliminate duplicate selected options:
  var aUniqueOpts = [];
  $.each(aSelectedOpts, function(i, opt) {
    if (aUniqueOpts.indexOf(opt) === -1) { 
      aUniqueOpts.push(opt);
    }
  });
  
  var selectedList = aUniqueOpts.join(", ");
  $("#"+selectedListId).setValue(selectedList);
}
User avatar
By amosbatto
#823789
gguerrero wrote:En primer lugar muchas gracias por tu ayuda, pero lamentablemente no me está funcionando del todo. El código para la suma no me imprime el valor en el textbox, pero más allá de eso revisé qué tenía la variable total y resulta que siempre es 0, por lo que no está sumando.
No has seteado function al "sum" en la propiedades, entonces getSummary() no funcionó.
No debes usar form.setOnchange mas que una vez por dynaform porque sobreescribe el event handler existente.
Lo que tienes que hacer es unir todo en solo un event handler.

He arreglado tu Dynaform:
(45.49 KiB) Downloaded 30 times

Thanks!

Hi, This user API https://wiki.processmaker.com/[…]

display pdf in panel control

Is there any solution?