Vous êtes sur la page 1sur 8

Lista de Seleccin Mltiple en PEOPLESOFT

En los proyectos en los que he trabajado desarrollando personalizaciones para


PEOPLESOFT siempre me he encontrado con el siguiente requerimiento:
La pgina de parmetros del reporte a desarrollar debe permitir para el
campo X (generalmente un campo XLAT) la seleccin de uno, todos o mltiples
valores.
Como desarrollador asum que est tipo de comportamiento es nativo a
PEOPLESOFT ya que se puede encontrar en las distintas pginas de bsqueda
que genera el aplicativo automticamente. En el siguiente ejemplo se puede ver el
comportamiento citado:

Dentro de PEOPLESOFT no existe una forma simple y automtica de replicar est


comportamiento, segn algunos foros en internet la forma de realizarlo es a travs
de la utilizacin del iScrip.

A continuacin expongo un ejemplo de como realizar una lista de seleccin


multiple dentro de una pgina de PEOPLESOFT

Lo primero que se debe hacer es crear un record para almacenar la informacin


que se seleccionar. Por ejemplo para la imagen anterior se deberan almacenar
los valores para "Comprobante Reclam", "Pago nico" y "Reversin" lo cuales
fueron seleccionados por el usuario. El registro se va a llamar Q_MULLIST_TBL y
es de tipo table y debe tener los campos que se muestran en la figura. Este
registro puede servir para almacenar todos los datos de todas la listas de
seleccin que se utilicen dentro de PEOPLESOFT.

Generalmente la ejecucin de los reportes se hace por control de ejecucin y por


id de usuario, por esa razn este registro tiene esos 2 campos.

El campo FIELDNAME es para indicar a que campo (de tipo XLAT) pertenecen
esos registros.

El campo PARAMETERNAME es un identificador por si es necesario introducir


dentro de un mismo control de ejecucin mltiples listas de seleccin para el
mismo campo.

Y por ltimo el campo VALUE50_FLD1 es el campo donde se almacenar el valor


seleccionado.

Cada vez que se quiere introducir cdigo iScript dentro de una pgina Peoplesoft
se debe tener un campo de tipo HTML Area, este campo permite generar cdigo
HTML independiente del COMPONENT BUFFER.

Para lo anterior se debe crear otro record, esta vez de tipo DERIVED/WORK para
introducir un campo de tipo HTML Area.

Adicionalmente este record contendr el campo TREECTLEVENT el cual tendr


como funcin controlar los eventos que se ejecutarn cuando se modifiquen los
datos que se incluyan dentro del campo HTML Area (En nuestro caso cuando se
marquen o desmarquen valores dentro de nuestra lista.)

El record se va a llamar Q_HTML_WRK y debe quedar como se ven en la figura:

A continuacin se describen las funciones que necesarias para generar nuestra


lista de seleccin mltiple. Estas funciones se deben escribir en el evento
FIELDFORMULA del campo HTMLAREA del record Q_HTML_WRK
La primera funcin es la funcin que permite pintar, cargar los valores
seleccionados y actualizar los valores de nuestra lista.

Function getHTMLMultiSelect(&str_oprid As string, &str_run_cntl_id As string, &str_recordname As string, &str_fieldname As


string, &str_parametername As string, &str_pagename As string, &str_cntrlfield As string, &bol_Init As boolean)

Local string &str_html;


Local Field &fld_campo;
Local string &str_field;
Local Rowset &rs_Xlat, &rs_selected;
Local Record &rec_field;
Local number &nbr_i;
Local array of string &arr_selected;

&str_html = "<select name='" | &str_parametername | "'


onchange=""javascript:submitAction_win0(document.win0,'#ICSetField" | &str_pagename | "." | &str_cntrlfield | ".X1');""
multiple= 'true'>";

&str_field = &str_recordname | "." | &str_fieldname;


&fld_campo = GetField(@(&str_field));

If &fld_campo.IsEditXlat Then

&arr_selected = CreateArrayRept("", 0);

If &bol_Init Then

&rs_selected = CreateRowset(Record.Q_MULLIST_TBL);
&rs_selected.Fill("WHERE FILL.OPRID = :1 AND FILL.RUN_CNTL_ID = :2 AND FILL.FIELDNAME = :3 AND
FILL.PARAMETERNAME = :4", &str_oprid, &str_run_cntl_id, &str_fieldname, &str_parametername);

For &nbr_i = 1 To &rs_selected.ActiveRowCount


&arr_selected.Push(&rs_selected(&nbr_i).GetRecord(1).GetField(Field.VALUE50_FLD1).Value);
End-For;
Else
&arr_selected = %Request.GetParameterValues(&str_parametername);
End-If;

&rs_Xlat = CreateRowset(Record.PSXLATITEM);
&rs_Xlat.Fill("WHERE FILL.FIELDNAME = :1 and EFFDT = (select max(EFFDT) from PSXLATITEM B where B.FIELDNAME = :1
and FILL.FIELDVALUE = B.FIELDVALUE and EFFDT <= %CURRENTDATEIN)", &str_fieldname);

&nbr_i = 1;
For &nbr_i = 1 To &rs_Xlat.ActiveRowCount
&fld_campo.Value = &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value;
If &arr_selected.Find(&rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value) <> 0 Then
&str_html = &str_html | "<option value='" | &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value | "'
selected='true'>" | &fld_campo.LongTranslateValue | "</option>"
Else
&str_html = &str_html | "<option value='" | &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value | "' >" |
&fld_campo.LongTranslateValue | "</option>"
End-If;

End-For;
&str_html = &str_html | "</select>";
Q_HTML_WRK.HTMLAREA.Value = &str_html;

If Not &bol_Init Then


Q_HTML_WRK.TREECTLEVENT.Value = "";
End-If;

End-If;
End-Function;
A continuacin se describen los parmetros de la funcin:
&str_oprid: Usuario que est creando los datos
&str_run_cntl_id: Control de ejecucin que se est creando
&str_recordname: Registro en el que se encuentra el campo XLAT para el
cual se va a almacenar la informacin.
&str_fieldname: Campo XLAT para el que se va a almacenar la informacin
&str_parametername: Identificador que se le va a dar al campo
&str_pagename: nombre de la pgina que est ejecutando el control
&str_cntrlfield: es el campo de control, generalmente es TREECTLEVENT
que es el campo que se utiliza para controlar los eventos que ocurrirn en el HTML
Area
&bol_Init: Indica si se est inicializando la lista (Rowinit) o si se est
modificando (fieldchange)

El objetivo del fragmento que presentando a continuacin es crear el cdigo html


que va a marcar el campo TREECTLEVENT para ejecutar el evento
FIELDCHANGE cuando se d clic dentro de la lista, la cual est representanda por
el comando <select el cual indica que se est creando una lista, y el parmetro
multiple=true indica que se pueden seleccionar mltiples valores dentro de
sta.

La funcin submitAction_win0 es una funcin javascript que provee peoplesoft, y


que permite marcar un control para la ejecucin del evento FIELDCHANGE
&str_html = "<select name='" | &str_parametername | "' onchange=""javascript:submitAction_win0(document.win0,'#ICSetField"
| &str_pagename | "." | &str_cntrlfield | ".X1');"" multiple= 'true'>";

El siguiente fragmento de cdigo verifica si el campo que se est usando es XLAT


de no ser as no har nada.

&str_field = &str_recordname | "." | &str_fieldname;


&fld_campo = GetField(@(&str_field));

If &fld_campo.IsEditXlat Then

El cdigo presentando a continuacin verifica los valores seleccionados dentro de


la lista. Si se est iniciando la lista, se verifican los valores que estn guardados
en la base de datos, de lo contrario s se est ejecutando en el FIELDCHANGE se
verifican los valores que se encuentran actualmente seleccionados en la lista. En
este punto es que entra jugar el iScript, la variable del sistema %Request permite
acceder directamente al html, usando esta variable podemos obtener los valores
seleccionados actualmente en la pgina, utilizando la funcin GetParameterValues
obtenemos los valores marcados por el usuario.
&arr_selected = CreateArrayRept("", 0);

If &bol_Init Then

&rs_selected = CreateRowset(Record.Q_MULLIST_TBL);
&rs_selected.Fill("WHERE FILL.OPRID = :1 AND FILL.RUN_CNTL_ID = :2 AND FILL.FIELDNAME = :3 AND
FILL.PARAMETERNAME = :4", &str_oprid, &str_run_cntl_id, &str_fieldname, &str_parametername);

For &nbr_i = 1 To &rs_selected.ActiveRowCount


&arr_selected.Push(&rs_selected(&nbr_i).GetRecord(1).GetField(Field.VALUE50_FLD1).Value);
End-For;
Else
&arr_selected = %Request.GetParameterValues(&str_parametername);
End-If;

En el siguiente paso se recorren los valores activos del XLAT, escribirlos dentro de
la lista usando la opcin "<option" y asignar este fragmento de HTML al campo
HTMLAREA para que sea visualizado dentro de la pgina.

&rs_Xlat = CreateRowset(Record.PSXLATITEM);
&rs_Xlat.Fill("WHERE FILL.FIELDNAME = :1 and EFFDT = (select max(EFFDT) from PSXLATITEM B where B.FIELDNAME = :1
and FILL.FIELDVALUE = B.FIELDVALUE and EFFDT <= %CURRENTDATEIN)", &str_fieldname);

&nbr_i = 1;
For &nbr_i = 1 To &rs_Xlat.ActiveRowCount
&fld_campo.Value = &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value;
If &arr_selected.Find(&rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value) <> 0 Then
&str_html = &str_html | "<option value='" | &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value | "'
selected='true'>" | &fld_campo.LongTranslateValue | "</option>"
Else
&str_html = &str_html | "<option value='" | &rs_Xlat(&nbr_i).GetRecord(1).GetField(Field.FIELDVALUE).Value | "' >" |
&fld_campo.LongTranslateValue | "</option>"
End-If;
&str_html = &str_html | "</select>";
Q_HTML_WRK.HTMLAREA.Value = &str_html;

Por ltimo se reinicia el valor del campo TREECTLEVENT.

La otra funcin que se debe desarrollar es la que permite guardar los datos
seleccionados a la base de datos

Function saveHTMLMultiSelect(&str_oprid As string, &str_run_cntl_id As string, &str_fieldname As string, &str_parametername


As string)
Local string &str_html;
Local Field &fld_campo;
Local string &str_field;
Local Rowset &rs_Xlat, &rs_selected;
Local number &nbr_i;

Local array of string &arr_selected;


Local Record &rec_tcf_mullist_tbl;
SQLExec("DELETE FROM PS_TCF_MULLIST_TBL WHERE OPRID = :1 AND RUN_CNTL_ID = :2 AND FIELDNAME = :3 AND
PARAMETERNAME = :4", &str_oprid, &str_run_cntl_id, &str_fieldname, &str_parametername);
&arr_selected = %Request.GetParameterValues(&str_parametername);

For &nbr_i = 1 To &arr_selected.Len


&rec_tcf_mullist_tbl = CreateRecord(Record.TCF_MULLIST_TBL);
&rec_tcf_mullist_tbl.OPRID.Value = &str_oprid;
&rec_tcf_mullist_tbl.RUN_CNTL_ID.Value = &str_run_cntl_id;
&rec_tcf_mullist_tbl.FIELDNAME.Value = &str_fieldname;
&rec_tcf_mullist_tbl.PARAMETERNAME.Value = &str_parametername;
&rec_tcf_mullist_tbl.VALUE50_FLD1.Value = &arr_selected [&nbr_i];

&rec_tcf_mullist_tbl.Insert();

End-For;
End-Function;

Primero que todo se elimina la informacin que existe actualmente en la base de


datos:

SQLExec("DELETE FROM PS_TCF_MULLIST_TBL WHERE OPRID = :1 AND RUN_CNTL_ID = :2 AND FIELDNAME = :3 AND
PARAMETERNAME = :4", &str_oprid, &str_run_cntl_id, &str_fieldname, &str_parametername);

Obtenemos la informacin actualmente seleccionada en la lista, utilizando el


objeto iScript %Request:

&arr_selected = %Request.GetParameterValues(&str_parametername);

Insertamos los valores seleccionados a la base de datos:

For &nbr_i = 1 To &arr_selected.Len


&rec_tcf_mullist_tbl = CreateRecord(Record.TCF_MULLIST_TBL);
&rec_tcf_mullist_tbl.OPRID.Value = &str_oprid;
&rec_tcf_mullist_tbl.RUN_CNTL_ID.Value = &str_run_cntl_id;
&rec_tcf_mullist_tbl.FIELDNAME.Value = &str_fieldname;
&rec_tcf_mullist_tbl.PARAMETERNAME.Value = &str_parametername;
&rec_tcf_mullist_tbl.VALUE50_FLD1.Value = &arr_selected [&nbr_i];

&rec_tcf_mullist_tbl.Insert();

End-For;

Hasta este momento se han creado los objetos que se van a reutilizar en cada una de las pginas
donde se haga necesario incluir la lista.

Los pasos para crear una pgina que use este control son los siguientes:

crear el registro del control de ejecucin del reporte para el cual se va a


utilizar la pgina. El registro tiene como mnimo OPRID y RUN_CNTL_ID las
cuales deben ser llaves y llaves de bsqueda. El registro que se va a utilizar en el
ejemplo se llama Q_PRB_LISTA_TBL
crear la pgina en la cual se va a mostrar la lista de seleccin.
Agregar a la pgina la Subpagina PRCSRUNCNTL_SBP y configurar el
campo To para que apunte al registro Q_PRB_LISTA_TBL
Crear un registro de tipo derived que contenga el campo para el cual se
har la lista de seleccin mltiple. El campo puede ser cualquiera que tenga
definido un XLAT, por ejemplo el campo ACCESS_LEVEL. En este caso se
utilizar un campo llamado Q_PRUEBA_LISTA y el recrod se llamar
Q_PRB_LISTA_WRK
Colocar el campo en la pgina donde va a ser utilizado el control, debe
marcarse como Display Only e Invisible
Arrastrar el campo HTMLAREA del record Q_HTML_WRK a la pgina
Arrastrar el campo TREECTLEVENT del record Q_HTML_WRK a la pgina
y lo marcarlo como invisible y Modifiable by Javascript
La pgina debe quedar como se ve en la figura:

En el evento rowinit del Q_PRB_LISTA_WRK.Q_PRUEBA_LISTA agregar


el llamado a la funcin para inicializar la lista de seleccin:
Declare Function getHTMLMultiSelect PeopleCode Q_HTML_WRK.HTMLAREA FieldFormula;

getHTMLMultiSelect(Q_PRB_LISTA_TBL.OPRID.Value, Q_PRB_LISTA_TBL.RUN_CNTL_ID.Value, "Q_PRB_LISTA_WRK",


"Q_PRUEBA_LISTA", "VALORES", "Q_PRB_LISTA_PAGE", "TREECTLEVENT", True);
En el evento SavePostChange del Q_PRB_LISTA_WRK.Q_PRUEBA_LISTA agregar el
llamado a la funcin para guardar los datos de la lista de seleccin:
Declare Function SAVEHTMLMultiSelect PeopleCode Q_HTML_WRK.HTMLAREA FieldFormula;
SAVEHTMLMultiSelect(Q_PRB_LISTA_TBL.OPRID.Value, Q_PRB_LISTA_TBL.RUN_CNTL_ID.Value, "Q_PRUEBA_LISTA", "VALORES");
Crear el Componente, el Men, registrarlos en el portal y le darles seguridad para poder
accederlos.
Por ltimo agregar el siguiente cdigo al campo TREECTLEVENT del record
Q_HTML_WRK a nivel de componente:
Declare Function getHTMLMultiSelect PeopleCode Q_HTML_WRK.HTMLAREA FieldFormula;
getHTMLMultiSelect(Q_PRB_LISTA_TBL.OPRID.Value, Q_PRB_LISTA_TBL.RUN_CNTL_ID.Value, "Q_PRB_LISTA_WRK",
"Q_PRUEBA_LISTA", "VALORES", "Q_PRB_LISTA_PAGE", "TREECTLEVENT", False);

Y listo:

Bueno hasta ac llega la primera entrada de este blog, espero que est informacin les sea de
mucha utilidad en sus proyectos.
Cualquier comentario, sugerencia, duda, pregunta, etc., es bienvenida. Esperen la proxima semana
una nueva entrada que tratar sobre una herramienta introducida en PEOPLESOFT 9.0 que
permite realizar "Customizaciones" dentro de las aplicaciones disminuyendo el impacto de las
mismas y su administracin.

Vous aimerez peut-être aussi