Datos personales

Por setiembre de 1992 empezaba mi primer curso en un Partner de Oracle en Montevideo, y a partir de ahí comenzaría una larga carrera de desarrollo de software. Primero fue SQL, luego PL/SQL, sql*forms 3.0 y sql*report, utilizando un emulador de terminal bajo Windows 3.11. La base de datos? Oracle 7.1. El tiempo fue pasando, los proyectos también, y las distintas versiones: forms 4.5, 5.0, 6i, 9i, 10g. reports 2.5... hasta llegar a 10g. En forma similar las Bases de Datos, 7.1, 7.2, 7.3, 8i, 9i, 10g, en linux, en VMS, an AIX, Solaris y Windows. Tuve la suerte de trabajar en varios lados, conocer algunos países y personas por este hermoso mundo de la informática. Lugares donde quizá uno jamás pensó visitar. Gente que nos atendió en forma maravillosa. Proyectos muy interesantes. El tiempo me fue llevando de programar PL, forms , reports, a pasar también por APEX y realizar customizaciones sobre las EBS, versiones 11i y 12i. Y aquí estamos, para compartir experiencias......

viernes, 15 de mayo de 2020

Como crear un websource en APEX para utilizar en un reporte

Para comenzar debemos ir al SQLWorkshop y si nunca hemos registrado el esquema en ORDS nos aparecerá la siguiente pantalla







A continuación registramos el esquema y le definimos el alias


quedando nuestro esquema registrado


 A continuación crearemos módulo y lo haremos sobre la tabla biblioautores

El módulo ha sido creado

A continuación debemos crear el template
ya tenemos el template creado

A continuación crearemos los métodos (los handler)

Método GET


A continuación vamos a crear un websource que utilizaremos en el reporte




Ahora crearemos el reporte interactivo


miércoles, 6 de mayo de 2020

My Story with APEX


In 2007 I was returning from a 4 month eBS project in the Dominican Republic and some friends were developing a system to manage their livestock. The situation occurred that they could not continue its development and they asked me to resume it, only one condition: that it be in htmldb that came pre-installed in XE 10g.
It was a time of systems in Oracle Forms and Oracle Reports, but they wanted to get out of using licenses. A few years earlier I had met him at htmldb at the Oracle Open World in São Paulo.
I remember lending me the book Easy HTML-DB: Create Dynamic Web Pages with OAE (Easy Oracle Series). And there my head had to change the terminals, the C / S and start thinking web. I remember that this system was later wanted to be sold with installation and I put together a program that installed XE, and then, as we had already upgraded, it did the APEX upgrades and installed the application (all in one .. Click (no, in a single enter )). Then the idea was to pass it to a SAS system. And there we contract a hosting with APEX.
I also remember that they gave me a very interesting book: Expert Oracle Application Express.
In addition from my independent work and later in my own company, I work in an insurance company. In 2009, a mandatory vehicle insurance called SOA emerged.
We had to make a system so that customers could buy the policy online, and then pay for it in what we call collection networks here. Physical places where one takes invoices from any organization and can pay them. The collection networks should be able to collect insurance and deliver the stickers to stick on the windows of the vehicles. We had no experience in web issues so I told my boss if I do it it is in APEX (3.1) and with another colleague we carry out the project even today its code lives and is active. That software should also print on paper, and there if we use Oracle Report. On the first day, tens of thousands of people entered to enter their insurance and we had a problem that somewhat blocked the system, was it APEX? no, the report server was the one who was not correctly configured to support all those requests. Once this issue was resolved, everything worked wonderfully.
Then came the creation of the Uruguay User Group in the Engineering faculty, we held our first event and I had the honor of giving the first conference: Development in Oracle at low cost. A presentation of XE and APEX. Then came the first Tour through Brazil, Uruguay and Argentina with Dan McGhan, where Clarisa and Marcelo Burgos were full with the organization, and then many projects, much training in companies and many conferences, in addition to being able to meet several members of the APEX team .
What else to say about APEX, it is a very friendly tool, easy to use and learn, in addition to being able to make systems fast and elegant. One of the things that I always show in the courses is the history of the evolution of the product, I don't know how many products are updated in this way, with this speed and always innovating.

domingo, 8 de marzo de 2020

Strings de sustitución en Oracle APEX

En Oracle APEX encontramos las strings de sustitución, que nos permiten utilizarlos para sustituírlos por valores dentro de un template o source de una región o item.

Strings de Sustitución dentro de un template
Para referenciarlos en un template debemos utilizar el String "encerrado" entre # y siempre en mayúsculas

ej. #MI_STRING_SUSTITUCION#

Strings de sutitución para Items de Página o Aplicación

También aquí el nombre del Item debe ir en mayúsculas
Se precede de &
Se finaliza con . (el carcter punto).

eje. P25_PROVEEDOR.


Strings de Sustitución en Columnas Grid Interactivos:
Como el caso anterio & y punto encierran en mayúsculas el nombre de la columna

ej. &PROVEEDOR.

Strings de sustitución para columnas de reportes clásicos e interactivos

 Para referenciarlos en un reporte de este  debemos utilizar el nombre de la columna "encerrado" entre # y siempre en mayúsculas

Uno de los puntos importantes a tener aquí en cuenta es, cualos son esos Strings de Sustitución que nos brinda APEX .

La lista es extensa:


        Algunos  importantes a destacar son:

Como realizar una reporte con indicadores de semáforos según determinados valores

Vamos a utilizar tablas de una de las apps, y realizaremos la siguiente consulta

Select EBA_DEMO_TREE_EMP.ENAME as ENAME,
    EBA_DEMO_TREE_EMP.JOB as JOB,
    EBA_DEMO_TREE_EMP.SAL as SAL,
    EBA_DEMO_TREE_EMP.DEPTNO as DEPTNO ,
    null icono,
case
when sal < 1000 then 'red'
when sal between 1000 and 2999 then 'yellow'
else 'green' end icon_color
 from EBA_DEMO_TREE_EMP EBA_DEMO_TREE_EMP

Uilizamos una pseudo-columna que se denomina icono a la cual le damos el valor NULL

Por otra parte otra pseudo-columna  también  que será la que determine el color del semáforo

Para la columna icono lo que debemos hacer en la propiedad html expression agregar el siguiente html

<span class="fa fa-dot-circle-o" aria-hidden="true" style="color:#ICON_COLOR#"></span>

Donde le agregamos el icono a utilizar el estilo y el color dado por la variable de sustitución ICONO_COLOR 

domingo, 9 de febrero de 2020

Como simular un shuttle con 2 interactive GRID


En este caso lo que realizamos es simular el comportamiento de un shuttle mediante Grids.
La idea es seleccionar elementos de un lado del Grid y enviarlos al otro Grid, en ambas direcciones.

Para realizar esta tarea es necesario identificar cada Grid con un Static ID.

Vamos a nominarlos como: igLeft e igRight.

Utilizaremos el siguiente código para realizar el pasaje

Con la siguiente idea
Se seleccionan las vistas actuales de cada Grid.


Vamos a para cada registro seleccionado en una de las grillas crear un nuevo registro en el otro Grid y asignarles los valores del primer Grid.

Luego debemos eliminar el registro original  y por último ejecutar el comando SAVE de cada uno de los Grids.



function moveRight(){
     var i, records, record, sal, modelLeft,
        viewLeft = apex.region("igLeft").widget().interactiveGrid("getCurrentView");
     modelLeft = viewLeft.model;

var modelRight       = apex.region('igRight').widget().interactiveGrid('getViews','grid').model;
var myNewRecordId,myNewRecord;
    var recordId;
//insert new record on a model

    // leer los seleccionados del lado izquierdo
       records = viewLeft.getSelectedRecords();
   // para cada uno crear registro  en grilla derecha, copiar valores y eliminar
        if ( records.length > 0 ) {
            for ( i = 0; i < records.length; i++ ) {
                record = records[i];
      
            myNewRecordId = modelRight.insertNewRecord();

//get the new record
  myNewRecord = modelRight.getRecord(myNewRecordId);

//update record values
modelRight.setValue(myNewRecord, 'COLUMN1', modelLeft.getValue(record, "COLUMN1"));
modelRight.setValue(myNewRecord, 'COLUMN2', modelLeft.getValue(record, "COLUMN2"));
modelRight.setValue(myNewRecord, 'COLUMN3', modelLeft.getValue(record, "COLUMN3"));
modelRight.setValue(myNewRecord, 'COLUMN4', modelLeft.getValue(record, "COLUMN4"));
modelRight.setValue(myNewRecord, 'CLASIFICA', 'I'); 
           
            }
              modelLeft.deleteRecords(records); 
//
            apex.region("igLeft").widget().interactiveGrid("getActions").invoke("save");
            apex.region("igRight").widget().interactiveGrid("getActions").invoke("save");
        }
}


CheckBox en un GRID de APEX

Desarrollando para un cliente, nos encontramos con la necesidad de utilizar un checkbox en el GRID (editable). Utiizando el rowselect de  APEX no cumplia los requisitos que quería el cliente, y utilizando un checkbox como una columna el look and feel no es el mejor y realmente tampoco era lo que deseaba nuestro cliente.
En resumen lo que hicimos fue customizar un checkbox utilizando imagenes de checked y uncheked

A continuación veremos la implementación:


La idea es que se utiliza un link que devuelve la línea donde se da click, en caso que el Grid no esté habilitado para modificarse, lo habilita y vuelve a llamarse con los mismos parámetros. En este segundo llamado sí va a estar habilitado. Si la clase del checkbox es desmarcado la cambia a marcado y viceversa. Cuando la clase queda marcada asigna a la columna marca un 1 sino 0 (0 es el valor por defecto).

El uso de la columna marca es si queremos procesar solo aquellas columnas que fueron realmente marcadas


        En el select se debe escribir:  ROWNUM as chkbox  y 0 as MARCA. 
   
      El rownum en caso que nuestro query  este compuesto por varias uniones debe estar en el select por fuera de todo el query.

2       Para configurar el  CHKBOX debemos setearlo del tipo LINK.
o   type : URL
o   URL: javascript:payUnpayCB("miStaticGridId",&CHKBOX.)  (En el primer parámetro va el static id del Grid, en el segundo parámetro ver que luego del & va el nombre del item que hace de checkbox)
o   Link Text: <span id="checkBoxID_&CHKBOX." aria-hidden="true" class="fa fa-square-o"></span>
o   Link Attributes: id="clickCheck_&CHKBOX."
     3)      Column Filter: False
     4)      Enable Users to: Sort: False
     5)      En CHKBOX en js Initialization Code
function(options) { 
 options.defaultGridColumnOptions = { 
    noHeaderActivate: true 
  } 
  return options; 
} 
    6)      A nivel de página en Function and Global Variable Declaration
            function payUnpayCB(pIDGrid, pLine) {
   
    if((apex.region(pIDGrid).widget().interactiveGrid("getActions").get("edit"))){

        var view = apex.region(pIDGrid).widget().interactiveGrid("getCurrentView");
        var model = view.model;
        var record = view.view$.grid("getActiveRecord");
   
        var aRet = $("#checkBoxID_"+pLine).attr("class");

        if (aRet == "fa fa-square-o" ){

           model.setValue( record, "MARCA", "1");
           $("#checkBoxID_"+pLine).removeClass("fa fa-square-o").addClass("fa fa-check-square-o");
        }
        else {
              model.setValue( record, "MARCA", "0");
              $("#checkBoxID_"+pLine).removeClass("fa fa-check-square-o").addClass("fa fa-square-o");
        }
       
    }
    else {
          apex.region(pIDGrid).widget().interactiveGrid("getActions").set("edit", true);
          payUnpayCB(pIDGrid, pLine);
    }
}

    7)   El item MARCA lo ocultamos en tiempo de ejecución y salvamos el reporte por defecto




jueves, 16 de noviembre de 2017

Cuando en junio de 2010 realizamos el primer evento de Grupo de Usuarios Oracle del Uruguay, y realizaba mi primer presentación de APEX y XE, tal vez jamás imaginé todo lo que fue aconteciendo. Conocer a gente maravillosa del mundo Oracle, de la informática y por si fuera poco expertos.
Luego todo fue sucediendo, APEX Tour, OTN Tour, Developer Tour, algunos eventos locales, varios países y muchos amigos.

En 2012 fue creado el APEX Tour del cual participó Dan McGhan. Ese primer APEX Tour fue impulsado por Marcelo Burgos, Clarisa Mamam Orfali y Nelson Calero. Tuve el gusto de poder participar de él en San Pablo, Montevideo y Buenos Aires

El año pasado viajé para el primer evento del Grupo de Usuarios de Paraguay donde presenté Desarrollo Mobile en APEX.

En el medio varios APEX Tour, varios OTN Tour y algunos países más OOW en San Pablo (muchos) y el OOW en San Francisco.

El año pasado el APEX Tour se transformó en ODT (Oracle Developer Tour).

Ese 2016 tuve la oportunidad de capacitar a más de 50 personas en APEX en Montevideo y este año a unas 8 en Asunción del Paraguay.

El ODT este año recorrería muchos países pero incorporaría para los amantes de APEX además de la presencia que ya ocurría desde dos años antes de David Peake (Product Manager de APEX), la presencia de Joel Kallman co-autor de APEX.

Tuve el gusto de conocer a David años antes en Brasilia y ahora conocería a Joel.

Mi decisión fue recorrer tres ciudades, Asunción, Brasilia y Córdoba.

En la primer y última ciudad mi actividad sería un hands-on o lab y en Brasilia una presentación (palestra)


Asunción explotó y más de 230 personas se hicieron presentes. En el lab que di serían unas  30 personas. Realmente la gente sumamente interesada en la herramienta, creo que el lab salió muy bien. La gente trabajó durante tres horas resolviendo el lab.
Aquí en la persona de Claudia Acosta gracias a todo el equipo del Grupo de Usuarios por las atenciones y el excelente evento. Gracias también por esa bienvenida tan especial.



Luego siguió Brasilia, allí casi que ya somos locales con mi amigo Marcelo Burgos, él como siempre se jugó en portugues en su conferencia. Yo con lecciones aprendidas de eventos anteriores preferí un español devagarinho y no el portuñol de hace dos años ........
Aqui conocí a Mercedes de Gautemala, muy buena onda la Chapi!!




Allí la palestra fue sobre reportes en APEX hablando de como lograr reportes más elaborados y reportes para impresión. Nuevamente el equipo de Anderson Ferreira se lució en todos los detalles del evento, así como también al TCU. Muchas gracias, obrigado!!!


























El siguiente turno fue Córdoba, años antes hubo un APEX Tour y no pude asistir, así que esta sería mi revancha!!.

Aquí nuevamente un lab, el cual con Marcelo Burgos unimos con el de él y entre los dos hicimos no se si uno de los mejores labs, pero por lo menos sí el más divertido. A mi me encantó, Marcelo me dijo que él también la pasó muy bien. No solo disfruté el taller sino que la participación de la gente fue espectacular y la muy buena onda también. Al final se acercaron todos a agradecer el lab muy lindo de verdad. Aqui las gracias a Adrián Filomeni y toda su gente, equipo y Universidad Técnica Nacional, hermoso el auditorio, y a sus laboratorios y el equipo.
Agradecimiento especial a Marcelo Ochoa por preparar con Docker las máquinas virtuales para el lab.
También fue un gusto reencontrarme con "amigo" el Pana Arístides!!!





Antes del final el agradecimiento a Joel y a David por participar en esta gira, por permitirnos compartir todos estos días con ellos y aprender más. Porque más allá de lo técnico son dos personas excepcionales. Gracias también a JB y JT por su presencia en la gira y por compartir algunos momentos.

Como cierre de todas las ciudades que estuve Córdoba era la que no conocía y me resultó una ciudad hermosa, las sierras quedarán para otra oportunidad. Cuidenla porque es muy bonita y su gente maravillosa.































Como cierre final también fui bien recibido en Montevideo por mis compañeras de "isla".


Gracias, y hasta el próximo Tour!!!