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
jueves, 24 de junio de 2010
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
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
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.
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.
Suscribirse a:
Entradas (Atom)