What's new

Help Merging rows in table who have the same values

carmona1426

Honorary Poster
Established
Good day sa lahat ng programmers dyan! Baka alam nyo to kapag gumamit pa ako ng rowspan sa pi_no column parang ayaw na mag generate ng PDF table at nagko-cause ng maximum time limit. Ano kayang posibleng solusyon nito? Gamit kong framework ay CI 3.
Ito yung code sa ibaba:

PHP:
private function printReport($data, $from, $to)
    {
        $dateFrom = date("M d, Y", strtotime($from));
        $dateTo   = date("M d, Y", strtotime($to));
        $pdf      = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
        // set document information
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetAuthor('MC');
        $pdf->SetTitle('Tracking Report');
        $pdf->SetSubject('CWO Transaction Tracking Report');
        $pdf->SetKeywords('CWO, Transaction, Tracking, Report');
        // set default header data
        $pdf->SetHeaderData('alturas.png', 32, '' . '', 'Cash With Order Monitoring Report');
        // set header and footer fonts
        $pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
        $pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
        // set default monospaced font
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
        // set margins
        $pdf->SetMargins(15, 20, 15);
        $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
        $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
        // set auto page breaks
        $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
        // set image scale factor
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
        $pdf->AddPage('L', array(215.9, 355.6));
        $pdf->SetDisplayMode('fullpage');
        $pdf->SetFont('helvetica', '', 9);
        $html = '<div style=" text-align: left;">
                        <span style="font-size: xx-large;padding-left:20px;"><b>CWO TRANSACTION - TRACKING REPORT</b></span><br>
                        <span style="font-size: medium;padding-left:20px">Report Date: ' . date('F d, Y') . '</span><br>
                        <span style="font-size: medium;padding-left:20px">From : ' . $dateFrom . ' To : ' . $dateTo . '</span><br>           
                    </div>
                    <div>
                        <span style="font-size: medium;padding-left:20px;">The provided table represents the CWO transactions, including supplier information, CRF/CV number and CRF date, CRF vs PSI status, SOP number and SOP date, PSI number, PSI date, PO number and PO date, PI number and PI date, and PI vs PSI status.</span><br>
                    </div>
                     <table border="1" >
                     <thead>
                         <tr>
                            <th colspan="2" align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16">SUPPLIER</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16">CRF/CV NO.</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16">CRF DATE</th>
                            <th align="center" bgcolor="#1d2120" color="#ccffff" style="border: 1px solid #c96a16">CRF VS PSI STATUS</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16">SOP NO.</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16">SOP DATE</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PSI NO.</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PSI DATE</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PO NO.</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PO DATE</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PI NO.</th>
                            <th align="center" bgcolor="#1d2120" color="white" style="border: 1px solid #c96a16"> PI DATE</th>
                            <th align="center" bgcolor="#1d2120" color="#ffff99" style="border: 1px solid #c96a16"> PI VS PSI STATUS</th>
                         </tr>
                    </thead>
                    <tbody>';
        $previousSupplier = "";
        $previousCrfNo    = "";
        $previousProfCode = "";
        $supplierRows     = [];
        $crfRows          = [];
        $psiRows          = [];
        $htmlRows         = [];
        foreach ($data as $a) {
            $supplierName                  = $a['supplier_name'];
            $crfNo                         = $a['crf_no'];
            $profCode                      = $a['psi_no'];
            $supplierRows[$supplierName][] = $a;
            $crfRows[$crfNo][]             = $a;
            $psiRows[$profCode][]          = $a;
        }
        foreach ($data as $b) {
            $supplierName = $b['supplier_name'];
            $crfNo        = $b['crf_no'];
            $profCode     = $b['psi_no'];
            $location     = $b['l_acroname'];
            $rowspan      = count($supplierRows[$supplierName]);
            $rowspan1     = count($crfRows[$crfNo]);
            $rowspan2     = count($psiRows[$profCode]);
            if ($supplierName !== $previousSupplier) {
                $htmlRows[] = '<tr>
                    <td colspan="2" rowspan="' . $rowspan . '" align="center">' . $supplierName . '<br><span style="font-style: italic;">LOCATION: ' . $location . '</span></td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . $crfNo . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . (empty($b['crf_date']) ? '' : date("m-d-Y", strtotime($b['crf_date']))) . '</td>
                    <td rowspan="' . $rowspan1 . '" align="center" style="color: ' . ($b['crf_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['crf_vs_psi_status'] . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . $b['sop_no'] . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . (empty($b['sop_date']) ? '' : date("m-d-Y", strtotime($b['sop_date']))) . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $profCode . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['psi_date']) ? '' : date("m-d-Y", strtotime($b['psi_date']))) . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $b['po_no'] . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['po_date']) ? '' : date("m-d-Y", strtotime($b['po_date']))) . '</td>
                    <td align="center">' . $b['pi_no'] . '</td>   
                    <td align="center">' . (empty($b['pi_date']) ? '' : date("m-d-Y", strtotime($b['pi_date']))) . '</td>
                    <td align="center" style="color: ' . ($b['pi_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['pi_vs_psi_status'] . '</td>
                </tr>';
            } else if ($crfNo !== $previousCrfNo) {
                $htmlRows[] = '<tr>
                    <td align="center" rowspan="' . $rowspan1 . '">' . $crfNo . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . (empty($b['crf_date']) ? '' : date("m-d-Y", strtotime($b['crf_date']))) . '</td>
                    <td rowspan="' . $rowspan1 . '" align="center" style="color: ' . ($b['crf_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['crf_vs_psi_status'] . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . $b['sop_no'] . '</td>
                    <td align="center" rowspan="' . $rowspan1 . '">' . (empty($b['sop_date']) ? '' : date("m-d-Y", strtotime($b['sop_date']))) . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $profCode . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['psi_date']) ? '' : date("m-d-Y", strtotime($b['psi_date']))) . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $b['po_no'] . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['po_date']) ? '' : date("m-d-Y", strtotime($b['po_date']))) . '</td>
                    <td align="center">' . $b['pi_no'] . '</td>   
                    <td align="center">' . (empty($b['pi_date']) ? '' : date("m-d-Y", strtotime($b['pi_date']))) . '</td>
                    <td align="center" style="color: ' . ($b['pi_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['pi_vs_psi_status'] . '</td>
                </tr>';
            } else if ($profCode !== $previousProfCode) {
                $htmlRows[] = '<tr>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $profCode . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['psi_date']) ? '' : date("m-d-Y", strtotime($b['psi_date']))) . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . $b['po_no'] . '</td>
                    <td align="center" rowspan="' . $rowspan2 . '">' . (empty($b['po_date']) ? '' : date("m-d-Y", strtotime($b['po_date']))) . '</td>
                    <td align="center">' . $b['pi_no'] . '</td>
                    <td align="center">' . (empty($b['pi_date']) ? '' : date("m-d-Y", strtotime($b['pi_date']))) . '</td>
                    <td align="center" style="color: ' . ($b['pi_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['pi_vs_psi_status'] . '</td>
                </tr>';
            } else {
                $htmlRows[] = '<tr>
                    <td align="center">' . $b['pi_no'] . '</td>
                    <td align="center">' . (empty($b['pi_date']) ? '' : date("m-d-Y", strtotime($b['pi_date']))) . '</td>
                    <td align="center" style="color: ' . ($b['pi_vs_psi_status'] === 'PENDING' ? 'red' : 'green') . ';">' . $b['pi_vs_psi_status'] . '</td>
                </tr>';
            }
            $previousSupplier = $b['supplier_name'];
            $previousCrfNo    = $b['crf_no'];
            $previousProfCode = $b['psi_no'];
            $pdf->Ln();
        }
        $html .= implode("", $htmlRows);
        $html .= '</tbody></table>';
        $pdf->writeHTML($html, true, false, true, false, '');
        $fileName = 'TRANSACTION_TRACKING_REPORT_' . time() . '.pdf';
        $pdf->Output(getcwd() . '/files/Reports/TrackingReports/' . $fileName, 'F');
        return $fileName;
    }
Ito naman ang pdf table na kapag hindi ginamitan ng rowspan ang pi_no column ay mag gegenerate ang table:
1689737421466.png
 

Attachments

Last edited:
Magandang araw din sa inyo!

Base sa inyong code, ang paggamit ng rowspan sa "pi_no" column ay nagiging sanhi ng problema sa pag-generate ng PDF table at nagko-cause ng maximum time limit. Mayroong ilang mga posibleng solusyon para maayos ito. Narito ang ilang mga ideya na maaari ninyong subukan:

1. Tanggalin ang rowspan at i-adjust ang pagkakabuo ng mga row:
Sa halip na gamitin ang rowspan sa "pi_no" column, maaari ninyong tanggalin ito at i-adjust ang iyong code para maayos na magbalikat ng mga row ang mga kailangan. Sa halimbawa, maaari kayong gumamit ng array para maitala kung aling mga row ang dapat magbalikat at kung ilang beses ito dapat gawin.

2. Gumamit ng ibang library para sa pag-generate ng PDF:
Kung ang kasalukuyang library na ginagamit ninyo ay may limitasyon o hindi kaya ang mga kinakailangan ninyo, maaaring subukan ninyong gumamit ng ibang library para sa pag-generate ng PDF tulad ng Dompdf o MPDF. Ito ay kadalasang may mas malawak na suporta at mas mabilis na pag-generate ng mga malalaking tabo.

3. Optimisahin ang pag-generate ng PDF:
Maaaring may mga bahagi ng inyong code na maaaring ma-optimize para maabot ang maximum time limit. Maaaring subukan ninyong i-analyze ang inyong code at tukuyin kung saan ang mga bahagi na kumukuha ng maraming oras. Maaaring magamit ang profiling tools tulad ng Xdebug para sa pagsusuri ng performance ng inyong code at matukoy kung aling bahagi ang pinakamabagal.

4. I-test ang code sa ibang environment:
Maaari rin na subukan ang inyong code sa ibang environment o server upang matingnan kung ang maximum time limit ay resulta ng isang environment-specific na isyu.

5. Pag-aralan ang paggamit ng pag-cache:
Kung ang inyong data ay hindi nagbabago nang madalas, maaaring magamit ang pag-cache upang maiwasan ang paulit-ulit na pagkuha ng data mula sa database. Sa pamamagitan ng pag-cache, maaari ninyong mabilisang makuha ang mga dati nang hinugot na data at mabawasan ang load sa database.

Pagsubokan ninyo itong mga solusyon na ito upang malunasan ang inyong problema sa pag-generate ng PDF table. Kung mayroon pang mga katanungan o kailangan pa ng karagdagang tulong, huwag mag-atubiling magtanong muli.
 
Magandang araw din sa inyo!

Base sa inyong code, ang paggamit ng rowspan sa "pi_no" column ay nagiging sanhi ng problema sa pag-generate ng PDF table at nagko-cause ng maximum time limit. Mayroong ilang mga posibleng solusyon para maayos ito. Narito ang ilang mga ideya na maaari ninyong subukan:

1. Tanggalin ang rowspan at i-adjust ang pagkakabuo ng mga row:
Sa halip na gamitin ang rowspan sa "pi_no" column, maaari ninyong tanggalin ito at i-adjust ang iyong code para maayos na magbalikat ng mga row ang mga kailangan. Sa halimbawa, maaari kayong gumamit ng array para maitala kung aling mga row ang dapat magbalikat at kung ilang beses ito dapat gawin.

2. Gumamit ng ibang library para sa pag-generate ng PDF:
Kung ang kasalukuyang library na ginagamit ninyo ay may limitasyon o hindi kaya ang mga kinakailangan ninyo, maaaring subukan ninyong gumamit ng ibang library para sa pag-generate ng PDF tulad ng Dompdf o MPDF. Ito ay kadalasang may mas malawak na suporta at mas mabilis na pag-generate ng mga malalaking tabo.

3. Optimisahin ang pag-generate ng PDF:
Maaaring may mga bahagi ng inyong code na maaaring ma-optimize para maabot ang maximum time limit. Maaaring subukan ninyong i-analyze ang inyong code at tukuyin kung saan ang mga bahagi na kumukuha ng maraming oras. Maaaring magamit ang profiling tools tulad ng Xdebug para sa pagsusuri ng performance ng inyong code at matukoy kung aling bahagi ang pinakamabagal.

4. I-test ang code sa ibang environment:
Maaari rin na subukan ang inyong code sa ibang environment o server upang matingnan kung ang maximum time limit ay resulta ng isang environment-specific na isyu.

5. Pag-aralan ang paggamit ng pag-cache:
Kung ang inyong data ay hindi nagbabago nang madalas, maaaring magamit ang pag-cache upang maiwasan ang paulit-ulit na pagkuha ng data mula sa database. Sa pamamagitan ng pag-cache, maaari ninyong mabilisang makuha ang mga dati nang hinugot na data at mabawasan ang load sa database.

Pagsubokan ninyo itong mga solusyon na ito upang malunasan ang inyong problema sa pag-generate ng PDF table. Kung mayroon pang mga katanungan o kailangan pa ng karagdagang tulong, huwag mag-atubiling magtanong muli.
Ito naman sa baba ang query ko mula sa php model at yang code na ibinahagi ko sa taas ay ang php controller:
PHP:
public function getSupplierTrackingReport($searchBy, $supId, $dateFrom, $dateTo)
    {
        $sql = "SELECT DISTINCT s.supplier_name, cus.l_acroname, c.crf_no, c.crf_date, c.status AS crf_vs_psi_status, sop.sop_no, sop.date_created AS sop_date, pro.proforma_code AS psi_no, pro.delivery_date AS psi_date, po.po_no, po.order_date AS po_date, pi.pi_no, pi.posting_date AS pi_date, pi.status AS pi_vs_psi_status
            FROM proforma_header pro
            INNER JOIN customers cus ON cus.customer_code = pro.customer_code
            INNER JOIN crf c ON c.crf_id = pro.crf_id
            INNER JOIN po_header po ON po.po_header_id = pro.po_header_id
            INNER JOIN sop_head sop ON sop.sop_id = c.sop_id
            INNER JOIN purchase_invoice_header pi ON pi.po_header_id = po.po_header_id
            LEFT JOIN suppliers s ON s.supplier_id = pro.supplier_id
            WHERE c.crf_date >= ? AND c.crf_date <= ?";
        if ($searchBy == 'All Supplier') {
            $params = array($dateFrom, $dateTo);
        } else if ($searchBy == 'Supplier') {
            $sql .= " AND pro.supplier_id = ?";
            $params = array($dateFrom, $dateTo, $supId);
        }
        //$sql .= " GROUP BY s.supplier_name, cus.l_acroname, c.crf_no, c.crf_date, c.status, sop.sop_no, sop.date_created, pro.proforma_code, pro.delivery_date, po.po_no, po.order_date, pi.pi_no, pi.posting_date, pi.status";
        $sql .= " ORDER BY s.supplier_name, pro.proforma_code, po.po_no, pi.posting_date ASC";
        $query = $this->db->query($sql, $params);
        return $query->result_array();
    }
 
Last edited:

Similar threads

Back
Top