none
Datagridview no muestra valores en una columna RRS feed

  • Pregunta

  •  

    Hola a todos y feliz Domingo:

    Estoy un poco pesadira pero es que no logro después de 2 horas que llevo con el tema, que me muestre unos valores en un datagridview. relleno manualmente, la columa "3" o de Resultados (Color Gris) no quiere mostrar los valores, aunque efectivamente si lleva valores.

    Será una tontería pero por más que compilo y paso con el berakpoint por la pequeña grilla, los valores de esa columna los lleva a 0, cuando no tendría que ser así.

    La imagen es la siguiente:

    Por otro lado el código de la misma es:

     Private Sub PropiedadesDatagrid2_PeriodosMensuales()
            Dim a As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly
            Dim rm As New ResourceManager(a.GetName.Name & ".Textos", a)
    
            With DataGridView2
                'Parámetros de ubicación
                .Enabled = True 'No es editable
                .AllowUserToAddRows = False 'No se añaden filas
                .AllowUserToDeleteRows = False 'No se borran filas
                .EnableHeadersVisualStyles = False 'Dehabilitamos los colores de fondo de filas y columnas
                '.CurrentCell.Selected = False 'No seleccionamos la primera del datagrid
    
                'No permitimos la ordenación de las columnas
                For Each col As DataGridViewColumn In DataGridView2.Columns
                    col.SortMode = DataGridViewColumnSortMode.Programmatic
                Next
    
                'Altura de la línea de títulos
                .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
                .ColumnHeadersHeight = 26 'píxeles
    
                'Definimos el ancho de las columnas y nombre de las columnas
                .Columns(0).Width = CInt(.Width / 4) : .Columns(0).HeaderText = rm.GetString("EjerciciosMay") 'EJERCICIOS
                .Columns(1).Width = CInt(.Width / 4) : .Columns(1).HeaderText = rm.GetString("ACTIVOmay") 'ACTIVO
                .Columns(2).Width = CInt(.Width / 4) : .Columns(2).HeaderText = rm.GetString("PASIVOmay") 'PASIVO
                .Columns(3).Width = CInt(.Width / 4) : .Columns(3).HeaderText = rm.GetString("DIFERENCIAS") 'DIFERENCIAS.
    
                'Llamamos a las funciones totalizadoras.
                AccesoLogica.CalculoGruposCuadreBalances()
                'AccesoLogica.CalculoPasivoCuadreBalances()
    
                For i As Integer = 0 To valor
                    TotalSaldoAP(i) = AccesoDatosFormulas.TotalActivoCuadre(i) - AccesoDatosFormulas.TotalPasivoCuadre(i)
                Next i
    
    
                'Creamos las rows y les asignamos valores
                Dim row1() As String = {VarGlobal.strPerMensualesMes(0) & "-" & VarGlobal.strPerMensualesAño(0), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(0)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(0)), 2), FormatNumber(CStr(TotalSaldoAP(0)), 2)}
                Dim row2() As String = {VarGlobal.strPerMensualesMes(1) & "-" & VarGlobal.strPerMensualesAño(1), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(1)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(1)), 2), FormatNumber(CStr(TotalSaldoAP(1)), 2)}
                Dim row3() As String = {VarGlobal.strPerMensualesMes(2) & "-" & VarGlobal.strPerMensualesAño(2), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(2)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(2)), 2), FormatNumber(CStr(TotalSaldoAP(2)), 2)}
                Dim row4() As String = {VarGlobal.strPerMensualesMes(3) & "-" & VarGlobal.strPerMensualesAño(3), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(3)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(3)), 2), FormatNumber(CStr(TotalSaldoAP(3)), 2)}
                Dim row5() As String = {VarGlobal.strPerMensualesMes(4) & "-" & VarGlobal.strPerMensualesAño(4), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(4)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(4)), 2), FormatNumber(CStr(TotalSaldoAP(4)), 2)}
                Dim row6() As String = {VarGlobal.strPerMensualesMes(5) & "-" & VarGlobal.strPerMensualesAño(5), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(5)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(5)), 2), FormatNumber(CStr(TotalSaldoAP(5)), 2)}
                Dim row7() As String = {VarGlobal.strPerMensualesMes(6) & "-" & VarGlobal.strPerMensualesAño(6), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(6)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(6)), 2), FormatNumber(CStr(TotalSaldoAP(6)), 2)}
                Dim row8() As String = {VarGlobal.strPerMensualesMes(7) & "-" & VarGlobal.strPerMensualesAño(7), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(7)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(7)), 2), FormatNumber(CStr(TotalSaldoAP(7)), 2)}
                Dim row9() As String = {VarGlobal.strPerMensualesMes(8) & "-" & VarGlobal.strPerMensualesAño(8), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(8)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(8)), 2), FormatNumber(CStr(TotalSaldoAP(8)), 2)}
                Dim row10() As String = {VarGlobal.strPerMensualesMes(9) & "-" & VarGlobal.strPerMensualesAño(9), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(9)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(9)), 2), FormatNumber(CStr(TotalSaldoAP(9)), 2)}
                Dim row11() As String = {VarGlobal.strPerMensualesMes(10) & "-" & VarGlobal.strPerMensualesAño(10), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(10)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(10)), 2), FormatNumber(CStr(TotalSaldoAP(10)), 2)}
                Dim row12() As String = {VarGlobal.strPerMensualesMes(11) & "-" & VarGlobal.strPerMensualesAño(11), FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(11)), 2), FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(11)), 2), FormatNumber(CStr(TotalSaldoAP(11)), 2)}
                'Creamos la matriz de rows
                Dim rows() As Object = {row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12}
    
                Dim rowArray As String()
                For Each rowArray In rows
                    DataGridView2.Rows.Add(rowArray)
                Next rowArray
    
                .Columns(0).HeaderText = rm.GetString("Períodos") 'Períodos
                '.Columns(1).HeaderText = rm.GetString("Indicador") 'Indicador
    
                'Cambiamos el color de fondo del datagrid
                .ColumnHeadersDefaultCellStyle.BackColor = Color.DarkKhaki 'Color de la cabecera del grid
                .RowHeadersDefaultCellStyle.BackColor = Color.Blue 'Color de las celdas del grid
    
                'Cambiamos el color de las fuentes y de las celdas seleccionadas
                With .DefaultCellStyle
                    .Font = New Font("Tahoma", 9)
                    .ForeColor = Color.Black
                    .BackColor = Color.Beige
                    .SelectionForeColor = Color.Yellow
                    .SelectionBackColor = Color.Black
                End With
    
                'Definimos los bordes de las celdas del grid
                '.CellBorderStyle = DataGridViewCellBorderStyle.None   'No hay separación de color en las celdas. Grid Color no hace nada.
                .RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
                .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
                .GridColor = Color.Orange 'esto cambia el color de la separación de las celdas.
    
                'Quitamos el borde izquierdo del datagrid utilizado para selección de líneas
                .RowHeadersVisible = False
    
                'Centramos los títulos de las columnas.
                .ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    
                'Ponemos en negrita los títulos de las columnas
                .ColumnHeadersDefaultCellStyle.Font = New Font(DataGridView.DefaultFont, FontStyle.Bold)
    
                'Definimos la alineación y el formato de las columnas que nos interesan
                For i As Integer = 1 To 3
                    .Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                Next
    
                For i As Integer = 1 To 3
                    .Columns(i).DefaultCellStyle.Format = "N2" 'Numero con 2 decimales
                Next
    
                'Ponemos en negrita las filas que nos interesan
                '.Rows(5).DefaultCellStyle.Font = New Font(DataGridView.DefaultFont, FontStyle.Bold)
    
                'Pintamos las filas que nos interesan
                .Rows(0).DefaultCellStyle.BackColor = Color.SlateGray
    
                'Cambiamos el color de la fuente de las filas que nos interesen
                .Rows(0).DefaultCellStyle.ForeColor = Color.White
    
                'Cambiamos el color de fondo del datagrid
                .ColumnHeadersDefaultCellStyle.BackColor = Color.DarkKhaki 'Color de la cabecera del grid
                .RowHeadersDefaultCellStyle.BackColor = Color.Blue 'Color de las celdas del grid
    
                'Pintamos la columna primera del datagridview
                .Columns(0).DefaultCellStyle.BackColor = SystemColors.InactiveCaptionText 'Color.SlateGray
                .Columns(0).DefaultCellStyle.ForeColor = Color.White
            End With
    
            Call OpcionesEmpresasVersionDemo()
        End Sub
    La variable Dim Rows as Object, lleva perfectamente los valores: Como ejemplo os pongo la row1.

    No entiendo donde está el error o no lo se ver.

    Un saludo a todos.

    Gemma

    domingo, 3 de abril de 2016 11:22

Respuestas

  • Hola Gemma:

     Veo que solo creas 4 columnas de donde sale la quinta? 

    Definimos el ancho de las columnas y nombre de las columnas
                .Columns(0).Width = CInt(.Width / 4) : .Columns(0).HeaderText = rm.GetString("EjerciciosMay") 'EJERCICIOS
                .Columns(1).Width = CInt(.Width / 4) : .Columns(1).HeaderText = rm.GetString("ACTIVOmay") 'ACTIVO
                .Columns(2).Width = CInt(.Width / 4) : .Columns(2).HeaderText = rm.GetString("PASIVOmay") 'PASIVO
                .Columns(3).Width = CInt(.Width / 4) : .Columns(3).HeaderText = rm.GetString("DIFERENCIAS") 'DIFERENCIAS.
    


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta gemma_campillo domingo, 3 de abril de 2016 15:01
    domingo, 3 de abril de 2016 14:55
  • "gemma_campillo" escribió:

    > ... después de estar 3 horas con la maldita grilla, resulta que en otro
    > procedimiento que totaliza los resultados, en vez de tener 5 columnas,
    > simplemente tenía 4. Una tontería, que me ha hecho perder mucho tiempo.

    ¡Una "tontería" dice! Perder 3 horas no es ninguna tontería ya que puede representar casi el 37 por 100 de una jornada de trabajo diaria de 8 horas. ¡Se nota que no tienes "jefe"! ;-)

    Estaba queriendo saber el motivo que te aparecieran los arrays con 5 elementos, porque ejecutando tu código, a mí me aparecían 4 elementos:

    >  Dim row1() As String = {
    >      VarGlobal.strPerMensualesMes(0) & "-" & VarGlobal.strPerMensualesAño(0),    -->  1 elemento
    >      FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(0)), 2),            -->   2 elemento
    >      FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(0)), 2),            -->   3 elemento
    >      FormatNumber(CStr(TotalSaldoAP(0)), 2)}                                                   -->   4 elemento

    El día que te olvides del módulo llamado VarGlobal, y de las variables compartidas que supuestamente se encuentran declaradas en el mismo, verás como no pierdes el tiempo en "tonterías". ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 3 de abril de 2016 15:36
    Moderador
  • "gemma_campillo" escribió:

    > Después, VarGlobal es una clase que tiene ese nombre porque mira en su momento
    > utilicé las variables globales, pero en esa clase solamente hay propiedades,
    > no utilizo ninguna variable global, todos son propiedades, ...

    He ampliado un trozo de la imagen para que se vea mejor:

    Son PROPIEDADES COMPARTIDAS (Shared), que es lo mismo que si en lugar de declarar una Class utilizas un Module y declaras las propiedades de la siguiente manera:

        Public Module VarGlobal
    
            Public Property StrCodEmpresa As String
            Public Property StrPlanConta As String
    
        End Module

    Cuando compiles tu proyecto, el compilador modificará el Module por la siguiente clase:

        <StandardModule> _
        Public NotInheritable Class VarGlobal
    
            Shared Sub New()
            End Sub
    
            Public Shared Property StrCodEmpresa As String
                <CompilerGenerated> _
                Get
                    Return VarGlobal._StrCodEmpresa
                End Get
                <CompilerGenerated> _
                Set(ByVal value As Integer())
                    VarGlobal._StrCodEmpresa = value
                End Set
            End Property
    
            Public Shared Property StrPlanConta As String
                <CompilerGenerated> _
                Get
                    Return VarGlobal._StrPlanConta
                End Get
                <CompilerGenerated> _
                Set(ByVal value As Integer())
                    VarGlobal._StrPlanConta = value
                End Set
            End Property
    
            <CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)> _
            Private Shared _StrCodEmpresa As String
    
            <CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)> _
            Private Shared _StrPlanConta As String
    
        End Class

    A la hora de compilar se añaden dos campos privados compartidos (_StrCodEmpresa y _StrPlanConta) porque has declarados dos Property sin sus correspondientes bloques Get y Set), cosa que también hará el compilador cuando compile tu clase llamada VarGlobal, por lo que no pienses que el compilador te ha añadido más código que si hubieras declarado una Class, porque el mismo código te va a añadir también.

    Como podrás ver, ES LO MISMO, se encuentren en una clase o un módulo, y seguirás teniendo problemas y más problemas, porque te encuentras COMPARTIENDO DATOS, y si no estás encima de ellos controlando en cada instante el valor que tienen, puede que en algún momento u otro tengas problemas y no sepas ni por donde vienen.

    Fíjate las estadísticas de llamada que tiene tu clase VarGlobal (53526 referencias), liderando el "ranking" en llamadas, la "famosa" propiedad StrCodEmpresa, que ocupa el puesto "número uno de la lista" con 14.321 referencias. ¡No está mal! :-))

    Está bien compartir datos en proyecto pequeños donde en un "abrir y cerrar de ojos" sepas localizar el problema. Pero en un proyecto de la envergadura que tiene el tuyo, habría que pensárselo muy bien el admitir o no estar compartiendo datos entre distintas clases, módulos o formularios. Al menos, así es como yo lo pienso.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 3 de abril de 2016 16:19
    Moderador
  • "gemma_campillo" escribió:

    > Todas las propiedades llevan su Set y Get:

    Digo que llevarán el Set y Get las propiedades que has indicado (dblValorDesgloseFlujosPlanFiscal y dblValorDesgloLargoPlazo57), porque NO has utilizado para declararlas la sintaxis de las propiedades implementadas automáticamente, como por ejemplo:

        Public Shared Property StrCodEmpresa As String

    Lo anterior es una propiedad implementada automáticamente, y el compilador añade de su cosecha los bloques Set y Get correspondientes, porque la propiedad es de lectura y escritura, y para que devuelva un valor (Get) o se le asigne uno (Set), también añade un campo con el mismo nombre de la propiedad que compienza por guión bajo:

        Private Shared _StrCodEmpresa As String

    Para salir de dudas, vete a la clase VarGlobal, y debajo de la declaración de la propiedad StrCodEmpresa, declara el siguiente campo:

        Dim _StrCodEmpresa As String

    Si te aparece una línea ondulada de color rojo, el compilador te está diciendo que dicho campo entra en conflicto con la propiedad StrCodEmpresa, porque ese campo lo tiene que añadir el compilador por el motivo de haber declarado una propiedad implementada automáticamente.

    > Yo lo que hago es asignar un valor a la propiedad normalmente una sola
    > vez en toda la ejecución del programa y si es verdad, que después voy
    > llamando a la propiedad muchas veces, pero siempre tiene el mismo valor.
    > Bueno, no se si ya es lo correcto o no.

    Si crees, y estás completamente segura de ello, que durante la ejecución del programa el valor de las propiedades compartidas no varían, pues no pasa nada, o no debería de pasar. Pero ¿y si donde menos te lo esperas, por cualquier olvido, se modifica el valor de cualquiera de ellas?

    Yo comprendo que la Programación Orientada a Objetos es complicada, pero te repito que un proyecto tan grande como el tuyo, habría que pensáselo muy bien el declarar variables Shared con un ámbito Public. De todas maneras, repito, que si dices que todo va bien, pues nada. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo domingo, 3 de abril de 2016 17:27
    domingo, 3 de abril de 2016 16:58
    Moderador

Todas las respuestas

  • Hola Gemma:

     Veo que solo creas 4 columnas de donde sale la quinta? 

    Definimos el ancho de las columnas y nombre de las columnas
                .Columns(0).Width = CInt(.Width / 4) : .Columns(0).HeaderText = rm.GetString("EjerciciosMay") 'EJERCICIOS
                .Columns(1).Width = CInt(.Width / 4) : .Columns(1).HeaderText = rm.GetString("ACTIVOmay") 'ACTIVO
                .Columns(2).Width = CInt(.Width / 4) : .Columns(2).HeaderText = rm.GetString("PASIVOmay") 'PASIVO
                .Columns(3).Width = CInt(.Width / 4) : .Columns(3).HeaderText = rm.GetString("DIFERENCIAS") 'DIFERENCIAS.
    


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta gemma_campillo domingo, 3 de abril de 2016 15:01
    domingo, 3 de abril de 2016 14:55
  • Hola querido José Luis:

    Acabo de solucionarlo, después de estar 3 horas con la maldita grilla, resulta que en otro procedimiento que totaliza los resultados, en vez de tener 5 columnas, simplemente tenía 4. Una tontería, que me ha hecho perder mucho tiempo.

    A veces te obcecas en una cosa y no ves más allá.

    La quinta columna que me preguntas pertenece al grid que me está dando los problemas. Ya está.

    Te agradezco como siempre que hayas intentado ayudarme en mi problema.

    Recibe un fuerte abrazo.

    Gemma

    domingo, 3 de abril de 2016 15:01
  • "gemma_campillo" escribió:

    > ... después de estar 3 horas con la maldita grilla, resulta que en otro
    > procedimiento que totaliza los resultados, en vez de tener 5 columnas,
    > simplemente tenía 4. Una tontería, que me ha hecho perder mucho tiempo.

    ¡Una "tontería" dice! Perder 3 horas no es ninguna tontería ya que puede representar casi el 37 por 100 de una jornada de trabajo diaria de 8 horas. ¡Se nota que no tienes "jefe"! ;-)

    Estaba queriendo saber el motivo que te aparecieran los arrays con 5 elementos, porque ejecutando tu código, a mí me aparecían 4 elementos:

    >  Dim row1() As String = {
    >      VarGlobal.strPerMensualesMes(0) & "-" & VarGlobal.strPerMensualesAño(0),    -->  1 elemento
    >      FormatNumber(CStr(AccesoDatosFormulas.TotalActivoCuadre(0)), 2),            -->   2 elemento
    >      FormatNumber(CStr(AccesoDatosFormulas.TotalPasivoCuadre(0)), 2),            -->   3 elemento
    >      FormatNumber(CStr(TotalSaldoAP(0)), 2)}                                                   -->   4 elemento

    El día que te olvides del módulo llamado VarGlobal, y de las variables compartidas que supuestamente se encuentran declaradas en el mismo, verás como no pierdes el tiempo en "tonterías". ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 3 de abril de 2016 15:36
    Moderador
  • Hola Enrique:

    Había cogido mal el método de la grilla, ese es para el DatagriofView2 y la imagen esra para el Datagridview3, que lleva una columna más. Perdón por el error.

    Después, VarGlobal es una clase que tiene ese nombre porque mira en su momento utilicé las variables globales, pero en esa clase solamente hay propiedades, no utilizo ninguna variable global, todos son propiedades, excepto en algún form que si utilizo variables a nivel local. Que te crees que no hago caso de todo lo que me indicas? pues sí maestro, que para eso me has enseñado, no para hacer lo que a mi me plazca, aunque alguna vez se me escapa algo.

    Con que te crees que a veces no te hago caso (toma..), te adjunto la imagen de " tu VarGlobal" para que la mires y veas que es verdad. Llevo un día de la leche, voy como una máquina. Ah!. Al final solo sale con 3 bases de datos, la de Access, sqlcompact y sql server express, ninguna mas, ya que me daban problemas.

    Bueno, querido maestro, te envío un fuertísimo abrazo.

    Gemma

    domingo, 3 de abril de 2016 15:53
  • "gemma_campillo" escribió:

    > Después, VarGlobal es una clase que tiene ese nombre porque mira en su momento
    > utilicé las variables globales, pero en esa clase solamente hay propiedades,
    > no utilizo ninguna variable global, todos son propiedades, ...

    He ampliado un trozo de la imagen para que se vea mejor:

    Son PROPIEDADES COMPARTIDAS (Shared), que es lo mismo que si en lugar de declarar una Class utilizas un Module y declaras las propiedades de la siguiente manera:

        Public Module VarGlobal
    
            Public Property StrCodEmpresa As String
            Public Property StrPlanConta As String
    
        End Module

    Cuando compiles tu proyecto, el compilador modificará el Module por la siguiente clase:

        <StandardModule> _
        Public NotInheritable Class VarGlobal
    
            Shared Sub New()
            End Sub
    
            Public Shared Property StrCodEmpresa As String
                <CompilerGenerated> _
                Get
                    Return VarGlobal._StrCodEmpresa
                End Get
                <CompilerGenerated> _
                Set(ByVal value As Integer())
                    VarGlobal._StrCodEmpresa = value
                End Set
            End Property
    
            Public Shared Property StrPlanConta As String
                <CompilerGenerated> _
                Get
                    Return VarGlobal._StrPlanConta
                End Get
                <CompilerGenerated> _
                Set(ByVal value As Integer())
                    VarGlobal._StrPlanConta = value
                End Set
            End Property
    
            <CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)> _
            Private Shared _StrCodEmpresa As String
    
            <CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)> _
            Private Shared _StrPlanConta As String
    
        End Class

    A la hora de compilar se añaden dos campos privados compartidos (_StrCodEmpresa y _StrPlanConta) porque has declarados dos Property sin sus correspondientes bloques Get y Set), cosa que también hará el compilador cuando compile tu clase llamada VarGlobal, por lo que no pienses que el compilador te ha añadido más código que si hubieras declarado una Class, porque el mismo código te va a añadir también.

    Como podrás ver, ES LO MISMO, se encuentren en una clase o un módulo, y seguirás teniendo problemas y más problemas, porque te encuentras COMPARTIENDO DATOS, y si no estás encima de ellos controlando en cada instante el valor que tienen, puede que en algún momento u otro tengas problemas y no sepas ni por donde vienen.

    Fíjate las estadísticas de llamada que tiene tu clase VarGlobal (53526 referencias), liderando el "ranking" en llamadas, la "famosa" propiedad StrCodEmpresa, que ocupa el puesto "número uno de la lista" con 14.321 referencias. ¡No está mal! :-))

    Está bien compartir datos en proyecto pequeños donde en un "abrir y cerrar de ojos" sepas localizar el problema. Pero en un proyecto de la envergadura que tiene el tuyo, habría que pensárselo muy bien el admitir o no estar compartiendo datos entre distintas clases, módulos o formularios. Al menos, así es como yo lo pienso.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 3 de abril de 2016 16:19
    Moderador
  • Hola Enrique:

    Todas las propiedades llevan su Set y Get:

     Public Shared Property dblValorDesgloseFlujosPlanFiscal() As Double()
            Get
                Return _dblValorDesgloseFlujosPlanFiscal
            End Get
            Set(ByVal value As Double())
                _dblValorDesgloseFlujosPlanFiscal = value
            End Set
        End Property
    
        Public Shared Property dblValorDesgloLargoPlazo57() As Double()
            Get
                Return _dblValorDesgloLargoPlazo57
            End Get
            Set(ByVal value As Double())
                _dblValorDesgloLargoPlazo57 = value
            End Set
        End Property

    En el caso de por ejemplo StrCodEmpresa, se le da un valor cuando se carga la empresa y no varía en toda la ejecución, es decir, no cambia. Yo no se hacerlo de otra manera, pero si te digo que por ahora no ha dado ningún tipo de error. Yo lo que hago es asignar un valor a la propiedad normalmente una sola vez en toda la ejecución del programa y si es verdad, que después voy llamando a la propiedad muchas veces, pero siempre tiene el mismo valor. Bueno, no se si ya es lo correcto o no.

    Venga un abrazo querido amigo.

    Gemma

    domingo, 3 de abril de 2016 16:34
  • "gemma_campillo" escribió:

    > Todas las propiedades llevan su Set y Get:

    Digo que llevarán el Set y Get las propiedades que has indicado (dblValorDesgloseFlujosPlanFiscal y dblValorDesgloLargoPlazo57), porque NO has utilizado para declararlas la sintaxis de las propiedades implementadas automáticamente, como por ejemplo:

        Public Shared Property StrCodEmpresa As String

    Lo anterior es una propiedad implementada automáticamente, y el compilador añade de su cosecha los bloques Set y Get correspondientes, porque la propiedad es de lectura y escritura, y para que devuelva un valor (Get) o se le asigne uno (Set), también añade un campo con el mismo nombre de la propiedad que compienza por guión bajo:

        Private Shared _StrCodEmpresa As String

    Para salir de dudas, vete a la clase VarGlobal, y debajo de la declaración de la propiedad StrCodEmpresa, declara el siguiente campo:

        Dim _StrCodEmpresa As String

    Si te aparece una línea ondulada de color rojo, el compilador te está diciendo que dicho campo entra en conflicto con la propiedad StrCodEmpresa, porque ese campo lo tiene que añadir el compilador por el motivo de haber declarado una propiedad implementada automáticamente.

    > Yo lo que hago es asignar un valor a la propiedad normalmente una sola
    > vez en toda la ejecución del programa y si es verdad, que después voy
    > llamando a la propiedad muchas veces, pero siempre tiene el mismo valor.
    > Bueno, no se si ya es lo correcto o no.

    Si crees, y estás completamente segura de ello, que durante la ejecución del programa el valor de las propiedades compartidas no varían, pues no pasa nada, o no debería de pasar. Pero ¿y si donde menos te lo esperas, por cualquier olvido, se modifica el valor de cualquiera de ellas?

    Yo comprendo que la Programación Orientada a Objetos es complicada, pero te repito que un proyecto tan grande como el tuyo, habría que pensáselo muy bien el declarar variables Shared con un ámbito Public. De todas maneras, repito, que si dices que todo va bien, pues nada. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo domingo, 3 de abril de 2016 17:27
    domingo, 3 de abril de 2016 16:58
    Moderador
  • Hola Enrique:

    De verdad que funciona perfectamente, nunca te tenido problemas haciéndolo tal como lo hago.

    Venga, un abrazo.

    Gemma

    domingo, 3 de abril de 2016 17:30