joined tables losses data changes
joined tables losses data changes
when I join 2 tables together, so some reason the changed data is not being passed to the php program.
I can get it to work with out the join but when I had the join the changed data does not get passed
php server script
use
DataTables\Editor,
DataTables\Editor\Field,
DataTables\Editor\Format,
DataTables\Editor\Join,
DataTables\Editor\Upload,
DataTables\Editor\Validate;
Editor::inst( $db)
->table("$dbname.ReportGroup")
->pkey('reportGroupID')
->fields(
Field::inst( 'ReportGroup.reportGroupID' ),
Field::inst( 'ReportGroup.reportGroupName' )->validator( 'Validate::notEmpty' ),
Field::inst( 'ReportGroup.reportGroupRoleID' )
->options("MBRROLE_FEATURE",'ROLEFEATURE_ID','NAME')
->validator( 'Validate::notEmpty' ),
Field::inst('MBRROLE_FEATURE.NAME')
->options("MBRROLE_FEATURE",'ROLEFEATURE_ID','NAME')
->validator( 'Validate::notEmpty' ),
Field::inst( 'ReportGroup.reportGroupDescr' )
)
->leftJoin('MBRROLE_FEATURE', "MBRROLE_FEATURE.ROLEFEATURE_ID", '=',"ReportGroup.reportGroupRoleID")
->process( $_POST )
->json();
javascript
reportGroup_Editor = new $.fn.dataTable.Editor( {
ajax: {
url: "/../../login/mysql/crudReportGroup.php",
},
table: "#reportGroupedit", //HTML table not sql table
fields: [ {
label: "GROUP ID: ",
name: "ReportGroup.reportGroupID",
type: "readonly",
attr: {
placeholder: "System generated ID number (Readonly)",
}
}, {
label: "GROUP NAME: ",
name: "ReportGroup.reportGroupName"
}, {
label: "ROLE FEATURE NAME: ",
name: "MBRROLE_FEATURE.NAME",
type: "select"
}, {
label: "DESCRIPTION: ",
name: "ReportGroup.reportGroupDescr",
type: "textarea"
}
],
i18n: {
create: {
title: "Create New Role Feature",
},
edit: {
title: "Edit Role Feature",
},
remove: {
title: "Delete Role",
confirm: {
1: "Are you sure you wish to delete the checked Feature?",
}
}
},
display: 'jqueryui',
formOptions: {
main: {
onReturn: 'none'
}
}
});
// Activate an inline edit on click of a table cell
$('#reportGroupedit').on( 'click', 'tbody td:not(:first-child)', function (e) {
console.log('inline edit');
onReturn: 'none',
reportGroup_Editor.inline( this, {
buttons: {
label: '<i class="fa fa-check" title="Submit"></i>',
fn: function () {
this.submit();
console.log('New Role Fature list');
}
}
});
});
reportGroup_Editor.on('submitSuccess', function(e, json, data) {
console.log('report group submit success');
console.log('e: ');
console.log(e);
console.log('json: ' );
console.log(JSON.stringify(json, null, 4));
console.log('data: ' );
console.log(JSON.stringify(data, null, 4));
newRoleFeatureList(document.getElementById('Role2'));
});
reportGroup_Editor.on('preCreate', function(e, json, data) {
console.log('report group preCreate');
console.log('e: ');
console.log(e);
console.log('json: ' );
console.log(JSON.stringify(json, null, 4));
console.log('data: ' );
console.log(JSON.stringify(data, null, 4));
newRoleFeatureList(document.getElementById('Role2'));
});
reportGroup_Editor.on( 'initEdit', function ( node, data, row, type ) {
console.log( node, data, row, type );
} );
$('#reportGroupedit').DataTable( {
"paging": false,
"scrollCollapse": true,
"scrollY": "20em",
"ScrollX": "100%",
dom: "BfTrtip",
//dom: "Tfrtip",
//dom: "Tf",
ajax: "/../../login/mysql/crudReportGroup.php",
columns: [
{ data: null,
defaultContent: '',
className: 'select-checkbox',
orderable: false
},
{ data: "ReportGroup.reportGroupID" },
{ data: "ReportGroup.reportGroupName" },
{ data: "MBRROLE_FEATURE.NAME" },
{ data: "ReportGroup.reportGroupDescr" }
],
order: [ 1, 'asc' ],
select: {
style: 'os',
selector: 'td:first-child'
},
buttons: [
{ extend: "create", editor: reportGroup_Editor },
{ extend: "edit", editor: reportGroup_Editor },
{ extend: "remove", editor: reportGroup_Editor }
]
});
console.log after inline edit of groupname changing Admin to Adminbbb
inline edit
adminReports.php:842 j…y.Event {type: "initEdit", timeStamp: 1442530190650, jQuery111306483318062964827: true, isTrigger: 2, namespace: ""…} <tr id="row_1" role="row" class="odd">…</tr> Object {DT_RowId: "row_1", ReportGroup: Object, MBRROLE_FEATURE: Object} <td>…</td>
adminReports.php:813 New Role Fature list
adminReports.php:806 inline edit
adminReports.php:820 report group submit success
adminReports.php:821 e:
adminReports.php:822 j…y.Event {type: "submitSuccess", timeStamp: 1442530228133, jQuery111306483318062964827: true, isTrigger: 2, namespace: ""…}
adminReports.php:823 json:
adminReports.php:824 {
"data": [
{
"DT_RowId": "row_1",
"ReportGroup": {
"reportGroupID": "1",
"reportGroupName": "Admin",
"reportGroupDescr": ""
},
"MBRROLE_FEATURE": {
"NAME": "RPTGRP_ADMIN"
}
}
],
"error": "",
"fieldErrors": []
}
adminReports.php:825 data:
adminReports.php:826 {
"DT_RowId": "row_1",
"ReportGroup": {
"reportGroupID": "1",
"reportGroupName": "Admin",
"reportGroupDescr": ""
},
"MBRROLE_FEATURE": {
"NAME": "RPTGRP_ADMIN"
}
}
adminReports.php:50 0
as you can see the data being sent to the sever script does not have the changes.
Also when adding a new row the windows fail to close and the new row is not added
This question has an accepted answers - jump to answer
Answers
Hi,
Thanks for the details. Could you add a
preSubmit
event as well, so we can see exactly what is being submitted to the server.However, what I suspect you are running into is the fact that Editor will only submit the value that has been modified when you are using inline editing, by default. For joined tables you need to have it submit the whole row, so the server-side has the information needed to be able to update the joined table (otherwise it doesn't know what row has been joined).
This can be done using the
submit
parameter of theform-options
object you are passing into theinline()
method. There are details about this in the upgrade documentation which is probably worth a read, even if you aren't upgrading but stating a new, as it explains what is happening.Allan
here the presubmit data for an inline change (reportGroupName hhhhdddd changed to hhhdddeee)
e
j…y.Event {type: "preSubmit", timeStamp: 1442583669167, jQuery111306972611050587147: true, isTrigger: 2, namespace: ""…}currentTarget: Editordata: undefineddelegateTarget: EditorhandleObj: ObjectisTrigger: 2jQuery111306972611050587147: truenamespace: ""namespace_re: nullresult: undefinedtarget: EditortimeStamp: 1442583669167type: "preSubmit"proto: Object
json:
{
"action": "edit",
"data": {
"row_6": {
"ReportGroup": {
"reportGroupName": "hhhhdddeee"
}
}
}
}
here the presubmit data for an bubble change (reportGroupName hhhhdddd changed to hhhdddeee)
e
j…y.Event {type: "preSubmit", timeStamp: 1442583899301, jQuery111306972611050587147: true, isTrigger: 2, namespace: ""…}
json:
{
"action": "edit",
"data": {
"row_6": {
"ReportGroup": {
"reportGroupID": "6",
"reportGroupName": "hhhhdddeee",
"reportGroupRoleID": "102",
"reportGroupDescr": "bbbbb"
}
}
}
}
here the preSubmit for a new insert: the dialog box does not close and the data is not inserted
e
j…y.Event {type: "preSubmit", timeStamp: 1442583996284, jQuery111306972611050587147: true, isTrigger: 2, namespace: ""…}
json:
{
"action": "create",
"data": {
"0": {
"ReportGroup": {
"reportGroupID": "",
"reportGroupName": "dddddd",
"reportGroupRoleID": "5",
"reportGroupDescr": "ddddddd"
}
}
}
}
data:
"create"
I will go reread the upgrade docs and see what I missed and look over my form-option
fyi: the reportGroupID is an auto increment column.
thanks for looking at this
Is their a way to have it only update or insert into the master table and not the joined tables. I want to display the name (from the joined table) but have the value inserted into the master table.
Currently I have it displaying for insert/change the name in the select box when editing but I can not get the name to display as default. This is done by not using a join but adding the option parameter to the field
Field::inst( 'ReportGroup.reportGroupRoleID' )
->options("MBRROLE_FEATURE",'ROLEFEATURE_ID','NAME')
->validator( 'Validate::notEmpty' ),
I changed the code to display the joined table column and it still act the same way here the preSubmit for a buble edit
e:
j…y.Event {type: "preSubmit", timeStamp: 1442585140766, jQuery11130466040767962113: true, isTrigger: 2, namespace: ""…}
json:
{
"action": "edit",
"data": {
"row_6": {
"ReportGroup": {
"reportGroupID": "6",
"reportGroupName": "hhhhdddeee",
"reportGroupRoleID": "102",
"reportGroupDescr": "bbbbb"
},
"MBRROLE_FEATURE": {
"NAME": "RPTGRP_PCSUSER"
}
}
}
}
data:
"edit"
Added the form option you recommended and nothing changed
inline code:
$('#reportedit').on( 'click', 'tbody td:not(:first-child)', function (e) {
console.log('Report inline edit');
report_Editor.inline( this, {
onReturn: 'none',
submit: 'allIfChanged',
buttons: {
label: '<i class="fa fa-check" title="Submit"></i>',
fn: function () {
this.submit();
console.log('Report: newReportList');
}
},
});
});
presubmit output:
e:
j…y.Event {type: "preSubmit", timeStamp: 1442585866823, jQuery111309216401523444802: true, isTrigger: 2, namespace: ""…}
json:
{
"action": "edit",
"data": {
"row_6": {
"ReportGroup": {
"reportGroupName": "hhhhdddeee"
}
}
}
}
data:
"edit"
Please disregard the last comment changed the wrong piece of code. here the correct information
inline code:
$('#reportGroupedit').on( 'click', 'tbody td:not(:first-child)', function (e) {
console.log('inline edit');
reportGroup_Editor.inline( this, {
onReturn: 'none',
submit: 'allIfChanged',
buttons: {
label: '<i class="fa fa-check" title="Submit"></i>',
fn: function () {
this.submit();
console.log('New Role Fature list');
}
}
});
});
presubmit output
e:
j…y.Event {type: "preSubmit", timeStamp: 1442586474586, jQuery111308602575790137053: true, isTrigger: 2, namespace: ""…}
json:
{
"action": "edit",
"data": {
"row_6": {
"ReportGroup": {
"reportGroupID": "6",
"reportGroupName": "hhhhdddeee",
"reportGroupRoleID": "102",
"reportGroupDescr": "bbbbb"
},
"MBRROLE_FEATURE": {
"NAME": "RPTGRP_PCSUSER"
}
}
}
}
data:
"edit"
rewrote the server code to use the new Mjoin method but can not get it to work.
code:
output:
Is there any way to print out the SQL statement you generate?
test SQL statement that works
select ReportGroup.reportGroupID, NAME
from benjiw_researchWeb.ReportGroup
join
benjiw_researchWeb
.MBRROLE_FEATURE
on ReportGroup.reportGroupRoleID = MBRROLE_FEATURE.ROLEFEATURE_ID;
In the
Database/Drivers/Mysql/Query.php
file (assuming you are using MySQL) you'll find a line which is commented out which callsfile_put_contents
. Enable that line and change the output file to one suitable for your system. That will record the SQL that Editor uses.I'm wondering if it is linked to the use of the database name as well as the table name.
Regards,
Allan
It does look like it my be related to the use of database name in the table name.
It looks like you do 2 SQL call with my configuration
SQL 1 - works fine
SELECT
reportGroupID
as 'reportGroupID',ReportGroup
.reportGroupID
as 'ReportGroup.reportGroupID',ReportGroup
.reportGroupName
as 'ReportGroup.reportGroupName',ReportGroup
.reportGroupDescr
as 'ReportGroup.reportGroupDescr'FROM
benjiw_researchWeb
.ReportGroup
;
SQL 2 has 3 issues. The issues are # out
SELECT
benjiw_researchWeb.ReportGroup.ROLEFEATURE_ID as dteditor_pkey,
benjiw_researchWeb.MBRROLE_FEATURE.ROLEFEATURE_ID as ROLEFEATURE_ID,
benjiw_researchWeb.MBRROLE_FEATURE.NAME as NAME
FROM benjiw_researchWeb.ReportGroup as
benjiw_researchWeb
.ReportGroupFROM benjiw_researchWeb.ReportGroup as ReportGroup
JOIN
benjiw_researchWeb
.MBRROLE_FEATURE
ON
benjiw_researchWeb
.MBRROLE_FEATURE
.reportGroupRoleID
=benjiw_researchWeb
.ReportGroup
.ROLEFEATURE_ID
ON
benjiw_researchWeb
.MBRROLE_FEATURE
.ROLEFEATURE_ID
=benjiw_researchWeb
.ReportGroup
.reportGroupRoleID
issue 1: the dteditor_pkey is matching up the wrong table and column
Issue 2: Database name in the AS clause in the FROM clause
Issue 3 the ON clause of the JOIN clause has the tables and column matched up wrong
My configuration
I removed the database name from the configuration and it still creating the dteditor_pkey and join incorrectly.
@jonescw I know this is small.. but you know that instead of doing:
You can just do
And yes, it still lets you interact with the objects/arrays as if it were in its own line, meaning you can expand them and see the data.
Just sayin :-D
And for the love of god... use formatting! lol, its impossible to read your code, or the blocks you paste.
Hi,
The SELECT query you have shown is the query Editor uses for its MJoin action. There should also be a query immediately preceding that one, another SELECT
which is performed on the
ReportGroup` table.The actual array join is the performed in PHP where the data sets are merged to form the data that should be output to the client-side.
That is shown in the table (in the web-browser) correct? That is the first thing to check there.
The next is, what is the data that is being submitted to the server when editing a row? The 'Network' tab in your browser's developer tools will be able to show you this.
Regards,
Allan
Allen
I'm going to close this Post and come back to it after I get a simple leftjoin to work.
thanks for you help