jueves, 14 de febrero de 2013

PeopleCode: Imprimir toda una página

Imprimir toda una página es más fácil...

Agrega un botón a tu página, asócialo a un derived y un campo que sea de 25 caracteres como mínimo de tipo MIXED.

En las propiedades del botón en Destination le pones External Link y en el cuadro de external link (el que se habilita) le pones dinámico.

Después en el FieldDefault del campo asociado al botón le pones:

TuDerived.TuCampo.value = "javascript:window.print()"
Y listo....

Adicional y si requieres que no imprima el menú  e incluso el mismo botón que lo mandó a imprimir, tendrías que hacer:

En las propiedades del botón, en la pestaña de General, en donde dice "Page Field Name" le pones algún nombre específico, como: BOTON_IMPRIME

Luego, en tu página tienes que agregar un HTML de tipo constante, y en el rowinit le pones este código:

TuDerived.TuCampoHTML.value = "<style type=""text/css"">@media print {body { zoom:75%;} #PAGEBAR, .PSHEADERTOOLBARFRAME, #BOTON_IMPRIME { display: none }}</style>";
Con esto estás controlando el zoom al momento de imprimir y las secciones que no quieres que aparezcan. Puedes nombrar tantos campos de tu pantalla como quieras, para luego decirle que no aprezcan en la impresión, anteponiendo el "#" como en la línea de arriba: #BOTON_IMPRIME { display: none }

Tanto el botón como el HTML deben de estar al nivel 0

Espero les sea de utilidad.

miércoles, 13 de febrero de 2013

ORACLE SQL - Renglones en una sola columna

Supongamos que tenemos esta tabla:

create table test2(nombre varchar(7));

Y con estos datos:

insert into test2 values('uno');
insert into test2 values('dos');
insert into test2 values('tres');
insert into test2 values('cuatro');
insert into test2 values('cinco');
insert into test2 values('seis');
insert into test2 values('siete');
insert into test2 values('ocho');
insert into test2 values('nueve');
insert into test2 values('diez');
commit;

Si revisamos los datos vemos:

select * from test2
NOMBRE
-------
uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez
10 rows selected
Y ahora queremos obtener esos 10 renglones en uno solo y en una sola columna

WITH DATOS
AS (SELECT 1 DUMMY, NOMBRE FROM TEST2 )
SELECT  LTRIM(MAX( SYS_CONNECT_BY_PATH ( NOMBRE, ',')),',') NOMBRES
    FROM
    (SELECT  DUMMY, NOMBRE,
             ROW_NUMBER() OVER ( PARTITION BY DUMMY  ORDER BY DUMMY) RN
    FROM  DATOS )
    CONNECT  BY  DUMMY = PRIOR DUMMY
            AND  RN     = PRIOR RN+1
    START WITH RN = 1
   GROUP BY DUMMY;

Y obtenemos:

NOMBRES
-----------------------------------------------------------------------------
uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve,diez
Espero les sea de utilidad.

viernes, 8 de febrero de 2013

PeopleSoft - Impresión de una sección de una página con IScript

Supongamos que tenemos una página como la siguiente:

 

 

En donde tenemos un objeto de tipo HTML y el texto de éste es el que queremos mandar a impresión (sin ninguna otra parte de la página, llámese secciones, campos, menú, etc..)

Bueno, después de haber buscado hacerlo por JavaScript y que no me dejó por sus restricciones de seguridad (que no dudo que se pueda, pero ya no me adentré más en eso) me fui por IScript de Peoplesoft.

Bueno, primero hablemos de cómo llené el objeto HTML.



Dentro del catálogo de mensajes, cree el relleno de esto, el texto dándole el formato que necesito con HTML.



Utilizando variables a sustituir, con la misma mecánica de PS, utilizando el %1  %2  %3  etc… insertándolo en las partes del texto donde deberán de aparecer.

Dentro de la página, obviamente para llenarlo le paso los parámetros que se necesitan:

&sHTML = MsgGetExplainText(123, 480, "No configurado", &emplid, &nombre);

MiRegistro.CampoHTML.value = &sHTML;

Ok, hasta aquí tenemos como se llenó en la página.

CREANDO EL ISCRIPT (WebLibrary)

Creamos un record con 1 solo campo. El nombre del Record necesariamente debe de comenzar con el prefijo WEBLIB_



El nombre del campo si puede ser cualquiera. Nos vamos al FieldFormula de ese campo y ponemos:

import PT_NAV:*;

Declare Function SetDocDomainForPortal PeopleCode FUNCLIB_PORTAL.TEMPLATE_FUNC FieldFormula;

Function IScript_Imprime ()
   &domainScript = SetDocDomainForPortal();
   &convocatoria = %Request.GetParameter("e");
   &nombre = %Request.GetParameter("n");
   &texto = MsgGetExplainText(123, 480, "N configurada", &emplid, &nombre);
   &HTML = GetHTMLText(HTML.HTML_BE_MSJ, %Response.GetStyleSheetURL(StyleSheet.PSSTYLEDEF), &domainScript, &texto);
   %Response.Write(&HTML);

End-Function;

El nombre de la función necesariamente debe de iniciar con IScript_ 

Si se fijan, estoy llamando un objeto HTML (HTML.HTML_BE_MSJ) en este objeto tengo el diseño de la página nueva que se abrirá y mostrará el contenido que requiero para mandarlo a impresión. Este objeto lo tengo así:



En el cuál estoy manejando variables que le pasaré con el contenido del texto que necesito imprimir y otros detalles. También, como solo me interesa imprimirlo, en el evento onload de ésta página lo estoy mandando a impresión e inmediatamente después me regreso a la página desde la cuál se hizo el llamado.

PERMISOS

Ahora, tenemos que registrar la librería, podría ser manualmente o por el asistente, el cuál se activa cuando creamos el Record de tipo WEBLIB_



Y de ahí seguimos las instrucciones. Yo usualmente lo añado a la carpeta Tools (que esta oculta). No se nos debe de olvidar añadirlo a la lista de permisos, que incluso desde el asistente se puede agregar





LLAMANDO LA LIBRERÍA

Después, en la página agregamos un botón que apunte a cualquier registro de tipo derived, y en el evento FieldChange pondríamos:

SQLExec("select nombre from ps_names where emplid=:1", PS_JOB.EMPLID, &nombre);

 

&Url = %Request.Scheme | "://" | %Request.ServerName | ":" | %Request.ServerPort | "/psc/" | %DbName | "/" | %Portal | "/";
&Url = &Url | %Node | "/s/WEBLIB_CYT_BE.CYT_BTN_PRINT.FieldFormula.IScript_Imprime ";

&Url = &Url | "?e=" | PS_JOB.EMPLID.value | "&n=" | &nombre;

 

%Response.RedirectURL(&Url);

 



Y listo!!

Al momento de dar clic al botón abrirá una nueva página junto con la caja de diálogo de impresión, y al momento de imprimir regresará a la página original.

Si observan, la función IScript no recibe como tal ningún parámetro, todos los que se necesiten serán leídos utilizando el %Request.GetParameter("MiParámetro").

Espero les sea de utilidad.

Translate