2017-10-05 1 views
1

Mon objectif est d'effectuer un regroupement multi-niveau dans jqGrid et d'ajouter un pied de page récapitulatif pour chaque niveau.jqGgrid: valeur de résumé de regroupement de niveau multiple

J'ai utilisé le code sur leur site officiel pour modifier dynamiquement le regroupement que j'ai étendu pour faire un groupement dynamique à trois niveaux.

J'ai créé 3 combobox pour choisir le nom de la colonne liée au regroupement de chaque niveau.

J'ai atteint le groupement de niveau multiple mais j'ai un problème ici que le pied de page résumé est par page et pas la somme totale de toutes les lignes dans chaque groupe.

J'ai essayé plusieurs solutions: l'un d'eux, la solution implémentée dans ce lien http://www.guriddo.net/demo/guriddojs/grouping/summary_and_grand_total/index.html mais ça n'a pas fonctionné pour moi.

J'ai essayé de personnaliser la fonction summaryType pour calculer les lignes de somme pour chaque groupe du côté client, mais je ne peux pas.

Maintenant, j'ai préparé la liste groupée par le premier niveau sur le côté serveur et ensuite je l'ai dans le côté client pour remplir le pied de page de sommation en utilisant "userdata". ceci est ma fonction:

var sumArraySearch = []; 
var criteria = '';// column name selected in Combobox to do the grouping 
function sumSearch(val, name, record) 
{ 
    if(init == 0){ 
     // console.log ($("#griddata").jqGrid('getGridParam','userData').rows); 
     var rows = $("#griddata").jqGrid('getGridParam','userData').rows; 
     var size = $("#griddata").jqGrid('getGridParam','userData').rows.length; 
     for (var i = 0; i < size; i++) { 
      sumArraySearch[rows[i][criteria]]= rows[i]['brutto']; 

     } 
     init ++; 
    } 
    return sumArraySearch[record[criteria]]; 
} 

Et je suis bloqué maintenant, si j'envoie 2 listes de serveur: le premier est les données regroupées par le premier niveau et le second est les données groupées par le second niveau comment peut Je reçois la somme correcte pour chaque groupe puisque la somme est retournée par une fonction?

EDIT:

J'ai préparé une démo JSFiddle pour démontrer le problème.

+0

1) Vous utilisez 'loadOnce: true' au lieu de' loadonce: true' dans votre code. Vous devriez corriger l'option. 2) Veuillez inclure les informations sur la ** version ** de jqGrid, que vous utilisez (peut utiliser), et la ** fork ** de jqGrid ([free jqGrid] (https://github.com/free-jqgrid/jqGrid), commercial [Guriddo jqGrid JS] (http://guriddo.net/?page_id=103334) ou un ancien jqGrid en version <= 4.7). 3) Si vous utilisez une branche jqGrid libre, alors je vous recommande d'ajouter 'forceClientSorting: true', qui étend l'option' loadonce: true'. 4) Ce serait bien si vous préparez la démo de JSFiddle, ce qui démontre le problème. – Oleg

+0

Pouvez-vous s'il vous plaît préparer une démo de travail avec des données? Seulement de cette façon est possible de rechercher le problème décrit –

+0

@Oleg: J'utilise gratuitement jQgrid 4.4.3. Est la solution pour mettre à jour la version à 4.7? – nayomi

Répondre

0

Le problème principal, que je vois: votre démo nécessite le groupement dynamique, où l'utilisateur choisit l'ordre des colonnes. Cela rend tout calcul côté serveur sans valeur. Si vous avez vraiment ordre fixe de regroupement alors vous devez simplifier la structure de userData pour permettre simplement obtenir la somme requise par agt, par exemple,

userData: { 
    brutto: "1593.2", 
    sums: { "455": "462.96", "806": "1130.06" } 
} 

Il permet de simplifier la fonction summaryType à

summaryType: function sumSearch(val, name, record, groupInfo) { 
    var p = $(this).jqGrid("getGridParam"); 
    return p.userData.sums[record.agt]; 
} 

ou

summaryType: function sumSearch(val, name, record, groupInfo) { 
    var p = $(this).jqGrid("getGridParam"); 
    return p.userData.sums[groupInfo.keys[0]]; 
} 

Voir https://jsfiddle.net/OlegKi/d2v0neo5/43/.

Si vous avez vraiment besoin que l'utilisateur choisir les colonnes de regroupement et l'ordre de regroupement dynamique alors vous devrez calculer la somme du côté client. Vous pouvez utiliser, par exemple, le paramètre p.lastSelectedData pour accéder aux données complètes de toutes les pages dans l'ordre correct, examiner p.groupingView.groupField pour connaître l'oder actuel des colonnes de regroupement et utiliser le tableau groupInfo.keys pour voir toutes les clés du groupe actuel.Vous obtiendrez un code plus complexe, mais vous pouvez calculer la somme ayant localement l'information et la retourner de summaryType.