On duplicate key update
On duplicate key update
Khalid Teli            
            
                Posts: 251Questions: 71Answers: 0            
            Hello,
I have a table which hold the information about balances.
So, when I insert the data in table , after inserting the balance for first month, it needs to be updated each month. I know I can do it using edit window but data is quite large, so I would like to upload a csv file and update records.
Is there a way to use on duplicate key update? or any other way round?
My client side code looks like this:
<script type="text/javascript" language="javascript">
var editor; // use a global for the submit and return data rendering in the contractss
function selectColumns ( editor, csv, header ) {
    var selectEditor = new $.fn.dataTable.Editor();
    var fields = editor.order();
    for ( var i=0 ; i<fields.length ; i++ ) {
        var field = editor.field( fields[i] );
        selectEditor.add( {
            label: field.label(),
            name: field.name(),
            type: 'select',
            options: header,
            def: header[i]
        } );
    }
    selectEditor.create({
        title: 'Map CSV fields',
        buttons: 'Import '+csv.length+' records',
        message: 'Select the CSV column you want to use the data from for each field.'
    });
    selectEditor.on('submitComplete', function (e, json, data, action) {
        // Use the host Editor instance to show a multi-row create form allowing the user to submit the data.
        editor.create( csv.length, {
            title: 'Confirm import',
            buttons: 'Submit',
            message: 'Click the <i>Submit</i> button to confirm the import of '+csv.length+' rows of data. Optionally, override the value for a field to set a common value by clicking on the field below.'
        } );
        for ( var i=0 ; i<fields.length ; i++ ) {
            var field = editor.field( fields[i] );
            var mapped = data[ field.name() ];
            for ( var j=0 ; j<csv.length ; j++ ) {
                field.multiSet( j, csv[j][mapped] );
            }
        }
    } );
}
$(document).ready(function() {
   //function for using global filtering
  function filterColumn ( i ) {
    $('#contracts').DataTable().column( i ).search(
        $('#col'+i+'_filter').val()
    ).draw();
}
  editor = new $.fn.dataTable.Editor( {
    "ajax":
       {
        url:"/Editor/Editor-1.9.5/controllers/contracts/contracts_import_balance_fetch.php",
     },
    "table": "#contracts",
    "fields": [
      {
          label: "Product ID:",
          name: "product_id_fk"
        },
         {
          label: "Contract ID :",
          name: "contract_id_fk"
        },
         {
          label: "M1:",
          name: "m1"
        },
        {
         label: "M2:",
         name: "m2"
       },
       {
        label: "M3:",
        name: "m3"
      },
      {
       label: "M4:",
       name: "m4"
     }
    ]
  } );
// Upload Editor - triggered from the import button. Used only for uploading a file to the browser
    var uploadEditor = new $.fn.dataTable.Editor( {
        fields: [ {
            label: 'CSV file:',
            name: 'csv',
            type: 'upload',
            ajax: function ( files ) {
                // Ajax override of the upload so we can handle the file locally. Here we use Papa
                // to parse the CSV.
                Papa.parse(files[0], {
                    header: true,
                    skipEmptyLines: true,
                    complete: function (results) {
                        if ( results.errors.length ) {
                            console.log( results );
                            uploadEditor.field('csv').error( 'CSV parsing error: '+ results.errors[0].message );
                        }
                        else {
                            uploadEditor.close();
                            selectColumns( editor, results.data, results.meta.fields );
                        }
                    }
                });
            }
        } ]
    } );
 var tablebalance = $('#contracts').DataTable( {
       "processing": true,
       "serverSide": true,
        "scrollX":true,
        "scrollCollapse": true,
        "ordering": [],
        "stateSave": false,
        "info":   true,
         "ajax":
    {
     url:"/Editor/Editor-1.9.5/controllers/contracts/contracts_import_balance_fetch.php",
           type:'POST',
            "data": function ( d ) {
         var start_date = $('#start_date').val();
                var end_date = $('#end_date').val();
          d.start_date = start_date;
                d.end_date = end_date;
            }
    },
          "dom": 'Brtlip',
   "columns": [
       { data: "contract_id_fk" },
      { data: "product_id_fk" },
      { data: "product_name" },
      { data: "pack_size" },
      { data: "member_name" },
      { data: "contract_prod" },
      { data: "start_date" },
         { data: "end_date" },
           { data: "m1" },
           { data: "m2" },
           { data: "m3" },
           { data: "m4" }
     ],
   select: true,
   buttons: [
     { extend: "create", editor: editor },
     { extend: "edit",   editor: editor },
     { extend: "remove", editor: editor },
      {
                text: 'Import CSV',
                action: function () {
                    uploadEditor.create( {
                        title: 'CSV file import'
                    } );
                }
            },
             buttons: [
            'csv'
        ]
   ]
 } );
})
</script>
server side code looks like this:
<?php
include( "../../lib/DataTables.php" );
use
  DataTables\Editor,
  DataTables\Editor\Field,
  DataTables\Editor\Format,
  DataTables\Editor\Mjoin,
  DataTables\Editor\Options,
  DataTables\Editor\Upload,
  DataTables\Editor\Validate,
  DataTables\Editor\ValidateOptions,
    DataTables\Editor\SearchPaneOptions;
$editor = Editor::inst( $db, 'crg_contracts_balance', 'contract_bal_id' )
    ->field(
       Field::inst( 'crg_products.product_code', 'product_code'),
       Field::inst( 'crg_products.product_name', 'product_name' ),
        Field::inst( 'crg_contracts.member_name', 'member_name' ),
        Field::inst( 'crg_contracts.start_date','start_date' ),
        Field::inst( 'crg_contracts.end_date','end_date' ),
        Field::inst( 'supplier.supplier_name','supplier_name' ),
        Field::inst( 'crg_contracts.contract_prod','contract_prod' ),
        Field::inst( 'crg_products.pack_size' , 'pack_size'),
         Field::inst( 'crg_contracts_balance.product_id_fk' , 'product_id_fk'),
        Field::inst( 'crg_products.product_id', 'product_id' ),
        Field::inst( 'crg_contracts_balance.contract_id_fk','contract_id_fk' ),
        Field::inst( 'crg_contracts.contract_id','contract_id' ),
       Field::inst( 'crg_contracts_balance.m1','m1' ),
       Field::inst( 'crg_contracts_balance.m2' ,'m2'),
       Field::inst( 'crg_contracts_balance.m3','m3' ),
       Field::inst( 'crg_contracts_balance.m4','m4' ),
      );
if (isset($_POST['start_date']) && isset($_POST['end_date']) && !empty($_POST['start_date']) && !empty($_POST['end_date']))
{
$editor->where( function ( $q ) {
    $q->where('crg_contracts_balance.start_date' ,$_POST["start_date"], '>=' );
     $q->where('crg_contracts_balance.start_date' ,$_POST["end_date"], '<=' );
} );
}
else{
}
 $editor
   ->leftJoin( 'crg_contracts', 'crg_contracts.contract_id', '=', 'crg_contracts_balance.contract_id_fk' )
  ->leftJoin( 'crg_products', 'crg_products.product_id', '=', 'crg_contracts_balance.product_id_fk' )
  ->leftJoin( 'supplier', 'supplier.supplier_id', '=', 'crg_products.supplier_id_fk' )
 ->debug(true)
  ->process( $_POST )
  ->json();
Thank you
This discussion has been closed.
            
Answers
Hi,
in relation to the above question , I realised that I think i need something like this but not sure how can this be implemented using csv import