DBEdit...

Tengo el siguiente detalle:
Una aplicación que guarda datos en una tabla, dentro de esa tabla tengo un campo con valor numérico y autoincrmentable y un DBEdit enlazado a el... Bueno, al hacer clic en mi botón "Agregar", no me aparece el siguiente valor en el campo, sino hasta que realizo un "Post"...¿Qué puedo hacer para que, en el momento en que yo le de clic a mi botón agregar, lo primero que me aparezca sea el número autoincrementable, o sea, mi consecutivo?, y empezar a capturar los demás datos

2 respuestas

Respuesta
1
No me indicas que base de datos estas usando. Generalmente las base de datos generan el valor hasta el momento en que se guarda el registro pues no pueden crear uno antes del post pues en caso de una cancelación se crearían huecos y tampoco puede decrementarlos pues podría causar errores de key violation en caso de que más de un usuario este agregando registros.
¿Es necesario que muestres ese valor antes de guardarlo?
Ok, estoy usando Paradox, y sí me serviría mostrar el valor antes de guardarlo, ya que la persona que captura coteja unos datos antes de iniciar una nueva captura...¿Es posible con paradox?... o ¿Necesito hacer algo más que utilizar un valor autoincrementable...?... Please, auxíliame...
Gracias.
Tienes dos opciones. Una es que tu mismo manejes el campo incrementable de tal forma que por medio del evento OnNewRecord incrementes el valor y lo asignes a tu registro. Para ello deberás tomar en cuenta varias consideraciones sobre todo para permitir la concurrencia de eventos.
La segunda opciones es intentar usar cachedUpdates. De esta forma podrías obtener el valor previamente. (No estoy seguro de ello pero es cuestión de hacer la prueba)
Respuesta
1
No me dices con que tipo de tablas trabajas, pero supongo que es Paradox. Lo que quieres hacer es imposible, dado que el gestor de BDD no asigna valor hasta que se realiza el post. Esto es debido a la gestión multiusuario, ya que si dos usuarios están editando a la vez, el gestor no sabe cual de ellos va a hacer el post en primer lugar o cual de ellos puede cancelar la inserción y dejar vacío algún numero.
Puedes hacer lo siguiente: olvidarte de los autoincrementales y hacértelos tu. Para ello el campo lo defines como ENTERO (no autoincremental) pero si indice primario. En tu formulario defines una variable ProxNum de tipo entero y global a todo el formulario. Luego en el componente TTable defines en el OnBeforInsert algo así como:
tTabla.Last;
ProxNum := tTablaCAMPO.Value + 1;
Con lo cual ya sabes cual ha de ser el siguiente numero. En el evento OnNewRecord haces:
tTablaCAMPO.Value := ProxNum;
Y ya está, ya tienes una gestión autoincremental propia en la que tu le das el valor al campo en el momento de la inserción y no en el post.
No dudes de volver a preguntar si no he sido lo suficientemente explicito.
Ok experto, tienes razón, la gestión será multiusuario, 5 para ser más específicos, pero al ser multiusuario, la solución que me brindas de generar yo mismo el incrementable, ¿sería factible?...
Gracias.
NO.
Vamos a pensar un poco que es lo que ocurre cuando varios usuarios insertan registros SIMULTÁNEAMENTE: primero se abre espacio para un registro nuevo pero que aun no esta físicamente en la tabla, es decir varios registros pueden estar siendo insertados pero aun no están físicamente en la tabla y no sabemos cual de ellos va a ser el primero en añadirse realmente (post), ademas puede que alguno de ellos (o incluso todos) no lleguen a insertarse nunca (cancel), así pues no hay manera de que sepamos que valor real va a tomar el campo autoincremental de cada registro antes de hacer el post.
La pregunta ahora es: ¿Hay algún problema si los valores de este campo no son consecutivos?, es decir, ¿puedo saltarme valores en este campo (1,2,4,7,8,9,12...)? Si es así puedo hacer lo siguiente:
Tener una tabla auxiliar con un campo "ProxNum" de tipo entero no autoincremental, que me servirá para ir guardando el valor que le tengo que dar al campo "Contador" de mi tabla. Así pues haré:
procedure TForm1.Table1NewRecord(DataSet: TDataSet);
var AccExclusivo : boolean;
begin
//la tabla2 la hemos definido en el Form como Exclusive = true;
//controlamos que tenemos acceso exclusivo a la tabla auxiliar o esperamos
//hasta poderla abrir
AccExclusivo := false;
while not AccExclusivo do
try
Table2.Open;
AccExclusivo := true;
except
AccExclusivo := false;
Application.ProcessMessages;
end;
Table2.First;
//tomamos el valor del proximo numero
Table1.FieldByName('Contador').Value := Table2.FieldByName('ProxNum').Value;
//aumentamos el valor del proximo numero
Table2.Edit;
Table2.FieldByName('ProxNum').Value := Table2.FieldByName('ProxNum').Value + 1;
Table2.Post;
Table2.Close; //la tabla2 queda libre para ser usada por otro usuario
end;
Espero que esto te solucione el problema. De no ser así sigue preguntando.

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas