miércoles, 11 de julio de 2012

Manipular campos por su nombre (por programación)

Esto que voy a escribir no sólo aplica a SalesLogix, sino a cualquier programación que estén haciendo en C#, o en cualquier otro lenguaje NET si prestan suficiente atención.

Un usuario me dió la tarea de crear un formulario con 50 preguntas parametrizables, cuya respuesta debería poderse escribir mediante un TextBox, o mediante un PickList (equivalente del dropdown en SalesLogix).

Al final, lo que se quiere lograr, es que en una tabla "Extension" (relación 1 a 1 con la tabla principal) hayan 50 campos con las preguntas y las respuestas así:  Campo "Preg1" - Valor "Es casado/a?: Si".

Poner los campos en el AppArchitect es súmamente sencillo, para hacerlo, coloqué un Label con nombre L, junto le puse un TextBox con nombre T, y junto le puse un Picklist con nombre P.  Para efectos de velocidad, los puse dentro de un "Control Container" (esto es sólo en SalesLogix).  Luego sólo fue necesario darle copiar al control container e ir pegando los 49 restantes (obviamente ya había creado las celdas).

El SalesLogix lo que hará es pegar los controles y cada vez que los pegas, le suma 1 al Id de cada control, es decir, la primera vez que pegué, el Label le puso L2, al TextBox le puso T2 y al PickList le puso P2.

Muy importante! Al terminar de pegar los controles hay que ir a renombrar los primeros objetos a L1, T1 y P1 respectivamente.

Ok, ahora viene la parte interesante.

Quiero hacer constar, que ninguno de los controles está "Binded" sino que voy a mover todo por programación!

Primero ponemos un botón y en el evento le asignamos el Business Rule "Save".

Generamos y hacemos "deploy to..." del proyecto (para que vaya el código), y buscamos el "SmartPart" con nuestra encuesta y ubicamos el método donde se guarda el formulario.

Copiamos todo lo que está el método y volvemos al AppArchitect, cambiamos que el botón en lugar de hacer "Business Rule" ahora sea un "C# Snippet Action Item" y pegamos lo que copiamos del formulario en el portal que hicimos el deploy.

Al código, justo antes de donde está " _entity.Save(); " hay que agregar lo siguiente:

for (int i = 1; i<=50; i++)
{
Label lctn = (Label)this.FindControl("L" + i.ToString());
TextBox tctn = (TextBox)this.FindControl("T" + i.ToString());
Sage.SalesLogix.Web.Controls.PickList.PickListControl pctn = (Sage.SalesLogix.Web.Controls.PickList.PickListControl)this.FindControl("P" + i.ToString());

_entity.ExtensionEntity_ReqInfo["Preg" + i.ToString()]=lctn.Text + ": " + tctn.Text + pctn.PickListValue;
}

Como pueden observar, la referencia a mi tabla actual se llama " _entity ", y tiene una tabla extensión que se llama " ExtensionEntity_ReqInfo " con los 50 campos que se llaman "Preg1, Preg2...Preg50".

Las 3 primeras líneas son para obtener los controles en cuestión.  La línea final es para llenar la tabla en cada campo "Preg1...Preg50" con la concatenación de [Pregunta] + ": " + [Respuesta].

Ahora agreguemos un evento al "Load" del formulario que también será "C# Snippet Action Item" y al crearlo, asegurémonos de poner en True la opción para que el método sea llamado cada vez que se repinta el formulario.

En el código coloquen lo siguiente:

string WfRelId = DialogService.DialogParameters["WfRelId"].ToString();
Sage.Entity.Interfaces.IC_Preguntas pregs = Sage.Platform.EntityFactory.GetById<Sage.Entity.Interfaces.IC_Preguntas>(WfRelId);


for (int i = 1; i<=50; i++)
{
Label lctn = (Label)this.FindControl("L" + i.ToString());
TextBox tctn = (TextBox)this.FindControl("T" + i.ToString());
Sage.SalesLogix.Web.Controls.PickList.PickListControl pctn = (Sage.SalesLogix.Web.Controls.PickList.PickListControl)this.FindControl("P" + i.ToString());
string qeRI = (string)pregs["Question" + i.ToString()];
string prRI = (string)_entity.ExtensionEntity_TicketReqInfo["Preg" + i.ToString()];
lctn.Text = qeRI;
if (lctn.Text != "") { if ((string)pregs["ControlType" + i.ToString()] == "TextBox") { tctn.Visible = true; tctn.Text = prRI.Replace(qeRI + ": ",""); }

else
{ pctn.Visible = true; pctn.PickListName=(string)pregs["PicklistRespName" + i.ToString()]; pctn.PickListValue = prRI.Replace(qeRI + ": ",""); }   }
}


Las 2 primeras líneas son, 1, para obtener un parámetro con el ID de registro que corresponde a las preguntas que queremos hacer, y 2, para obtener el registro con las 50 preguntas, las 50 especificaciones de si es TextBox o PickList, y los 50 posibles nombres de PickList.

Esa tabla llamada C_Preguntas, tiene 4 campos que son el ID, 50 columnas de pregunta "Question1...Question50", 50 columnas de tipo "ControlType1...ControlType50" y 50 columnas para establecer el nombre del picklist "PicklistRespName1...PicklistRespName50".

Las preguntas van callendo en la línea con la variable " qeRI " y las respuestas en la siguiente en la variable " prRI ".  Pero ojo, al guardar, dijimos que la respuesta se guardaba como [Pregunta] + ": " + [Respuesta].  Por eso hay unos Replace en la sentencia siguiente.

En el IF, vemos que dependiendo del "ControlType", si es TextBox, mostramos el campo TextBox correspondiente con su respuesta, y si no, el PickList con el valor seleccionado.

Ya con esto, manipulamos por programación y sin mucho esfuerzo, los 50 campos del formulario.

No hay comentarios:

Publicar un comentario