Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-10-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
auto increment

hola chicos una pregunta, tengo una tabla con un capo id de auto_incremente, tengo un problema a la hora de cargar los datos. aca les dejo un ejemplo

alta_proveedor:='INSERT INTO proveedores VALUES(: pid, : pfax,: pdom,man,: ppiso,: ptel,: pcuit,: prazon,: pprov, local, cp, correo, web';
with dm.abmCompras do begin
sql.Clear;
sql.Add(alta_proveedor);
ParamByName('pdi').Value:=null;
ParamByName('pfax').Value:=editfax.Text;
ParamByName('pdom').Value:=editdomicilio.Text;
y asi sucesivamente hasta q cargo todos los datos...

el campo id q muestro ahi es el auto increment, eh intentado de esta manera insertando en ese campo un null pero me da error... tengo entendido q no hace hace falta cargar ni siquieda pasarle en null por el solo hecho q se incrementa solo, q tendria q hacer?? gracias
Responder Con Cita
  #2  
Antiguo 14-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Por favor, usa las etiquetas adecuadas para publicar tu código.

En cuanto a la pregunta, intenta pasarle 0 al parámetro.

// Saludos
Responder Con Cita
  #3  
Antiguo 14-10-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
q no se entendio? las caritas se formaron porq todos los parametros llevan un : p precedido, ah por sierto probe con asiganrle el 0 sigo con el mismo error
Responder Con Cita
  #4  
Antiguo 14-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

Hola einarcito, me gustaria saber en que servidor de base de datos estas trabajando.
Pero aqui va una sugerencia:
Verifica que el campo que tienes como autoincrement sea por defecto null, por si no es asi no podras pues fijate que no este declarado como not null. por que si no no aceptará valores nulos , ademas si siquiera debes enviarle datos, pues automaticamente se incrementa cada ves que insertas una tupla
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #5  
Antiguo 14-10-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
estoy con mysql server 5 oye tengo otro eemplo y lo tengo definido como null y lo mismo anda el auto incrementador asi q creo q no es el problema, le asige cero y tmb me sigue dando error
Responder Con Cita
  #6  
Antiguo 14-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Entonces amigo por que no pusiste tu duda en el foro de MySQL . Halla te ayudarian mejor ya que son unos Master
Pero Que error te sale?
O si no no le mandes nada y el servidor te lo hara solo
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 14-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por einarcito Ver Mensaje
q no se entendio? las caritas se formaron porq todos los parametros llevan un : p precedido, ah por sierto probe con asiganrle el 0 sigo con el mismo error
Hola

roman se referia a que no se entiende bien asi como lo pones, con las etiquetas se ve así:

Código Delphi [-]

alta_proveedor:='INSERT INTO proveedores VALUES(:pid,:pfax,:pdom,:pman,:ppiso,:ptel,:pcuit,:prazon,:pprov,:plocal,:pcp,:pcorreo,:pweb)';

with dm.abmCompras do begin
   sql.Clear;
   sql.Add(alta_proveedor);
   ParamByName('pdi').Value := null;
   ParamByName('pfax').Value := editfax.Text;
   ParamByName('pdom').Value := editdomicilio.Text;
   // Y demas parámetros.....
end;

Tal vez requiere de que asignes los campos en la misma sentencia

Código Delphi [-]

alta_proveedor:= 'INSERT INTO proveedores (pid,pfax,pdom,pman,ppiso,ptel,pcuit,prazon,pprov,plocal,pcp,pcorreo,pweb)'+
                 ' VALUES(:pid,:pfax,:pdom,:pman,:ppiso,:ptel,:pcuit,:prazon,:pprov,:plocal,:pcp,:pcorreo,:pweb)';

Salud OS

PD: Para evitar ver las caritas debes de agregar la etiqueta


[noparse]
....

[/noparse]
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #8  
Antiguo 14-10-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
egopolice tmb eh probado eso y no funciona, a ver mi pregunta es deberia cargar ese dato??? me contesto a mi mismo CREO q no porq por algo es autoincremente, entonces mi otra pregunta es como deberia declarar eso dentro de mi codigo???
Responder Con Cita
  #9  
Antiguo 14-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por einarcito Ver Mensaje
egopolice tmb eh probado eso y no funciona, a ver mi pregunta es deberia cargar ese dato??? me contesto a mi mismo CREO q no porq por algo es autoincremente, entonces mi otra pregunta es como deberia declarar eso dentro de mi codigo???
Hola

Me parece que no es necesario cargar ese campo, segun se ve en este hilo

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #10  
Antiguo 14-10-2008
PablorD PablorD is offline
Miembro
 
Registrado: sep 2008
Posts: 42
Poder: 0
PablorD Va por buen camino
prueba con esto.

Código Delphi [-]
alta_proveedor:='INSERT INTO proveedores VALUES(:id,:fax,:dom,:man,iso,:tel,:cuit,:razon,rov,:local,:cp,:correo,:web)';
//saque las p para que no hiciera :P, tienes que ponerlas denuevo
with dm.abmCompras do begin
   sql.Clear;
   sql.Add(alta_proveedor);
   ParamByName('pdi').Value := 'null';
   ParamByName('pfax').Value := editfax.Text;
   ParamByName('pdom').Value := editdomicilio.Text;
//y asi sucesivamente hasta q cargo todos los datos...

o con esto

Código Delphi [-]

   ParamByName('pdi').Value := '';
   
//y asi sucesivamente hasta q cargo todos los datos...
Responder Con Cita
  #11  
Antiguo 14-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
egostar ya ha dado la respuesta correcta, no le deis más vueltas.

Tienes que omitir el campo que es autoinc del sql. Si lo incluyes, entonces se aplican otras reglas:
- si le das el valor null y el campo no admite nulos, excepción al canto.
- si le das el valor null y el campo admite nulos (cosa que nunca debería ocurrir en este caso) almacenará el nulo y después es probable que tengas otros errores.
- Si le das un valor distinto de nulo, lo grabará y podrá incurrir en key violation o en violación de índices únicos.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 14-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No tenía muchas ganas de intervenir nuevamente en este hilo, pero quiero acotar, respecto a lo que dice Lepe, que uso con frecuencia este tipo de campos en MySQL, y puedo asegurar que si se le pasa un valor cero, el motor genera el incremento correcto. Esto funciona así, tanto desde una aplicación usando componentes como ZEOS o MyDAC, o bien desde el cliente mismo de MySQL.

Lo uso mucho así, precisamente para no tener que escribir todos los campos en la sentencia.

Incluso, leyendo el manual, se ve esto:

Cita:
When you insert a value of NULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value
No sé si esto es no-estándar o si funcione en otros motores, pero así funciona en MySQL.

// Saludos
Responder Con Cita
  #13  
Antiguo 15-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
Escribo en éste hilo porque me parece pertinente frente a mi problema, hasta ahora he trabajado la inserción de registros en tablas MySQL con campos llave AutoIncrement simplemente no asignándole valor, el asunto ahora es que eso funciona para un solo registro, pero cuando debo crear 2 o más, el primer Post pasa sin problema pero el segundo arroja un error de 'Key Violation' porque como el AutoIncrement es llave primaria, 2 valores NULL o '' no pueden coexistir.

He buscado soluciones pero no logro entenderlas, alguien puede comentar cómo ha podido solucionar dicho inconveniente ..?

Saludos.
Responder Con Cita
  #14  
Antiguo 15-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por gustavosv Ver Mensaje
....
Mejor crea un tema nuevo, no es exactamente el mismo problema, además esto es de hace 6 años.
Responder Con Cita
  #15  
Antiguo 17-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo utilizo MySQL y nunca he tenido problemas con campos autoincrementados, simplemente ni siquiera los incluyo en los inserts y dejo que el motor haga lo suyo. Desde que creo la tabla dejo los valores por defecto para los campos autoincrementados. Cada vez que se hace un insert y se agrega una tupla si no se indica el valor del campo autoincrementado MySQL automáticamente lo inserta y coloca el valor correspondiente. Sin embargo si incluyes el campo y le das un valor (aunque sea cero) MySQL lo insertará sin alterar el contador del autoincrementado, es decir, si el campo va en 99 e insertamos un valor de 150, MySQL nos lo aceptará y agregará correctamente la fila pero el contador seguirá quedando en 99 que fue el último valor autoincrementado. El problema lo tendremos cuando llegue a 150 porque nos arrojará un error de clave duplicada (recordemos que los campos autoincrementados deben ser claves primarias).
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #16  
Antiguo 18-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
AzidRain, y nunca ha tenido problemas cuando necesita grabar 2 registros (2 Post) antes de hacer un ApplyUpdates ?

En mi caso debo crear algo así como el detalle de una factura, entonces creo el encabezado (factura) (1 Post) y luego el detalle (DetalleFactura) que son varios registros (varios Post), cuando se completa la operación debo hacer el Apply, pero en el 2do Post me sale el error 'Key Violation'
Responder Con Cita
  #17  
Antiguo 19-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
El error te sale porque estas tomando y asumiendo que el valor que tienes en folio o clave de las 2 facturas que estás editando es el mismo. La clave la debes obtener hasta que ya vayas a guardar el encabezado y posteriormente pasarla al detalle. Para ello puedes hacer lo siguiente, grabas la cabecera (sin indicar la clave o folio) inmediatamente despues obtienes que número le fue asignado usando "LAST_INSERT_ID" y ya con ese número actualizas el detalle y lo guardas y listo. "LAST_INSERT_ID" te devolverá siempre el último valor autoincrementado que te asignó el motor sin importar si otros usuarios antes o después que tú hicieron lo mismo. Ojo, tienes que abrir una transacción para hacer todo esto para que si ocurre cualquier error no te quedes con una cabecera sin detalle.

En resumidas cuentas tienes que hacer toda tu operación SIN saber que clave le corresponde a la cabecera, eso lo dejas hasta el final. Al usuario si quiere le muestras el folio asignado hasta el momento en que terminas las actualizaciones a la BD, antes NO.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #18  
Antiguo 19-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
AzidRain, gracias por la recomendación es muy pertinente, sin embargo la PRIMARY KEY de la tabla Detalle es un campo AUTOINCREMENT, es decir, independiente de saber o no la clave de la cabecera, esa no es la clave principal, sino el campo AutoInc de la misma tabla Detalle cuyo valor no conozco en ese momento, de hecho el NroFactura (Id de la respectiva tabla cabecera) lo manejo desde otra tabla de consecutivos, por lo que al grabar el datalle si conozco el NroFactura.
Responder Con Cita
  #19  
Antiguo 21-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo creo que no necesitas el autoincrement en la tabla de detalle ya que muy seguramente la estructura de la tabla ya incluye como clave foránea el número de factura. Podría ser una clave compuesta que incluya el número de factura y el número de línea de detalle, el cual no tiene que ser autoinc. ya que no necesitas llevar la cuenta de cuantas líneas has insertado en todas las facturas sino solo en cada una. De esta manera podemos identificar cada fila como única a partir de su número de factura y número de línea.

Sería bueno ver la estructura de las 2 tablas
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #20  
Antiguo 23-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
tema resuelto en el siguiente hilo: http://www.clubdelphi.com/foros/show...ear#post476477

Gracias a AzidRain por sus aportes ...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Auto carga de clases en PHP 5 dec PHP 1 08-03-2008 22:37:13
EAN 128 Auto Switch ?? ofillia Varios 2 02-02-2007 19:07:03
auto incremento valentino MySQL 1 14-02-2005 12:59:33
Auto borrado brandolin Varios 6 27-09-2003 21:18:37
Auto Crear Forma cmgenny Varios 2 13-05-2003 13:46:03


La franja horaria es GMT +2. Ahora son las 23:26:14.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi