viernes, 6 de febrero de 2015

PeopleCode - Manipuar valores de XLAT

Los valores de XLAT que se asocian al campo son definidos como parte de las propiedades del mismo campo, pero que pasa si esos valores son variables? o provienen incluso en ocasiones de tablas diferentes a donde están los valores de XLAT (PSXLATITEM)? Quizá de entrada se pensaría en cambiar el XLAT por un prompt, pero no queremos que el comportamiento sea como de un prompt, sino como un LISTBOX ?

Aquí un código que te ayudará a resolver eso:

/****************************************/

Local Rowset &XLAT, &RS;

&FLD = GetRecord(Record.MI_RECORD_EN_LA_PAGINA).GetField(Field.MI_CAMPO_CON_XLAT);

&FLD.ClearDropDownList();

/* EN LA SIGUIENTE LINEA PODRÍA USARSE CUALQUIER OTRO RECORD, EN ESTE EJEMPLO ESTOY UTILIZANDO LA MISMA TABLA DE XLAT CON CONDICIONES ESPECIFICAS */

&XLAT = CreateRowset(Record.PSXLATITEM);
&XLAT.Fill("WHERE FILL.FIELDNAME = 'MANAGER_LEVEL' AND FILL.EFF_STATUS = 'A' AND FILL.FIELDVALUE <= 5 AND FILL.EFFDT =(SELECT MAX(ED.EFFDT) FROM SYSADM.PSXLATITEM ED WHERE ED.FIELDNAME = FILL.FIELDNAME AND ED.EFF_STATUS = FILL.EFF_STATUS AND ED.EFFDT <= SYSDATE )");

For &i = 1 To &XLAT.ActiveRowCount
 /* es importante destacar que se deben asociar 2 valores: 1 -> el que servirá como clave y 2-> el que lleva la descripción */
   &id = &XLAT(&i).PSXLATITEM.FIELDVALUE.Value;
   &descr = &XLAT(&i).PSXLATITEM.XLATSHORTNAME.Value;
   &FLD.ADDDROPDOWNITEM(&id, &descr);

End-For;

/*****************************************/

Máquinas Virtuales - Unir Archivos OVA

Si descargaste alguna máquina virtual y ésta viene dividida en archivos .OVA necesitas antes de abrirla o importarla unir esos archivos, para esto desde una terminal (en linux o CMD en windows) es necesario unirlos antes de cualquier operación.

En Windows (por ejemplo):

copy /b Oracle_producto.ova?   Oracle_producto.ova

En Lunux / OS X (por ejemplo):

cat Oracle_producto.ova? > Oracle_producto.ova

Usualmente los archivos son grandes, así que paciencia que se tomará su tiempo.

PeopleCode - Envío de Correos con imágenes visibles

Para enviar correos con imágenes dentro del cuerpo del mensaje para que sean visibles dentro del mensaje, les tengo estas dos soluciones:

1. Utilizando encode64

He visto que esta funciona con correos como hotmail, gmail, etc... Las imágenes deben de haber sido cargadas previamente en alguna URL definida (podría ser algún FTP, dentro de tu red), o en su defecto especificar la ruta donde se encuentran.

/********************************************/

Local string &MAIL_CC, &MAIL_TO, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TITLES;
Local string &MAIL_TEXT, &MAIL_FILES, &MAIL_FROM, &REPLYTO, &SENDER, &MAIL_SEP;
Local string &CONTTYPE, &strSQL, &email, &App_name, &Vac_title;
Local number &MAIL_FLAGS, &RET;

&strHTML = "<b> Estimado socio: </b>";
&strHTML=  &strHTML | " Le mando estas imágenes: "  | Char(13) | " <mi_imagen> ";

 &MAIL_FLAGS = 0;
&MAIL_TO = "destinatario1@hotmail.com; destinatario2@gmail.com";
&MAIL_SUBJECT = "Asunto"; 
&MAIL_TEXT = "<html><body>" | &strHTML | "</body></html>"; 

Local File &F1;
Local string &base64string;

&ImgName = "FirmaCia.jpg";

/* aquí se trae la imagen desde tu URL a un directorio temporal donde esta tu Application Server*/
&ok = GetAttachment(URL.MI_FTP, &ImgName, GetEnv("TMP") | "/" | &ImgName);

/* abrimos el archivo y convertimos */
&F1 = GetFile(GetEnv("TMP") | "/" | &ImgName, "R", %FilePath_Absolute);
If &F1.IsOpen Then
      &base64string = &F1.GetBase64StringFromBinary();
      &F1.Close();
      &MAIL_TEXT = Substitute(&MAIL_TEXT, "<mi_imagen>", "<img alt=" | Char(34) | "Embedded Image" | Char(34) | " src=" | Char(34) | "data:image/png;base64," | &base64string | Char(34) | "/>");
End-If;

&MAIL_FROM = "mi_correo@mi_dominio.com";
&MAIL_SEP = ";";
&SENDER = "mi_correo@mi_dominio.com";
&CONTTYPE = "Content-type: text/html; charset=utf8";

/* enviamos correo */
&RET = SendMail(&MAIL_FLAGS, &MAIL_TO, &MAIL_CC, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TEXT, &MAIL_FILES, &MAIL_TITLES, &MAIL_FROM, &MAIL_SEP, &CONTTYPE, &REPLYTO, &SENDER);
If &RET <> 0 Then
   MessageBox(0, "", 0, 0, "Código de retorno de error de SendMail=" | &RET);

End-If;

/********************************************/

2. Añadiendo la imagen como documento adjunto y utilizando dentro del HTML de tu mensaje, en el tag de imágen, en el SOURCE el CID con el nombre de tu imagen. Este me ha servido cuando el cliente de correo es como el OUTLOOK.


/********************************************/

Local string &MAIL_CC, &MAIL_TO, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TITLES;
Local string &MAIL_TEXT, &MAIL_FILES, &MAIL_FROM, &REPLYTO, &SENDER, &MAIL_SEP;
Local string &CONTTYPE, &strSQL, &email, &App_name, &Vac_title;
Local number &MAIL_FLAGS, &RET;

&strHTML = "<b> Estimado socio: </b>";
&strHTML=  &strHTML | " Le mando estas imágenes: "  | Char(13) | " <mi_imagen> ";

&MAIL_FLAGS = 0;
&MAIL_TO = "destinatario1@empresa1.com; destinatario2@empresa2.com";
&MAIL_SUBJECT = "Asunto"; 
&MAIL_TEXT = "<html><body>" | &strHTML | "</body></html>"; 

&MAIL_FILES = "";
&MAIL_TITLES = "";
&ImgName = "FirmaCia.jpg";

&FileUrl = GetEnv("TMP") | "/" | &ImgName;

/* traigo la imagen desde el FTP al server donde esta el Application Server*/
&ok = GetAttachment(URL.MI_FTP, &ImgName, &FileUrl);
  
&MAIL_FILES = &MAIL_FILES | &FileUrl | ";";
&MAIL_TITLES = &MAIL_TITLES | &ImgName | ";";
&MAIL_TEXT = Substitute(&MAIL_TEXT, "<mi_imagen>", "<img SRC=cid:" | &ImgName | " >");

&MAIL_FROM = "mi_correo@mi_dominio.com";
&MAIL_SEP = ";";
&SENDER = "mi_correo@mi_dominio.com";
&CONTTYPE = "Content-type: text/html; charset=utf8";

&RET = SendMail(&MAIL_FLAGS, &MAIL_TO, &MAIL_CC, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TEXT, &MAIL_FILES, &MAIL_TITLES, &MAIL_FROM, &MAIL_SEP, &CONTTYPE, &REPLYTO, &SENDER);
If &RET <> 0 Then
    MessageBox(0, "", 0, 0, "Código de retorno de error de SendMail=" | &RET);
End-If;

/********************************************/

Espero les sea de utilidad.



Translate