Hello everyone, I’m writing one pdf suitelet and I...
# suitescript
n
Hello everyone, I’m writing one pdf suitelet and I’m running a for loop to show the tables!! I just want each table on different page on the pdf!! What I can do in the pdf suitelet? do we have any xml tag to do it? Please help me here!!
e
n
where I can use the pbr tag? at the end of for loop?
e
well, yes, that would make sense - forcing a new page for each. or at the beginning for each except for the first iteration, right? depends on your needs.
share code, may help
n
Copy code
for(var j=0;j<prodUnit_ar.length;j++){

      var transactionSearchObj = search.create({
           type: "transaction",
           filters:
           [
              ["internalid","anyof",so_id], 
              "AND", 
              ["taxline","is","F"], 
              "AND", 
              ["mainline","is","F"], 
              "AND", 
              ["item.class","anyof",prodUnit_ar[j]]
           ],
           columns:
           [
              search.createColumn({name: "item", label: "Item"}),
              search.createColumn({name: "quantity", label: "Quantity"}),
              search.createColumn({
                 name: "class",
                 join: "item",
                 sort: search.Sort.ASC,
                 label: "Production Unit"
              })
           ]
        });
        var searchResultCount = transactionSearchObj.runPaged().count;

        log.debug("transactionSearchObj result count",searchResultCount);


          transactionSearchObj.run().each(function(result){

            var it_name = result.getText({name:'item'});

            //it_name.replace('/&',"&");
           
            item_ar.push(it_name);

            qty_ar.push(result.getValue({name:'quantity'}));

            item_prodUnit_ar.push(result.getValue({ name: "class",
                                                   join: "item",
                                                   sort: search.Sort.ASC}));
           return true;
        });


        
         xml+='<tr>'
         xml+='<td style="padding: 0;margin-left:50px;width:100px;"><span style="font-size: 8pt;"></span><br/></td>';
         xml+='</tr>';
         xml+='</table>';
         xml+=''
         
       
           
         xml+=' <table style="border: 0.3px solid ; margin-top: 10px;font-size: 10pt;  width: 100%;">'
         xml+='  <thead>'
         xml+='   <tr>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;border-right:0;border-bottom:1;background-color: #E2EAF0;">Wash</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">Clean</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">Item</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">&nbsp;Bundle</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;;border-bottom:1">&nbsp;Remarks</td>'
         xml+='   </tr>'
         xml+='  </thead>'
       
        for(var i=0;i<searchResultCount;i++){

         xml+='  <tr style ="border: 0.3px solid ;">'
         xml+=' <td align="left" style ="border: 0.3px solid ;">'+qty_ar[i]+'</td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;">'+xmll.escape({xmlText :item_ar[i]})+'</td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         //xml+=' <td align="left" style ="border: 0.3px solid ;">&nbsp;'+open_bal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")+'</td>'
         xml+='  </tr>'

       }

      item_ar = [];
      qty_ar = [];
      item_prodUnit_ar = [];

     }
this code is to show tables
e
try adding where you see fit (beginning or end). you can always skip adding where j == 0 or j == prodUnit_ar.length - 1
n
how I can add pbr tag in xml?
e
Copy code
xml+=' <pbr> ';
just like you did with the other tags
sorry,
<pbr/>
(i missed the slash)
try it, let me know
n
its not working!!
Copy code
define(['N/xml','N/record','N/search','N/format','N/runtime'], function(xmll,record,search,format,runtime) {

  
    function onRequest(context) {

        var so_id= context.request.parameters.recid;


        var so_obj = record.load({
          type:record.Type.SALES_ORDER,
          id:so_id
        });

        var so_num = so_obj.getText({fieldId:'tranid'});

        var so_date = so_obj.getText({fieldId:'trandate'});

        var cust_name = so_obj.getText({fieldId:'entity'});



        var item_ar = [];
        var qty_ar = [];
        var item_prodUnit_ar = [];


        var transactionSearchObj = search.create({
             type: "transaction",
             filters:
             [
                ["internalid","anyof",so_id], 
                "AND", 
                ["taxline","is","F"], 
                "AND", 
                ["mainline","is","F"]
             ],
             columns:
             [
                search.createColumn({name: "item", label: "Item"}),
                search.createColumn({name: "quantity", label: "Quantity"}),
                search.createColumn({
                   name: "class",
                   join: "item",
                   sort: search.Sort.ASC,
                   label: "Production Unit"
                })
             ]
          });
          var searchResultCount = transactionSearchObj.runPaged().count;
          log.debug("transactionSearchObj result count",searchResultCount);
          transactionSearchObj.run().each(function(result){
             
             item_ar.push(result.getText({name:'item'}));

             qty_ar.push(result.getValue({name:'quantity'}));

             item_prodUnit_ar.push(result.getValue({ name: "class",
                                                   join: "item",
                                                   sort: search.Sort.ASC}));

             return true;
          });

//No of Production Units:

          var noProdUnit = 0;
          var prodUnit_ar = [];

          var transactionSearchObj = search.create({
               type: "transaction",
               filters:
               [
                  ["internalid","anyof",so_id], 
                  "AND", 
                  ["taxline","is","F"], 
                  "AND", 
                  ["mainline","is","F"]
               ],
               columns:
               [
                  search.createColumn({
                     name: "class",
                     join: "item",
                     summary: "GROUP",
                     sort: search.Sort.ASC,
                     label: "Production Unit"
                  }),
                  search.createColumn({
                     name: "class",
                     join: "item",
                     summary: "COUNT",
                     sort: search.Sort.ASC,
                     label: "Production Unit"
                  })
               ]
            });
            var searchResultCount_prodUnit = transactionSearchObj.runPaged().count;
            log.debug("searchResultCount_prodUnit result count",searchResultCount_prodUnit);

            transactionSearchObj.run().each(function(result){
               
              prodUnit_ar.push(result.getValue({name: "class",
                     join: "item",
                     summary: "GROUP"}));


               return true;
            });

            log.debug('Prod Unit array',prodUnit_ar);

////No of Production Units




       





        var xml = '<?xml version=\"1.0\"?>\n<!DOCTYPE pdf PUBLIC \"-//big.faceless.org//report\" \"report-1.1.dtd\">\n';
        xml+= '<pdf>';
        xml += "<head><macrolist><macro id=\"myfooter\"><p align=\"right\">Page of <pagenumber /></p></macro></macrolist></head>";
        xml+= '<body style="font-family: sans-serif" header="nlheader" header-height="14%" footer="myfooter" footer-height="15pt" padding="0.5in 0.5in 0.5in 0.5in" size="Letter">';
            
         xml+='<table style="border=0px; width:100%;"><tr>'
         xml+='<td><img src="<http://5550177-sb1.shop.netsuite.com/core/media/media.nl?id=13142&c=5550177_SB1&h=fVZtwAQ395jDmPqhlrq06E8O_wPf-tEavGATxAtitmAM5E9a>" style="width: 180px; height: 100px;" /><br /></td>';
         xml+='<td style="padding: 0;margin-right:100px;align=right;width: 200px; height: 65px;"><span></span><br/></td>';
         xml+='<td style="padding: 10px;margin-left:50px;width: 240px; height: 50px;font-size: 18pt;">Show Production Unit<br/></td>';
         xml+='</tr>';
         xml+='<tr>'
         xml+='<td style="padding: 0;margin-left:50px;width:100px;"><span style="font-size: 8pt;"></span><br/></td>';
         xml+='</tr>';

         xml+='<tr>'
         xml+='<td style="padding: 0 10px;align=center;margin:auto;width: 200px; height: 65px;"><span style="font-size: 8pt;"><b>DCS Address:</b> '+xmll.escape({xmlText :so_num})+'</span></td>';
         xml+='<td style="padding: 0 10px;margin:auto;align=center;width: 200px; height: 65px;"><span style="font-size: 8pt;"><b>Client:</b> '+xmll.escape({xmlText :cust_name})+'</span></td>';
         xml+='<td style="padding: 0 10px;text-align=right;margin-left:50px;width: 240px; height: 50px;"><span style="font-size: 10pt;"><b>SO#:</b> '+xmll.escape({xmlText :so_num})+'</span><br/><span style="font-size: 10pt;"><b>SO Date:</b> '+so_date+'</span></td>';
         xml+='</tr>';


// Items, Qty and Production Unit:

    for(var j=0;j<prodUnit_ar.length;j++){

      var transactionSearchObj = search.create({
           type: "transaction",
           filters:
           [
              ["internalid","anyof",so_id], 
              "AND", 
              ["taxline","is","F"], 
              "AND", 
              ["mainline","is","F"], 
              "AND", 
              ["item.class","anyof",prodUnit_ar[j]]
           ],
           columns:
           [
              search.createColumn({name: "item", label: "Item"}),
              search.createColumn({name: "quantity", label: "Quantity"}),
              search.createColumn({
                 name: "class",
                 join: "item",
                 sort: search.Sort.ASC,
                 label: "Production Unit"
              })
           ]
        });
        var searchResultCount = transactionSearchObj.runPaged().count;

        log.debug("transactionSearchObj result count",searchResultCount);


          transactionSearchObj.run().each(function(result){

            var it_name = result.getText({name:'item'});

            //it_name.replace('/&',"&");
           
            item_ar.push(it_name);

            qty_ar.push(result.getValue({name:'quantity'}));

            item_prodUnit_ar.push(result.getValue({ name: "class",
                                                   join: "item",
                                                   sort: search.Sort.ASC}));
           return true;
        });


        
         xml+='<tr>'
         xml+='<td style="padding: 0;margin-left:50px;width:100px;"><span style="font-size: 8pt;"></span><br/></td>';
         xml+='</tr>';
         xml+='</table>';
         xml+=''
         
       
           
         xml+=' <table style="border: 0.3px solid ; margin-top: 10px;font-size: 10pt;  width: 100%;">'
         xml+='  <thead>'
         xml+='   <tr>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;border-right:0;border-bottom:1;background-color: #E2EAF0;">Wash</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">Clean</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">Item</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;border-right:0;border-bottom:1">&nbsp;Bundle</td>'
         xml+='    <td  style="border: 0.3px solid;font-weight:bold;background-color: #E2EAF0;;border-bottom:1">&nbsp;Remarks</td>'
         xml+='   </tr>'
         xml+='  </thead>'
       
        for(var i=0;i<searchResultCount;i++){

         xml+='  <tr style ="border: 0.3px solid ;">'
         xml+=' <td align="left" style ="border: 0.3px solid ;">'+qty_ar[i]+'</td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;">'+xmll.escape({xmlText :item_ar[i]})+'</td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         xml+=' <td align="left" style ="border: 0.3px solid ;"></td>'
         //xml+=' <td align="left" style ="border: 0.3px solid ;">&nbsp;'+open_bal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")+'</td>'
         xml+='  </tr>'


       }

      item_ar = [];
      qty_ar = [];
      item_prodUnit_ar = [];



     }


      
         

      xml+='  </table><br/>'
      xml+=' <pbr/> '; 
      xml+=''
           
         
         
           xml += '</body></pdf>';// end PDF tags
           
        context.response.renderPdf({xmlString: xml});

      
     


    }

    return {
        onRequest: onRequest
    };
    
});
this is my whole code
I added <pbr/>
at the end of table!
am i missing something?
🤔
e
sorry, trying to help!
🙂
n
where should I add this break page?
I shared whole code here!! can you please mention it if possible!
e
no wait, hold on. you placed the page break outside of your for loop
Copy code
xml+=' <pbr/> ';
This should appear IN your for loop. understand?
n
added it in!! but giving error!
i think i misplaced the table tags?
e
the problem is probably bec you are inside of the table element there. try higher up
n
before table creation it works but first page is coming blank as well
first table is going on 2nd page
e
OR, you can edit the table element with the page-break-after css style like this https://bfo.com/products/report/docs/tags/atts/page-break-after.html Please try this. see screenshot!
so, to use pbr you need to instead wrap that in an if statement But don’t do the attribute “page-break-after” approach AND the pbr tag. One or the other. Probably page-break-after is better, but up to you. see screenshot. Good luck!
n
cool
e
😉
n
page-break-after works
it gives an extra page at the end but its okay
e
gooood! sorry for not being clear
n
no worries!! you were very helpful
e
👍
n
it would have taken me 30 mins at least to research but coz of you it is done in 10 mins
thanks
e
ok great
n
will work on header and footer now
can you share me link if you have any to add header and footer on pdf suitelet so I can refer!
n
sure I’ll check it out
thanks a lot for your help!