- код создает форму фильтра «начать с».
- при отправке фильтра создает подсписок.
- При создании подсписка вы добавляете дополнительныйполе, это поле должно генерировать событие изменения состояния и захватывать значение, которое я не знаю, как сделать.4. когда фильтрация по некоторым полям работает хорошо, но при фильтрации по полю "campoitem" она не работает, и я получаю эту ошибку:
{"type": "error.SuiteScriptError","name": "SSS_INVALID_SRCH_FILTER", "message": "nlobjSearchFilter содержит недопустимые критерии поиска: custrecord_nso_item.itemname.", "stack": ["getRange (N / searchObject)", "datos (/ SuiteScripts / GHprueScript).js: 114) "," onRequest (/SuiteScripts/GHpruebaScript/GHpruebas.js:86) "]," причина ": {" тип ":" внутренняя ошибка "," код ":" SSS_INVALID_SRCH_FILTER "," details ":"NlobjSearchFilter содержит недопустимые критерии поиска: custrecord_nso_item.itemname. "," UserEvent ": null," stackTrace ": [[getRange (N / searchObject)", "datos (/SuiteScripts/GHpruebaScript/GHpruebas.js4")onRequest (/SuiteScripts/GHpruebaScript/GHpruebas.js:86) "]," notifyOff ": false}," id ":" "," notifyOff ": false," userFacing ": false}
//, Also specify which field does not work when I apply a filter,
// for example "campoitem". some filters work well for example "codigobarra"
/**
* @NApiVersion 2.0
* @NScriptType suitelet
* @NModuleScope public
*/
define(['N/ui/serverWidget', 'N/search', 'N/log'],
function(serverWidget, search, log) {
//1 - FUNCION DE CONTENIDO
function onRequest(context) {
// 2 - CARGAMOS LA BUSQUEDA GUARDAD ESTA BUSQUEDA GUARDAD FUE CREADA EN SUITELE
// Y CONTIENE UNO FILTRO EN CRITERIA YA DEFINIDOS QUE AFECTAN A ESTE SCRIPT
var busqueda = search.load({ id: 'customsearch_axa_lista_v5_ok' });
//CREAMOS UN FORMULARIO
var formulario = serverWidget.createForm({ title: 'Formulario de Busqueda' });
// CREAMOS UN GRUPO DE BUSQUEDA INDIVIDUAL TEMPORAL
var GrupoBusqueda = formulario.addFieldGroup({ id: 'GrupoBusqueda', label: 'Grupo de Busqueda' });
GrupoBusqueda.isSingleColumn = true;
// CREAMOS LOS CAMPO QUE VAN A ENVIAR LOS VALORES
formulario.addField({ id: 'codigobarra', type: serverWidget.FieldType.TEXT, label: 'Codigo de Barras', container: 'GrupoBusqueda' });
formulario.addField({ id: 'nombrelinea', type: serverWidget.FieldType.TEXT, label: 'Linea de Producto', container: 'GrupoBusqueda' });
formulario.addField({ id: 'nombrelista', type: serverWidget.FieldType.TEXT, label: 'Lista de asociados', container: 'GrupoBusqueda' });
formulario.addField({ id: 'campoitem', type: serverWidget.FieldType.TEXT, label: 'Seleccionar Producto', container: 'GrupoBusqueda' });
formulario.addField({ id: 'formafarma', type: serverWidget.FieldType.TEXT, label: 'Seleccionar Tipo de producto ("Jarabe/tabletas etc..")', container: 'GrupoBusqueda' });
// CREAMOS UN GRUPO DE BUSQUEDA ENTRE CANTIDAD O PRECIOS COMO BETWEEN
var GrupoBusquedaDos = formulario.addFieldGroup({ id: 'GrupoBusquedaDos', label: ' AXA 2019' });
GrupoBusquedaDos.isSingleColumn = true;
// CREAMOS LOS CAMPOS QUE VAN A ENVIAR LOS VALORES
formulario.addField({ id: 'preciobase1', type: serverWidget.FieldType.CURRENCY, label: 'Precio desde', container: 'GrupoBusquedaDos' });
formulario.addField({ id: 'preciobase2', type: serverWidget.FieldType.CURRENCY, label: 'Precio hasta', container: 'GrupoBusquedaDos' });
formulario.addField({ id: 'ivaporcent1', type: serverWidget.FieldType.PERCENT, label: 'Promocion desde', container: 'GrupoBusquedaDos' });
formulario.addField({ id: 'ivaporcent2', type: serverWidget.FieldType.PERCENT, label: 'Promocion hasta', container: 'GrupoBusquedaDos' });
//CREAMOS LOS BOTONES DE ENVIO Y LIMPIAR
formulario.addSubmitButton({ id: 'markall', label: 'Enviar Filtro' });
formulario.addResetButton({ label: 'Limpiar Campos' });
//ENVIAMOS LOS DATOS A UNA PAGINA NUEVA DONDE PUEDO VISUALIZAR MIS CAMPOS
context.response.writePage(formulario);
//DEPUES DE CREADA LA PAGINA TOMO LOS VALORES AL EDITAR CADA CAMPO
// EJECUCION DE PRUEBA SOLO POR CAMPO INDIVIDUAL TEMPORALMENTE
var codigobarra = context.request.parameters.codigobarra;
var nombrelinea = context.request.parameters.nombrelinea;
var nombrelista = context.request.parameters.nombrelista;
var campoitem = context.request.parameters.campoitem;
var formafarma = context.request.parameters.formafarma;
var preciobase1 = context.request.parameters.preciobase1;
var preciobase2 = context.request.parameters.preciobase2;
var ivaporcent1 = context.request.parameters.ivaporcent1;
var ivaporcent2 = context.request.parameters.ivaporcent2;
// SI EL CODIGO DE BARRA CONTIENE UN VALOR ENVIAR EL FILTRO SINO PASA AL
// OTRO VALOR VALOR Y ASI SUCESIVAMENTE
// ESTE CODIGO FUNCIONA NOMBRELINEA
if (codigobarra) {
// EMPAQUETAMOS LA BUSQUEDA
var filtrosArray = busqueda.filters;
//CREAMOS EL FILTRO DE BUSQUEDA DEACUERDO AL VALOR OSEA CODIGO DE BARRA
var filterOne = search.createFilter({ name: 'upccode', join: 'custrecord_nso_item', operator: search.Operator.STARTSWITH, values: [codigobarra] });
// ENVIAMOS ESE FILTRO A NUESTRO ARRAY
filtrosArray.push(filterOne);
datos(filtrosArray) // INICIAMOS LA FUNCION DATOS CON EL FILTRO CREADO
} // ESTE CODIGO FUNCIONA NOMBRELINEA
else if (nombrelinea) {
var filterOne = search.createFilter({ name: 'vendorname', join: 'custrecord_nso_item', operator: search.Operator.STARTSWITH, values: [nombrelinea] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne);
datos(filtrosArray);
} // ESTE CODIGO FUNCIONA NOMBRELISTA
else if (nombrelista) {
var filterOne = search.createFilter({ name: 'name', join: 'CUSTRECORD_AXA_PRU_BOD_CLI', operator: search.Operator.STARTSWITH, values: [nombrelista] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne);
datos(filtrosArray);
} // ESTE CODIGO ACONTINUACION TIENE "ERROR CAMPOITEM"
else if (campoitem) {
var filterOne = search.createFilter({ name: 'itemname', operator: search.Operator.STARTSWITH, filter: [campoitem] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne);
datos(filtrosArray);
} // ESTE CODIGO ACONTINUACION TIENE "ERROR FORMAFARMA"
else if (formafarma) {
var filterOne = search.createFilter({ name: 'custitem_nso_forma_farmaceutica', operator: search.Operator.STARTSWITH, filter: [formafarma] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne);
datos(filtrosArray);
} // ESTE CODIGO FUNCIONA PRECIOBASE 1 Y 2
else if (preciobase1, preciobase2) {
var filterOne = search.createFilter({ name: 'formulanumeric', formula: 'ROUND(({custrecord_nso_costo_maestro}+({custrecord_nso_costo_maestro}*{custrecord_axa_pru_bod_cli.custrecord_nso_margen_2})),0)', operator: search.Operator.GREATERTHAN, values: [preciobase1] });
var filterTwo = search.createFilter({ name: 'formulanumeric', formula: 'ROUND(({custrecord_nso_costo_maestro}+({custrecord_nso_costo_maestro}*{custrecord_axa_pru_bod_cli.custrecord_nso_margen_2})),0)', operator: search.Operator.NOTGREATERTHAN, values: [preciobase2] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne, filterTwo);
datos(filtrosArray);
} // ESTE CODIGO ACONTINUACION TIENE "ERROR PORCENT1 Y PORCENT2"
else if (ivaporcent1, ivaporcent2) {
var filterOne = search.createFilter({ name: 'custitem_axa_edu_iva', join: 'CUSTRECORD_NSO_ITEM', operator: search.Operator.GREATERTHAN, values: [ivaporcent1] });
var filterTwo = search.createFilter({ name: 'custitem_axa_edu_iva', join: 'CUSTRECORD_NSO_ITEM', operator: search.Operator.NOTGREATERTHAN, values: [ivaporcent2] });
var filtrosArray = busqueda.filters;
filtrosArray.push(filterOne, filterTwo);
datos(filtrosArray);
}
// TERMINA LOS FILTROS DE BUSQUEDA
//FUNCION DATOS DONDE MOSTRAREMOS UNA SUBLISTA CON LOS DATOS ENCONTRADOS EN LOS FILTROS
function datos(filtrosArray) {
// CORREMOS LA BUSQUEDA PARA INGRESAR LA INFORMACION EN UNS SUBLISTA
var FiltrosV4 = busqueda.run().getRange({ start: 0, end: 70 });
// CFREAMOS UN NUEVO FORMULARIO QUE CONTENDRA LOS DATOS
var form = serverWidget.createForm({
title: 'Datos Filtrados: ' + codigobarra + ' - ' + nombrelinea + ' - ' + nombrelista + ' - ' + campoitem + ' - ' + formafarma
});
// ACCESO DIRECTO A UN NUEVO FILTRO - LINK
form.addPageLink({ type: serverWidget.FormPageLinkType.CROSSLINK, title: 'Nuevo Filtro', url: '/app/site/hosting/scriptlet.nl?script=1358&deploy=1' });
//LLAMO A UN ARCHIVO EXTERNO PARA PODER UTILIZAR LOS DATOS CON UN BOTON
form.clientScriptModulePath = 'SuiteScripts/GHpruebaScript/ClientScript/GHclientScript.js';
// CONTENEDOR DE LOS DATOS
var sublist = form.addSublist({
id: 'sublist',
type: serverWidget.SublistType.LIST, //INLINEEDITOR, LIST','EDITOR', or 'STATICLIST'
label: 'Listado de productos'
});
// NOMBRE DE CADA COLUMNA DE LA SUBLISTA
sublist.addField({ id: 'custpage_empresa', label: 'Empresa', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_codigobarra', label: 'Codigo de Barras', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_producto', label: 'Producto', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_linea', label: 'Linea', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_precio', label: 'Precio Venta', type: serverWidget.FieldType.CURRENCY });
sublist.addField({ id: 'custpage_descuento', label: 'Decuento', type: serverWidget.FieldType.PERCENT });
sublist.addField({ id: 'custpage_predesc', label: 'Precio Descuento', type: serverWidget.FieldType.CURRENCY });
sublist.addField({ id: 'custpage_iva', label: 'IVA', type: serverWidget.FieldType.PERCENT });
sublist.addField({ id: 'custpage_preiva', label: 'Precio IVA', type: serverWidget.FieldType.CURRENCY });
sublist.addField({ id: 'custpage_promo', label: 'Fecha Promocion', type: serverWidget.FieldType.DATE });
sublist.addField({ id: 'custpage_generico', label: 'Generico', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_farma', label: 'FormFarma', type: serverWidget.FieldType.TEXT });
sublist.addField({ id: 'custpage_saldo', label: 'Saldo', type: serverWidget.FieldType.INTEGER });
// CREAMOS UN CAMPO PARA INSERTAR INFORMACION DE CANTIDAD
// LA IDEA ESQUE ESTE CAMPO AL SER EDITADO CREE UN FIELDCHANGE QUIEN TOMARA LOS DATOS
// OSEA LA CANTIDAD Y TOMARA COMO REFERENCIA EL ID DE LA FILA DONDE SE ESCRIBIO.
var cantidad = sublist.addField({ id: 'custpage_cantidad', label: 'Cantidad Producto', type: serverWidget.FieldType.INTEGER });
cantidad.updateDisplayType({ displayType: serverWidget.FieldDisplayType.ENTRY });
//SECCIONAMOS LA BUSQUEDA CON SUS COLUMNAS
var sublist = form.getSublist({ id: 'sublist' });
for (var i = 0; i < FiltrosV4.length; i++) {
var columns = FiltrosV4[i].columns; // COLUMNA EN SU POSICION
sublist.setSublistValue({ id: 'custpage_empresa', line: i, value: [FiltrosV4[i].getValue(columns[0])] });
sublist.setSublistValue({ id: 'custpage_codigobarra', line: i, value: [FiltrosV4[i].getValue(columns[2])] });
sublist.setSublistValue({ id: 'custpage_producto', line: i, value: [FiltrosV4[i].getText(columns[3])] });
sublist.setSublistValue({ id: 'custpage_linea', line: i, value: [FiltrosV4[i].getValue(columns[4])] });
sublist.setSublistValue({ id: 'custpage_precio', line: i, value: [FiltrosV4[i].getValue(columns[5])] });
sublist.setSublistValue({ id: 'custpage_descuento', line: i, value: [FiltrosV4[i].getValue(columns[6])] });
sublist.setSublistValue({ id: 'custpage_predesc', line: i, value: [FiltrosV4[i].getValue(columns[7])] });
sublist.setSublistValue({ id: 'custpage_iva', line: i, value: [FiltrosV4[i].getValue(columns[8])] });
sublist.setSublistValue({ id: 'custpage_preiva', line: i, value: [FiltrosV4[i].getValue(columns[9])] });
sublist.setSublistValue({ id: 'custpage_promo', line: i, value: [FiltrosV4[i].getValue(columns[10])] });
sublist.setSublistValue({ id: 'custpage_generico', line: i, value: [FiltrosV4[i].getValue(columns[12])] });
sublist.setSublistValue({ id: 'custpage_farma', line: i, value: [FiltrosV4[i].getText(columns[13])] });
}
// CREAMOS UN BOTON DONDE ESTE CAPTURA EL CLIENTSCRIPT EXTERNO
var botones = sublist.addButton({
id: 'custpage_buttonid',
label: 'Enviar Selección',
functionName: 'btnenvio' //LLAMO LA FUNCION DEL CLIENTSCRIP
});
// MUESTRO MI SUBLISTA EN UNA NUEVA PAGINA
context.response.writePage(form);
}
}
return {
onRequest: onRequest
};
});
Este es el ClientScript, корректирующая дебера, функционирующая в полном объеме, полностью независимая, референсная оценка, бесплатная версия для печати.
/**
*@NApiVersion 2.0
*@NScriptType ClientScript
*/
define(["N/log", "N/ui/dialog", "N/record", "N/currentRecord"], function(log, dialog, record, currentRecord) {
//FUNCION PAGEINIT
var pageInit = function(context) { console.log('Ingreso tambien PageInit') } // contructor en blanco
//FUNCION DEL BOTON DEL SUITELET DE FILTROS
// AQUI ES DONDE DEBEMOS CAPTURAR EL VALOR DEL CAMPO "CANTIDAD"
//ESE VALOR DEBE TOMAR DE REFERECNIA EL ID DE ESA FILA DONDE ESTA ESCRIBIENDO
// PARA FINAL MENTE INTRODUCIRLA EN UN PEDIDO
var btnenvio = function(context) {
// MENSAJE DE CONFIRMACION DE CLICK EN EL BOTON
var reg = 'Verificando la carga de el JSON';
dialog.alert({
title: "Resultado de Recogidos ",
message: [reg]
});
// CARGO LA ORDEN DONDE QUIERO HACER UNA INSERCION "ESTE CARGO ES OBLIGATORIO EN ESTA PRUEBA"
// LA IDEA ES QUE AL SELECCIONAR MI CAJA DE CANTIDAD SE ACTIVE Y SELECCION POR DEFECTO UN EVENTO CON SI ID
var records = record.load({
type: 'purchaseorder',
id: 2980, // variable de seleccion estado cuando cambia el campo(vacio a lleno)
isDynamic: true
});
//ESTABLECEMOS LOS VALORES POR CAMPO
records.setValue({
fieldId: "custpage_producto",
value: 760
});
records.setValue({
fieldId: "quantity", //custpage_cantidad nombre del la variable del campos
value: 2
});
//Inserta una línea de sublista.
//Al insertar una línea con este método,
//se mueven todas las líneas correctas y se aumenta el recuento total de líneas.
//Esencialmente, las líneas siguientes se confirman en una nueva
//línea de sublista con un nuevo número de línea.
records.insertLine({
sublistId: 'item',
line: 1
});
//registro en modo estándar,
//debe enviar y cargar el registro para obtener valores de campo de origen,
records.save({
enableSourcing: true,
ignoreMandatoryFields: false
});
// JSON DEL ID BUSCADO
log.audit({ title: 'Informacion ClientScript', details: JSON.stringify(records) });
}
//VALIDACION DE LOS CAMPOS AUN NO DEFINIDO
function validateField(context) {
/*
var record = context.record;
var sublistName = context.sublistId;
var sublistFieldName = context.custpage_cantidad;
var line = context.line;
if (sublistName === 'custpage_cantidad') {
if (sublistFieldName === 'quantity') {
if (record.getCurrentSublistValue({
sublistId: sublistName,
fieldId: sublistFieldName
}) < 3) {
record.setValue({
fieldId: 'custpage_cantidad',
value: 2 //La cantidad es inferior a 3
});
} else {
record.setValue({
fieldId: 'custpage_cantidad',
value: 3 //'Cantidad aceptada'
});
}
}
}
return true;*/
}
// CAMBIO DE ESTADO CAMPO AUN NO DEFINIDO
function fieldChanged(context) {
var record = context.record;
var sublistName = context.sublistId;
var sublistFieldName = context.fieldId;
var line = context.line;
if (sublistName === 'item' && sublistFieldName === 'custpage_cantidad')
record.setValue({
fieldId: 'custpage_cantidad',
value: 'Item: ' + record.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'custpage_cantidad'
}) + ' is selected'
});
}
return {
pageInit: pageInit,
btnenvio: btnenvio,
fieldChanged: fieldChanged,
validateField: validateField
}
});