none
Sharepoint SPFIELDNumber RRS feed

  • Domanda

  • Ciao a tutti,

    ho un problema con un custom field di tipo SPFIELDNUMBER nella Lista "ORDINI". Il valore di questo campo viene aggiornato dopo il MyBase.ItemUpdated(properties) dell' Eventreceiver "ItemUpdated" della lista "INTERVENTI". Ho provato ad assegnare al SPFIELDNUMBER i valori 6.5(Double), "6,5" (string), "6.5" (string) ma il risultato è che il campo ritorna sempre 65(Double). Questo succede solo se ho la "," come separatore di decimali nelle impostazioni di sistema. Con un campo number standard di sharepoint questo non succede. Devo forse impostare quache proprietà del campo per farlo funzionare ??????? di seguito il codice del campo campo e del XML.

     

     

     

    <FieldTypes>

    <

     

     

    FieldType>

    <

     

     

    Field Name="TypeName">GiornateErogate</Field>

    <

     

     

    Field Name="ParentType">Number</Field>

    <

     

     

    Field Name="TypeDisplayName">Giornate Erogate</Field>

    <

     

     

    Field Name="TypeShortDescription">Riepilogo Giornate Erogate</Field>

    <

     

     

    Field Name="UserCreatable">TRUE</Field>

    <

     

     

    Field Name="InternalType">Number</Field>

    <

     

     

    Field Name="SQLType">float</Field>

    <

     

     

    Field Name="ShowOnListCreate">TRUE</Field>

    <

     

     

    Field Name="ShowOnSurveyCreate">TRUE</Field>

    <

     

     

    Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>

    <

     

     

    Field Name="ShowOnColumnTemplateCreate">TRUE</Field>

    <

     

     

    Field Name="FieldTypeClass">SharePoint.GiornateErogateField, SharePoint.GiornateErogate_Field_Type, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7f0bb302dae66795</Field>

    <

     

     

    PropertySchema>

    </

     

     

    PropertySchema>

    </

     

     

    FieldType>

    </

     

     

    FieldTypes>

    martedì 23 novembre 2010 15:50

Risposte

Tutte le risposte

  • Ciao !
    Lato C# (o VB.NET) setti in qualche modo il valore del tuo double ? Magari nella proprietà Value ? Magari fai qualche calcolo prima di settarlo ?
    Perchè è probabile che tu debba formattare il valore utilizzando la lingua corrente (o una lingua specifica che vuoi tu) attraverso la classe CultureInfo.
    Ci posti anche il codice .NET del tuo campo ?


    Giuseppe Marchi - SharePoint MVP
    www.peppedotnet.it
    www.dev4side.com
    www.sharepointcommunity.it
    Twitter: @PeppeDotNet
    mercoledì 24 novembre 2010 08:48
  •  

     

    Codice Campo:

    Public Class Campo
    Inherits SPFieldNumber
    Public Sub New(ByVal fields As SPFieldCollection, ByVal fieldname As String)
    MyBase.New(fields, fieldname)
    Me.DisplayFormat = SPNumberFormatTypes.OneDecimal
    Me.MinimumValue = 0
    Me.MaximumValue = 9999999
    End Sub
    Public Sub New(ByVal fields As SPFieldCollection, ByVal typeName As String, ByVal displayName As String)
    MyBase.New(fields, typeName, displayName)
    Me.DisplayFormat = SPNumberFormatTypes.OneDecimal
    Me.MinimumValue = 0
    Me.MaximumValue = 9999999
    End Sub
    Public Overrides ReadOnly Property FieldRenderingControl() As BaseFieldControl
    Get
    Dim fieldControl As BaseFieldControl = New UCCampo()
    fieldControl.FieldName = Me.InternalName
    Return fieldControl
    End Get
    End Property
    End Class

    Codice Controllo:

    Public Class UCCampo
    Inherits BaseFieldControl
    Protected lblCampo As Label
    Protected Overrides ReadOnly Property DefaultTemplateName() As String
    Get
    Return "CampoForDisplay"
    End Get
    End Property
    Public Overrides Property DisplayTemplateName As String
    Get
    Return "CampoForDisplay" (CampoForDispaly è il rendertemplate del file ascx che contiene una sola label)
    End Get
    Set(ByVal value As String)
    MyBase.DisplayTemplateName = value
    End Set
    End Property
    Public Overrides Property Value() As Object
    Get
    Return MyBase.ItemFieldValue
    End Get
    Set(ByVal value As Object)
    MyBase.Value = MyBase.ItemFieldValue
    End Set
    End Property
    Public Overrides Sub UpdateFieldValueInItem()
    MyBase.UpdateFieldValueInItem()
    End Sub
    Protected Overrides Sub CreateChildControls()
    If Me.Field IsNot Nothing Then
    MyBase.CreateChildControls()
    lblCampo = CType(TemplateContainer.FindControl("lblCampo"), Label)
    If lblCampo Is Nothing Then
    Throw New ApplicationException("Error: Cannot load .ascx file")
    End If
    If Not (SPContext.Current.Site Is Nothing) Then
    If Me.ControlMode = SPControlMode.New Then
    lblCampo.Text = ""
    Else
    If Not Me.ItemFieldValue Is Nothing Then
    lblCampo.Text = CType(Me.ItemFieldValue, String)
    Else
    lblCampo.Text = "0"
    End If
    End If
    End If
    End If
    End Sub
    End Class

    Codice dell'EventReceiver ItemUpdated dove aggiorno il valore del campo:

    Public Overrides Sub ItemUpdated(ByVal properties As SPItemEventProperties)
      CurrentItem = properties.ListItem
      MyBase.ItemUpdated(properties)
      SPSecurity.RunWithElevatedPrivileges(AddressOf RefreshGiornateErogate)
    End Sub

    Private Sub RefreshGiornateErogate()
            Dim lookupValue As String
            Dim LookupItem As SPListItem
            Dim SumGiornateErogate As Double
            Dim updateListId As Guid
            Dim MyWeb As SPWeb
            Dim lookupFld As SPFieldLookup

            MyWeb = CurrentItem.ParentList.ParentWeb
            lookupFld = FindLookupField()
            If Not lookupFld Is Nothing Then
                LookupItem = FindLookupItem(lookupFld)
                If Not LookupItem Is Nothing Then
                    lookupValue = CurrentItem(lookupFld.InternalName).ToString()
                    updateListId = LookupItem.ParentList.ID
                    SumGiornateErogate = GetGiornateErogate(MyWeb, CurrentItem.ParentList.ID, lookupFld, lookupValue)
                    UpdateGiornateErogateOrdini(MyWeb, SumGiornateErogate, Convert.ToInt16(lookupValue.Split(CChar(";"))(0)), updateListId)
                End If
            End If
    End Sub

    Private Sub UpdateGiornateErogateOrdini(ByVal MyWeb As SPWeb, ByVal SumGiornateErogate As Double, ByVal updateItemId As Integer, ByVal UpdateListId As Guid)
            Dim query As SPQuery
            Dim UpdateList As SPList
            Dim updateItems As SPListItemCollection
            Dim updateItem As SPListItem

            Try
                MyWeb.AllowUnsafeUpdates = True
                UpdateList = MyWeb.Lists(UpdateListId)
                query = New SPQuery()
                query.Query = "<Where><Eq><FieldRef Name='ID'/>" + "<Value Type='Integer'>" + updateItemId.ToString + "</Value></Eq></Where>"
                updateItems = UpdateList.GetItems(query)
                updateItem = updateItems(0)
                For Each fld As SPField In updateItem.Fields
                    If fld.TypeAsString = CONST_GiornateErogate Then
                        updateItem(fld.StaticName) = SumGiornateErogate
                        Exit For
                    End If
                Next
                updateItem.Update()
            Catch ex As Exception
                MyWeb.AllowUnsafeUpdates = False
                Throw New ApplicationException("Error:" & ex.Message)
            End Try

            MyWeb.AllowUnsafeUpdates = False
    End Sub

    mercoledì 24 novembre 2010 10:19
  • ho provato anche così:

    SumGiornateErogate.ToString(

     

    CultureInfo.CurrentUICulture.NumberFormat)

    ma ilrisultatto non cambia, sembra quasi che non accetta il separatore di decimale infatti se forzo a "7.5000" oopure "7,5000"

    il valore del campo diventa 7500.0.

    mercoledì 24 novembre 2010 15:29
  • Ok, facciamo un pò di ispezione..
    Se vai in deug, se sicuro al 100% che quando fai l'operazione:

    updateItem(fld.StaticName) = SumGiornateErogate

    il valore di SumGiornateErogate è quello che ti aspetti ?


    Giuseppe Marchi - SharePoint MVP
    www.peppedotnet.it
    www.dev4side.com
    www.sharepointcommunity.it
    Twitter: @PeppeDotNet
    giovedì 25 novembre 2010 09:39
  • ____ se sono sicuro !!!

    Si può dire ____ in questo forum ????

    :-)

     

    Grazie

    Ciao

    giovedì 25 novembre 2010 15:32
  • evidentemente no ? :)

    cmq, sempre in debug, in questa riga qua:

    lblCampo.Text = CType(Me.ItemFieldValue, String)

    com'è il valore della proprietà ItemFieldValue ? E' già sbagliato ? Se no, allora prova con:

    lblCampo.Text = Me.ItemFieldValue.ToString(New CultureInfo("it-IT"))

    se vuoi la formattazione in italiano, altrimenti "en-US" per quella in inglese.


    Giuseppe Marchi - SharePoint MVP
    www.peppedotnet.it
    www.dev4side.com
    www.sharepointcommunity.it
    Twitter: @PeppeDotNet
    giovedì 25 novembre 2010 17:05
  • Ciao !
    Ci aggiorni su questo post per piacere ?

    Grazie
    Peppe


    Giuseppe Marchi - SharePoint MVP
    www.peppedotnet.it
    www.dev4side.com
    www.sharepointcommunity.it
    Twitter: @PeppeDotNet
    venerdì 3 dicembre 2010 19:01