PDA

Ver la Versión Completa : Pasar un array como parámetro a una Query


pape19
06-10-2011, 13:30:53
Soy bastante nuevo en Delphi, y de a poco me voy acomodando con las funciones que ofrece. Estoy desarrollando una pequeña aplicacion de control de inventarios, y para hacer una consulta, necesito de una Query. Como nunca hice una en Delphi, me parece que algo estoy haciendo mal.

Yo tengo una tabla general, que contiene elementos, cada uno identificado con un codigo de elemento.
En otra tabla, en memoria, tengo guardados unos Codigo de elemento, que son los que necesito que queden en la tabla general.

Es decir...TablaGeneral: Cod_Elemento...15; 21; 25; 26; 28 - MemoryTable: Cod_Elemento...21; 25

Lo que tengo que lograr es filtrar la tabla general de manera que solo queden el registro con cod 21 y 25; o hacer una consulta que devuelva solo esos registros. En tabla general, cada registro tiene varios campos, que obviamente tienen que acompañar al Cod_Elemento en la consulta.

Como les decía, pensé en una Query, y mi código es el siguiente...

En la Unit del Form:


//Con este ciclo pongo todos los ID de la tabla en mem. en un string. Ej1: 20, 24, 27

MemoryTable1.First;
cadena:=inttostr(MemoryTable1Cod_Elemento.value);
MemoryTable1.next;
while not MemoryTable1.eof do
Begin
cadena:=cadena + ', ' + inttostr(MemoryTable1Cod_Elemento.value);
MemoryTable1.Next
End;

//con lo que sigue, paso como parámetro cadena, que quedaría como el Ej1.
If camposllenos = 3 then
Begin
Query1.ParamByName('PARAMETRO').AsString:= cadena;
Query1.Open;
End;


En la query:


SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)


Y en las propiedades del parámetro, tengo que...


DataType: ftString
ParamType: ptUnknown
Value Type: String


Cuando ejecuto, al llegar al Open de la Query, me sale este error de tipos "Type Mismatch in expression".

Que estoy haciendo mal? Que solucion me pueden dar? GRACIAS!

Casimiro Notevi
06-10-2011, 13:46:37
Recuerda poner el código entre las etiquetas correspondientes, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png


Y no olvides leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración.

.

pape19
06-10-2011, 15:39:30
Lo que hago es generar desde una tabla en memoria un array "cadena" de integer, a una Query en Paradox.

El error es el adjunto.

Mi codigo es el que sigue:

En el unit

MemoryTable1.First;
while not MemoryTable1.eof do
Begin
y:=y+1;
cadena[y]:= MemoryTable1Cod_Elemento.value;
MemoryTable1.Next
End;

En la query:

SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)

En el parametro:

DataType: ftArray
ParamType: ptInput
Value Type: Integer

ecfisa
06-10-2011, 19:20:06
Hola Pape19.

Por favor no crees nuevos temas con el mismo contenido.
Guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) punto 6:

Nadie me contesta

Si te encuentras en esta situación, te aconsejaría que en vez de abrir otro tema, con lo que podría perderse información previa sobre el tema que expusiste en un principio, siguieses el tema que tu mismo iniciaste en su día, escribiendo una nueva contestación. De esta manera el tema se actualizará y pasará a la cabecera del foro, y se marcará como no leido para el resto de usuarios. Así evitamos duplicar información innecesariamente.

Otro motivo por el que es posible que no te hayan contestado es porque puedes haberte explicado mal. Sería conveniente en este caso que trataras de ampliar la información que has escrito en el primer mensaje de tu tema. Así podrías ayudar al resto de usuarios a que respondan más claramente.

Combiné los dos temas bajo el segundo título que es más significativo, e imagino fué ese el motivo del tu segundo mensaje.
Con respecto a esto último, te comento que si deseas cambiar un título, podés enviar un mensaje personal a cualquier moderador y con gusto lo cambiará por el que consideres más adecuado.

Un saludo y gracias por tu colaboración. :)

pape19
06-10-2011, 19:28:48
No quiero ser irrespetuoso, pero si lees bien, son dos temas distintos, porque son diferentes maneras de encarar un problema.

En uno de los puntos, pregunto porque me tira error de tipos pasando un string como parametro.

Y en el otro, pongo este ejemplo, pero mi pregunta es como hacer para pasar un array como parámetro; osea, consulta distinta a la anterior; por eso mismo es que abrí otro tema.

A lo mejor debería haber aprovechado mi primer consulta, y ubicar ahi en un comentario mi segundo problema.

Gracias igual por la aclaración, saludos

oscarac
06-10-2011, 19:40:34
me parece que en lugar de array debes usar una cadena... como bien lo has estado haciendo.. pero me parece que la sintaxis es un poquito diferente


SELECT * FROM General WHERE General.Cod_Elemento IN ('02','03','04')


creo que tienes que crear una funcion que la cadena te la formatee de acuerdo a la sintaxis requerida

ecfisa
06-10-2011, 19:59:42
Hola.
No quiero ser irrespetuoso, pero si lees bien, son dos temas distintos
No, no lo sos en absoluto, solamente diferimos en la apreciación.

Primer post:

MemoryTable1.First;
cadena:=inttostr(MemoryTable1Cod_Elemento.value);
MemoryTable1.next;
while not MemoryTable1.eof do
Begin
cadena:=cadena + ', ' + inttostr(MemoryTable1Cod_Elemento.value);
MemoryTable1.Next
End;

Segundo post:

MemoryTable1.First;
while not MemoryTable1.eof do
Begin
y:=y+1;
cadena[y]:= MemoryTable1Cod_Elemento.value;
MemoryTable1.Next
End;

Primer post:

SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)

Segundo post:

SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)

Primer post:

DataType: ftString
ParamType: ptUnknown
Value Type: String

Segundo post:

DataType: ftArray
ParamType: ptInput
Value Type: Integer

Para mí, es claro que se trata del mismo problema.

, porque son diferentes maneras de encarar un problema.
Correcto, como bién dices, hay muchas formas de encarar un mismo problema. Entonces, podría darse el caso de que tuvieramos que leer repetidamente y en varios hilos la misma situación encarada de dos,tres o más formas diferentes, cuando lo lógico es crear un hilo con la consulta. Las formas de encararlo y solucionarlo irán surgiendo de las sugerencias que te vayan haciendo.

Un saludo. :)

rastafarey
10-10-2011, 22:53:40
usa la propiedad filter.