lunes, 9 de septiembre de 2013

PeopleSoft - Revisión de Permisos y Accesos

Yo sé que este query esta muuy largo... pero esta muy digerido. Te da por usuario, roles, listas de permisos, rutas en el portal (inglés y español), menú y componente al cuál se tiene acceso.


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

Esto puede ser muy útil para quitar publicidad y esas cosas que no queremos en nuestras páginas... o hasta incluso .. meter publicidad si queremos (me imagino por ejemplo algún cyber.. o lo que se les ocurra)

' 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


' Nuestra función de lectura
Public Function LeeURL(sURL As String) As String
Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
Dim hInternet As Long, hSession As Long, lReturn As Long

'obtener el identificador de la conexión a Internet actual
hSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)

'obtener el identificador de la url
If hSession Then hInternet = InternetOpenUrl(hSession, sURL, vbNullString, 0, IF_NO_CACHE_WRITE, 0)

'si tenemos el identificador, a continuación, iniciar la lectura de la página web
If hInternet Then
    'obtenemos el primer bloque y lo vamos guardando.
    iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
    sData = sBuffer
    'mientras haya más datos los seguimos guardando
    Do While lReturn <> 0
        iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
        sData = sData + Mid(sBuffer, 1, lReturn)
        DoEvents
    Loop
End If

'cerramos la conexión
iResult = InternetCloseHandle(hInternet)
LeeURL = sData
End Function


' Ahora solo la llamamos y podemos guardar en una variable de texto, de ahí la podemos mandar a nuestro objeto de IExplorer o hacer lo que queramos con ello

....
Url = "www.google.com"
CodigoPaginaHTML = LeeURL(Url)
....



viernes, 2 de agosto de 2013

ROWNUM en ACCESS (solución)

Al parecer muchos han buscado este tema y si bien ya había puesto una posible solución creo no fue la mejor solución para todos.

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.


Ahora, en Access creamos 2 funciones públicas:


Declaran esta variable de tipo pública (ID)



Aquí el código para que lo copien y peguen:

Public Function RN(valor As Variant) As Double
    If valor = 1 Then
        ID = 0
        RN = ID
    End If
End Function

Public Function Rownum(valor As Variant) As Double
   ID = ID + 1
   Rownum = ID
End Function

Y solo queda usarlo.... desde código VB el ejemplo:



Bueno, dentro de la función test() hago un primer Select y tal cual me traigo todo de la tabla y lo pinto en la ventana del debug, excepto la primera columna, que el dato no nos sirve para nada pero es necesario para que la función Rownum funcione correctamente.

En el segundo Select hago un filtro por datos y el Rownum que me genera por cada renglón es correcto.

Bueno, este ejemplo es generándolo por código, pero también por consulta en Access


Y el resultado


Pues bueno, espero sea esto lo que realmente necesitan.

Comentarios, mejoras o sugerencias ... 





lunes, 17 de junio de 2013

Crear un PDF con PeopleCode desde un HTML

Aquí les dejo un ejemplo de cómo crear un PDF en línea, con PeopleCode a partir de una plantilla 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%'>&nbsp;</td> ";
&str = &str | " <td width='20%'>&nbsp;</td> ";
&str = &str | " <td width='50%'>&nbsp;</td> ";
&str = &str | " <td width='20%'>&nbsp;</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

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.

lunes, 21 de enero de 2013

PeopleCode: Realizar filtros dentro de una página

Usualmente para realizar filtros en las páginas utilizamos los Search Records del componente, pero que pasa cuando necesitamos realizar un filtro cuando ya tenemos la página abierta.

Supongamos que dentro de la página tenemos algo como esto:


Y necesitamos que el grid de abajo (en nivel 1) se llene con los datos relacionados al filtro que realicemos.

Primero:
El campo del record (MI_REC_BUSQUEDA) por el que se realiza el filtro deberá tener un prompt:



En el evento FieldChange del campo EMPLID metemos este código:

      Local Rowset &grid;
      &grid = GetLevel0()(1).GetRowset(Scroll.TABLA_DEL_GRID);
      &Where = "WHERE EMPLID = '" | MI_REC_BUSQUEDA.EMPLID | "'";
      &total_lineas = &grid.Selectnew(Record.TABLA_DEL_GRID, &Where);

Con esto creamos el filtro y llenamos el grid de abajo, adicional tenemos el número total de registros devueltos.

Y listo…





Translate