J'essaie de parcourir un DataTable pour récupérer la valeur de deux colonnes, la première contient et ID et la seconde le montant afin que je puisse créer un tableau à transmettre pour mettre à jour l'ID avec le montant de la base de données. Mon code renvoie «indéfini». Comment puis-je renvoyer la valeur de la colonne «x» pour chaque ligne s'il vous plaît?

function disperse() {
    memDispTable.rows().every(function() {
        var row = this.data();
        console.log(row[0]);
    //  Create array to send for updating
    });
}

Dans la colonne DataTable 0 se trouve:

{data: 'cdId',
visible: false,
searchable: false},

La colonne 6 (le montant à mettre à jour) est un champ de saisie:

{data: null,
className: "center",
defaultContent: '<input class="ilValue" type="number" min="0" max="99999.99" step=".01" placeholder="0.00">'
},

Le résultat de:

    var row = this.data();
    console.log(row);

Est:

cdFirstName: "Tendon"
cdId: "MTQ5"
cdSurname: "Achilles"
grpId: "MQ=="
section: "Cub"
__proto__:
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()

Je suis maintenant en train de parcourir les lignes. La première ligne contient un montant:

enter image description here

Cependant, lorsque j'itère dans le total, le total est renvoyé pour une ligne différente:

enter image description here

Et lorsque je trie, le total est à nouveau renvoyé pour une ligne différente:

enter image description here

Le total sur la page reste avec la ligne correcte une fois trié (c'est-à-dire Glyn Bartlett).

Mon code est:

function postDispersements() {
    //Disperse the amounts to each person
    
    //Iterate through each row
    memDispTable.rows().data().each( function ( rowData, index ) {
        
        var scoutNo = rowData.scoutNumber;
        var surname = rowData.cdSurname;
        var firstName = rowData.cdFirstName;
        
        var amtNode = memDispTable.cells(index, 7).nodes().to$()[0];//Total column
        var amt = parseFloat($('input', amtNode ).val());
        
        if (isNaN(amt)) {
          amt = 0.0;
        }
        amt = (Math.floor((amt + Number.EPSILON) * 100) / 100).toFixed(2);
        
        //There are a large number of records so only log the rows with an amount
        if (amt > 0) {
            console.log("scoutNo: " + scoutNo + " surname: " + surname + " firstName: " + firstName + " amt: " + amt);
        }
    });
}
1
Glyn 16 août 2020 à 03:12

1 réponse

Juste pour que ce soit clair au cas où quelqu'un d'autre se trouverait dans une situation similaire. Si vous utilisez:

tablename.rows().data().each( function ( rowData, index ) {

Ensuite, dans la boucle, n'utilisez pas:

var surname = rowData.surname;

Comme la valeur renvoyée peut ne pas être dans la même ligne que:

var amtNode = memDispTable.cells(index, 7).nodes().to$()[0];//Total column
var amt = parseFloat($('input', amtNode ).val());// Returns the value in the 

Utilisez-le à la place:

var surname = memDispTable.cell( index, 3 ).data();

Et toutes les valeurs renvoyées seront dans la même ligne.

En entier:

function postDispersements() {
//Disperse the amounts to each person

    //Iterate through each row
    memDispTable.rows().data().each( function ( rowData, index ) {
    
        //var surname = rowData.surname; //Do not use this it will return a value; however, may not the the same row as your <input>
        var surname = memDispTable.cell( index, 3 ).data(); // Use this
    
        var amtNode = memDispTable.cells(index, 7).nodes().to$()[0];//Total column
        var amt = parseFloat($('input', amtNode ).val());// Returns the value in the <input>
    
    });
}
1
Glyn 25 août 2020 à 03:05