Je crée une table HTML dynamique qui a col-span à l'intérieur, le problème est que je ne peux pas créer ces en-têtes de col-span dynamiquement. Voici mon json
json
[{ "billdate": "2018-09-01", "outlet": "JAYANAGAR", "discount": 513, "GST": 25357, "amount": 476426 }, { "billdate": "2018-09-01", "outlet": "MALLESHWARAM", "discount": 0, "GST": 4930, "amount": 92141 }, { "billdate": "2018-09-01", "outlet": "KOLAR", "discount": 0, "GST": 5966, "amount": 115313 }, { "billdate": "2018-09-02", "outlet": "JAYANAGAR", "discount": 471, "GST": 28319, "amount": 511153 }, { "billdate": "2018-09-02", "outlet": "MALLESHWARAM", "discount": 0, "GST": 6198, "amount": 115704 }, { "billdate": "2018-09-02", "outlet": "KOLAR", "discount": 0, "GST": 4254, "amount": 83597 }, { "billdate": "2018-09-03", "outlet": "JAYANAGAR", "discount": 263, "GST": 9944, "amount": 167421 }, { "billdate": "2018-09-03", "outlet": "KOLAR", "discount": 0, "GST": 2693, "amount": 53775 } ]
billdate
et outlet
sont l'en-tête parent à l'intérieur des points de vente
, c'est-à-dire Jayanagar
, malleshwaram
et kolar
ici, j'ai d'autres valeurs d'objet, c'est-à-dire brut ,
réduction
, GST
et montant
brut
, remise
, GST
et montant
sont comme col-span que je crée statiquement comme innerHTML=gross
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"> <div align="left" class="table table-responsive" id="commonDvScroll"> <table id="dailySales"></table> </div>
var data = [{ "billdate": "2018-09-01", "outlet": "JAYANAGAR", "gross": 451458, "discount": 513, "GST": 25357, "amount": 476426 }, { "billdate": "2018-09-01", "outlet": "MALLESHWARAM", "gross": 87190, "discount": 0, "GST": 4930, "amount": 92141 }, { "billdate": "2018-09-01", "outlet": "KOLAR", "gross": 109308, "discount": 0, "GST": 5966, "amount": 115313 }, { "billdate": "2018-09-02", "outlet": "JAYANAGAR", "gross": 483194, "discount": 471, "GST": 28319, "amount": 511153 }, { "billdate": "2018-09-02", "outlet": "MALLESHWARAM", "gross": 109483, "discount": 0, "GST": 6198, "amount": 115704 }, { "billdate": "2018-09-02", "outlet": "KOLAR", "gross": 79305, "discount": 0, "GST": 4254, "amount": 83597 }, { "billdate": "2018-09-03", "outlet": "JAYANAGAR", "gross": 157660, "discount": 263, "GST": 9944, "amount": 167421 }, { "billdate": "2018-09-03", "outlet": "KOLAR", "gross": 51059, "discount": 0, "GST": 2693, "amount": 53775 } ] let formatData = function(data) { let billdates = []; let outlets = []; data.forEach(element => { if (billdates.indexOf(element.billdate) == -1) { billdates.push(element.billdate); } if (outlets.indexOf(element.outlet) == -1) { outlets.push(element.outlet); } }); return { data: data, billdates: billdates, outlets: outlets, }; }; let renderTable = function(data) { billdates = data.billdates; outlets = data.outlets; data = data.data; let tbl = document.getElementById("dailySales"); let table = document.createElement("table"); let thead = document.createElement("thead"); let headerRow = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = "BillDate"; th.classList.add("text-center"); headerRow.appendChild(th); let grandTotal = 0; let grandGross = 0; let grandDiscount = 0; let grandGst = 0; let outletWiseTotal = {}; let outletWiseGross = {}; let outletWiseDiscount = {}; let outletWiseGst = {}; th = document.createElement("th"); th.colSpan = 4; th.innerHTML = "Total"; th.classList.add("text-center"); headerRow.appendChild(th); outlets.forEach(element => { th = document.createElement("th"); th.colSpan = 4; th.innerHTML = element; th.classList.add("text-center"); headerRow.appendChild(th); outletWiseTotal[element] = 0; outletWiseGross[element] = 0; outletWiseDiscount[element] = 0; outletWiseGst[element] = 0; data.forEach(el => { if (el.outlet == element) { outletWiseTotal[element] += parseInt(el.amount); outletWiseGross[element] += parseInt(el.gross); outletWiseDiscount[element] += parseInt(el.discount); outletWiseGst[element] += parseInt(el.GST); } }); grandTotal += outletWiseTotal[element]; //calculating totals for Total column grandGross += outletWiseGross[element]; grandDiscount += outletWiseDiscount[element]; grandGst += outletWiseGst[element]; }); thead.appendChild(headerRow); headerRow = document.createElement("tr"); th = document.createElement("th"); th.innerHTML = ""; headerRow.appendChild(th); for (i = 0; i < outlets.length + 1; i++) { th = document.createElement("th"); th.innerHTML = "Discount"; //here statically i am giving the header names th.classList.add("text-center"); th.classList.add("discount"); headerRow.appendChild(th); th = document.createElement("th"); th.innerHTML = "GST"; //here statically i am giving the header names th.classList.add("text-center"); th.classList.add("gst"); headerRow.appendChild(th); th = document.createElement("th"); th.innerHTML = "Net_Amount"; //here statically i am giving the header names th.classList.add("text-center"); th.classList.add("netAmount"); headerRow.appendChild(th); th = document.createElement("th"); th.innerHTML = "Gross_Amount"; //here statically i am giving the header names th.classList.add("text-center"); th.classList.add("grossAmount"); headerRow.appendChild(th); } headerRow.insertBefore(th, headerRow.children[1]); thead.appendChild(headerRow); table.appendChild(thead); headerRow = document.createElement("tr"); td = document.createElement("th"); td.innerHTML = "Total"; td.classList.add("text-center"); headerRow.appendChild(td); outlets.forEach(element => { // these are the table rows for each column td = document.createElement("th"); td.innerHTML = outletWiseGross[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseDiscount[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseGst[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseTotal[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); }); td = document.createElement("th"); td.innerHTML = grandTotal.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandGst.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandGross.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); thead.appendChild(headerRow); table.appendChild(thead); let tbody = document.createElement("tbody"); billdates.forEach(element => { let row = document.createElement("tr"); td = document.createElement("td"); td.innerHTML = element; row.appendChild(td); let total = 0; let totalGross = 0; let totalDiscount = 0; let totalGST = 0; outlets.forEach(outlet => { let ta = 0; let tg = 0; let tdi = 0; let tgst = 0; data.forEach(d => { if (d.billdate == element && d.outlet == outlet) { total += parseInt(d.amount); totalGross += parseInt(d.gross); totalDiscount += parseInt(d.discount); totalGST += parseInt(d.GST); ta = d.amount; tg = d.gross; tdi = d.discount; tgst = d.GST; } }); td = document.createElement("td"); td.innerHTML = tg.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = tdi.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = tgst.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = ta.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); }); td = document.createElement("td"); td.innerHTML = total.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalGST.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalGross.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); tbody.appendChild(row); }); table.appendChild(tbody); tbl.innerHTML = ""; tbl.appendChild(table); table.classList.add("table"); table.classList.add("table-striped"); table.classList.add("table-bordered"); table.classList.add("table-hover"); } let formatedData = formatData(data); renderTable(formatedData);
brut
, remise
, GST
et montant
, tous ces éléments sont dynamiques, ils peuvent parfois être 3 2 et parfois 1 pour que j'essaye de créer dynamiquement Ici, dans le JSON ci-dessous, je n'ai que réduction
, gst
et montant
là n'est pas dégoûtant donc dans mon tableau, je ne veux que ces trois en-têtes comme col-span dans mon tableau
Comme la solution fournie par @Anilm ne semble pas faire comme ça
[{ "billdate": "2018-09-01", "outlet": "JAYANAGAR", "gross": 451458, "discount": 513, "GST": 25357, "amount": 476426 }, { "billdate": "2018-09-01", "outlet": "MALLESHWARAM", "gross": 87190, "discount": 0, "GST": 4930, "amount": 92141 }, { "billdate": "2018-09-01", "outlet": "KOLAR", "gross": 109308, "discount": 0, "GST": 5966, "amount": 115313 }, { "billdate": "2018-09-02", "outlet": "JAYANAGAR", "gross": 483194, "discount": 471, "GST": 28319, "amount": 511153 }, { "billdate": "2018-09-02", "outlet": "MALLESHWARAM", "gross": 109483, "discount": 0, "GST": 6198, "amount": 115704 }, { "billdate": "2018-09-02", "outlet": "KOLAR", "gross": 79305, "discount": 0, "GST": 4254, "amount": 83597 }, { "billdate": "2018-09-03", "outlet": "JAYANAGAR", "gross": 157660, "discount": 263, "GST": 9944, "amount": 167421 }, { "billdate": "2018-09-03", "outlet": "KOLAR", "gross": 51059, "discount": 0, "GST": 2693, "amount": 53775 } ]
Dans mon JSON, tous les brut
, Discount
, Gst
et Le montant
y est alors ce sera affiché:
Quand seulement Remise
, GST
et Amount
sont là alors ce sera mis en dehors:
De même pour les autres également.
Ces quatre brut
, remise
, GST
et montant sont dynamiques l'utilisateur sélectionne un, deux ou tous alors je veux remplir le tableau.
3 Réponses :
Essayez:
thisSpan = 4;
th.setAttribute ('colSpan', thisSpan);
le colspan 4 que vous dites n'est pas fixe
Votre exemple de code utilise un nombre fixe, mais j'ai modifié ce qui précède pour utiliser une variable à la place.
hé je n'ai trouvé aucune solution avec ça, pouvez-vous les aider avec du code?
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script type="text/javascript" src="Utility.js"></script> </head> <body onLoad="createTable();"> <div align="left" class="table table-responsive" id="commonDvScroll"> <table id="dailySales"></table> </div> </body> </html>
//added createTable function >> is called on body on load function createTable(){ let formatedData = formatData(data); renderTable(formatedData); } var data = [{ "billdate": "2018-09-01", "outlet": "JAYANAGAR", "gross": 451458, "discount": 513, "GST": 25357, "amount": 476426 }, { "billdate": "2018-09-01", "outlet": "MALLESHWARAM", "gross": 87190, "discount": 0, "GST": 4930, "amount": 92141 }, { "billdate": "2018-09-01", "outlet": "KOLAR", "gross": 109308, "discount": 0, "GST": 5966, "amount": 115313 }, { "billdate": "2018-09-02", "outlet": "JAYANAGAR", "gross": 483194, "discount": 471, "GST": 28319, "amount": 511153 }, { "billdate": "2018-09-02", "outlet": "MALLESHWARAM", "gross": 109483, "discount": 0, "GST": 6198, "amount": 115704 }, { "billdate": "2018-09-02", "outlet": "KOLAR", "gross": 79305, "discount": 0, "GST": 4254, "amount": 83597 }, { "billdate": "2018-09-03", "outlet": "JAYANAGAR", "gross": 157660, "discount": 263, "GST": 9944, "amount": 167421 }, { "billdate": "2018-09-03", "outlet": "KOLAR", "gross": 51059, "discount": 0, "GST": 2693, "amount": 53775 } ] let formatData = function(data) { let billdates = []; let outlets = []; let arr=[]; data.forEach(element => { if (billdates.indexOf(element.billdate) == -1) { billdates.push(element.billdate); } if (outlets.indexOf(element.outlet) == -1) { outlets.push(element.outlet); outlets.push(); //checking for property of each object of array "data" and if property exists adding to custom_Obj >> then adding to array and returning. var jsonObj= {}; if(element.hasOwnProperty("gross")){ jsonObj["gross"]=element.gross; } if(element.hasOwnProperty("discount")){ jsonObj["discount"]=element.discount; } if(element.hasOwnProperty("GST")){ jsonObj["GST"]=element.GST; } if(element.hasOwnProperty("amount")){ jsonObj["amount"]=element.amount; } arr.push(jsonObj); } }); return { data: data, billdates: billdates, outlets: outlets, arr:arr }; } let renderTable = function(data) { var arr=data.arr; billdates = data.billdates; outlets = data.outlets; data = data.data; let tbl = document.getElementById("dailySales"); let table = document.createElement("table"); let thead = document.createElement("thead"); let headerRow = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = "BillDate"; th.classList.add("text-center"); headerRow.appendChild(th); let grandTotal = 0; let grandGross = 0; let grandDiscount = 0; let grandGst = 0; let outletWiseTotal = {}; let outletWiseGross = {}; let outletWiseDiscount = {}; let outletWiseGst = {}; th = document.createElement("th"); th.colSpan = 4; th.innerHTML = "Total"; th.classList.add("text-center"); headerRow.appendChild(th); outlets.forEach(element => { th = document.createElement("th"); th.colSpan = 4; th.innerHTML = element; th.classList.add("text-center"); headerRow.appendChild(th); outletWiseTotal[element] = 0; outletWiseGross[element] = 0; outletWiseDiscount[element] = 0; outletWiseGst[element] = 0; data.forEach(el => { if (el.outlet == element) { outletWiseTotal[element] += parseInt(el.amount); outletWiseGross[element] += parseInt(el.gross); outletWiseDiscount[element] += parseInt(el.discount); outletWiseGst[element] += parseInt(el.GST); } }); grandTotal += outletWiseTotal[element]; //calculating totals for Total column grandGross += outletWiseGross[element]; grandDiscount += outletWiseDiscount[element]; grandGst += outletWiseGst[element]; }); thead.appendChild(headerRow); headerRow = document.createElement("tr"); th = document.createElement("th"); th.innerHTML = ""; headerRow.appendChild(th); //As in this code you are creating "total" column explicitly and not by json,So to create the header for the total column I am adding this headers to array[0] manually. //Otherwise header for that column cannot be populated dynamically. //Or you can add a dummy header obj in data array. var totalcoloumn_obj={"gross":"","discount":"","GST":"","amount":""}; //as you showed total column in first, I am shifiting the array index by 1 and adding the total dymmy object at first index. arr.unshift(totalcoloumn_obj); //Creating column headers dynamically based on the data array that you declared on the top. for (var j = 0; j < arr.length; j++) { for(var key in arr[j]) { var th_dynamic = document.createElement("TH"); var t = document.createTextNode(key); th_dynamic.appendChild(t); th_dynamic.classList.add("text-center"); headerRow.appendChild(th_dynamic); } } headerRow.insertBefore(th, headerRow.children[1]); thead.appendChild(headerRow); table.appendChild(thead); headerRow = document.createElement("tr"); td = document.createElement("th"); td.innerHTML = "Total"; td.classList.add("text-center"); headerRow.appendChild(td); outlets.forEach(element => { // these are the table rows for each column td = document.createElement("th"); td.innerHTML = outletWiseGross[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseDiscount[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseGst[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); td = document.createElement("th"); td.innerHTML = outletWiseTotal[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); }); td = document.createElement("th"); td.innerHTML = grandTotal.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandGst.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); td = document.createElement("th"); td.innerHTML = grandGross.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); thead.appendChild(headerRow); table.appendChild(thead); let tbody = document.createElement("tbody"); billdates.forEach(element => { let row = document.createElement("tr"); td = document.createElement("td"); td.innerHTML = element; row.appendChild(td); let total = 0; let totalGross = 0; let totalDiscount = 0; let totalGST = 0; outlets.forEach(outlet => { let ta = 0; let tg = 0; let tdi = 0; let tgst = 0; data.forEach(d => { if (d.billdate == element && d.outlet == outlet) { total += parseInt(d.amount); totalGross += parseInt(d.gross); totalDiscount += parseInt(d.discount); totalGST += parseInt(d.GST); ta = d.amount; tg = d.gross; tdi = d.discount; tgst = d.GST; } }); td = document.createElement("td"); td.innerHTML = tg.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = tdi.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = tgst.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); td = document.createElement("td"); td.innerHTML = ta.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); }); td = document.createElement("td"); td.innerHTML = total.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalGST.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); td = document.createElement("td"); td.innerHTML = totalGross.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); tbody.appendChild(row); }); table.appendChild(tbody); tbl.innerHTML = ""; tbl.appendChild(table); table.classList.add("table"); table.classList.add("table-striped"); table.classList.add("table-bordered"); table.classList.add("table-hover"); }
hé j'ai essayé votre solution, mais cela n'a pas fonctionné, veuillez vérifier avec le nouvel objet JSOn que j'ai fourni dans ma modification, car le nouvel objet n'a pas brut
mais il montre toujours la colonne brute dans le tableau , mes données json seront dynamiques brut
, remise
, gst
et montant
sont parfois dynamiques, les 4 seront il y a parfois 2 ou 3 ou un
Dans l'extrait de code d'exécution, il fonctionne comme prévu selon votre question précédente.Je ne suis pas en mesure de comprendre le problème exact pour lequel vous voulez une solution.Veuillez fournir une image instantanée de votre table à quoi vous voulez qu'elle ressemble exactement.Ainsi, je peut modifier la solution en fonction de celle-ci.
ok j'ai compris, laissez-moi modifier le code et je posterai la solution
Avec le code existant, je trouve ça difficile, j'ai besoin d'écrire un nouveau code
Essayez comme ça, j'ai modifié du code de réponse d'Anilm . J'espère que cela fonctionnera pour vous.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script type="text/javascript" src="Utility.js"></script> </head> <body onLoad="createTable();"> <div align="left" class="table table-responsive" id="commonDvScroll"> <table id="dailySales"></table> </div> </body> </html>
//added createTable function >> is called on body on load function createTable(){ let formatedData = formatData(data); renderTable(formatedData); } var hasGross = false;; var hasGST = false; var hasDiscount = false; var hasTotal = false; var data = [{ "billdate": "2018-09-01", "outlet": "JAYANAGAR", "discount": 513, "gross": 25357, "amount": 476426 }, { "billdate": "2018-09-01", "outlet": "MALLESHWARAM", "discount": 0, "gross": 4930, "amount": 92141 }, { "billdate": "2018-09-01", "outlet": "KOLAR", "discount": 0, "gross": 5966, "amount": 115313 }, { "billdate": "2018-09-02", "outlet": "JAYANAGAR", "discount": 471, "gross": 28319, "amount": 511153 }, { "billdate": "2018-09-02", "outlet": "MALLESHWARAM", "discount": 0, "gross": 6198, "amount": 115704 }, { "billdate": "2018-09-02", "outlet": "KOLAR", "discount": 0, "gross": 4254, "amount": 83597 }, { "billdate": "2018-09-03", "outlet": "JAYANAGAR", "discount": 263, "gross": 9944, "amount": 167421 }, { "billdate": "2018-09-03", "outlet": "KOLAR", "discount": 0, "gross": 2693, "amount": 53775 } ] let formatData = function(data) { let billdates = []; let outlets = []; let arr=[]; data.forEach(element => { if (billdates.indexOf(element.billdate) == -1) { billdates.push(element.billdate); } if (outlets.indexOf(element.outlet) == -1) { outlets.push(element.outlet); outlets.push(); //checking for property of each object of array "data" and if property exists adding to custom_Obj >> then adding to array and returning. var jsonObj= {}; if(element.hasOwnProperty("gross")){ hasGross = true; jsonObj["gross"]=element.gross; } if(element.hasOwnProperty("discount")){ hasDiscount = true; jsonObj["discount"]=element.discount; } if(element.hasOwnProperty("GST")){ hasGST = true; jsonObj["GST"]=element.GST; } if(element.hasOwnProperty("amount")){ hasTotal = true; jsonObj["amount"]=element.amount; } arr.push(jsonObj); } }); return { data: data, billdates: billdates, outlets: outlets, arr:arr }; } let renderTable = function(data) { var arr=data.arr; billdates = data.billdates; outlets = data.outlets; data = data.data; let tbl = document.getElementById("dailySales"); let table = document.createElement("table"); let thead = document.createElement("thead"); let headerRow = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = "BillDate"; th.classList.add("text-center"); headerRow.appendChild(th); let grandTotal = 0; let grandGross = 0; let grandDiscount = 0; let grandGst = 0; let outletWiseTotal = {}; let outletWiseGross = {}; let outletWiseDiscount = {}; let outletWiseGst = {}; th = document.createElement("th"); let cols = 0; if(hasGST){ cols++; } if(hasGross){ cols++ } if(hasDiscount){ cols++ } if(hasTotal){ cols++ } th.colSpan = cols; th.innerHTML = "Total"; th.classList.add("text-center"); headerRow.appendChild(th); outlets.forEach(element => { th = document.createElement("th"); th.colSpan = cols th.innerHTML = element; th.classList.add("text-center"); headerRow.appendChild(th); outletWiseTotal[element] = 0; outletWiseGross[element] = 0; outletWiseDiscount[element] = 0; outletWiseGst[element] = 0; data.forEach(el => { if (el.outlet == element) { if(hasTotal){ outletWiseTotal[element] += parseInt(el.amount); } if(hasGross){ outletWiseGross[element] += parseInt(el.gross); } if(hasDiscount){ outletWiseDiscount[element] += parseInt(el.discount); } if(hasGST){ outletWiseGst[element] += parseInt(el.GST); } } }); if(hasTotal){ grandTotal += outletWiseTotal[element]; //calculating totals for Total column } if(hasGross){ grandGross += outletWiseGross[element]; } if(hasDiscount){ grandDiscount += outletWiseDiscount[element]; } if(hasGST){ grandGst += outletWiseGst[element]; } }); thead.appendChild(headerRow); headerRow = document.createElement("tr"); th = document.createElement("th"); th.innerHTML = ""; headerRow.appendChild(th); //As in this code you are creating "total" column explicitly and not by json,So to create the header for the total column I am adding this headers to array[0] manually. //Otherwise header for that column cannot be populated dynamically. //Or you can add a dummy header obj in data array. var totalcoloumn_obj={}; if(hasGross){ totalcoloumn_obj.gross = ""; } if(hasDiscount){ totalcoloumn_obj.discount = ""; } if(hasGST){ totalcoloumn_obj.GST = ""; } if(hasTotal){ totalcoloumn_obj.amount = ""; } //as you showed total column in first, I am shifiting the array index by 1 and adding the total dymmy object at first index. arr.unshift(totalcoloumn_obj); //Creating column headers dynamically based on the data array that you declared on the top. for (var j = 0; j < arr.length; j++) { for(var key in arr[j]) { var th_dynamic = document.createElement("TH"); var t = document.createTextNode(key); th_dynamic.appendChild(t); th_dynamic.classList.add("text-center"); headerRow.appendChild(th_dynamic); } } headerRow.insertBefore(th, headerRow.children[1]); thead.appendChild(headerRow); table.appendChild(thead); headerRow = document.createElement("tr"); td = document.createElement("th"); td.innerHTML = "Total"; td.classList.add("text-center"); headerRow.appendChild(td); outlets.forEach(element => { // these are the table rows for each column if(hasGross){ td = document.createElement("th"); td.innerHTML = outletWiseGross[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); } if(hasDiscount){ td = document.createElement("th"); td.innerHTML = outletWiseDiscount[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); } if(hasGST){ td = document.createElement("th"); td.innerHTML = outletWiseGst[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); } if(hasTotal){ td = document.createElement("th"); td.innerHTML = outletWiseTotal[element].toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.appendChild(td); } }); if(hasTotal){ td = document.createElement("th"); td.innerHTML = grandTotal.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); } if(hasGST){ td = document.createElement("th"); td.innerHTML = grandGst.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); } if(hasDiscount){ td = document.createElement("th"); td.innerHTML = grandDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); } if(hasGross) { td = document.createElement("th"); td.innerHTML = grandGross.toLocaleString('en-IN'); td.classList.add("text-right"); headerRow.insertBefore(td, headerRow.children[1]); } thead.appendChild(headerRow); table.appendChild(thead); let tbody = document.createElement("tbody"); billdates.forEach(element => { let row = document.createElement("tr"); td = document.createElement("td"); td.innerHTML = element; row.appendChild(td); let total = 0; let totalGross = 0; let totalDiscount = 0; let totalGST = 0; outlets.forEach(outlet => { let ta = 0; let tg = 0; let tdi = 0; let tgst = 0; data.forEach(d => { if (d.billdate == element && d.outlet == outlet) { if(hasTotal){ total += parseInt(d.amount); ta = d.amount; } if(hasDiscount){ totalDiscount += parseInt(d.discount); tdi = d.discount; } if(hasGST){ totalGST += parseInt(d.GST); tgst = d.GST; } if(hasGross){ totalGross += parseInt(d.gross); tg = d.gross; } } }); //console.log(tg) if(hasGross){ td = document.createElement("td"); td.innerHTML = tg.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); } if(hasDiscount){ td = document.createElement("td"); td.innerHTML = tdi.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); } if(hasGST){ td = document.createElement("td"); td.innerHTML = tgst.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); } if(hasTotal){ td = document.createElement("td"); td.innerHTML = ta.toLocaleString('en-IN'); td.classList.add("text-right"); row.appendChild(td); } }); if(hasTotal){ td = document.createElement("td"); td.innerHTML = total.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); } if(hasGST){ td = document.createElement("td"); td.innerHTML = totalGST.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); } if(hasDiscount){ td = document.createElement("td"); td.innerHTML = totalDiscount.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); } if(hasGross){ td = document.createElement("td"); td.innerHTML = totalGross.toLocaleString('en-IN'); td.classList.add("text-right"); row.insertBefore(td, row.children[1]); } tbody.appendChild(row); }); table.appendChild(tbody); tbl.innerHTML = ""; tbl.appendChild(table); table.classList.add("table"); table.classList.add("table-striped"); table.classList.add("table-bordered"); table.classList.add("table-hover"); }
Hé monsieur, il a des problèmes 1:> lorsque j'utilise JSON qui a les quatre bruts
, montant
, remise
et GST code> la dernière colonne de
Kolar
de la dernière ligne ne s'affiche pas comme cellule, elle est vide. 2:> lorsque l'utilisateur sélectionne brut
, Amount
et Gst
alors il lance une erreur, je pense que vous ne l'avez fait que lorsqu'il y a pas de brut
dans l'objet JSON qui est incorrect L'utilisateur peut sélectionner dynamiquement l'un d'entre eux
hey nom avez-vous vérifié la sortie, il montre autre chose kolar
n'a qu'une seule colonne et jayanagar
que 4 colonnes et Total n'a que 3
veuillez vérifier
même problème monsieur je vous ai dit que je pense que vous vérifiez avec seulement brut, maintenant j'ai brut dans mon json et je n'ai pas de réduction
cela génère une erreur, de même l'un d'entre eux peut manquer ou deux peut être manquant
hé monsieur si pouvez-vous s'il vous plaît vérifier ce problème stackoverflow.com/questions/56422075/...
Je ne comprends pas vraiment cette question. Pouvez-vous créer un JSFiddle avec le code et un exemple de HTML que vous aimeriez être le résultat de votre code? Cela identifierait le problème.
Si vous avez des cellules manquantes, laissez-les vides. Une table en a normalement un par colonne. Si une ligne a un ensemble complet de données et que la ligne suivante a une cellule manquante, expliquez comment cela est censé fonctionner.
@ zer00ne Les attributs
colspan
etrowspan
sont assez courants, pour couvrir exactement cette exigence.@LajosArpad J'ai déjà créé un extrait de code, et qu'est-ce que vous ne comprenez pas?
@manishthakur la question n'est pas bien formulée. Il faut le lire plusieurs fois pour comprendre quel est le problème exact. Je ne ferai pas ca. Si vous souhaitez avoir de meilleures chances d'obtenir de l'aide, vous devrez améliorer votre question. Je vous ai dit ce que vous devez faire. 1. Créez un JSFiddle qui reproduit le comportement dont vous parlez. J'ai vu l'extrait de code que vous avez donné, mais je ne créerai pas de violon pour vous. Tu devrais faire ça. 2. Donnez-nous un exemple de HTML qui devrait être le résultat de votre code. Cela expliquerait mieux le problème que vos paroles.
Ce n'est pas clair quand vous dites, "Selon l'exigence brute, remise, TPS et montant, tous ces éléments sont dynamiques, ils peuvent être 3 parfois 2 et parfois 1 pour que j'essaye de créer dynamiquement" . Ce n'est pas une bonne pratique de modifier les champs de lignes et de colspan pour tenir compte des données manquantes. L'absence de données peut être tout aussi importante que si elle était là. La suppression d'une colonne implique que les données de la colonne ne s'appliquent plus (si le lecteur remarque son absence).
@ zer00ne selon l'exigence, je veux dire ici je reçois
brut, remise, TPS et montant
, donc selon la sélection de l'utilisateur, il peut s'agir deremise, TPS et montant
, maisla date de facturation
et laprise
vont être courantes@ rv7 pour ce dont vous parlez? l'extrait que j'ai fourni qui fonctionne bien, le nouvel objet JSON que j'ai téléchargé ne fonctionne pas bien avec cela, j'ai téléchargé 2 photos ce que j'ai fait et ce que j'essaie de faire, à ce
pour la boucle code> ligne Je définis statiquement les en-têtes de col-span selon les points de vente No +1 car comme vous pouvez le voir, ils sont communs dans chaque point de vente + une colonne, c'est-à-dire
Total
OK je suis désolé. C'était un malentendu. Eh bien, il est très difficile de travailler avec votre mise en page spécifique. Pouvez-vous s'il vous plaît le réduire à un exemple minimal, complet et vérifiable.
@ rv7 J'ai presque terminé le codage, il suffit de faire cette boucle dans la tête et le corps qui montre ces quatre bruts, rabais, montant et TPS actuellement, je le fais quatre fois de manière statique parce que l'exigence initiale était que, maintenant l'utilisateur sélectionne les options et ils peuvent en sélectionner un ou plusieurs
Vous nous demandez de réécrire votre code pour qu'il soit générique. C'est presque comme une demande de fonctionnalité. Vous avez créé cette structure complexe en codant en dur presque toute la structure. Je peux seulement dire que la solution impliquera très probablement
Object.keys
et diverses méthodes de transformation de tableau.@MaazSyedAdeeb non non je ne demande pas une solution complète comme vous pouvez le voir, j'ai créé une partie du code par une structure codée en dur et en tant que codeur de niveau modéré
JS
, je suis confronté à des problèmes pour le faire selon les besoins