Application Performance Management: Como rastrear el desempeño con Netsuite 2015.2

ANTECEDENTES

Cuando las opciones de configuración de Netsuite son insuficientes para cubrir los requerimientos de negocio, podemos realizar adecuaciones por medio de scripts y flujos de trabajo. Con ellos se pueden hacer una gran variedad de pasos adicionales y adecuaciones a las instalaciones de Netsuite, pero tienen un pequeño problema: normalmente entre más adecuaciones y scripts, el performance se puede ver afectar.

¿cuales se afectan y como?

En ese momento, las preguntas adecuadas son: ¿qué script tenemos? ¿que registros hay afectados? ¿cuales podemos optimizar? ¿cuáles son los más lentos?. En el pasado, tener estas respuestas no era sencillo. Si bien existía un monitor de aplicaciones, solo era básico y sobre ciertas aplicaciones concretas.

Application performance management con netsuite 2015.2

En la versión 2015.2 de Netsuite se ha liberado el bundle de Application Performance Monitor. Esto fue anunciado durante el evento de Suite World, 2015. Esta interesante herramienta nos permite monitorear en tiempo real el desempeño de prácticamente cualquier transacción, tiempos, medias, tiempos de carga, etc.

Aqui un ejemplo:

 

NEtsuite 2015.2 Application Performance.
NEtsuite 2015.2 Application Performance.

Mediante este monitor, podemos tener una mayor visualización e información respecto a que ajustar y como están siendo afectada la operación por las adecuaciones.

En el ejemplo anterior, podemos ver que tenemos un pico en los tiempos de respuesta de una transacción dada.

¿COMO PODEMOS AYUDAR?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos.  Si necesita ayuda, por favor contactanos.

Borrado Masivo de Registros

Antecedentes

Una de las cosas comunes al implementar NetSuite es hacer pruebas, parte fundamental es simular el día a día de la operación, para ello se tiene que crear las transacción que realizan cada una de las áreas de la empresa, al final todas esas transacciones deberán ser borradas, fácil, si, pero tedioso, más si hablamos de algunas 100 transacciones, existe una manera de automatizar/facilitar este proceso, un Script tipo actualización masiva.

¿Cómo borrar masivamente registros?

Simplemente hay que seguir estos pasos:

  1. Crear un Script tipo “Actualización masiva”.
  2. Utilizar el siguiente código fuente:
    • function DeleteRecord(recordType, recordId)
      {
          try
          {
              nlapiDeleteRecord(recordType, recordId);
          }
          catch(error)
          {
              //logica de manejo de errores.
          }
      }
      
  3. Implementar el Script en el tipo de registro a borrar.
  4. Ir a Listas > Actualización masiva > Actualizaciones masivas > Actualizaciones personalizadas
  5. Seleccionar el tipo de registro y el Script creado en el paso 1
  6. Introducir “criterios” y “resultados”
  7. Presionar el botón Vista previa
  8. Presionar el botón Ejecutar actualización
  9. Repetir los pasos 3 – 8 hasta completar el borrado de registros.

Nota: la solución arriba implementada funciona tanto en registros personalizados como en Nativos.

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.

Consumir WebServices de NetSuite desde el navegador

Antecedentes

La integración entre uno o más sistemas siempre ha sido todo un tema, es común que al pensar en “Integracíon de sistemas” pensemos en archivos CSV o TXT, consultas SQL o directamente modificar la base de datos, otra opción es WebServices, cada día más presentes y mas potentes.

En estos tiempos donde la tecnología CloudComputing gana más terreno podemos probar un WebService sin tener que pasar por el dolor que impone la instalación de un lenguaje de programación, su IDE, sus librerias, etc, podemos probar directamente en WebService desde el navegador utilizando la pagina WSDL Browser

¿Que probar utilizar WSDL Browser?

Solo debemos ejecutar los siguientes pasos:

  1. Ir a la página web http://wsdlbrowser.com/
  2. Proporcionar la liga del WSDL a probar
  3. Presionar el botón Browse
  4. Elegir un método del panel izquierdo.
  5. Completar el request
  6. Presionar el botón Call function
  7. Esperar resultados.

Ejemplo en NetSuite: Consultar la existencia de artículos

  • WSDL:
  • https://webservices.netsuite.com/wsdl/v2015_1_0/netsuite.wsdl
  • Request
    <?xml version="1.0" encoding="UTF-8"?>
        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:core_2015_1.platform.webservices.netsuite.com" xmlns:ns2="urn:messages_2015_1.platform.webservices.netsuite.com">
            <SOAP-ENV:Header>
                <ns2:login>
                    <ns2:passport>
                        <ns1:email>MI_USUARIO</ns1:email>
                        <ns1:password>MI_CONTRASEÑA</ns1:password>
                        <ns1:account>MI_CUENTA_DE_NETSUITE</ns1:account>
                        <ns1:role internalId="MI_ID_DE_ROL"/>
                    </ns2:passport>
                </ns2:login>
            </SOAP-ENV:Header>
            <SOAP-ENV:Body>
                <ns2:getItemAvailability>
                    <ns2:itemAvailabilityFilter>
                        <ns1:item>
                            <ns1:recordRef internalId="38"/>
                            <ns1:recordRef internalId="17"/>
                        </ns1:item>
                    </ns2:itemAvailabilityFilter>
                </ns2:getItemAvailability>
            </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>
    
  • Response
    <?xml version="1.0" encoding="utf-8"?>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <soapenv:Header>
                <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
                    <platformMsgs:nsId>WEBSERVICES_TSTDRV904452_06262015836892025729143836_4fe490de</platformMsgs:nsId>
                </platformMsgs:documentInfo>
            </soapenv:Header>
            <soapenv:Body>
                <getItemAvailabilityResponse xmlns="urn:messages_2015_1.platform.webservices.netsuite.com">
                    <platformCore:getItemAvailabilityResult xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com">
                        <platformCore:status isSuccess="true"/>
                        <platformCore:itemAvailabilityList>
                            <platformCore:itemAvailability>
                                <platformCore:item internalId="17" type="lotNumberedInventoryItem">
                                    <platformCore:name>CRMTMUSB</platformCore:name>
                                </platformCore:item>
                                <platformCore:lastQtyAvailableChange>2015-05-11T09:40:23.000-07:00</platformCore:lastQtyAvailableChange>
                                <platformCore:locationId internalId="2" type="location">
                                    <platformCore:name>DF</platformCore:name>
                                </platformCore:locationId>
                                <platformCore:quantityOnHand>1501.0</platformCore:quantityOnHand>
                                <platformCore:onHandValueMli>75050.0</platformCore:onHandValueMli>
                                <platformCore:quantityCommitted>0.0</platformCore:quantityCommitted>
                                <platformCore:quantityAvailable>1501.0</platformCore:quantityAvailable>
                            </platformCore:itemAvailability>
                            <platformCore:itemAvailability>
                                <platformCore:item internalId="17" type="lotNumberedInventoryItem">
                                    <platformCore:name>CRMTMUSB</platformCore:name>
                                </platformCore:item>
                                <platformCore:lastQtyAvailableChange>2015-05-11T09:34:19.000-07:00</platformCore:lastQtyAvailableChange>
                                <platformCore:locationId internalId="1" type="location">
                                    <platformCore:name>GDL</platformCore:name>
                                </platformCore:locationId>
                                <platformCore:quantityOnHand>82.0</platformCore:quantityOnHand>
                                <platformCore:onHandValueMli>10660.0</platformCore:onHandValueMli>
                                <platformCore:quantityOnOrder>0.0</platformCore:quantityOnOrder>
                                <platformCore:quantityCommitted>0.0</platformCore:quantityCommitted>
                                <platformCore:quantityAvailable>82.0</platformCore:quantityAvailable>
                            </platformCore:itemAvailability>
                            <platformCore:itemAvailability>
                                <platformCore:item internalId="38" type="lotNumberedInventoryItem">
                                    <platformCore:name>C-3102</platformCore:name>
                                </platformCore:item>
                                <platformCore:lastQtyAvailableChange>2015-04-14T14:14:39.000-07:00</platformCore:lastQtyAvailableChange>
                                <platformCore:locationId internalId="2" type="location">
                                    <platformCore:name>DF</platformCore:name>
                                </platformCore:locationId>
                                <platformCore:quantityOnHand>360.0</platformCore:quantityOnHand>
                                <platformCore:onHandValueMli>1440.0</platformCore:onHandValueMli>
                                <platformCore:quantityCommitted>0.0</platformCore:quantityCommitted>
                                <platformCore:quantityAvailable>360.0</platformCore:quantityAvailable>
                            </platformCore:itemAvailability>
                            <platformCore:itemAvailability>
                                <platformCore:item internalId="38" type="lotNumberedInventoryItem">
                                    <platformCore:name>C-3102</platformCore:name>
                                </platformCore:item>
                                <platformCore:locationId internalId="1" type="location">
                                    <platformCore:name>GDL</platformCore:name>
                                </platformCore:locationId>
                            </platformCore:itemAvailability>
                        </platformCore:itemAvailabilityList>
                    </platformCore:getItemAvailabilityResult>
                </getItemAvailabilityResponse>
            </soapenv:Body>
        </soapenv:Envelope>
    

Este es solo un ejemplo rápido, según los requerimientos de cada quien sería el request y el response, recuerda que cada empresa tiene sus propios necesarios, aún así con SuiteTalk, puedes resolver todos y cada uno.

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.

Formularios en Línea y su color

Antecedentes

En la implementación de uno de nuestros clientes tuvimos la necesidad de colocar un formulario en linea (Suitlet sin inicio de sesión), algo que sin duda no representa un reto, sin embargo, el cliente nos solicito cambiar los colores del formulario, es sabido por todos que los Scripts no manipulan el Look & Feel de NetSuite, mucho menos manipulan el DOM de la página web.

¿Que hacer para cambiar los colores delos formularios en línea?

Solo debemos ejecutar los siguientes pasos:

  1. Ir a Configuración > Estructura del sitio > Configurar sitio web
  2. Clic en la pestaña Aspecto
  3. Seleccionar el tema que mas nos guste en Tema de Color del Sitio Web

Tema: Básico : Azul y gris

Captura de pantalla de 2015-06-26 16:15:47

Tema: Básico : Piedra natural

Captura de pantalla de 2015-06-26 16:12:54

Podemos seleccionar entre una basta cantidad de temas pre-configurados o crear nuestro propio tema en Configuración> Estructura del sitio > Temas de color.

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.

Cuando los scripts de Netsuite interfieren con la velocidad y el performance.

Antecedentes

En el desarrollo de la configuración de Netsuite, principalmente en el diseño y configuración de la solución, es común encontrar escenarios en dónde es requerido realizar scripts o desarrollos para personalización, que van más allá de la configuración nativa de la herramienta.

Normalmente son adecuaciones y automatizaciones requeridas por los procesos de negocio. Estas adecuaciones, pueden tener un impacto en la velocidad de las transacciones y en ocasiones es interesante conocer como ajustar y nivelar los requerimientos de negocio vs el desempeño.

El monitor de desempeño de scripts.

En general creo que los mejores scripts son los que no se requieren. Pero si el escenario demanda la creación de un script, el primer paso es elegir bien el tipo de script requerido. En Netsuite, es posible crear varios tipos de scripts, y estos pueden tener un comportamiento distinto. Los más comunes son client, user event, scheduled y RESTlets.

Si partimos de una buena definición, el performance será mejor.

Ahora bien, aun con una buena definición, es muy común que se requiera conocer que scripts están afectando una transacción y como. Para de esta forma poder tomar decisiones informadas respecto a que y como ajustar.

Ahí es dónde el Script Performance Monitor de Netsuite, puede resultar de gran ayuda, por que nos proporciona información valiosa respecto a que está afectando a nuestra transacción.

Permite ver una lista de las transacciones en un periodo y conocer como ha sido su desempeño.
Permite ver una lista de las transacciones en un periodo y conocer como ha sido su desempeño.

Así mismo nos presenta de manera gráfica que es lo que está tomando mayor tiempo. Luego de ver los impactos, normalmente podemos encontrar formas de automatizar aún más o bien eliminar algunos scripts que no agregan valor y que pueden ser realizados de manera diferente o bien mediante ajustes al proceso de negocio.

Script Performance Monitor
Gráfico de impacto de Sripts en una transacción.

En la pasada reunión de usuarios, SuiteWorld 2015, se presentó lo que creo será la versión dos del monitor. Mucho más detalle de cada transacción, sus impactos, etc. etc. Algo que sin duda será de mucha utilidad, sobre todo cuando los requerimientos son complejos.

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.

Borrado Masivo de Registros

Antecedentes

Una de las cosas más comunes en NetSuite es que con el paso del tiempo llegamos a acumular una gran cantidad de registros, muchos de ellos nunca se usaron y probablemente jamas se usarán, otros ya no tienen razón de existir, lo que nos lleva a querer eliminarlos, lo cual es sencillo (Editar > Más acciones > Eliminar), pero cuando son muchos registros esta tarea se vuelve muy tediosa.

Por suerte existe el borrado masivo de registros, ahora te mostramos como utilizarlo.

¿Como borrar registros de manera masiva?

Solo debemos ejecutar los siguientes pasos:

  1. Crea un Script tipo Actualización masiva. 
    • El Script debe contener el siguiente código:
      function DeleteRecord(recordType, recordId)
      {
          try
          {
              nlapiDeleteRecord(recordType, recordId);
          }
          catch(error)
          {
          	if(error instanceof nlobjError)
              {
            	    var errorCode 	 = returnBlank(error.getCode());
          	    var errorDetails 	 = returnBlank(error.getDetails());
          	    var errorID 	 = returnBlank(error.getId());
          	    var errorInternalID	 = returnBlank(error.getInternalId());
          	    var errorStackTrace	 = returnBlank(error.getStackTrace());
          	    if(errorStackTrace != '')
          	    {
          		errorStackTrace	 = errorStackTrace.join();
          	    }
          	    var errorUserEvent 	 = returnBlank(error.getUserEvent());
                  nlapiLogExecution( 'ERROR', 'Error Code',errorCode);
                  nlapiLogExecution( 'ERROR', 'Error Details',errorDetails);
                  nlapiLogExecution( 'ERROR', 'Error ID',errorID);
                  nlapiLogExecution( 'ERROR', 'Error Internal ID',errorInternalID);
                  nlapiLogExecution( 'ERROR', 'Error StackTrace',errorStackTrace);
                  nlapiLogExecution( 'ERROR', 'Error UserEvent',errorUserEvent);
              }
              else
              {
                  var errorString	 = returnBlank(error.toString());
                  nlapiLogExecution( 'ERROR', 'Unexpected Error',errorString);
              }
          }
      }
      
    • Crea una implementación por cada tipo de registro que quieras borrar.
  2. Ir a Listas > Actualización masiva > Actualizaciones masivas > Actualizaciones personalizadas > [Registro a borrar] > [Script creado en el paso 1]
  3. Filtra los registros que deseas borrar.
  4. Presiona el botón Vista previa.
  5. Presiona el botón Ejecutar actualización.

Importante: antes de borrar registros debemos de asegurarnos que no hay dependencias, ejemplo, un Lead tiene asignada un Evento.

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.

Preferencias Generales & Parámetros personalizados

Antecedentes

Las Preferencias generales de NetSuite como su nombre lo indica, son preferencias generales disponibles para todas las subsidiarias y empleados, las cuales indican o establecen los parámetros con los que la cuenta de NetSuite va a funcionar. Sin embargo, es común, que al implementar NetSuite surjan procesos personalizados que requieran parámetros, un error común es dejar estos parámetros en Hard Code, ahora te mostramos como crear preferencias generales personalizadas y utilizarlos como parámetros para los procesos.

¿Como crear preferencias generales personalizadas?

Solo debemos ejecutar los siguientes pasos:

  1. Ir al Script deseado.
  2. Clic en la pestaña Parámetros
  3. Clic en Nuevo parámetro
  4. Ingresar la información solicitada (es indispensable seleccionar Empresa en el campo Preferencia)
  5. Guardar
param
Parámetro del Script
prefere
Preferencia general creada a través de parámetro de Script.

Importante: es probable que nuestros Scripts compartan parámetros, y para esos casos recomendamos lo siguiente:

  1. Crear un Script tipo Suitelet 
  2. Implementar el Script (marcar la opción Disponible sin inicio de sesión)
  3. Crear todos los parámetros genéricos a compartir.
  4. Utilizar el siguiente código fuente:
    •   
      //El siguiente código fuente regresara TODOS los parámetros del script.
      //returnBlank es una función de ejemplo; asegura que el dato no sea null o undefined
      //Base64 es una función de ejemplo; manipula el Base 64
      var context		= nlapiGetContext();
      var scriptId		= returnBlank(context.getScriptId());
      var script_filters	= new Array();
          script_filters.push(new nlobjSearchFilter('scriptid',null,'is',scriptId));
      var script_results	= returnBlank(nlapiSearchRecord('script', null, script_filters, null));
      var script_id		= script_results[0].getId();
      var script_record	= nlapiLoadRecord('script', script_id);
      var parameter_lines	= script_record.getLineItemCount('parameters');
      var data				= new Object();
      for(var i=1;i<=parameter_lines;i++)
      {
      	var param_name	 = script_record.getLineItemValue('parameters', 'internalid', i);
      	var param_value  = returnBlank(context.getSetting('SCRIPT', param_name));
      	data[param_name] = param_value;
      }
      data	= JSON.stringify(data);
      data	= Base64.encode(data);
      response.write(data);
      
  5. Hacer un Request a dicho Script  cada que sea necesario.
    • Nota: El Request regresará una cadena codificada en Base 64 por lo que se tendrá que decodificar y posteriormente convertir en un objeto JSON

¿Cómo podemos ayudar?

NetSuite es una gran plataforma que configurada adecuadamente puede dar resultados extraordinarios en su negocio. En IMR contamos con la experiencia y conocimientos para apoyar el logro de sus objetivos. Si necesita ayuda, por favor contactanos.