martes, 5 de febrero de 2013

Análisis de Plataformas de Business Intelligence & Analytics


Magic Quadrant for BI & Analytics Platforms 2013



Para 2013, Gartner cambió el nombre de este Cuadrante Mágico de "Plataformas de Business Intelligence" a "Plataformas de Business Intelligence y Analytics" para enfatizar la importancia creciente de las capacidades de análisis de los sistemas de información que las organizaciones están ahora construyendo. Gartner define al mercado de plataformas de Business Intelligence (BI) y Analytics como una plataforma de software que ofrece 15 funciones en tres categorías: la integración, la entrega de información y análisis.
Esta publicación hace un análisis de las mas importantes características de destacadas herramientas de Business Intelligence y Analytics, ubicando a Tableau en el cuadrante de Líderes del mercado, observando evolución respecto al reporte anterior (2012):

Para ver el reporte completo, con el análisis de las características-funciones de las categorías evaluadas, siga el link: http://www.gartner.com/technology/reprints.do?id=1-1DZLPEP&ct=130207&st=sb

viernes, 1 de febrero de 2013

Siebel eScript que crea archivo en el Siebel filesystem y lo ubica en un Applet como hyperlink

Este Siebel eScript crea un archivo registro/log en el filesystem de Siebel y lo agrega a un List Applet como hyperlink. Se hace uso de las funciones InvokeMethod: GetFile, PutFile, CreateFile y Clib.getenv("SIEBEL_HOME")
 /********************************************************************** 
 ** Function Name:    TraceCarga 
 ** Inputs:         gImportJobId: Id del Trabajo de Importación 
 ** Trace: Texto del Mensaje 
 ** strStringDate: Concatenación de la fecha para nombre de archivo 
 ** Function Descripcion: Crea archivo con log resumen de la carga y lo agrega al applet de excepciones 
 ** Author:         Gabriel Bravo 
 ** Created:        2012-06-25 
 **********************************************************************/ 
function TraceCarga(gImportJobId,Contenido,strStringDate) 
{
  try{ 
    var Trace:String=Contenido; 
    Trace+="\nIngreso a la función TraceCarga OK\n"; 
    var vBOMktgImport = TheApplication().GetBusObject("Mktg Import"); 
    var vBCMktgImportJobs = vBOMktgImport.GetBusComp("Mktg Import Jobs"); 
    var vBCMktgImportExceptions = vBOMktgImport.GetBusComp("Mktg Import Exceptions"); 
    var sGetFileReturn; 
    var sStatus; 
    var sAbsoluteFileName; 
    var oFile=null; 
    var fileName; 
    var filePath; 

    vBCMktgImportJobs.SetViewMode(AllView); 
    vBCMktgImportJobs.ClearToQuery(); 
    vBCMktgImportJobs.ActivateField("Id"); 
    vBCMktgImportJobs.SetSearchSpec("Id", gImportJobId); 
    vBCMktgImportJobs.ExecuteQuery(ForwardOnly); 
 
    Trace+="Inicialización de Variables OK\n"; 
    sStatus = vBCMktgImportJobs.CountRecords(); 
    Trace+="vBCMktgImportJobs.CountRecords(): "+sStatus+"\n"; 
 
    sStatus = vBCMktgImportExceptions.CountRecords(); 
    Trace+="vBCMktgImportExceptions.CountRecords(): "+sStatus+"\n"; 

    fileName = "RegistroCarga_"+gImportJobId+"_"+strStringDate; 
    filePath = Clib.getenv("SIEBEL_HOME"); 
    filePath = filePath.charAt(filePath.length-1); 
    filePath = Clib.getenv("SIEBEL_HOME")+((filePath=="/")?"":"/")+"temp/"+fileName+".csv"; 
    Trace+="Nombre archivo: "+fileName+"\nRuta: "+filePath+"\n"; 
 
    vBCMktgImportExceptions.SetViewMode(AllView); 
    vBCMktgImportExceptions.ClearToQuery(); 
    vBCMktgImportExceptions.ActivateField("Import Job Id"); 
    vBCMktgImportExceptions.ActivateField("ImportFileName"); 
    sStatus="[Import Job Id] = '"+gImportJobId+"'
      AND [ImportFileName] = '"+fileName+"'"; 
    vBCMktgImportExceptions.SetSearchExpr(sStatus); 
    vBCMktgImportExceptions.ExecuteQuery(ForwardOnly); 
    Trace+="vBCMktgImportExceptions Consultado con SetSearchExpr: "+sStatus+"\n"; 
    sStatus = vBCMktgImportExceptions.CountRecords(); 
    Trace+="vBCMktgImportExceptions.CountRecords(): "+sStatus+"\nNuevo archivo ??: "+((sStatus>0)?"No":"Si")+"\n"; 

    if(vBCMktgImportExceptions.FirstRecord()){ 
      sGetFileReturn=null; 
      try{ 
        sGetFileReturn = vBCMktgImportExceptions.InvokeMethod("GetFile", "ImportFileName"); 
        Trace+="sGetFileReturn: "+sGetFileReturn+"\n"; 
        sStatus = sGetFileReturn.substring(0,sGetFileReturn.indexOf(",")); 
        Trace+="sStatus: "+sStatus+"\n"; 
        if (sStatus == "Success"){ 
          sAbsoluteFileName = sGetFileReturn.substring(sGetFileReturn.indexOf(",") + 1); 
          Trace+="sAbsoluteFileName: "+sAbsoluteFileName+"\n"; 
          oFile = Clib.fopen(sAbsoluteFileName,"a"); 
          if (oFile != null){ 
            Trace+="Previo a llenar el archivo\n"; 
            Clib.fprintf(oFile,Trace); 
            Trace += vBCMktgImportExceptions.InvokeMethod("PutFile", sAbsoluteFileName, "ImportFileName"); 
            Trace+="\nArchivo llenado\n"; 
          } 
          Clib.fclose(oFile); 
          Trace+="Archivo cerrado\n"; 
        } 
      }catch(fsErr){ 
        Trace += "\n"+fsErr.toString(); 
        RegistraExcep("TraceCarga",Trace,"Account Load Marketing Import Process.TraceCarga"); 
      } 
    }else{ 
      Trace+="sGetFileReturn: null\n"; 
      sStatus = Clib.getcwd(); 
      Trace+="Clib.getcwd(): "+sStatus+"\n"; 
      sStatus = Clib.getenv("SIEBEL_HOME"); 
      Trace+="Clib.getenv('SIEBEL_HOME'): "+sStatus+"\n"; 
      vBCMktgImportExceptions.NewRecord(NewAfter); 
      vBCMktgImportExceptions.SetFieldValue("Import Job Id",gImportJobId); 
      vBCMktgImportExceptions.SetFieldValue("ImportFileExt","log"); 
      vBCMktgImportExceptions.SetFieldValue("ImportFileName",fileName); 
      vBCMktgImportExceptions.SetFieldValue("ImportFileSrcPath",filePath); 
      vBCMktgImportExceptions.SetFieldValue("ImportFileSrcType","FILE"); 
      vBCMktgImportExceptions.SetFieldValue("File Usage","Exception"); 
      sStatus = TheApplication().InvokeMethod("LookupValue", "MKTG_IMPORT_SCH_STATUS", "Complete LIC"); 
      vBCMktgImportExceptions.SetFieldValue("Job Status",sStatus); 
      Trace+="Registro Creado. Ruta nuevo archivo: "+filePath+"\n"; 
      oFile = Clib.fopen(filePath, "a"); 
      Clib.fprintf(oFile,Trace); 
      Trace+="Archivo nuevo llenado\n"; 
      if( oFile != null ){ 
        Clib.fclose(oFile); 
        oFile=null; 
      } 
      sGetFileReturn = vBCMktgImportExceptions.InvokeMethod("CreateFile", filePath, "ImportFileName","N"); 
      Trace+="Archivo nuevo cargado\n"; 
      vBCMktgImportExceptions.WriteRecord(); 
      vBCMktgImportExceptions.InvokeMethod("RefreshBusComp"); 
      Trace+="Registro nuevo escrito\n"; 
    } 
  }catch(e){ 
    Trace +=e.toString() + "\n" + e.errText; 
    RegistraExcep("TraceCarga",Trace,"OCS Account Load Marketing Import Process.TraceCarga"); 
  }finally{ 
    if (oFile != null ){ 
      Clib.fclose(oFile); 
    } 
    vBCMktgImportJobs=null; 
    vBCMktgImportExceptions=null; 
    vBOMktgImport=null; 
    sGetFileReturn=null; 
    sStatus=null; 
    sAbsoluteFileName=null; 
    oFile=null; 
  } 
}//function 

Como abrir una URL en un popup desde un applet en Siebel


  • Para abrir un popup desde un Applet de Siebel hay que definir una columna en un List Applet basada en un campo (DTYPE_TEXT) de un Business Component que almacene la URL destino.
  • La columna asociada a la URL deberá tener la la propiedad HTML Type = Link y HTML Display Mode = DontEncodeData
  • La alternativa es usar el siguiente Browser Script
Este Siebel Browser eScript abre una URL en un popup basándose en una columna Drilldown de un applet que almacena una URL..
function   Applet_PreInvokeMethod (name, inputPropSet){
  var currBC;
  var url;
  if(name == "Drilldown"){
    currBC = this.BusComp();
    url = currBC.GetFieldValue("GBF URL Field");
    window.open(url,"..:: Detalle ::..");
    return("CancelOperation");
  }
  return ("ContinueOperation");
}

Siebel eScript Trim function

Este Siebel eScript elimina los espacios en blanco en los extremos de una cadena de texto..
function ltrim(str) {
  for(var k = 0; k < str.length && isWhitespace(str.charAt(k)); k++);
  return str.substring(k, str.length);
}


function rtrim(str) {
  for(var j=str.length-1; j>=0 && isWhitespace(str.charAt(j)) ; j--) ;
  return str.substring(0,j+1);
}


function trim(str) {
  return ltrim(rtrim(str));
}


function isWhitespace(charToCheck) {
  var whitespaceChars = " \t\n\r\f";
  return (whitespaceChars.indexOf(charToCheck) != -1);
}

Siebel eScript de consulta LOVs para retornar un LIC

Este Siebel eScript realiza la consulta a las listas de valores por un tipo y un valor y retorna el LIC (Languaje Independent Code) o valor único. Funciona para idioma español (ESN), se podría mejorar agregando el idioma como parámetro adicional..
/**********************************************************************
** Function Name: LookupLIC
** Inputs: Type:String => Lista de Valor, Value:String => Valor a buscar
** Function Descripcion: Recibe el tipo de lista de valor y el valor y retorna el LIC
** Author: Gabriel Bravo
** Created: 2012-06-27
**********************************************************************/
function LookupLIC(Type:String, Value:String){
  try {
    var LOVBO:BusObject = TheApplication().GetBusObject("List Of Values");
    var LOVBC:BusComp = LOVBO.GetBusComp("List Of Values");
    var LIC:String = "";
    var nCount:Number = 0;

    
    LOVBC.SetViewMode(AllView);
    LOVBC.ClearToQuery();
    LOVBC.ActivateField("Name");
    LOVBC.ActivateField("Type");
    LOVBC.ActivateField("Value");
    LOVBC.ActivateField("Language");
    LIC="[Type]='" + Type + 
      "' AND [Value]='" + 
      Value + "' AND [Language]='ESN'";
    LOVBC.SetSearchExpr(LIC);
    LOVBC.ExecuteQuery(ForwardOnly);
    nCount = LOVBC.CountRecords();
    LIC="";
    if ((nCount>0)&&(LOVBC.FirstRecord())) {
      LIC = LOVBC.GetFieldValue("Name");
    }
  } catch(e) {
    RegistraExcep("LookupLIC", e.toString(), "Marketing Import Process.LookupLIC");
  } finally {
    LOVBC = null;
    LOVBO = null;
  }
  return LIC;
}

Carga de LOVs desde archivo plano con Siebel eScript

Este Siebel eScript permite cargar Listas de Valores desde un archivo plano codificado en UTF-8 como la siguiente muestra
PAISES;AFGHANISTAN;AFGHANISTAN;;AF;ESN;;1;Y;Y;;;;;;AFGHANISTAN
PAISES;ALAND ISLANDS;ALAND ISLANDS;;AX;ESN;;2;Y;Y;;;;;;ALAND ISLANDS
PAISES;ALBANIA;ALBANIA;;AL;ESN;;3;Y;Y;;;;;;ALBANIA
PAISES;ALGERIA;ALGERIA;;DZ;ESN;;4;Y;Y;;;;;;ALGERIA
PAISES;AMERICAN SAMOA;AMERICAN SAMOA;;AS;ESN;;5;Y;Y;;;;;;AMERICAN SAMOA
PAISES;ANDORRA;ANDORRA;;AD;ESN;;6;Y;Y;;;;;;ANDORRA
PAISES;ANGOLA;ANGOLA;;AO;ESN;;7;Y;Y;;;;;;ANGOLA
PAISES;ANGUILLA;ANGUILLA;;AI;ESN;;8;Y;Y;;;;;;ANGUILLA
PAISES;ANTARCTICA;ANTARCTICA;;AQ;ESN;;9;Y;Y;;;;;;ANTARCTICA
PAISES;ANTIGUA AND BARBUDA;ANTIGUA AND BARBUDA;;AG;ESN;;10;Y;Y;;;;;;ANTIGUA AND BARBUDA
El script:
function Service_PreInvokeMethod (MethodName, Inputs, Outputs){
	switch(MethodName){
	  case "Importa_LOVs":
/*Importa Listas de Valores*/
	    Importa_LOVs(Inputs,Outputs);
	    return (CancelOperation);
	    break;
	  case "Borra_LOVs":
/*Elimina Listas de Valores*/
	    Borra_LOVs(Inputs,Outputs);
	    return (CancelOperation);
	    break;
	  }
	return (ContinueOperation);
}
function Importa_LOVs(Inputs, Outputs){
        var cmdArray, TypeArray, i, line, Cuenta, ContadorPublico, tamanio, encontrado;
        var strType = "";
        var strValor = "";
        var strLIC = "";
        var strBajo = "";
        var strIdioma = "";
        var strParLIC = "";
        var strOrden = "";
        var strDesc = "";
        var LOVBO, LOVBC, LangBC, ParBC, sSpec;
        try{
          var fp = Clib.fopen("D:\\LOVS.CSV", "rt");
          if ( fp == null ){
            TheApplication().RaiseErrorText("\aError abriendo archivo para lectura.\n")
          }else{
            LOVBO = TheApplication().GetBusObject("List Of Values");
            LOVBC = LOVBO.GetBusComp("List Of Values");
            LOVBC.InvokeMethod("SetAdminMode", "TRUE");
            ContadorPublico = 0;
            TypeArray = new Array("LOV_TYPE");
            while (null != (line=Clib.fgets(fp))){
              cmdArray = line.split(";");
              strType=cmdArray[0].substring(0,30);
              strValor=cmdArray[1].substring(0,30);
              strLIC=cmdArray[2].substring(0,50);
              strBajo=cmdArray[4];
              strIdioma=cmdArray[5];
              strParLIC=cmdArray[6].substring(0,50);
              strOrden=cmdArray[7];
              strDesc = cmdArray[15].substring(0,255);
              ContadorPublico=ContadorPublico + 1;
              tamanio=TypeArray.length-1;
              encontrado=false;
              for(i=0;i<tamanio;i++){
                if(TypeArray[i]=="strType"){
                  encontrado=true;
                  break;
                }
              }
              if(!encontrado){
                LOVBC.SetViewMode(AllView);
                LOVBC.ClearToQuery();
                sSpec = "[Type]='LOV_TYPE' AND [Name]=" +
                   String.fromCharCode(34) +
                   strType + String.fromCharCode(34) +
                   " AND [Language]='" + 
                   strIdioma + "'";
                LOVBC.SetSearchExpr(sSpec);
                LOVBC.ExecuteQuery(ForwardOnly);
                Cuenta = LOVBC.CountRecords();
                if(Cuenta==0){
                  TypeArray.push(strType);
                  LOVBC.NewRecord(NewAfter);
                  LOVBC.SetFieldValue("Type","LOV_TYPE");
                  LOVBC.SetFieldValue("Value",strType);
                  LOVBC.SetFieldValue("Name",strType);
                  LOVBC.SetFieldValue("Description",strType);
                  LangBC=LOVBC.GetPicklistBusComp("Language Name");
                  LangBC.ClearToQuery();
                  sSpec="[Language Code]='" + strIdioma + "'";
                  LangBC.SetSearchExpr(sSpec);
                  LangBC.ExecuteQuery(ForwardOnly);
                  Cuenta = LangBC.CountRecords();
                  if(Cuenta>0){
                    LangBC.FirstRecord();
                    LangBC.Pick();
                  }
                  LOVBC.SetFieldValue("Translate","Y");
                  LOVBC.SetFieldValue("Multilingual","Y");
                  LOVBC.WriteRecord();
                }
              }
              LOVBC.SetViewMode(AllView);
              LOVBC.ClearToQuery();
              sSpec = "[Type]='" + strType +
                "' AND [Name]=" + String.fromCharCode(34) +
                strLIC +
                String.fromCharCode(34) +
                " AND [Language]='"
                strIdioma + "'";
              LOVBC.SetSearchExpr(sSpec);
              LOVBC.ExecuteQuery(ForwardOnly);
              Cuenta = LOVBC.CountRecords();
              if(Cuenta==0){
                LOVBC.NewRecord(NewAfter);
                LOVBC.SetFieldValue("Type",strType);
                LOVBC.SetFieldValue("Value",strValor);
                LOVBC.SetFieldValue("Name",strLIC);
                LOVBC.SetFieldValue("Description",strDesc);
                LangBC=LOVBC.GetPicklistBusComp("Language Name");
                LangBC.ClearToQuery();
                sSpec="[Language Code]='" + strIdioma + "'";
                LangBC.SetSearchExpr(sSpec);
                LangBC.ExecuteQuery(ForwardOnly);
                Cuenta = LangBC.CountRecords();
                if(Cuenta>0){
                  LangBC.FirstRecord();
                  LangBC.Pick();
                  //LOVBC.SetFieldValue("Language Name","Medio");
                }
                if(strParLIC!=""){
                  ParBC=LOVBC.GetPicklistBusComp("Parent");
                  ParBC.ClearToQuery();
                  sSpec="[Value]='" + strParLIC + "'";
                  ParBC.SetSearchExpr(sSpec);
                  ParBC.ExecuteQuery(ForwardOnly);
                  if(ParBC.FirstRecord()){
                    ParBC.Pick();
                  }
                   //LOVBC.SetFieldValue("Parent Id","Medio");//??
                }
                LOVBC.SetFieldValue("Low",strBajo);
                LOVBC.SetFieldValue("Order By",strOrden);
                LOVBC.SetFieldValue("Translate","Y");
                LOVBC.SetFieldValue("Multilingual","Y");
                LOVBC.WriteRecord();
              }
            }
          }
        }catch(e){
          var fperr = Clib.fopen("D:\\ERRORES.log", "a");
          var theDay="";
          var strSysDate = new Date();
          Clib.sprintf(theDay,"%02i",strSysDate.getDate())
          var strStringDate = strSysDate.getFullYear() 
            + "-"
            + strSysDate.getMonth()
            + "-" + theDay
            + " " + strSysDate.getHours()
            + ":" + strSysDate.getMinutes()
            + ":" + strSysDate.getSeconds();
          Clib.fprintf(fperr, strStringDate + "\n");
          sSpec = e.errText;
          Clib.fprintf(fperr, sSpec + "\n");
          Clib.fprintf(fperr, "Type:" + strType + "\n");
          Clib.fprintf(fperr, "Value:" + strValor + "\n");
          Clib.fprintf(fperr, "Name:" + strLIC + "\n");
          Clib.fprintf(fperr, "Language Code:" + strIdioma + "\n");
          Clib.fprintf(fperr, "Parent:" + strParLIC + "\n");
          Clib.fprintf(fperr, "Low:" + strBajo + "\n");
          Clib.fprintf(fperr, "Order By:" + strOrden + "\n\n");
          Clib.fclose(fperr);
        }finally{
          Clib.fclose(fp);
          LOVBO=null;
          LOVBC=null;
          LangBC=null;
          ParBC=null;
          cmdArray=null;
          line=null;
          strSysDate=null;
        }
}

function Borra_LOVs(Inputs,Outputs){
  var cmdArray, i, line, Cuenta, ContadorPublico;
  var strType = "";
  var LOVBO,LOVBC,LangBC,ParBC,sSpec;
  try{
    var fp = Clib.fopen("D:\\PROYECTOS\\LOVS.CSV", "rt");
    if ( fp == null ){
      TheApplication().RaiseErrorText("\aError abriendo archivo para lectura.\n")
    }else{
      LOVBO = TheApplication().GetBusObject("List Of Values");
      LOVBC = LOVBO.GetBusComp("List Of Values");
      LOVBC.InvokeMethod("SetAdminMode", "TRUE");
      ContadorPublico = 0;
      while (null != (line=Clib.fgets(fp))){
        cmdArray = line.split(";");
        strType=cmdArray[0].substring(0,30);
        ContadorPublico=ContadorPublico + 1;
        LOVBC.SetViewMode(AllView);
        LOVBC.ClearToQuery();
        sSpec = "[Type]='" + strType + "'";
        LOVBC.SetSearchExpr(sSpec);
        LOVBC.ExecuteQuery();
        Cuenta = LOVBC.CountRecords();
        sSpec="";
        if(Cuenta>0){
          while(LOVBC.LastRecord()){
            sSpec = LOVBC.GetFieldValue("Id");
            LOVBC.DeleteRecord();
          }
        }
      }
    }
  }catch(e){
    var fperr = Clib.fopen("D:\\ERRORES.log", "a");
    var theDay="";
    var strSysDate = new Date();
    Clib.sprintf(theDay,"%02i",strSysDate.getDate())
    var strStringDate = strSysDate.getFullYear() 
      + "-"
      + strSysDate.getMonth()
      + "-" + theDay
      + " " + strSysDate.getHours()
      + ":" + strSysDate.getMinutes()
      + ":" + strSysDate.getSeconds();
    Clib.fprintf(fperr,strStringDate + "\n");
    sSpec = "Error borrando Listas de Valores"+e.errText+"\n"+(sSpec!=""?"RowId:"+sSpec:"");
    Clib.fprintf(fperr, sSpec + "\n");
    Clib.fprintf(fperr, "Type:"+strType+ "\n");
    Clib.fclose(fperr);
  }finally{
    Clib.fclose(fp);
    LOVBO=null;
    LOVBC=null;
    LangBC=null;
    ParBC=null;
    cmdArray=null;
    line=null;
    strSysDate=null;
  }
}