jueves, 24 de junio de 2010

datagridviewcheckboxcell y value que no cambia

Sintomas:
No se refleja los cambios realizado por el usuario cuando en el código vas a comprobar el valor de una columna checkbox en un datagridview.
Solución:
Cambiar el valor a mano con el evento on clic
Private Sub dgvListaActivos_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvListaActivos.CellMouseClick

If e.Button = MouseButtons.Left And e.ColumnIndex = 1 Then
    dgvListaActivos.Rows(e.RowIndex).Cells(1).Value = Not CType(dgvListaActivos.Rows (e.RowIndex).Cells(1).Value, Boolean)
   End If
End Sub

miércoles, 16 de junio de 2010

Servicios Web en Cumulus 8.1 de Canto (dos tips)

Sintomas
La documentación de Canto en los servicios web de su DAM Cumulus es bastante pobre y hay que adivinar bastantes cosas.
Tips
En muchos casos no basta con dar un valor,  hay que decir que lo has hecho.
Por ejemplo al crear los wsItem para el metodo updateItems no basta con especificar el id de registro también hay que decirlo en .idSpecied:
New wsItem With {.id = foto.idDamFoto, .fieldValues = wsCambios.ToArray, .idSpecified = True}
Las cosas son aún mas complicadas cuando hablamos de los valores de campos, y especialmente en los de fecha que usa el valor long de Java (basado en el origen Unix de las fechas):

Public Function valorCpo(ByVal nombre As String, ByVal valor As String) As wsFieldValue
'Strings
Return New wsFieldValue With {.guid = guidsAsset(nombre), .stringValue = valor, .dataType = 0, .valueInterpretation = 0}
End Function
Public Function valorCpo(ByVal nombre As String, ByVal valor As Boolean) As wsFieldValue
'Booleanos
Return New wsFieldValue With {.guid = guidsAsset(nombre), .booleanValue = IIf(valor, 1, 0), .dataType = 1, .valueInterpretation = 0, .booleanValueSpecified = True}
End Function


Public Function valorCpo(ByVal nombre As String, ByVal valor As Date) As wsFieldValue
'fechas
Dim origen = New DateTime(1970, 1, 1, 2, 0, 0)
Dim fecha = New DateTime(valor.Year, valor.Month, valor.Day, valor.Hour, valor.Minute, valor.Second)
Dim calculoBinary As Long = (fecha.ToBinary - origen.ToBinary) * (10 ^ -4)
Return New wsFieldValue With {.guid = guidsAsset(nombre), .longValue = calculoBinary, .dataType = 4, .valueInterpretation = 0, .longValueSpecified = True}
End Function

Public Function valorCpo(ByVal nombre As String, ByVal valor As wsAssignedCategory()) As wsFieldValue
'Categoria
Return New wsFieldValue With {.guid = guidsAsset(nombre), .categories = valor, .dataType = -1, .dataTypeSpecified = True}
End Function


Public Function valorCpo(ByVal nombre As String, ByVal valor As Integer) As wsFieldValue
'valor de una lista de strings
Dim campoLista() As wsStringListValue = {New wsStringListValue With {.id = valor, .idSpecified = True}}
Return New wsFieldValue With {.guid = guidsAsset(nombre), .stringListValue = campoLista}
End Function


Y para terminar cuando hagamos el update y queramos saber si ha habido un error o no debemos consultar el status de la respuesta: 0 es correcto y 1 es error. Por ejemplo:

Public Sub TrasladaCambios(ByVal cambios() As wsItem)
Dim retorno() As wsResultStatus = serDam.updateItems(ConexDam, TablaActivos, cambios, "es")
For Each res As wsResultStatus In retorno
      If res.status <> 0 Then Err.Raise(vbObjectError + 1000, "Error actualizando DAM")
Next
End Sub

lunes, 14 de junio de 2010

IIS7.5, aplicaciones,net y System.Security.SecurityException

Sintomas:
Al migrar aplicaciones .NET que funcionaban bajo IIS6 obtienes errores del tipo:
"System.Security.SecurityException: Error de solicitud de permiso de tipo 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Solución:
Cambia el pool de la aplicación el usuario de ApplicationpPoolIdentity a NetworkService.
Comentario:
Probablemente no es una solución optima en seguridad y algún día estudiaré algo mejor

miércoles, 9 de junio de 2010

Exchange 2010 backup no borra transaction logs

Sintomas
La copia de seguridad de exchange 2010 no borra los transactions logs, y el volumén que los contiene se llena.
Contexto
La hacemos según instrucciones en technet con imagenes VSS de los volumenes donde residen la base de datos y los registro de transacciones. De paso añadimos la copia de system state.
Solución
Quitar la copia del system state de esta tarea de backup y dejar solo los volumenes.
Comentario
Las instrucciones no dicen nada de la copia de system state, pero deberían porque provoca un error que impede el borrado posterior de los transactions logs.