Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-03-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 22
mrmanuel Va por buen camino
Consulta SQL, Delete

Hola a todos,

Necesito hacer una consulta en SQL y no se como hacerla. Tengo delphi 5.

Tengo una tabla con 4 campos: CODIGO, CLAVE, REVISION, MAQUINA, no tengo ningun tipo de clave.
lo que quiero hacer es borrar todos los registros que cumplan como condicion que CODIGO, CLAVE, REVISION sean iguales a unos parametros fijos que le doy (TextEdit), y que el campo MAQUINA no esté dentro de un rango de valores que está dentro de un ChekListBox.

es decir borrar todos los registros que tengan los tres primeros campos fijos a unos valores que le doy, y que para el ultimo campo sean distintos a los seleccionados por el CeckListbox.

No me he explicado muy bien, pero de todas formas gracias a todos
Responder Con Cita
  #2  
Antiguo 26-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Siempre que hagas consultas de este tipo es bueno que especifiques la base de datos que usas así como el tipo de datos de los campos.

No teniendo esos datos voy a suponer que todoslos campos son enteros.

La consulta podría ser ago así como

Código:
delete from tabla
where
  codigo = :codigo and
  clave = :clave and
  revision = :revision and
  (maquina < :primer_valor or maquina > :ultimo_valor)
suponiendo que el rango que no debe abarcar maquina es consecutivo.

Al correr la consulta sustituyes los parámetros:

Código:
Query.ParamByName('codigo').AsInteger := valor de codigo;
Query.ParamByName('clave').AsInteger := valor de clave;
Query.ParamByName('revision').AsInteger := valor de revision;
Query.ParamByName('primer_valor').AsInteger := primer valor del rango;
Query.ParamByName('ultimo_valor').AsInteger := ultimo valor del rango;
// Saludos
Responder Con Cita
  #3  
Antiguo 26-03-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 22
mrmanuel Va por buen camino
Cierto, fallo mio, no he especificado lo suficiente.


la base de datos es InterBase,

para acceder a los datos utilizo: IBTransaction, IBDataSet, IBDataBase.

Los tipos de datos son Char [de n caracteres],

las maquinas las tomo de un ScrollBox que lleva un campo de tipo Check.
y el problema está en que el rango de maquina no es consecutivo, ejem:

MAQUINA: los [x], son check's o como se llame.
001 [x]
005 [x]
038 [x]
123 [x]
250 [x]

el usuario quita o pone los check's y pulsa el boton correspondiente, y es aqui donde tengo que eliminar todas las máquinas que no estén selecciondas.


creo que ahora lo he explicado un poc mejor.

saludos
Responder Con Cita
  #4  
Antiguo 26-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La condición para la consulta SQL tendría que ser del estilo de:


Código:
where
  ... and
  maquina in ("001", "005", "123")
suponiendo que se seleccionaron las casillas 001, 005 y 123, de manera que el parámetro sería una lista de valores:


Código:
where
  ... and
  maquina in (:valores)
En la prueba que hice ayer con Paradox no me permitió introducir tal tipo de parámetros e ignoro si en Interbase puede realizarse, así que mientras llega un experto en la materia veamos de hacerlo "a pie".

Reconstruyendo la sentencia desde el comienzo yo declararía una constante (o variable según prefieras) así:


Código:
const
  fmtSql = 
    'delete from tabla ' +
    'where ' +
    'codigo = "%s" and clave = "%s" and revision = "%s" and ' +
    'maquina in (%s)'
Aquí la cadena no se pasa directamente al query sino que se le da formato con la función Format:

Código:
Format(fmtSql, [Codigo, Clave, Revision, Maquinas])
donde Codigo, Clave y Revisión son cadenas con los valores provenientes de los Edit (o directamente Edit.Text) y Maquinas es una cadena formada por la lista separada por comas de los valores correspodientes a las casillas seleccionadas. Esta es la parte "pesada" pues para construir tal lista tendrás que recorrer todos los ítemes del CheckListBox y agregar un valor por cada ítem seleccionado:

Código:
var
  I: Integer;

begin
  Maquinas := '';
  for I := 0 to Pred(CheckListBox.Count) do
    if CheckListBox1.Checked[i] then
      if Maquinas = ''
        then Maquinas := QuotedStr(CheckListBox.Items[i])
        else  Maquinas := Maquinas + ',' + QuotedStr(CheckListBox.Items[i]);
end;
QuotedStr es necesario para introducir las comillas que se requieren alrededor de cada valor.

Con estos valores de Codigo, Clave, Revison y Maquinas el resultado de Format será la cadena que debes pasar a la consulta SQL:

Código:
Query.SQL.Text := Format(...);
// Saludos
Responder Con Cita
  #5  
Antiguo 29-03-2004
cahp cahp is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 90
Poder: 22
cahp Va por buen camino
Hola:

En Interbase hasta lo que yo se, tambien hay que hacerlo asi. o bien
otra forma es la que yo utilizo, no para casos como este pero parecidos, sobre todo para selecciones multiples, por ejemplo eljir facturas de varios clientes, y es:

tengo en interbase una tabla solo para selecciones de este tipo, con un campo clave, uno de texto y otro numerico, lo que hago es grabar esas selecciones en esa tabla y despues la consulta la hago sobre esta es decir:

delete from tabla
where
codigo = :codigo and
clave = :clave and
revision = :revision and
maquina not in (select codigostr from tablaseleccion)

lo unico que para aplicaciones cliente servidor, tienes que crear una clave unica para la sesion para que si hay varias maquinas haciendo esa misma consulta el campo clave, le indique si es seleccion suya o no, asi como eliminar una vez realizadas las consultas las lineas de la tabla para esa sesion.


Espedo haberte ayudado, si tienes dudas, me lo comentas.

Saludos
Responder Con Cita
  #6  
Antiguo 30-03-2004
mrmanuel mrmanuel is offline
Miembro
 
Registrado: may 2003
Posts: 135
Poder: 22
mrmanuel Va por buen camino
Hola y gracias a todos.

La idea de CAHP, ya la tuve en cuenta, y el problema me surgía a la hora de hacer el segundo select, que no sabia como pasarle los valores seleccionados.
Para hacer esto estuve probando creándome un conjunto de datos, pero me daba errores de compilación. No se me había ocurrido hacer lo de la lista de valores que me ha comentado ROMAN. Creo que la idea de ROMAN parece mas correcta de que como yo lo tenía hasta ahora, borrar todos los valores que cumplan la condición y luego insertarle los que estaban seleccionados.



Gracias nuevamente, Pruebo y ya os comento.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:07:27.


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
Copyright 1996-2007 Club Delphi