Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

Membuat report dengan tanggal dinamis dan kolom di baris ( PHP & MYSQL )

Saya mengalami kesulitan untuk pembuatan report dengan tanggal dinamis dan kolom yang dilooping . Berikut gambar report yang telah saya buat.

Permasalahan 1

Saya sudah looping table header periode dengan query yang beda dengan data, bagaimana caranya agar data angka angka dan tabel datanya menyesuaikan apa yang ada di header. Misal, PartName dengan mesin A jalan di tanggal 11, data seperti planning dst terisi di kolom periode 11.Seperti format yang saya inginkan. Query untuk penampilan data pisah dengan query untuk looping tanggal periode soalnya.

berikut codenya :

https://jsfiddle.net/LvL63f5k/

Berikut tabel databasenya :

sqlfiddle.com/#!9/a17ad89/1

Comments

  • edited January 17
    elo bikin ini ...
    select DAY(a.Date) as Tanggal 
    from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    ) a
    where a.Date between '$tglmulai' and '$tglselesai'
    ORDER BY a.Date
    niatnya buat apaan to ?

    gw liat di koding nya cuma buat bikin header.
    lalu itu pun elo batasi pake ... where a.Date between '$tglmulai' and '$tglselesai'

    cuma mau buat urutan tanggal dari $tglmulai s/d $tglselesai ?
    lalu cuma mau elo ambil ada brp hari buat nentuin jumlah kolomnya ?
    lalu cuma mau elo ambil tanggal nya buat penamaan kolomnya ?

    kok ya ribet to ...
    <?php
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    $interval=date_diff($tglmulai,$tglselesai)->format('%a')+1;
    $add=date_interval_create_from_date_string('1 day');
    date_sub($tglmulai,$add);

    echo '<table border=1 cellpadding=5 cellspacing=0>';

    echo '<tr><td colspan="'.($interval*2).'" align="center">PERIODE</td></tr>';

    echo '<tr>';
    for($i=0;$i < $interval;$i++) {
    date_add($tglmulai,$add);
    echo '<td>'.date_format($tglmulai,'j').'</td><td>Mesin</td>';
    }
    echo '</tr>';

    echo '</table>';
    ?>
    simple to ?




    kalo masalah menampilkan datanya ...
    gw kagak ngecek query elo sudah bener atau enggak ...
    tapi kalo sekedar menyesuaikan data dgn kolom tanggal yg sesuai ...
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    $interval=date_diff($tglmulai,$tglselesai)->format('%a')+1;
    $add=date_interval_create_from_date_string('1 day');
    date_sub($tglmulai,$add);

    $OK='<tr>';
    $NG='<tr>';
    ...
    for($i=0;$i < $interval;$i++) {
    date_add($tglmulai,$add);
    $OK.='<td>'.($r['Tanggal']==date_format($tglmulai,'Y-m-d')?$r['OK']:'').'</td><td></td>';
    $NG.='<td>'.($r['Tanggal']==date_format($tglmulai,'Y-m-d')?$r['NG']:'').'</td><td></td>';
    ...
    }
    $OK.='</tr>';
    $NG.='</tr>';
    ...

    echo $OK;
    echo $NG;
    ...
    cetak kalo tanggalnya sama.
  • edited January 17
    saya buat union all biar tanggal yang tidak ada datanya tetep tampil di header. Soalnya sebelum menampilkan report kan ada filter yg dipilih makanya gue buat variabel $tglmulai dan $tglselesai. Karena begini baris yang ada tulisannya "Planning, OK, NG, Jam, %NG" itu merupakan baris yang ane looping karena setiap ganti data kolom PartName otomatis ke 5 baris tersebut akan create baru.
    Dan ini query data saya:

    sqlfiddle.com/#!9/a17ad89/5

    Jadi dari query saya, saya pengen misakan baris planning untuk tgl 9 dengan nama mesin BS 120 B itu datanya menempati di kolom header yangtepat dan seterusnya. JIka ditanggal tsb tidak ada data yang kolomnya isinya null. Gimana itu. Sampai di sini pahamkan
  • edited January 17
    lalu kalo menurut elo,
    cara yg gw tulis itu tanggal nya ndak muncul semua ?
    sudah dicoba atau belum ?


    yg masalah tampilan data kan sudah gw tunjukin alurnya ...
    kan tinggal elo ikutin.
    sudah dicoba atau belum ?

    masa ya gw yg mesti ngetikin koding lengkap buat elo.
  • kalau tanggal sih emang keluar , sebelumnya juga udah keluar. masalah gue itu penempatan td(table data) yg berisi angka angka itu biar nempatin sesuai tanggalnya
  • edited January 18
    $OK.='<td>'.($r['Tanggal']==date_format($tglmulai,'Y-m-d')?$r['OK']:'').'</td><td></td>';

    paham baris perintah itu ndak ?


    soalnya di situ letak data di cetak di kolom yg sesuai.

    $r['Tanggal']==date_format($tglmulai,'Y-m-d')
    itu kondisinya ...

    kalo tanggalnya sama ... tambahkan data $r['OK']

    tapi kalo tidak sama / else ... tambahkan string kosong ''

    elo mau tulis if ... else ... lengkap ya silakan.



    cuma ya gw nulisnya pake model alur gw, ndak pake model alur elo.
    karena kalo model alur gw, tanggal masih bisa dibuat perbandingan.

    kalo model elo, tanggal dari db cuma tinggal ada tanggal 9,10,11,...

    mana bisa buat perbandingan dengan tanggal data yg satunya yg masih lengkap, misal '2018-01-10'.
  • edited January 17
    menurut ente query gue uda bener ngga, sama yang dibutuhin
  • edited January 18
    $OK.='<td>'.($r['Tanggal']==date_format($tglmulai,'Y-m-d')?$r['OK']:'').'</td><td></td>';

    ... atau ...

    $OK.='<td>';

    if($r['Tanggal']==date_format($tglmulai,'Y-m-d') {
    $OK.=$r['OK'];
    }
    else {
    $OK.='';
    }

    $OK.='</td><td></td>';

    sama saja
  • sebentar ente kasih looping dengan for terus looping ane while kepake ngga
  • edited January 17
    looping while kan buat ambil data di database nya ... ya tetep ada to.

    itu kan di dalam loop for masih pake $r['...'] elo.
    $r itu kan dapat nya dari while nya.

    for itu cuma buat nulis kolom nya ke kanan

    while itu kan buat nulis barisnya ke bawah.
    lha isinya emang data elo.



    logikanya kan sama kaya logika elo.
    yg diganti kan cuma "bagaimana cara elo menulis kolomnya"
    baik utk header
    maupun data

    jangan salah ...
    while elo total ada 3.
    1 while susun header ... ini ribet, ndak dipake, diganti alur gw
    1 while ambil data ... ini yg dipake
    1 while susun kolom ... ini juga ribet, ndak dipake, diganti alur gw
  • edited January 17
    kok data malah ngga muncul ya . Apa kodingan ane yg salah. Ada yg salah ngga. soalnya kalaui gue query-in bener. ini table data gue:

    gambar kode



  • edited January 17
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    $interval=date_diff($tglmulai,$tglselesai)->format('%a')+1;
    $add=date_interval_create_from_date_string('1 day');
    date_sub($tglmulai,$add);

    itu nya mana ?

    itu juga di dalam while, soalnya mesti diulang terus buat nulis dari kolom pertama sesuai tanggal.
  • lah itu kan kode yang ente kasih.
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    itu untuk table head
  • edited January 17
    salah paham mas ...

    itu 2x ...
    buat header iya
    buat data iya

    kan alur yg gw tunjukin juga gw tulis ulang.



    bisa elo sederhanakan, biar ndak bolak balik nulis '2017-01-09' & '2017-01-16'

    misal di awal
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    saat mau cetak header
    $tglmulai_header=$tglmulai;
    $tglselesai_header=$tglselesai;

    $interval=date_diff($tglmulai_header,$tglselesai_header)->format('%a')+1;
    $add=date_interval_create_from_date_string('1 day');
    date_sub($tglmulai_header,$add);

    ... sesuaikan date_add() & date_format() di dalam for nya ...

    saat cetak data
    $tglmulai_data=$tglmulai;
    $tglselesai_data=$tglselesai;

    // yg ini bisa dihilangkan, bisa pake $interval yg dari header, sama isinya
    $interval=date_diff($tglmulai_data,$tglselesai_data)->format('%a')+1;
    // ini juga bisa dihilangkan, isinya sama dgn $add yg di header
    $add=date_interval_create_from_date_string('1 day');
    // tapi ini tetap ada
    date_sub($tglmulai_data,$add);

    ... sesuaikan date_add() & date_format() di dalam for nya ...



    itu harus ditulis ulang soalnya fungsi date_sub() dan date_add() merubah isi $tglmulai nya.
    jadi harus di definisikan ulang isinya.
  • edited January 17
    Masih tetap tidak keluar data. Coba cek codingan saya



  • edited January 17
    echo '</tbody>';

    bukan di dalam while, itu setelah while selesai.

    tidak keluar data ini maksudnya ndak keluar sama sekali ?
    atau yg keluar cuma OK dan NG nya saja ?

    posting capture-an hasil terakhir.
  • tidak keluar sama sekali gan , dan untuk tgl yang terakhir selalu tabelnya tidak ada terus loopingnya saya ganti dari 0 ke -1 tabel garisnya muncul tapi datanya tetep ngga ada.
  • edited January 17
    bentar ...

    definisi
    $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16');

    di mana ?
    bener elo nulis tanggal nya ?
    itu gw nulis contoh alur nya "2017" ... sementara query elo pake data asli "2018"

    sudah disesuaikan ?



    masalah kolom kurang geser ke kanan ...

    $OK='<tr>';
    $NG='<tr>';

    disesuaikan juga to mas ...
    kan ada kolom buat NO dan PARTNAME
    paling ndak elo tambah <td></td> kosong 2 buah.

    atau kalo mau elo tambah judul barisnya ... terserah dah kalo yg itu ...

    tapi ya mesti elo sesuaikan.
    soalnya gw nunjukinnya alur utk kolom PERIODE doang.
  • edited January 18
    Untuk $tglmulai=date_create('2017-01-09');
    $tglselesai=date_create('2017-01-16'); udah gue ganti jadi tahun 2018. Karena, data gue tahun 2018, gue query datanya tampil. tapi pas ngikutin cara loe datanya ngga tampil sama sekali
  • edited January 18
    post lengkap koding nya.

    soalnya gw test di tempat gw keluar.


  • edited January 18
    nih link code gue phpfiddle.org/main/code/0bkd-zfqe

    tolong di cek, coba gue minta kodingan loe biar dicocokin juga.
  • edited January 18
    php nya yg aneh ...

    gw baru sadar, gw masih pake model reply pertama gw.
    2x
    $tglmulai=date_create('2018-01-09');
    $tglselesai=date_create('2018-01-16');

    bukan pake _header dan _data.
    dan belum gw sederhanakan.

    ini bug nya php.
    <?php
    $a=5; // $a isinya 5
    $b=$a; // $b isinya sama dengan $a, 5, pass by value

    echo $a.'<br>'; // 5
    echo $b.'<br>'; // 5

    $b=$b + 2; // $b isinya jadi 7, dan $a tetap 5;

    echo $a.'<br>'; // 5
    echo $b.'<br>'; // 7
    ?>
    <?php
    $add=date_interval_create_from_date_string('10 days');

    $a=date_create('2018-01-09');
    $b=$a; // ini harusnya assignment pass by value

    echo date_format($a,'Y-m-d').'<br>'; // '2018-01-09'
    echo date_format($b,'Y-m-d').'<br>'; // '2018-01-09'

    date_add($b,$add); // harusnya yg berubah cuma value variable $b

    echo date_format($a,'Y-m-d').'<br>'; // '2018-01-19' <~~ $a ikut berubah, pass by reference
    echo date_format($b,'Y-m-d').'<br>'; // '2018-01-19'
    ?>



    model penyederhanaannya yg mesti diubah.

    $tglmulai='2018-01-09';
    $tglselesai='2018-01-16';

    lalu berikutnya ...

    $tglmulai_header=date_create($tglmulai);
    $tglselesai_header=date_create($tglselesai);

    dan ...

    $tglmulai_data=date_create($tglmulai);
    $tglselesai_data=date_create($tglselesai);
  • edited January 18
    masih ngga bisa ya, gue minta kodingan loe gue cocokin yang salah apanya. soalnya gue udah ngikutin saran loe tapi masih ngga keluar
  • edited January 18
    ya kalo elo jalanin koding elo copy paste apa adanya ya ndak jalan mas'e ...

    itu kan butuh koneksi ke database
    ada $conn.

    elo ndak ada $conn=mysqli_connect(...);



    lha wong gw cuma ubah kodingan elo ... nambah ...

    $conn=mysqli_connect(...);

    lalu ubah ...

    $tglmulai='2018-01-09';
    $tglselesai='2018-01-16';

    lalu berikutnya ...

    $tglmulai_header=date_create($tglmulai);
    $tglselesai_header=date_create($tglselesai);

    dan ...

    $tglmulai_data=date_create($tglmulai);
    $tglselesai_data=date_create($tglselesai);

    selesai, jalan.
  • edited January 18
    ada kok gue pake ini mysqli_query($conn,"");

    soalnya koneksi ke database udah ada filenya sendiri jadi gue tinggal inculde aja.

    gue mau lihat kodingan loe aja.
  • edited January 18
    https://pastebin.com/YDfswUfp




    itu query gw ubah, soalnya dari elo cuma posting 1 table.
    gw hapus yg merujuk ke table ms_partcategory.
    dan karena elo juga sudah bilang query sudah elo test dan jalan, mestinya ndak ada masalah juga kalo ms_partcategory tetep ada.

    tapi buat contoh koding yg di atas, ndak dipake juga di tampilan dan prosesnya.

    dan gw juga sudah bilang ...
    kalo masalah kolom kurang ke kanan

    $OK='<tr>';
    $NG='<tr>';

    harus disesuaikan.
    soalnya elo ada kolom NO dan PART NAME
  • gue bingung penempatannya dimana dan salahnya dimana. dan kolom Mesin itu kan gimana agar $r['IdMesin'] itu menempati kolom mesin yg sesuai tanggalnya. seperti gambar yang post pertama kali.

    Hasil yang gue inginkan


    Hasil sekarang(amburadul)



    Kodingan gue sekarang
    https://pastebin.com/9rRFywLG


  • edited January 18
    ini salah ... dihapus saja.

    echo '<td>'.$no.'</td>';
    echo '<td>'.$r['PartName'].'</td>';
    echo '<tr><td>OK</td></tr>';
    echo '<tr><td>NG</td></tr>';

    alurnya :
    - semua <tr>...</tr> table ditampung dulu di variable (lihat contoh sebelumnya $OK & $NG)
    - di echo setelah loop for selesai (lihat contoh sebelumnya $OK & $NG)

    kalo liat model elo kaya gitu ...
    mestinya $no dan PartName ikut baris nya $OK.
    ditambah 1 kolom lagi buat judul baris, misal "OK" dan "NG"

    jadi mestinya begini :

    $OK='<tr><td>'.$no.'</td><td>'.$r['PartName'].'</td><td>OK</td>';

    $NG='<tr><td></td><td></td><td>NG</td>';



    kalo elo mau bikin baris <tr>...</tr> lain ...
    ya bikinnya begini (ikuti model $OK & $NG) :

    $Plan='<tr>...';
    $OK='<tr>...';
    $NG='<tr>...';
    $Jam='<tr>...';
    $Percent='<tr>...';

    lalu di dalam for ikuti polanya $OK dan $NG

    $Plan.='<td>...';
    $OK.='<td>...';
    $NG.='<td>...';
    $Jam.='<td>...';
    $Percent.='<td>...';

    sisanya setelah for dan echo nya ... bisa elo perkirakan sendiri dah ...
  • edited January 18
    ini nama part nya sama tapi tanggalnya beda kok ngecreate table data baru ya alias ke bawah. Harusnya begini : PartName yang sama tapi beda tangggal ada di satu baris tapi kolomnya beda. Misal PartName : BOTTOM STYROFOAM 51 GI itu kan ada dua yg beda tanggalnya doang harusnya angka angka itu diisi di kolom tgl yg sesuai bukan ngebuat baris baru.
    ini gambar terbaru


  • edited January 18
    kalo itu baru masalah query.
    jadi kaya begitu karena emang hasil query elo jadi 2 row data, bukan 1.

    kalo mau kaya begitu antara 2 ...

    [1]
    crosstab query elo yg diganti.
    SELECT 
    GROUP_CONCAT(dt.Tanggal ORDER BY dt.Tanggal) AS Tanggal,
    GROUP_CONCAT(dt.IdMesin ORDER BY dt.Tanggal) AS IdMesin,
    dt.PartID,
    GROUP_CONCAT(dt.PartName ORDER BY dt.Tanggal) AS PartName,
    GROUP_CONCAT(dt.Plan ORDER BY dt.Tanggal) AS Plan,
    GROUP_CONCAT(dt.NG ORDER BY dt.Tanggal) AS NG,
    GROUP_CONCAT(dt.OK ORDER BY dt.Tanggal) AS OK
    FROM (
    SELECT
    a.Tanggal,
    a.IdMesin,
    a.PartID,
    b.PartName,
    SUM(a.QtyPlanning) AS Plan,
    SUM(IF(a.HasilProduksi<>'Good',a.QtyProduksi,0)) AS NG,
    SUM(IF(a.HasilProduksi='Good',a.QtyProduksi,0)) AS OK
    FROM
    trans_lhpdthp a
    INNER JOIN
    ms_partcategory b ON b.PartID=a.PartID
    WHERE
    a.Tanggal BETWEEN '2018-01-09' AND '2018-01-16'
    GROUP BY
    a.PartID,a.IdMesin,a.Tanggal
    ORDER BY b.PartName
    ) dt
    GROUP BY dt.PartName
    tapi alurnya juga mesti di ubah .
    ada proses explode data.
    tapi tetep bisa 1 loop for di dalam while.
    kondisinya juga diubah.

    [2]
    tetep pake query yg sekarang.
    tapi ndak bisa main concatenate string bikin seperti $OK & $NG.
    alurnya baca data pake while,
    tampung dulu data yg terbaca di array, di sini baru ada proses buat menggabungkan.
    selesai while, baru ada loop foreach buat cetak data.

    kalo cara yg kedua itu resikonya kalo datanya banyak.
    bikin array nya pasti makan memori.
    karena semua data yg terbaca dari database disimpan semua ke array sebelum di cetak.
  • untuk cara pertama proses explodenya gimana soalnya tanggalnya kan juga di explode kan. bisa kasih contoh ngga
  • edited January 18
    sori ada yg salah ...
    yg PartName juga ndak perlu di GROUP_CONCAT()
    isinya sama.

    ...
    dt.PartID,
    dt.PartName,
    ...



    di dalam while, sebelum for

    $_Tanggal=explode(',',$r['Tanggal']);
    $_IdMesin=explode(',',$r['IdMesin']);
    $_Plan=explode(',',$r['Plan']);
    ... terusin sendiri, cuma yg di GROUP_CONCAT() yg mesti di explode ...

    di dalam for, sesudah date_add()

    $index=array_search(date_format($tglmulai_data,'Y-m-d'),$_Tanggal);

    tinggal ubah kondisinya ...
    gw contohin yg $OK

    $OK.='<td>'.($index!==false?$_OK[$index]:'').'</td><td></td>';

    selesai.
  • edited January 18
    ok gue coba
  • edited January 18
    $persenng = ROUND((($r['NG']/$r['OK'])*100),2);

    itu salah.

    $r['NG'] isinya string yg harus di explode.

    elo ngitungnya di dalam for, setelah $index=...

    $persenng = ROUND((($_NG[$index]/$_OK[[$index]])*100),2);



    $PLAN.=''.($index!==false?$_Plan[$index]:'').'';
    $OK.=''.($index!==false?$_OK[$index]:'').'';
    $NG.=''.($index!==false?$_NG[$index]:'').'';
    $jam.=''.($index!==false?$_OK[$index]:'').'';
    $persenng.=''.($index!==false?$_OK[$index]:'').'';

    $PLAN.='<td>'.($r['Tanggal']==date_format($tglmulai_data,'Y-m-d')?$r['Plan']:'').'</td><td>'.$r['IdMesin'].'</td>';
    $OK.='<td>'.($r['Tanggal']==date_format($tglmulai_data,'Y-m-d')?$r['OK']:'').'</td><td></td>';
    $NG.='<td>'.($r['Tanggal']==date_format($tglmulai_data,'Y-m-d')?$r['NG']:'').'</td><td></td>';
    $jam.='<td>'.($r['Tanggal']==date_format($tglmulai_data,'Y-m-d')?$r['NG']:'').'</td><td></td>';
    $percent.='<td>'.($r['Tanggal']==date_format($tglmulai_data,'Y-m-d')?$persenng:'').'</td><td></td>';

    baca ulang posting gw sebelumnya ...

    jangan nyalahin gw, ini gegara engine nya dweb bikin ribet.
    nulis posting "<td>" ... kalo < ndak diganti dulu jadi &lt; pasti hilang.

    jadi tadi terpaksa gw edit karena tag <td> & </td> nya hilang semua.
  • Yang $persenng hasilnya nol semua. Ini kodingan gue :

    Ini hasilnya :

  • masa ndak bisa liat sendiri to mas ...

    $persenng = ROUND((($_NG[$index]/$_OK[[$index]])*100),2);

    $_OK[[$index]] <~~ ini gw salah tulis :D ... masa ya kurung sikunya dobel.

    dikoreksi sendiri lah kalo gw salah tulis.
    lha wong gw juga ndak nyoba.
    gw nulis langsung dari logika yg gw pikir.



    dan berhubung $index isinya bisa false ...
    mending ditulisnya begini :

    if($index!==false) $persenng = ROUND((($_NG[$index]/$_OK[$index])*100),2);



    lalu $percent elo mestinya juga ada kondisinya ...

    $percent.='<td>'.($index!==false?$persenng:'').'</td><td></td>';
  • haha sorry sorry gue teledor, but thanks , gatau mau gimana kalau ngga ada loe
Sign In or Register to comment.