martes, 14 de junio de 2016

¿Cómo listar todas las variables de Session en ASP.NET?

Cuando queremos listar todos las variables y sus valores en una Sesión en ASP.NET, podemos hacer uso del siguiente ejercicio:

En VB.NET

For i As Integer = 0 To Session.Count - 1
   Response.Write(Session.Keys(i).ToString() & ": " & Session(i).ToString() & "<br>")
Next

En C#.NET

for (int i = 0; i <= Session.Count - 1; i++) {
    Response.Write(Session.Keys[i].ToString() + ": " + Session[i].ToString() + "<br>");
}

domingo, 10 de abril de 2016

[Corregido] Error al crear Ordenes de compra, Facturas, Presupuestos y Ordenes de venta luego de migración en VTiger

Luego de una migración en vTiger, uno espera no tener ningun problema. Aún así, nos piden que hagamos backup para estar preparados para nuestros inmerecidos y muy probables problemas de migración.

Listo. Backup de código y base de datos creados. Y comenzamos la migración de vTiger.

Una vez terminados, nos hemos topado con algunos mensajes de advertencia de pequeñas ejecuciones en la base de datos que no se pudieron completar satisfactoriamente, y aunque reintentamos la migración siguen saliendo. Optamos por no prestarle atención y correr a ejecutar nuestra nueva versión de vTiger.

Aunque ya activamos el "log" y "trace" para validar el error, nos encontramos con que es imposible crear una nueva Orden de Compra, Factura, Presupuesto u Orden de compra, y siempre nos aparece el mensaje de:

{"success":false,"error":{"code":"result is not an object","message":"result is not an object"}}

...o en español:

{"success":false,"error":{"code":"El registro al que pretende acceder no existe","message":"El registro al que pretende acceder no existe"}}

No hay nada que temer... pueden consultar durante 2 días, tal como yo lo hice en todos los foros, y seguir cada paso y no encontrar ninguna solución en el universo indexado de Internet... o simplemente vayan directamente en la base de datos y hagan los siguientes dos cambios:

1) En la estructura de la tabla "vtiger_users"

En la estructura de la tabla, asegurarse que existe el campo "is_owner", y debe ser "varchar(5).

2) En los registros la tabla "vtiger_field"

Revisar los registros de los 4 módulos que nos están generando problemas, con las siguientes consultas:

Para Facturas:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_invoice' ORDER BY columnname

Para Ordenes de venta
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_salesorder' ORDER BY columnname

Para Presupuestos:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_quotes' ORDER BY columnname

Para Ordens de compra:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_purchaseorder' ORDER BY columnname

La solución es, simplemente, eliminar el registro duplicado que aparece en cada consulta, y dejar uno de ellos (por ejemplo, he dejado el primero):


Y listo. vTiger vuelve a ser tan eficiente como antes.

Requiere ayuda en su nuevo CRM?  Podemos ayudarle en Solutecia sas.

jueves, 7 de abril de 2016

[Corregido] Call to a member function getPicklistValues() on a non-object in /crm/modules/Users/models/Record.php on line 494

Acabo de encontrarme con este mensaje de error luego de una migración de VTiger de 5.4 a 6.1.

En el foro de VTiger no han dado con una solución satisfactoria, y por algún motivo no tengo privilegios para postear la solución en dicho foro.

Bueno, aquí con la solución.

El problema lo podemos resolver directamente en el archivo ubicado en la ruta:
modules/Users/models/Record.php

Inicialmente, aparece esta código al rededor de la línea 494:

//-----------------------------------------------------------------------------
$hour_format = $fieldModel['hour_format']->getPicklistValues();
$start_hour = $fieldModel['start_hour']->getPicklistValues();

        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');
//-----------------------------------------------------------------------------

Por algún motivo luego de la migración, no toma el listado por defecto de los Picklist para el listado de los horarios, pero si incluye los valores por defecto una línea más abajo.

Parece algo poco lógico, que hayan colocado los valores por defecto luego, yo simplemente le di el orden que me pareció más acertado.  Por lo tanto lo dejé de la siguiente manera:

//-----------------------------------------------------------------------------
        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');

$hour_format = $defaultValues;
$start_hour = $defaultValues;
//-----------------------------------------------------------------------------

Y tema solucionado.

Calcular edad con la fecha de nacimiento en PHP

 En este tutorial, aprenderemos cómo calcular la edad a partir de la fecha de nacimiento en PHP. Daré dos ejemplos de Cómo calcular la edad....