lunes, 9 de septiembre de 2013
PeopleSoft - Revisión de Permisos y Accesos
SELECT AD.ROLEUSER, AC.ROLENAME, AC.CLASSID,
rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim( G.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim( F.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( E.PORTAL_LABEL )) || ' > ')) || rtrim(ltrim( D.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( C.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim( B.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( A.PORTAL_LABEL)) AS Ruta_Ingles,
rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(GL.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim(FL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(EL.PORTAL_LABEL )) || ' > ')) || rtrim(ltrim(DL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(CL.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim(BL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(AL.PORTAL_LABEL)) AS Ruta_Español,
A.PORTAL_URI_SEG1 AS Menu,
A.PORTAL_URI_SEG2 as Componente
FROM ((((((((
(PSPRSMDEFN A LEFT OUTER JOIN PSPRSMDEFNLANG AL
ON A.PORTAL_NAME = AL.PORTAL_NAME
AND A.PORTAL_REFTYPE = AL.PORTAL_REFTYPE
AND A.PORTAL_OBJNAME = AL.PORTAL_OBJNAME
) LEFT OUTER JOIN
(PSPRSMDEFN B LEFT OUTER JOIN PSPRSMDEFNLANG BL
ON B.PORTAL_NAME = BL.PORTAL_NAME
AND B.PORTAL_REFTYPE = BL.PORTAL_REFTYPE
AND B.PORTAL_OBJNAME = BL.PORTAL_OBJNAME
) ON A.PORTAL_PRNTOBJNAME = B.PORTAL_OBJNAME AND (A.PORTAL_NAME = 'EMPLOYEE' AND A.PORTAL_NAME = B.PORTAL_NAME )
) LEFT OUTER JOIN
( PSPRSMDEFN C LEFT OUTER JOIN PSPRSMDEFNLANG CL
ON C.PORTAL_NAME = CL.PORTAL_NAME
AND C.PORTAL_REFTYPE = CL.PORTAL_REFTYPE
AND C.PORTAL_OBJNAME = CL.PORTAL_OBJNAME
) ON B.PORTAL_NAME = C.PORTAL_NAME
AND B.PORTAL_REFTYPE = C.PORTAL_REFTYPE
AND B.PORTAL_PRNTOBJNAME = C.PORTAL_OBJNAME
AND B.PORTAL_NAME = C.PORTAL_NAME
) LEFT OUTER JOIN
(PSPRSMDEFN D LEFT OUTER JOIN PSPRSMDEFNLANG DL
ON D.PORTAL_NAME = DL.PORTAL_NAME
AND D.PORTAL_REFTYPE = DL.PORTAL_REFTYPE
AND D.PORTAL_OBJNAME = DL.PORTAL_OBJNAME
) ON C.PORTAL_NAME = D.PORTAL_NAME
AND C.PORTAL_REFTYPE = D.PORTAL_REFTYPE
AND C.PORTAL_PRNTOBJNAME = D.PORTAL_OBJNAME
AND C.PORTAL_NAME = D.PORTAL_NAME
) LEFT OUTER JOIN
(PSPRSMDEFN E LEFT OUTER JOIN PSPRSMDEFNLANG EL
ON E.PORTAL_NAME = EL.PORTAL_NAME
AND E.PORTAL_REFTYPE = EL.PORTAL_REFTYPE
AND E.PORTAL_OBJNAME = EL.PORTAL_OBJNAME
) ON D.PORTAL_NAME = E.PORTAL_NAME
AND D.PORTAL_REFTYPE = E.PORTAL_REFTYPE
AND D.PORTAL_PRNTOBJNAME = E.PORTAL_OBJNAME
) LEFT OUTER JOIN
( PSPRSMDEFN F LEFT OUTER JOIN PSPRSMDEFNLANG FL
ON F.PORTAL_NAME = FL.PORTAL_NAME
AND F.PORTAL_REFTYPE = FL.PORTAL_REFTYPE
AND F.PORTAL_OBJNAME = FL.PORTAL_OBJNAME
) ON E.PORTAL_NAME = F.PORTAL_NAME
AND E.PORTAL_REFTYPE = F.PORTAL_REFTYPE
AND E.PORTAL_PRNTOBJNAME = F.PORTAL_OBJNAME
) LEFT OUTER JOIN
(PSPRSMDEFN G LEFT OUTER JOIN PSPRSMDEFNLANG GL
ON G.PORTAL_NAME = GL.PORTAL_NAME
AND G.PORTAL_REFTYPE = GL.PORTAL_REFTYPE
AND G.PORTAL_OBJNAME = GL.PORTAL_OBJNAME
) ON F.PORTAL_NAME = G.PORTAL_NAME
AND F.PORTAL_REFTYPE = G.PORTAL_REFTYPE
AND F.PORTAL_PRNTOBJNAME = G.PORTAL_OBJNAME
) LEFT OUTER JOIN
(PSPRSMDEFN H LEFT OUTER JOIN PSPRSMDEFNLANG HL
ON H.PORTAL_NAME = HL.PORTAL_NAME
AND H.PORTAL_REFTYPE = HL.PORTAL_REFTYPE
AND H.PORTAL_OBJNAME = HL.PORTAL_OBJNAME
) ON G.PORTAL_NAME = H.PORTAL_NAME
AND G.PORTAL_REFTYPE = H.PORTAL_REFTYPE
AND G.PORTAL_PRNTOBJNAME = H.PORTAL_OBJNAME
) LEFT OUTER JOIN
(PSPRSMDEFN I LEFT OUTER JOIN PSPRSMDEFNLANG IL
ON I.PORTAL_NAME = IL.PORTAL_NAME
AND I.PORTAL_REFTYPE = IL.PORTAL_REFTYPE
AND I.PORTAL_OBJNAME = IL.PORTAL_OBJNAME
) ON H.PORTAL_NAME = I.PORTAL_NAME
AND H.PORTAL_REFTYPE = I.PORTAL_REFTYPE
AND H.PORTAL_PRNTOBJNAME = I.PORTAL_OBJNAME
),
PSPRSMPERM AB,
PSROLECLASS AC,
PSROLEUSER AD
where B.PORTAL_REFTYPE = 'F'
AND A.PORTAL_NAME = AB.PORTAL_NAME
AND A.PORTAL_REFTYPE = AB.PORTAL_REFTYPE
AND A.PORTAL_OBJNAME = AB.PORTAL_OBJNAME
AND AC.CLASSID = AB.PORTAL_PERMNAME
AND AC.ROLENAME = AD.ROLENAME
AND A.PORTAL_URI_SEG2 <> ' '
AND AD.ROLEUSER = 'VP1'
order by 1,4,2,3
Leer una página WEB desde VB
' Declaraciones a nivel público
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
'Nuestras constantes
Public Const IF_FROM_CACHE = &H1000000
Public Const IF_MAKE_PERSISTENT = &H2000000
Public Const IF_NO_CACHE_WRITE = &H4000000
Public Const BUFFER_LEN = 256
viernes, 2 de agosto de 2013
ROWNUM en ACCESS (solución)
Pues bueno, creo que esta les funcionará mejor.
Primero, tengo esta tabla:
Así, sin más, solo 2 columnas con datos cualesquiera de tipo texto.
lunes, 17 de junio de 2013
Crear un PDF con PeopleCode desde un HTML
Local JavaObject &Document = CreateJavaObject("com.lowagie.text.Document");
Local JavaObject &pdfWriter = GetJavaClass("com.lowagie.text.pdf.PdfWriter").getInstance(&Document, CreateJavaObject("java.io.FileOutputStream", "/tmp/test.pdf", True));
&Document.open();
Local JavaObject &htmlWorker = CreateJavaObject("com.lowagie.text.html.simpleparser.HTMLWorker", &Document);
Local string &str;
&str = " <html> ";
&str = &str | " <head> ";
&str = &str | " <title></title> ";
&str = &str | " </head> ";
&str = &str | " <body> ";
&str = &str | " <p><b><font size='7'>Título</font></b></p> ";
&str = &str | " <p><b><font size='5'>Subtítulo</font></b></p> ";
&str = &str | " <p><b><font size='4'>Párrafo</font></b></p> ";
&str = &str | " <p>Texto de párrafo, texto de párrafo, texto de párrafo, texto de párrafo, texto ";
&str = &str | " de párrafo, texto de párrafo, texto de párrafo, texto de párrafo, texto de ";
&str = &str | " párrafo, texto de párrafo, texto de párrafo.</p> ";
&str = &str | " <table border='1' cellspacing='1' bgcolor='#FFFFCC' bordercolor='#0000FF' width='100%'> ";
&str = &str | " <tbody> ";
&str = &str | " <tr> ";
&str = &str | " <td width='10%'><b>Tabla</b></td> ";
&str = &str | " <td width='20%'><b>Head 1</b></td> ";
&str = &str | " <td width='50%'><b>Head 2</b></td> ";
&str = &str | " <td width='20%'><b>Head 3</b></td> ";
&str = &str | " </tr> ";
&str = &str | " <tr> ";
&str = &str | " <td width='10%'> </td> ";
&str = &str | " <td width='20%'> </td> ";
&str = &str | " <td width='50%'> </td> ";
&str = &str | " <td width='20%'> </td> ";
&str = &str | " </tr> ";
&str = &str | " </tbody> ";
&str = &str | " </table> ";
&str = &str | " <ul> ";
&str = &str | " <li>Elemnto 1</li> ";
&str = &str | " <li>Elemento 2</li> ";
&str = &str | " <li>Elemento 3</li> ";
&str = &str | " </ul> ";
&str = &str | " </body> ";
&str = &str | " </html> ";
Local JavaObject &SR = CreateJavaObject("java.io.StringReader", &str);
&htmlWorker.parse(&SR);
&Document.close();
&salida = PutAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf", "/tmp/test.pdf");
/* eliminamos el archivo en el AppSrv, del subdirectorio temporal */
Local JavaObject &f = CreateJavaObject("java.io.File", "/tmp/test.pdf");
&f.delete();
/* Muestra el archivo desde la ubicación de FTP */
&salida = ViewAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf", "test.pdf", True);
/* Eliminamos el archivo copiado después de haberlo mostrado*/
&salida = DeleteAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf");
NOTA:
Este tema esta relacionado con un tema previo que publiqué, con referencia al uso de las librerías iText.
jueves, 14 de febrero de 2013
PeopleCode: Imprimir toda una página
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
select * from test2
NOMBRE
-------
uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez
10 rows selected
NOMBRES
-----------------------------------------------------------------------------
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.