Ir al contenido


Foto

[RESUELTO] La pelea contra los autoincrementables...


  • Por favor identifícate para responder
7 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 septiembre 2011 - 09:42

Buen día, jóvenes hombres y mujeres que se dedican a programar en Delphi.

Resulta que tengo éste código:


delphi
  1. with adoqryMltpl do
  2.     begin
  3.       Active := False;
  4.       SQL.Clear;
  5.       SQL.Add('INSERT INTO E4R_REPORTE ' +
  6.                           '(E4R_SECUENCIA, ' +
  7.                           'E4R_PROPIETARIO, ' +
  8.                           'E4R_TITULO, ' +
  9.                           'E4R_DESCRIPCION_REPORTE, ' +
  10.                           'E4R_STORED_PROCEDURE, ' +
  11.                           'E4R_ES_FIJO, ' +
  12.                           'E4R_ES_LABORATORIO, ' +
  13.                           'E4R_TAB, ' +
  14.                           'E4R_ESPUBLICO) ' +
  15.                     'VALUES (,' + QuotedStr(sttsbarBrr.Panels.Items[2].Text) + ', ' +
  16.                             QuotedStr(frmEstdsLbrtr1aVez.edtTtlRprt.Text) + ', ' +
  17.                             QuotedStr(frmEstdsLbrtr1aVez.mmoDscrpcnRprt.Text) + ', ' +
  18.                             QuotedStr('') + ' , 0, 0, 0,'+sEsPblc+')');
  19.       try
  20.         ExecSQL;
  21. .
  22. .
  23. .
  24. .
  25. .
  26. .
  27.  
  28.       except
  29.         begin
  30.           Beep;
  31.           MessageDlg('¡Ha ocurrido un error guardando el encabezado!'+#13+#10+''+#13+#10+'Contactar al administrador de base de datos.', mtError, [mbOK], 0);
  32.         end;
  33.       end;
  34.     end;



En donde el campo E4R_SECUENCIA es un campo autoincrementable de SQLServer 2008 R2..., trabajándolo con Delphi 6 en un ambiente Windows XP.

El punto es que cada vez que intento insertar un nuevo registro en tiempo de ejecución con "debug", me manda éste error en la imagen, y OBVIAMENTE no inserta el nuevo registro (lo cual es un alivio, realmente). He intentado de todo, con NULL, con 0 (cero), con un espacio, amenazándola, mentándosela..., pero no inserta registros...

¿Serían tan amables de "desburrarme" en cómo debo hacer para que mis sentencias SQL den el resultado requerido, es decir, que inserte un registro que tiene un campo autoincrementable? Sólo espero que ésta pregunta no se vaya a un año sin respuestas pero con más de 150 vistas, como una anterior que hice...   

Archivos adjuntos


  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 septiembre 2011 - 09:45

No se si en msSqlServer sera igual, pero en Firebird debe ser asi:




delphi
  1. with adoqryMltpl do
  2.  
  3.     begin
  4.       Active := False;
  5.       SQL.Clear;
  6.       SQL.Add('INSERT INTO E4R_REPORTE ' +
  7.                           '('E4R_PROPIETARIO, ' +
  8.                           'E4R_TITULO, ' +
  9.                           'E4R_DESCRIPCION_REPORTE, ' +
  10.                           'E4R_STORED_PROCEDURE, ' +
  11.                           'E4R_ES_FIJO, ' +
  12.                           'E4R_ES_LABORATORIO, ' +
  13.                           'E4R_TAB, ' +
  14.                           'E4R_ESPUBLICO) ' +
  15.                     'VALUES (QuotedStr(sttsbarBrr.Panels.Items[2].Text) + ', ' +
  16.                             QuotedStr(frmEstdsLbrtr1aVez.edtTtlRprt.Text) + ', ' +
  17.                             QuotedStr(frmEstdsLbrtr1aVez.mmoDscrpcnRprt.Text) + ', ' +
  18.                             QuotedStr('') + ' , 0, 0, 0,'+sEsPblc+')');
  19.       try
  20.         ExecSQL;
  21. .
  22. .
  23. .
  24. .
  25. .
  26. .
  27.  
  28.       except
  29.         begin
  30.           Beep;
  31.           MessageDlg('¡Ha ocurrido un error guardando el encabezado!'+#13+#10+''+#13+#10+'Contactar al administrador de base de datos.', mtError, [mbOK], 0);
  32.         end;
  33.       end;
  34.     end;



  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 septiembre 2011 - 09:51

Sí, EduardoCol..., ya también intenté remover el campo y su correspondiente valor y no agrega el registro...
_____________________________
Modificación: ¡¡MIENTO CON TODOS LOS DIENTES!! :p *-) , sí agregó el registro quitándole el nombre del campo y su valor esperado (y) (y) (y) . Muchas gracias, demos por terminado éste penoso asunto...  :D
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 septiembre 2011 - 10:58

¿Entonces está solucionado? ¿Cuál es la solución?


Disculpen que pregunte, ¿Cuál es la diferencia entre la consulta de Felipe y la de Eduardo? No la veo.


Por cierto, Felipe no estaría mal que utilizaras parámetros para no torturarse demasiado con las comillas, y el paso de los valores a la consulta.  ;)


Saludos,
PD: Felipe recuerda que puedes poner al hilo como [RESUELTO] editando el primer mensaje del hilo y añadiéndole el prefijo.
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 septiembre 2011 - 11:00

¿Entonces está solucionado? ¿Cuál es la solución?


Disculpen que pregunte, ¿Cuál es la diferencia entre la consulta de Felipe y la de Eduardo? No la veo.



La consulta de Eduardo elimina el campo Autoincremental.


Saludos
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 septiembre 2011 - 11:06

La consulta de Eduardo elimina el campo Autoincremental.

¡Voy a tener que ir al oculista! No lo vi.


Así es... cuando se trata de campos autoincrementales, la regla que siguen los motores de base de datos, en un INSERT es de obviarlo.


Saludos,
  • 0

#7 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 septiembre 2011 - 11:10

¿Entonces está solucionado? ¿Cuál es la solución?


Disculpen que pregunte, ¿Cuál es la diferencia entre la consulta de Felipe y la de Eduardo? No la veo.


Que Eduardo elimina el uso del campo E4R_SECUENCIA y la comilla vacía en los valores...

Por  cierto, Felipe no estaría mal que utilizaras parámetros para no  torturarse demasiado con las comillas, y el paso de los valores a la  consulta. 


Sí, Delphius, lo sé..., el problema es que se crea "al vuelo" el TADOQuery que ejecutará la inserción, y es menos confuso poner los valores directos de los campos que en un parametrizado. No te creas, estoy intentando eliminar muchos vicios de programación que tengo..

PD: Felipe recuerda que puedes poner al hilo como [RESUELTO] editando el primer mensaje del hilo y añadiéndole el prefijo.

A veces me deja, a veces no me deja..., pero bueno, ya lo hice hoy que sí me dejó...  (y) :D
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 septiembre 2011 - 11:27

Cuando se trata de consultas en tiempo de ejecución quizá si sea más fácil y directo pasar los datos como haces.
Aunque también se puede acceder a los parámetros en tiempo de ejecución, igual de siempre. Simplemente se aconseja hacer uso del método Prepare para asegurar que se arme bien la consulta y se tengan los parámetros creados listos para recibir los datos. Esto agiliza la ejecución.


Ni bien le pasas la consulta a la propiedad .Sql el componente solito la "parsea" buscando los parámetros. Por cada uno que encuentre, crea un parámetro y lo asocia a la clase TParams o TParameters según la suite de componentes que utilices (ADO es el único que utiliza TParameters).


Saludos,
  • 0




IP.Board spam blocked by CleanTalk.