Foros del Web » Programando para Internet » ASPX (.net) »

[SOLUCIONADO] 2 o mas usuarios pueden ver la misma informacion

Estas en el tema de 2 o mas usuarios pueden ver la misma informacion en el foro de ASPX (.net) en Foros del Web. hola buenos dias comunidad, Me encuentro con el problema, estoy trabajando con Webforms y la pagina en localhost funciona muy bien, al momento de subirla ...
  #1 (permalink)  
Antiguo 18/09/2013, 09:13
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
2 o mas usuarios pueden ver la misma informacion

hola buenos dias comunidad,


Me encuentro con el problema, estoy trabajando con Webforms y la pagina en localhost funciona muy bien, al momento de subirla al servidor, cuando 2 o mas usuarios estan en el mismo proceso se cruza la informacion, es decir:

Usuario A) Esta llenando un grid. en el postback los usuarios A, B y C pueden ver lo que esta llenando el usario A.

igual pasa con otros controles como comboboxes.

incluso si usuario A y B estan actualizando el grid con informacion, los 3 usuarios en cada postback pueden ver la actualizacion de los usuarios A y B.


Alguna idea de como puedo solucionar eso?


De antemano muchas gracias, saludos!!
  #2 (permalink)  
Antiguo 18/09/2013, 09:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Si no quieres que todos los usuarios vean la misma información deberás crearle campos de auditoria en las tablas (Usuario Ingresa, Fecha Ingresa, Usuario Modifica, Fecha Modifica son los campos que normalmente se crean, no son necesarios todos, con un campo de usuario basta)

Y en el grid al cargar la información ponerle un where usuario=XXXXXX que seria el id del usuario que este logueado en la computadora, ese usuario podrías almacenarlo en una variable de sesion para no perderlo (supongo que ya sabes como hacerlo) y así solo se mostrara la información que el usuario haya ingresado.

Pero como supongo que siempre debe haber algun momento en que el usuario "X" requiera ver la información del usuario "Y" tendrás que ingeniártelas ahi para lograrlo, podrías ponerle un campo booleano que diga si es publico o no y que el usuario tenga algo con que ponerle ese valor, algo así como un checkbox que lo seleccione al ingresar o modificar el registro para determinar eso, así en el where cambiaría a algo como where usuario=XXXXX or publico=1 o algo asi.

Espero que te sirva. Saludos.
  #3 (permalink)  
Antiguo 19/09/2013, 08:59
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Hola CRauda, muchas gracias por contestar

Si manejo la cuestion de los permisos de informacion a nivel usuario.

Recreare un poco mas el escenario, creo que me falto mas informacion por explicar, una disculpa.

Es una pagina de mantenimento el (Altas, Bajas, Consulta). Donde de 1 a n usuarios pueden estar almacenando informacion al mismo tiempo, y efectivamente cuando hacen la consulta debieran poder ver la informacion ya almacenada en la base de datos de los demas usuarios.

El problema es que la información en los grids de captura no debiera ser compartida, solo la debieran poder ver los demas usuarios cuando sea obtenida de la bd. Y sin embargo durante la ejecucion pueden ver la informacion sin que la informacion este guardada. como si las variables estuviaran globales y publicas y por eso pudieran verla.

Actualmente utilizo:
Visual Studio 2010
.Net Framework 4.0
Webforms
3 Capas (Presentacion, Negocios, Acceso a Datos)
Listas genericas.

he probado en
Chrome v29.0.1547.66
Firefox v24.0
IE v9.0.8112.16421


Mando un fragmento del codebehind, donde se realiza la inicializacion de variables, el llenado del grid y el evento del cambio de renglon,

Código:
public partial class Entradas : System.Web.UI.Page
    {
        static List<Movimientos> _cargaEntradaSalidas = null;
        static List<PrefijosEntidad> _listaPrefijos = null;
        static ContabilidadParamEntidad _datosParamcont = null;
        static CentroCostoEntidad _obtieneCentroTodos = null;
        static MetodosComunes _metodosComunes = null;
        static bool _selectCatalogo = false;
        static List<TipoMoneda>_tipoMoneda = null;
        static ComprasParamEntidad _datosParamComp = null;
        static List<EntradaAlmacen> _listEntrada = null;
        static bool _alta = false;
        static bool _exito = false;
        static List<string> _listMoneda = null;
        static List<VarArticulos> _listVarArticulo = null;
        static ArticulosEntidad _datosArticulo;
        static string _opcion = string.Empty;
        static string _cadena = string.Empty;
        static string _consecutivoOriginal = string.Empty;
        static string _imgAbierto = "../../Imagenes/candadoAbierto.png", _imgCerrado = "../../Imagenes/candadoCerrado.png";
        static List<CentrosCuenta> CentrosCostosAux = null;
        static List<MovimientosEntrada> _movimientosEntrada = null;
        static EntradasEntidad _datosEntrada = null;
        static string _mensage = string.Empty, _borrar = string.Empty, _separador = string.Empty, _costoAutomatico = string.Empty;
        static bool _new = false, _ModFolio = false, _NoValidaCuenta = false;
        static int _totalCentros = 0,_comboPrefijoIndexAnt;
        static List<Movimientos> _tipoMovimientosInventario = null;
        static bool _ajusteInventario;
        static int anioMax = 0;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Inicializar();
            }
        }

        public void Inicializar()
        {
            #region Entrada
            _movimientosEntrada = new List<MovimientosEntrada>();
            tableEntradas.DataSource = _movimientosEntrada;
            tableEntradas.DataBind();
            EstiloTablaEntrada();
            #endregion
            _datosParamcont = new ContabilidadParamEntidad();
            _datosParamcont = new ParametrosBLL().ObtenerInformacionParametroCont();
            _ModFolio = (_datosParamcont.IndicadorModificarFolio == true && _datosParamcont.IndicadorModificarFolio != null) ? true : false;
            _NoValidaCuenta = (_datosParamcont.IndicadorValidarCuentaContable == true && _datosParamcont.IndicadorModificarFolio != null) ? true : false;

            _datosParamComp = new ComprasParamEntidad();
            _datosParamComp = new ComprasBLL().ObtenerInformacionParametroCompras();
            _costoAutomatico = (_datosParamComp.IndicadorEntradaCosto == true) ? "1" : "0"; 
            anioMax = new MetodosComunes().AnioMaximo();
            CentrosCostosAux = new CentroCostoBLL().ObtieneCuentasObligatorias();
            stcCancelado.Visible = false;
           

            edtEntrada.Text = "--";
            _separador = Session["Separador"].ToString();
           
           
            _tipoMoneda = new List<TipoMoneda>();
            _tipoMoneda = new MetodosComunes().TipoMoneda();
            Parametro.CamposAdicionales = new CamposAdicionalesBLL().ObtenerCamposAdicionalesPorProceso("Entradas");
            _listMoneda = new List<string>();
            _listMoneda.Add("");
            _listMoneda.Add(_tipoMoneda[0].MonedaNacional);
            _listMoneda.Add(_tipoMoneda[0].MonedaExtranjera);
            comboMoneda.DataSource = _listMoneda;
            comboMoneda.DataBind();
        }

        
        
        protected void tableEntradas_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
        {
            tableEntradas.DataSource = _movimientosEntrada;
        }

    protected void tableEntradas_SelectedIndexChanged(object sender, EventArgs e)
        {
            chckboxNuevo.Checked = false;
            GridDataItem item = tableEntradas.SelectedItems[0] as GridDataItem;

            edtArticulo.Text = InnovaTools.RemoverNOBR(item["NoArticulo"].Text);
            edtCuentaAbono.Text = InnovaTools.RemoverNOBR(item["CuentaExterna"].Text);
            edtUnidadMedida.Text = InnovaTools.RemoverNOBR(item["UnidadMedida"].Text);
            edtAlmacen.Text = InnovaTools.RemoverNOBR(item["Almacen"].Text);
            comboMoneda.SelectedIndex = comboMoneda.FindItemIndexByText(InnovaTools.RemoverNOBR(item["Moneda"].Text));
            edtCantidad.Text = InnovaTools.RemoverNOBR(item["Cantidad"].Text);
            edtCosto.Text = InnovaTools.RemoverNOBR(item["Precio"].Text);
            edtSerie.Text = InnovaTools.RemoverNOBR(item["Serie"].Text);
            edtPedimento.Text = InnovaTools.RemoverNOBR(item["Pedimento"].Text);

            #region Centros Costo
            for (int i = 0; i < _totalCentros; i++)
            {
                switch (i)
                {
                    case 0:
                        edtCc1.Text = InnovaTools.RemoverNOBR(item["Columna1"].Text);
                        break;
                    case 1:
                        edtCc2.Text = InnovaTools.RemoverNOBR(item["Columna2"].Text);
                        break;
                    case 2:
                        edtCc3.Text = InnovaTools.RemoverNOBR(item["Columna3"].Text);
                        break;
                    case 3:
                        edtCc4.Text = InnovaTools.RemoverNOBR(item["Columna4"].Text);
                        break;
                    case 4:
                        edtCc5.Text = InnovaTools.RemoverNOBR(item["Columna5"].Text);
                        break;
                }
            }
            #endregion

        }
    }

nuevamente muchas gracias por contestar, saludos!!
  #4 (permalink)  
Antiguo 19/09/2013, 09:41
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Creo que el problema viene porque todas las variables que creas, y que llenas las has declarado tipo static, supongo que sabes que normalmente, una variable local de un procedimiento deja de existir en cuanto finaliza el procedimiento. Una variable estática sigue existiendo y conserva su valor más reciente. La próxima vez que su código llame al procedimiento, no se reinicializa la variable y sigue conservando el último valor asignado. Una variable estática sigue existiendo mientras dure la clase o módulo en donde está definida.

Es realmente necesario que sean todas static? Bueno, eso es lo unico que he encontrado, otra cosa que te podria servir es no llenar las variables durante se vaya escribiendo, es decir, que el usuario primero termine de llenar todos los campos y al darle click a guardar y mandes a llamar al metodo entonces ahi llena las variables, has la insercion, destruye las variables (ponlas null denuevo) y luego recarga la informacion, para que no se vaya viendo a tiempo real lo que se esta escribiendo, espero te sirva.

Saludos.
  #5 (permalink)  
Antiguo 19/09/2013, 13:27
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Hola CRauda gracias otra vez

Si he leido que las variable static no son recomendables para paginas web ya que son una variable por aplicacion..., el tipo static no es altamente necesario, lo que necesito es conservar el valor para su posterior uso.

Las variables Session serian una opcion pero me crean incertidumbre, debido a que segun si las utilizo para almacenar listas genericas o cualquier tipo de datasource, podria llegar a saturar la memoria y eso ocacionaria que el servidor solamente utilice una instancia en cada variable.

Otra opcion que vi es la cache, pero segun entendi esta crea una instancia de la variable por servidor para todos los usuarios. y si entendi bien no serviria para esto que quiero evitar.


una vez mas, muchas gracias!!

Saludos!!
  #6 (permalink)  
Antiguo 19/09/2013, 15:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: 2 o mas usuarios pueden ver la misma informacion

La otra opcion seria crear clases e ir llenando instancias de objetos con la informacion y asi si requieres cambiar de pagina o algo por el estilo entonces simplemente lo vas pasando hacia nuevas instancias por parametros.

Usarias de esas clases que llevan Set y Get para ello, sino lo que te recomende antes, guardar la informacion en la base de datos al final y luego si necesitas usar la informacion nuevamente deberias hacer un select segun el codigo que hayas guardado (Asi guardas solo el codigo en una variable de sesion y no toda la informacion) y asi puedes obtener los datos de vuelta desde la base.


Espero te sirva.
  #7 (permalink)  
Antiguo 21/09/2013, 13:13
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Hola gracias por contestar

, opte por manejar Viewstates y Session y ha funcionado bien con respecto a la informacion separada, el problema que vi con viewstate es que si 2 o mas usuarios dan click al mismo tiempo a un boton, solo respeta al primero que llego y a los demas usuarios no ejecuta la accion, como podria solucionar este problmea de viewstate?


Saludos!!
  #8 (permalink)  
Antiguo 23/09/2013, 10:05
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Este es un ejemplo de como estoy utilizando las variables session, que me podria faltar?

private List<AlmacenEntidad> _almacenes = null;

private void Inicializar()

{

if (Session[VarSesionAlmacen.Almacen] == null)
Session[VarSesionAlmacen.Almacen] = new List<AlmacenEntidad>();
else
_almacenes = (List<AlmacenEntidad>)Session[VarSesionAlmacen.Almacen];

InicializarListas();
Session[VarSesionAlmacen.Almacen] = _almacenes;

}

protected void btnAceptar_Click(object sender, EventArgs e)
{

if (Session[VarSesionAlmacen.Almacen] == null)
Session[VarSesionAlmacen.Almacen] = new List<AlmacenEntidad>();
else
_almacenes = (List<AlmacenEntidad>)Session[VarSesionAlmacen.Almacen];

_almacenes.Add(new AlmacenEntidad()
{
Almacen= InnovaTools.RemoverSimbolos(edtClave.Text.ToUpper( ).Trim()),
DescripcionEspanol = InnovaTools.RemoverSimbolos(edtDescripcionEspanol. Text.Trim()),
DescripcionIngles = InnovaTools.RemoverSimbolos(edtDescripcionIngles.T ext.Trim()),
Cuenta = InnovaTools.RemoverSimbolos(edtCuentaContable.Text .Trim()),
CuentaAjuste = InnovaTools.RemoverSimbolos(edtCuentaAjuste.Text.T rim()),
IsNuevo=true,
ID = string.Empty
});
Session[VarSesionAlmacen.Almacen] = _almacenes;

}

¿Alguna otra sugerencia?, gracias de antemano.
  #9 (permalink)  
Antiguo 23/09/2013, 14:52
 
Fecha de Ingreso: septiembre-2010
Mensajes: 91
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Lo siento pero nunca he usado los ViewStates quizas alguien mas vea el tema y te pueda ayudar en ese punto, yo normalmente uso clases y ahi lo voy llenando todo, y una que otra variable de session para cosas como usuario, id's y roles pero nada mas.
  #10 (permalink)  
Antiguo 01/10/2013, 10:07
 
Fecha de Ingreso: enero-2010
Mensajes: 36
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: 2 o mas usuarios pueden ver la misma informacion

Hola CRauda, Gracias,

ya vi el problema era una variable static en otro metodo que estaba ocacionando el problema, pero ya lo pude solucionar muchas gracias a todos, saludos!!

Etiquetas: informacion, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:44.