PDA

Ver la Versión Completa : Clave primaria a 0


aromigaret
05-02-2016, 16:31:56
Hola, estoy desarrollando con tablas Access y ADO, un sistema donde necesito limpiar una base y reiniciar la primary key. No hayo la forma de hacerlo. Intente copiar una tabla nueva con la misma estructura, pero me daba error. Agradezco quien pueda darme una mano, ya sea, copiando la nueva tabla o borrar todos los ítems y reiniciar la primary key. Muchas gracias.

Casimiro Notevi
05-02-2016, 16:53:34
.. me daba error.¿Qué error?

aromigaret
05-02-2016, 17:13:16
Casimiro gracias por contestar,
Perdón no me da error sino simplemente no hace la operación de copiado de estructura. Te transcribo lo que hago :

IF MESSAGEDLG('ESTA SEGURO DE INICIAR UN NUEVO PEDIDO',MTCONFIRMATION,[MBYES,MBNO],0,MBNO) = MRYES THEN BEGIN

PEDIDO.Close;
LIMPIAR.SQL.Text:='INSERT INTO PEDIDOS(RENGLON,CANTIDAD,ARTICULO,MARCA,PRECIO,SUBTOTAL,CODIGONUM,UBICACION) SELECT RENGLON,CANTIDAD,ARTICULO,MARCA,PRECIO,SUBTOTAL,CODIGONUM,UBICACION FROM ORIGINAL';
LIMPIAR.ExecSQL;
PEDIDO.Open;

END

Casimiro Notevi
05-02-2016, 17:19:16
Esa sentencia inserta en la tabla pedidos los registros que existan en la tabla original.

aromigaret
05-02-2016, 17:38:54
Creí que con ello superponía la estructura también no solo los registros. Entonces como hago para copiar la estructura de Original sobre Pedidos?

Casimiro Notevi
05-02-2016, 17:41:29
No entiendo para qué quieres hacer eso. ¿Tú quieres hacer?

aromigaret
05-02-2016, 18:10:21
Sobre la tabla Pedidos se "escriben" mercadería solicitada. Una vez impresa la nota se borran todos los artículos y se inicia nuevamente. La clave primaria, debería iniciarse para que no crezca hasta el infinito.

Casimiro Notevi
05-02-2016, 18:15:07
Para borrar todos los registros de una tabla:
delete from nombredelatabla

aromigaret
05-02-2016, 18:18:50
Eso lo hice, pero no reinicia la clave primaria, sigue numerando desde la ultima entrada hecha.

Casimiro Notevi
05-02-2016, 18:23:12
¿Y cómo lo haces?

Explica con detalle todo, puedes escribir todo lo que quieras, no hay límite, es que estamos con un diálogo casi monólogo/monosílabo ;)
.

AgustinOrtu
05-02-2016, 18:28:17
No deberias nunca reiniciar la clave primaria

Cual es el problema que crezca "hasta el infinito"?

aromigaret
05-02-2016, 18:46:01
Perdón, tratare de ser mas claro.
Tengo una tabla llamada Pedidos en ella se cargan todos los ítems que va pidiendo un cliente, una vez finalizada la carga se imprime el pedido y se guarda en otra tabla lo cargado. Debo reiniciar la tabla 'Pedidos' para una nueva carga. Para ello yo hacia lo mismo que vos mencionaste:

PEDIDOS.close;
LIMPIAR.SQL.text:='delete from pedidos';
LIMPIAR.execsql;
PEDIDOS.open;

Pero al iniciar una nueva carga, veo que el campo auntoincrementable y clave primaria 'Renglon' de la tabla pedidos continua con el siguiente numero dejado por la anterior carga en vez de iniciar desde 1.

Acabo de probar lo siguiente:

PEDIDO.Close;
LIMPIAR.SQL.Text:='DROP TABLE PEDIDOS';
LIMPIAR.ExecSQL;

LIMPIAR.SQL.Text:='SELECT * INTO PEDIDOS FROM ORIGINAL';
LIMPIAR.ExecSQL;

PEDIDO.Open;

Intentando copiar la estructura de ORIGINAL (Una tabla igual a Pedidos, pero vacia) y me da el siguiente error cuando lo ejecuto sin el debugger:

"El motor de bases de datos Microsoft Jet no pudo encontrar el objeto 'PEDIDOS' ....."

Ahora cuando lo ejecuto con el debugger, no aparece el error, hace todo perfecto, así que no sé en que línea se produce dicho error.

AgustinOrtu
05-02-2016, 18:53:49
Es que basicamente estas usando una tabla para guardar 1 pedido con sus n linea de detalles y luego borras todo. Para que usar una tabla access para eso? Directamente podes mantener todo en memoria.

Si queres optar por la via de DataSet podes usar un ClientDataSet

Vas cargando todas las lineas del pedido en el ClientDataSet, una vez que se termina, lo cargas en "la otra tabla" y lo imprimes

Yo no borraria la informacion que se va guardando, agregaria un campo de estado en los pedidos (pendiente, borrado, facturado, etc)

aromigaret
05-02-2016, 19:11:07
Hola AgustinOrtu,

Te comento que no lo hago en memoria, pues al cerrar el programa se perdería la información. Dataset nunca lo use y después de estar usando el arcaico BDE, opte por interiorizarme con ADO y ahora agregue Access, después de utilizar tablas .dbf. Así que soy muy novato. Cual seria la ventaja de usar clientdataset por sobre ADO?

AgustinOrtu
05-02-2016, 20:20:00
ClientDataSet es una tabla en memoria

No digo que mantengas todo el sistema entero en memoria; pero el pedido actual que estas cargando si

Vas cargando todo en una tabla de memoria (o llamala temporal si queres) que podria ser un TClientDataSet

Cuando se confirma el pedido, tomas todo lo que tiene el ClientDataSet (todos los "renglones") y lo vuelcas en la tabla access

Luego eliminas todo lo del ClientDataSet y podes volver a cargar otro pedido

Lo que digo que esta muy raro en tu programa es que estas usando una tabla para guardar basicamente una sola entidad. Estas cargando un pedido y luego lo borras y lo pasas a otra tabla. Por que?

bitbow
05-02-2016, 23:55:03
Hola, creo que debes aclararnos que es lo que necesitas, para la generacion de pedidos puedes o no usar una tabla temporal (sea en memoria o no), pero en si cual es tu problema, y no me refiero a el reset de la clave primaria, si no al por que quieres reiniciarla? tal ves podamos darte otra idea de hacer lo que requieres.

El autoincrement no se va a reiniciar a menos que destruyas la tabla y la vuelvas a crear, podria ser una secuencia pero estas no existen en access.

Si requiere tener un master-detail

Cabecera
producto 1
producto 2

No es necesario que pongas el autoincrement, puedes contar los productos y poner el contador, pero si es recomendable que cambies a una tabla temporal.

Saludos.