FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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) 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; |
#3
|
|||
|
|||
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 |
#4
|
||||
|
||||
La condición para la consulta SQL tendría que ser del estilo de:
Código:
where ... and maquina in ("001", "005", "123") Código:
where ... and maquina in (:valores) 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)' Código:
Format(fmtSql, [Codigo, Clave, Revision, Maquinas]) 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; 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(...); |
#5
|
|||
|
|||
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 |
#6
|
|||
|
|||
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. |
|
|
|