Архив метки: jqgrid

1C: Еще один вариант вывода данных с пагинацией

На этот раз, данные подготовлены для JSON JqGrid. Рабочий вариант для не большого количества записей (около 1000). В противном случае будут «тормоза» в 1С, т.к. листается вся выборка для построения «страницы».

Функция GetListing(body, answer) Экспорт	
	answer.result = Новый Массив;
	answer.error = Истина;
	answer.errortext = "Ошибка!";		
		Если body.Свойство("page") Тогда
			page = Число(body.page);
		Иначе
			page = 1;
		КонецЕсли;
		
		Если body.Свойство("limit") Тогда
			limit = Число(body.limit);
		Иначе
			limit = 20;
		КонецЕсли;
		
		Если body.Свойство("sidx") Тогда
			sidx = body.sidx;
		Иначе
			sidx = "";
		КонецЕсли;
		
		Если body.Свойство("sord") Тогда
			sord = body.sord;
		Иначе
			sord = "";
		КонецЕсли;
		
		Если body.Свойство("flt") Тогда
			flt = body.flt;
		Иначе
			flt = Неопределено;
		КонецЕсли;			
			
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ХрюХрю.Номер КАК id,
		|	ХрюХрю.НачалоЧесания КАК dtstart,
		|	ХрюХрю.ДлительностьПочесывания КАК long,
		|	ХрюХрю.Пятачок.Наименование КАК column,
		|	ХрюХрю.ВыходПятачка.OCPP_num КАК outlet,
		|	ХрюХрю.НачальныеПоказанияСчастья КАК meterstart,
		|	ХрюХрю.КонечныеПоказанияСчастья КАК meterend,
		|	ПРЕДСТАВЛЕНИЕ(ХрюХрю.ТекущийСтатусПочесывания) КАК status,
		|	ХрюХрю.ТекущийСтатусПочесывания КАК ТекущийСтатусПочесывания
		|ПОМЕСТИТЬ тЗарядки
		|ИЗ
		|	Документ.ХрюХрю КАК ХрюХрю
		|ГДЕ
		|	ХрюХрю.ЭЗС.Владелец.Код = &Код
		|	И ХрюХрю.ПометкаУдаления = ЛОЖЬ
		|	И ХрюХрю.НачалоЧесания МЕЖДУ &ДатаНачала И &ДатаКонца
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	тЗарядки.column КАК column,
		|	тЗарядки.dtstart КАК dtstart,
		|	тЗарядки.id КАК id,
		|	тЗарядки.long КАК long,
		|	тЗарядки.meterend КАК meterend,
		|	тЗарядки.meterstart КАК meterstart,
		|	тЗарядки.outlet КАК outlet,
		|	тЗарядки.status КАК status,
		|	тЗарядки.ТекущийСтатусПочесывания КАК ТекущийСтатусПочесывания
		|ИЗ
		|	тЗарядки КАК тЗарядки
		|	&Фильтры
		|	&Сортировка	";
	Запрос.УстановитьПараметр("Код", пп.Владелец.Код);
	Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата(body.datefrom)));
	Запрос.УстановитьПараметр("ДатаКонца", КонецДня(Дата(body.datefrom)));		
	
		Сортировка = "";
		Если ЗначениеЗаполнено(sidx) Тогда
				Сортировка = "УПОРЯДОЧИТЬ ПО " + sidx + " " + sord + ", id desc";
		КонецЕсли;
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Сортировка", Сортировка);
		
		Условие = "";
		status="";
		Если ЗначениеЗаполнено(flt) Тогда
			groupOp = flt.groupOp;
			rules = flt.rules;
			Для Каждого rule Из rules Цикл			
				Если rule.op = "bw" Тогда
					ЧастичноеУсловие = "(" + rule.field + " ПОДОБНО ""%" + rule.data + "%"")";
					Условие = Условие + ?(ЗначениеЗаполнено(Условие), " " + groupOp + " ", "") + ЧастичноеУсловие;					
				конецесли;
				Если rule.op = "eq" Тогда
					если rule.data<>"-1" тогда
						Если rule.field = "status" Тогда
							ЧастичноеУсловие = "(ТекущийСтатусПочесывания = &status)";
							status=rule.data;
						иначе
							ЧастичноеУсловие = "(" + rule.field + " = """ + rule.data + """)";
						конецесли;							
						Условие = Условие + ?(ЗначениеЗаполнено(Условие), " " + groupOp + " ", "") + ЧастичноеУсловие;
					конецесли;
				конецесли;
				
			конеццикла;				
			Если ЗначениеЗаполнено(Условие) Тогда
				Условие = "ГДЕ " + Условие;
			КонецЕсли;
		конецесли;		
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Фильтры", Условие);
	если status<>"" тогда
		status=перечисления.СтатусыПочесывания[status];
		Запрос.УстановитьПараметр("status", status);
	конецесли;			
	
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
	rows = Новый Массив();
	РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // нехорошо

		колстрок = РезультатЗапроса.Количество();
		total = Цел((колстрок - 1) / limit) + 1;		
		rowid = (page - 1) * limit;
		lastrow = rowid + limit - 1;
		records=0;
		Пока rowid <= lastrow И rowid < колстрок Цикл
			Стр = РезультатЗапроса[rowid];
			cell = Новый Массив;
			cell.Добавить(Стр.id);
			cell.Добавить(Стр.dtstart);
			cell.Добавить(Стр.long);
			cell.Добавить(Стр.column);
			cell.Добавить(Стр.outlet);
			cell.Добавить(Стр.status);
			cell.Добавить(Стр.meterend-Стр.meterend);
			cell.Добавить(0);
			row = Новый Структура("id, cell", Стр.id, cell);
			rows.Добавить(row);
			rowid = rowid + 1;
			records=records+1;
		КонецЦикла;
		
		result = Новый Структура("page, total, records, rows", page, total, records, rows); 		
		
	answer.result = result;	
	answer.errortext="";
	answer.error = ложь;
	
	возврат answer;
конецфункции	

jqgrid-free экспорт в эксель

В «свободном» форке jqgrid, к сожалению нет «встроенного» способа сформировать на основании таблицы файл Excel. Однако можно использовать сторонний способ https://github.com/SheetJS/sheetjs

Тогда код может получиться примерно следующий:

        jQuery("#paylist").jqGrid('navButtonAdd',"#paypager",{caption:'Excel',                              
             title: "Выгрузить в Excel",buttonicon: "none",position:"last",
             onClickButton:function(){                
                          var filename = "export_rents.xlsx",
                            data = $("#paylist").getRowData();
                            dataAsArray = [["dt", "amount", "comment"]];
                              for (i = 0; i < data.length; i++) {
                                item = data[i];
                                dataAsArray.push([item.dt, item.amount, item.comment]);
                              }
                              var ws_name = "SheetJS";
                              var wb = XLSX.utils.book_new(),
                                  ws = XLSX.utils.aoa_to_sheet(dataAsArray);
                              XLSX.utils.book_append_sheet(wb, ws, ws_name);
                              XLSX.writeFile(wb, filename);                
             }        
         });

JQgrid, странный глюк с jqContextMenu

На днях произошел странный глюк с плагином jqContextMenu, а именно, после нажатия на правую кнопку мыши контекстное меню появлялось, но пропадало после отпускания клавиши. Проявилось только в браузере FireFox и только у меня.  На что уж только не грешил, делал откат кода назад на пару недель, думал сам где какую ошибку внес. Затем сходил на сайт  Причем специально сходил на www.guriddo.net, где собственно размещена демка от «создателей» — опаньки, и там тоже самое. Значит проблема в браузере. Пробовал отключать плагины, чистить кэшь и т.д. — ничего не помогло. Пришлось засучить рукава и лезть в исходный код плагина context-menu.js, и ставить «костыль». А именно, заменил эвент «клик» на эвент «нажатие» (не отпускание) на скрытие «предыдущего» меню. Что за глюк браузера и почему вдруг «сломалось» — пока загадка.

Читать далее JQgrid, странный глюк с jqContextMenu

Обработка ошибок загрузки данных в операциях Add, Edit, Del в JqGrid

Чтобы отобразить «свою» интерпретацию ошибки на сервере при выполнении операции Add, Del, Edit можно воспользоваться следующим «финтом ушами»: 1) на сервере генерируем ошибку, например 501 которую обрабатывает стандарный обработчик ошибок errorTextFormat:

php:

 header('HTTP/1.1 501 Internal Server Error'); 
                die("Не могу добавить пользователя! " . mysqli_error(Module::$sqln->idsqlconnection));

И код JavaScript на клиенте:

$("#list1").navGrid("#pager1",{
				search: true,
				add: true,
				edit: true,
				del: true,
				refresh: true
				},
				{errorTextFormat: commonError}, //edit options
				{errorTextFormat: commonError}, //add options
				{errorTextFormat: commonError}, //delete options
				{
					multipleSearch: true
					,closeAfterSearch: true
					,closeAfterReset: true									
				}
			);
...
function commonError(data) {
    console.log(data.responseText);
    return data.responseText;
}