Inserción masiva condicionada
Hola a tod@s.
En un hilo anterior sobre este tema, siguiendo los consejos de Casimiro, logré solucionar mis limitaciones. Por refrescar el tema, os diré que trabajo con Delphi 2010, Firebird 4 y SQL Manager Lite. Tengo que poner un espacio entre : y Campo, porque me salen caras En Firebird tengo la siguiente tabla:
Y el siguiente Procedimiento almacenado:
Y en Delphi tengo el siguiente procedimiento:
La primera inserción la hace bien, pero en la segunda me da el error: 'Attempt to execute an unprepared dynamic SQL statement' Agradeceré vuestra ayuda. |
Perdonad, pero no he puesto qué es lo que pretendo.
Intento insertar registros en la tabla Charts, pero si existe el registro (todos los campos menos Id y Steps) que en lugar de una inerción se incremente el campo Steps del registro existente. Gracias. |
Creo que el orden de comprobaciones es incorrecto.
Primero miras si hay que hacer commit. Si has hecho commit, el contador se voverá 0 y harás como si fuera la primera inserción. En tu código, perparabas la sentencia y luego si se trataba de la MaxTenokatesInserteds hacías commit, con lo que ya no está preparada.
|
De todos modos, creo que lo mejor sería hacer Commit y no CommitRetaining.
Luego, si es la "primera", no tentiendo porqué haces un Rollback. Yo lo haría así, siempre y cuando la transacción no sea compartida por fTexting y otros DataSets.
|
Aparte de lo indicado por duilioisola, también puedes simplificar el procedure usando "update or insert".
https://firebirdsql.org/refdocs/lang...or-insert.html
|
Cita:
|
Se supone que siempre comprobará la clave primaria, sea de un campo o esté compuesta por más de un campo.
Eso dice la lógica. |
Cita:
|
MATCHING se refiere a encontrar el registro según los campos que le pasas.
En el ejemplo, busca primero si existe un registro cuyo campo Number es 3278823. Si lo encuentra hace un update sobre ese registro modificando los otros campos que le pasas Name y Location. De lo contrario hace un insert con los tres campos que le pasas. |
Cita:
|
Aquí el manual, ya que tiene algo más de juego... por ejemplo, puedes retornar valores OLD.campo o NEW.campo
En firebird 5 tiene más opciones todavía. () |
Cita:
|
Cita:
Tengo, por ejemplo, este procedimiento: Código:
CREATE OR ALTER PROCEDURE Act_Libro(Registro SMALLINT, Titulo VARCHAR(60), Autor VARCHAR(60), Genero VARCHAR(25), Código:
Query->Close(); |
Es que estás ejecutando la sentencia dentro de un stored procedure, y en éste no estás devolviendo nada.
|
|
Gracias a los dos; es lo que pasa cuando se tienen errores de base. Pero sigo teniendo la misma duda: ¿cómo trabajo con esa variable en BCB?
|
Igual que en un SELECT...
No conozco BCB pero supongo que hay algo así como FieldByName(). Código:
Query->Close(); |
Creo que algo así:
EDITO: No había visto el mensaje de [duilioisola]. |
Gracias a los dos. Lo probaré y os digo como va.
|
Pues no: tanto con FieldByName como con ParamByName da error. Con FieldByName me dice Query; Field 'NewRec, not found, y con ParamByName en vez de Field dice que lo no encontrado es el parámetro. He probado a ejecutarlo desde SQL Manager y se ejecuta bien y devuelve un valor coherente, pero no veo como recuperarlo para la aplicación. :confused:
|
La franja horaria es GMT +2. Ahora son las 02:17:55. |
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