我在postgresql中有一个表。 字段类型为“interval”,其名称为“time_duration”。 postgresql发送到我的extjs网格json,如:
Ext.grid.feature.GroupingSummary
我想使用summaryType: 'sum'
当我将dataIndex: 'time_duration'
与0
一起使用时,其返回日期就像一个字符串,并在开头添加summaryType
。
value
获取"0Tue Jul 04 2017 00:01:00 GMT+0300 (RTZ 2 (зима))Tue Jul 04 2017 01:00:00 GMT+0300 (RTZ 2 (зима))Tue Jul 04 2017 02:00:00 GMT+0300 (RTZ 2 (зима))"
参数字符串"time_duration":"01:00:00"+ "time_duration":"01:00:00" = "02:00:00"
。所以json的日期加入了。
我想总结一下。例如 Ext.require(['Ext.data.*', 'Ext.grid.*']);
// Создаем model
Ext.define('Users', {
extend: 'Ext.data.Model',
//idProperty: 'id',
//idProperty: 'id',
fields: [{
name: 'id',
type: 'int',
//mapping: 'id'
},
{
name:'time_duration',
type:'date',
dateFormat:'H:i:s'
}
]
});
Ext.onReady(function() {
// Создаем store
var store = Ext.create('Ext.data.Store', {
autoLoad: true,
autoSync: true,
model: 'Users',
// Задает параметр для фильтрации подтаблиц myGroupingFeature
groupField: 'date',
groupDir: 'DESC',
proxy: {
type: 'ajax',
url: 'test_rakov.php',
api: {
create: 'test_rakov.php?action=create',
read: 'test_rakov.php?action=read',
update: 'test_rakov.php?action=update',
destroy: 'test_rakov.php?action=delete'
},
reader: {
type: 'json',
// Данные получаемые от сервера, которые мы затем обрабатываем в таблице
rootProperty: 'dataFromServer'
},
writer: {
type: 'json',
encode: true,
rootProperty: 'dataUpdate',
allowSingle: false,
writeAllFields: true,
//root:'records'
},
actionMethods: {
create: 'GET',
read: 'GET',
update: 'GET',
destroy: 'GET'
}
},
listeners: {
write: function(store, operation) {
var record = operation.getRecords()[0],
name = Ext.String.capitalize(operation.action),
verb;
if (name == 'Destroy') {
verb = 'Destroyed';
} else {
verb = name + 'd';
}
//Ext.example.msg(name, Ext.String.format("{0} user: {1}", verb, record.getId()));
}
}
});
// Отображает подтаблицы в таблице
var myGroupingFeature = Ext.create('Ext.grid.feature.GroupingSummary', {
groupHeaderTpl: '{columnName}: {name} ({rows.length} задач)',
hideGroupedHeader: false,
// Сворачивать по умолчанию или нет
startCollapsed: false
});
// Данные для выбора типа задачи
var storeCombo = new Ext.data.SimpleStore({
fields: ["value"],
data: [
["Анализ регистраций в WebAdmin"],
["AP -Анализ работы сервера"],
["AP -Составление config файлов"],
["Анализ заявок в СРМ"],
["Встречи"],
["Консультация сотрудников ОТП"],
["Перекур"],
["Программирование"],
["Почтовая переписка"],
["Другое"],
]
});
// Выбор типа задачи
var combo = new Ext.form.ComboBox({
store: storeCombo,
editable: false,
valueField: "value",
displayField: "value",
});
var grid = Ext.create('Ext.grid.Panel', {
columnLines: true,
renderTo: document.body,
// Редактирование таблицы
plugins: {
ptype: 'cellediting',
clicksToEdit: 1
},
listeners: {
edit: function() {
}
},
width: '99,3%',
// Высота на весь экран
autoHeight: true,
frame: true,
title: 'Users',
store: store,
// Отображает подтаблицы в таблице
features: [myGroupingFeature],
iconCls: 'icon-user',
columns: [{
text: 'id',
width: '2%',
sortable: true,
dataIndex: 'id',
renderer: function(v, meta, rec) {
return rec.phantom ? '' : v;
}
},
{
header: 'Задача',
width: '30%',
// sortable: true,
dataIndex: 'task',
editor: {
completeOnEnter: false,
field: {
xtype: 'textfield',
enableKeyEvents: true,
listeners: {
keydown: function(field, e) {
if (e.getKey() == e.ENTER) {
field = grid.getSelectionModel().getCurrentPosition().rowIdx;
grid.getView().focusRow(field);
}
}
},
//name: 'timeStart1',
//fieldLabel: 'Time In',
anchor: '100%',
allowBlank: false
}
}
},
{
header: 'Время начала',
width: '5%',
// sortable: true,
dataIndex: 'time_start',
//format: 'H:i',
// Нужно для верного отображеия времени после редактирования в таблице
renderer: Ext.util.Format.dateRenderer('H:i'),
editor: {
completeOnEnter: true,
field: {
xtype: 'timefield',
format: 'Hi',
//name: 'timeStart1',
//fieldLabel: 'Time In',
//minValue: '8:00',
//maxValue: '20:00',
increment: 720,
//anchor: '100%',
//allowBlank: false
}
}
},
{
header: 'Результат',
width: '30%',
// sortable: true,
dataIndex: 'task_result',
editor: {
completeOnEnter: false,
field: {
xtype: 'textfield',
enableKeyEvents: true,
listeners: {
keydown: function(field, e) {
if (e.getKey() == e.ENTER) {
field = grid.getSelectionModel().getCurrentPosition().rowIdx;
grid.getView().focusRow(field);
}
}
},
//name: 'timeStart1',
//fieldLabel: 'Time In',
//anchor: '100%',
allowBlank: false
}
}
},
{
header: 'Время конца',
width: '5%',
// sortable: true,
dataIndex: 'time_end',
//format: 'H:i',
// Нужно для верного отображеия времени после редактирования в таблице
renderer: Ext.util.Format.dateRenderer('H:i'),
editor: {
completeOnEnter: false,
field: {
xtype: 'timefield',
format: 'Hi',
enableKeyEvents: true,
listeners: {
keydown: function(field, e) {
if (e.getKey() == e.ENTER) {
field = grid.getSelectionModel().getCurrentPosition().rowIdx;
grid.getView().focusRow(field);
}
}
},
//name: 'timeStart1',
//fieldLabel: 'Time In',
minValue: '8:00',
maxValue: '20:00',
increment: 30,
anchor: '100%',
allowBlank: false
}
}
},
{
header: 'Дата',
width: 70,
// sortable: true,
dataIndex: 'date',
renderer: Ext.util.Format.dateRenderer('d/m/Y'),
editor: {
completeOnEnter: false,
field: {
xtype: 'datefield',
dateFormat: 'd/m/Y',
allowBlank: false
}
}
},
{
header: 'Длительность',
width: 60,
// sortable: true,
dataIndex: 'time_duration',
//xtype: 'datecolumn',
renderer: Ext.util.Format.dateRenderer('H:i:s'),
summaryType: 'sum',
//summaryType: function(f1){ console.log(f1); return;}
//summaryRenderer: Ext.util.Format.dateRenderer('H:i')
summaryRenderer: function(value, summaryData, dataIndex){
//console.log("val1= " + value);
var val2 = value.substring(1);
//console.log("val2= " + x);
var x = Ext.Date.format(val2, 'H:i:s');
//console.log (x);
//console.log( Ext.Date.format(val2, 'H:i:s'));
//console.log("tmpDate= " + tmpDate);
//return Ext.String.format('{0} student{1}', value, value !== 1 ? 's': '');
}
},
{
header: 'Тип задачи',
width: '20%',
dataIndex: 'task_type',
editor: combo
}
],
dockedItems: [{
xtype: 'toolbar',
items: [{
text: 'Добавить задачу',
iconCls: 'icon-add',
handler: function() {
// Создаем новую задачу
// Для корректной работы с БД нужно задать ID новой строки, равной +1 от последней ID из таблицы.
var rec = new Users();
//rec.date = Ext.Date.format(new Date(), 'Y-m-d\\T00:00:00');
//rec.data.date = Ext.Date.format(new Date(), 'Y-m-d\\T00:00:00');
rec.set('date', new Date());
rec.set('time_start', new Date(),'H:i:s');
//rec.time_start = Ext.Date.format(new Date(), '2008-01-01\\TH:i:s');
//rec.data.time_start = Ext.Date.format(new Date(), '2008-01-01\\TH:i:s');
store.insert(0, rec);
}
}, '-', {
itemId: 'delete',
text: 'Удалить задачу',
iconCls: 'icon-delete',
disabled: false,
handler: function() {
var selection = grid.getView().getSelectionModel().getSelection()[0];
if (confirm('Вы действительно хотите удалить задачу №' + selection.id + " ?")) {
// Удлаяем
if (selection) {
store.remove(selection);
}
}
}
}]
}]
});
});
。如何以正确的方式做到这一点? Mb将postgresl中的字段类型更改为其他内容?请帮帮我。
这是我的代码:
{{1}}
答案 0 :(得分:1)
您可以传递summaryType
一个功能:
....或者,summaryType可以是函数定义。如果 在这种情况下,使用两个参数调用该函数:一个数组 记录和一组字段值来计算摘要 值。
http://docs.sencha.com/extjs/6.2.1/classic/Ext.grid.feature.GroupingSummary.html
所以而不是:
summaryType: 'sum'
您可以使用:
summaryType: function(records){
// do your logic and return a value.
}