Hola, tengo un problemón llevo 8 horas para hacer una consulta, la he intentado hacer de 3 formas distintas.
Primeramente utilizo la tabla texportar (contador,fecha,lectura,consumo) son sus campos.
Lo que pretendo es exportar datos a esta tabla mediante un query y lo que tiene que hacer la consulta es si el contador (que es la clave principal de la tabla) que pretendo introducir en la tabla texportar ya existe en esa tabla modifico sus datos (fecha,lectura,consumo) y si no existe los inserto. Necesito hacer la consulta de una vez para evitar la conexión repetida al servidor ya que la consulta está dentro de un bucle ó lazo.
Acontinuación os pongo el código de como la intentado hacer.Por cierto utilizo Firebird 1.5:
La primera opción por la que opté fue:
Código Delphi
[-]
query.Close;
query.SQL.Add('replace texportar(contador,fecha,lectura,consumo)VALUES ('+datos.IBADOQ.fieldbyname('numero').text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+','+ datos.IBADOQ.fieldbyname('consumo').text+')');
query.ExecSQL;
Creo que no ha resultado porque el replace pertenece a MySql y no a SQL estandar,si no me equivoco.
Segunda forma:
Código Delphi
[-]
query.SQL.Clear;
query.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+ datos.IBADOQ.fieldbyname('numero').text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+','+ datos.IBADOQ.fieldbyname('consumo').text+')on duplicate key (update fecha=#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#, lectura='+datos.IBADOQ.fieldbyname('lectura').text+ ',consumo='+datos.IBADOQ.fieldbyname('consumo').text+')');
query.ExecSQL;
Esta opción creo que falla por lo mismo que la anterior porque el on duplicate key es de MySql
Tercera:
Código Delphi
[-]
query.Close;
query.SQL.Text:='INSERT INTO texportar SELECT contador,fecha,lectura,consumo, (IF ((SELECT contador FROM texportar';
query.SQL.Text:=query.sql.Text+' WHERE contador<>'+datos.IBADOQ.fieldbyname('numero').text+')then';
query.SQL.Text:=query.sql.Text+' INSERT INTO texportar (contador,fecha,lectura,consumo)values('+datos.IBADOQ.fieldbyname('numero').text+'';
query.SQL.Text:=query.sql.Text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+'';
query.SQL.Text:=query.sql.Text+','+datos.IBADOQ.fieldbyname('consumo').text+')else UPDATE texportar'+'';
query.SQL.Text:=query.sql.Text+'SET fecha=#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#'; query.SQL.Text:=query.sql.Text+',lectura='+datos.iBADOQ.fieldbyname('lectura').Text+',consumo='+dato s.IBADOQ.fieldbyname('consumo').Text+' where contador='+ datos.IBADOQ.fieldbyname('numero').Text+')) from texportar';
query.Open;
Esta opción realmente no se porque falla ya que los if si son permitidos en Sql estandar.
Por favor, si laguien sabe como resolver esta consulta, ó si sabe otra forma de hacerla aunque sea partiendo la consulta en varias..
P.D:
datos.IBADOQ= corresponde a otro query de interbase ya que con el saco los datos que quiero exportar.
desde ya mismo , muchas gracias.