Validar conjunto de datos.

Iniciado por piwi, 27 Julio 2010, 12:11 PM

0 Miembros y 1 Visitante están viendo este tema.

piwi

Hola.

Me he encontrado con este manual como validar los conjuntos de datos.

http://msdn.microsoft.com/es-es/library/ms171930(v=VS.80).aspx

La validación la hago sobre un campo que es PK y busco si ya existe en la base de datos. Al probarlo me funciona y me muestra el mensaje de error que ya existe este valor pero al dar a guardar sigue intentando guardar los cambios y me da error de clave duplicada.

Para solventarlo he hecho lo siguiente (que me parece una chapuza) en el BindingNavigatorSaveItem_Click

If String.IsNullOrEmpty(ErrorProvider1.GetError(IDTextBox)) Then
        Me.Validate()
        Me.LICENCIASBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.LicenciasDataSet)
else
   msgbox("Existen errores")
end if

Faltaría algo de código para controlar los errores, esta como a medias, aunque me muestre el error, sigue con la grabación.

La solución de arriba me funciona cuando es el boton guardar pero si le doy al nuevo o a las flechas de navegación también guarda los valores automaticamente, donde están el código que guarda los datos por ejemplo al dar al botón nuevo?

Gracias de antemano.


[D4N93R]

Dos cosas,  una no se si seguiste el manual bien porque no posteas el código completo, si quieres hazlo en pastebin.com y nos pasas el link.

Y segundo, que no entendí bien el problema, acuerdate siempre de explicar bien el escenario. Por ejemplo, tengo X controles, la base de datos es TAL, El tipo de conexión, la conexión no la hago a mano, sino con Controles SqlDataSources, etc..

De ésta manera es mucho más fácil para entender el problema y darle una solución.. :) Saludos!

MaLkAvIaN_NeT

Amigo no se que quieres hacer pero las pk sirven precisamente para validar que no existan claves duplicadas,, no perjudiques el SGDB buscando si la clave ya existe, esas operaciones puedes hacerlas en el cliente.
a por las buenas ideas

[D4N93R]

Casi nunca debes haces validaciones de PK, debido a que es más recomendado usar una columna Identity, si ese registro necesita un código que vaya a ser usado fuera del sistema en sí, ejemplo código de barras, serial o lo que sea, eso no es el PK, sino un valor más del registro..

Te recomiendo que sigas ésta idea,

Un saludo!

piwi

Gracias por las respuestas.

Os pongo un ejemplo. Creo una tabla llamada personas cuyos campos son dni, nombre, apellido. Como el campo DNI es único entonces lo pongo como la clave primaria. Por una lado porque haré busquedas por él y por otro lado que no puede ser nulo y nunca será duplicado.
Teniendo la BD lista ahora desde el vb creo un origen de datos y lo arrastro al formulario en forma de campos sueltos (modo detalle y no datagridview).
Hasta aquí no he hecho nada, y vb me ha creado los tres campos: dni, nombre y appelido enllazados a datos, un bindingsource, un tableadapter, tableadaptermanager y bindingnavigator. Además de eso utilizo un ErrorProvider para mostrar los posibles mensajes de error.
Lo que me queda es realizar las validaciones para que no me salte una excepcion que que el campo dni es único y que no esté duplicado, es ahí donde he intentado realizarlo a nivel de dataset como dice aquí http://msdn.microsoft.com/es-es/library/ms171930 pero me he encontrado con el problema que pongo en el primer post.
Otra duda que tengo, automáticamente me ha creado el código en en evento saveitem_click de bindingnavigator que ahí puedo realizar los chequeos pero el problema está que también está guardadondo automaticamente cuando doy a las flechas para cambiar de registro o cuando doy a un nuevo registro.
En definitiva, lo que quiero hacer es chequear que el campo dni no esté vacío ni que esté duplicado, donde lo tengo que hacer, a nivel de dataset, en validación del campo?

[D4N93R]

Sin importar si el campo DNI es único, yo, personalmente no recomiendo que lo coloques como PK, sino que además crees un ID Autonumérico (Identity en MsSql, Autoincremental en MySql), Qué pasa si creas un registro con un DNI "E123" por ejemplo, y más adelante te dicen que lo escribieron mal, muchas tablas se van a ver afectadas, y por ende tu sistema, por lo que es siempre mejor colocar Autonuméricos en la mayoría de los casos.

Ahora, para validar los datos cuando usas un BindingNavigator, debes suscribirte a los eventos de los controles enlazados (a los que les haces el binding) y no al BindingNavigator ni al Source. Por ejemplo, en el caso de un DataGridView te suscribes al evento CellValidating, CellValidated, RowValidating o RowValidated, lo mismo pasa en los demás controles.

Por ejemplo en un TextBox
Código (csharp,6) [Seleccionar]

private void DNITextBox_Validating(object sender, CancelEventArgs e)
{
    if (string.IsNullOrEmpty(taskStateNameTextBox.Text))
    {
        personaErrorProvider.SetError(DNITextBox, "El campo DNI no puede ser vacío");
        e.Cancel = true;
    }
    else
    {
        personaErrorProvider.SetError(DNITextBox, string.Empty);
     }
}


Fíjate en la línea subrayada, el los controles de databinding son llamados a la hora de pedir los datos para ser mandardos al datasource, entonces a todos se les ejecuta el método Validating y Validated. En Validating es donde haces todas las validaciones.

Un saludo, espero te funcione!

piwi

Gracias por todo.

Lo probaré. De momento he solucionado la mayoría de mis males quitando del bindingnavigator de los botones las propiedades de movefirsitem y las demás y lo hago a mano así tengo más control.
El problema que veo en el código que me has puesto es si no paso por el campo dni y le doy a guardar, me dará error ya que ni ha pasado por validating.

Un saludo

[D4N93R]

A qué te refieres , "si no pasas por el campo"?

piwi

Me refiero que el validating de un textbox salta cuando el texbox pierde el foco.

[D4N93R]

Cuando cambias el registro actual con el BindingNavigator, se validarán el "binding Value" actual para ese control. Entonces el evento Validating debería funcionar.

Saludos!