Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar un array como parámetro a una Query (https://www.clubdelphi.com/foros/showthread.php?t=76060)

pape19 06-10-2011 13:30:53

Problema de tipos con Query
 
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:

Código Delphi [-]
//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:

Código SQL [-]
SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)

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

Código:

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:




Y no olvides leer nuestra guía de estilo, gracias por tu colaboración.

.

pape19 06-10-2011 15:39:30

Pasar un array como parámetro a una Query
 
1 Archivos Adjunto(s)
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

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

En la query:

Código Delphi [-]
SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)

En el parametro:

Código Delphi [-]
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 punto 6:
Cita:

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

Código SQL [-]
 
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.
Cita:

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:
Código Delphi [-]
 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:
Código Delphi [-]
 MemoryTable1.First;
    while not MemoryTable1.eof do
      Begin
        y:=y+1;
        cadena[y]:= MemoryTable1Cod_Elemento.value;
        MemoryTable1.Next
      End;
Primer post:
Código Delphi [-]
SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)
Segundo post:
Código Delphi [-]
SELECT * FROM General
WHERE General.Cod_Elemento IN
(:PARAMETRO)
Primer post:
Código Delphi [-]
DataType: ftString
ParamType: ptUnknown
Value Type: String
Segundo post:
Código Delphi [-]
DataType: ftArray
ParamType: ptInput
Value Type: Integer
Para mí, es claro que se trata del mismo problema.

Cita:

, 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

resp
 
usa la propiedad filter.


La franja horaria es GMT +2. Ahora son las 02:08:00.

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