PDA

Ver la Versión Completa : TIbquery


nenufer
02-05-2006, 09:30:23
Hola!! Vereis tengo un procedimiento al cual le paso como parametro un array dinamico string para los campos de la tabla y un string que sera el nombre de la tabla. Tengo otro array dinamico declarado global para los valores(VNuevos). En este procedimiento es dnd voy a realizar una consulta insert. Mi problema es q no tengo ni idea de como recorrer los dos arrays para poder hacer la consulta. Yo hago lo siguiente:

procedure TForm1.OpInsert(campos : array of string; Tabla:String);
var
i,j : integer;
begin
with DM do
begin
for i:=0 to high(campos) do
QrOperacion.SQL.Add('insert into ' + Tabla + '(' + campos[i] + ')');
for j:=0 to high(VNuevos) do
QrOperacion.SQL.Add('values (' + VNuevos[j] + ')');
QrOperacion.open;
end;

end;

El error que me da es: Acces violation at address 00404567;

A ver si alguien puede ayudarme. Muxas gracias:)

Neftali [Germán.Estévez]
02-05-2006, 09:46:13
Por favor, utiliza TAG's de Delphi (ultimos botones del editor) cuando introduzcas código.
Independientemente de que el código funcione o no, el error de "Access Violation" suele ser por un acceso a memoria incorrecto (algo que no está creado correctamente -dirección incorrecta-).

Ejecuta este código paso a paso y dinos en qué linea falla exactamente, seguramente alguno de los objetos que estás usando está a nil.

Además de lo comentado, apuntarte un par de cosas.
* Si usas el HIGH en un for (para el limite superior), lo lógico sería utilizar el LOW para el límite inferior.
* Si a cada vuelta del FOR, añades el texto:
'insert into ' + Tabla + '(' + campos[i] + ')'
a la SQL, al final del bucle tendrás un SQL como ésta:

insert into NombreTabla (campo1) insert into NombreTabla (campo2) insert into NombreTabla (campo3)
insert into NombreTabla (campo4) insert into NombreTabla (campo5) ...

nenufer
02-05-2006, 09:59:25
Gracias x contestar tan rapido. No entiendo lo de los tags:( . Me hace lo que dices pero es q no se como hacerlo. El error da en el segundo for. He puesto el low

with DM do
begin
for i:=low(campos) to high(campos) do
QrOperacion.SQL.Add('insert into ' + Tabla + '(' + campos[i] + ')');
for j:=low(campos) to high(VNuevos) do
QrOperacion.SQL.Add('values (' + VNuevos[i] + ')');
end;

nenufer
02-05-2006, 10:37:04
Buenas otra vez. Lo he planteado de otro forma xo me sigue dando error. He decidido recorrer los arrays e introducirlos en una vble string.


procedure TForm1.OpInsert(campos : array of string; Tabla:String);
var
i,j: integer;
ConsultCamp,ConsultValor : String;
begin
with DM do
begin
for i:=low(campos) to high(campos) do
ConsultCamp := ConsultCamp + '''' + campos[i] + '''' + ',' ;
ConsultCamp := copy (ConsultCamp,-1,length(ConsultCamp)-2);

for j:=low(VNuevos) to high(VNuevos) do
ConsultValor := ConsultValor + '''' + VNuevos[j] + '''' + ',' ;
ConsultValor := copy(ConsultValor,-1,length(ConsultValor)-1);

{Memo1.Lines.Add(ConsultCamp);
Memo1.Lines.Add(ConsultValor);}
QrOperacion.SQL.Add('insert into ' + Tabla + '(' + ConsultCamp + ')');
QrOperacion.SQL.Add('values (' + ConsultValor + ')');
QrOperacion.Open;
end;
end;

Pero me da un error: sql Parse error: EOF in string detected'

Neftali [Germán.Estévez]
02-05-2006, 10:38:20
¿Cómo resaltar la sintaxis Delphi?

link (http://img46.imageshack.us/img46/5425/resaltarsintaxisdelphi7lh.png)


Añade esta línea antes del open y dinos qué te devuelve:


MessageDlg('SQL: ' + QrOperacion.SQL.Text , mtWarning, [mbOK], 0);

nenufer
02-05-2006, 11:05:04
ahhhh!!!! Vale, me faltaba la comilla final. Lo q pasa es q me da un error: sql error code = -104 'Token unknow - line 1, char 26 'Nombre''. El 1º campo es el q no me reconoce.

nenufer
02-05-2006, 11:13:07
Muxas gracias x todo. El error q me daba era xq en los campos habia puesto comillas simples y son dobles. Gracias x atenderme!!