Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Hacer un and en una consulta SQL (https://www.clubdelphi.com/foros/showthread.php?t=65826)

dtomeysoto 15-01-2010 15:43:38

Hacer un and en una consulta SQL
 
Amigos, estoy haciendo una aplicación en Delphi 7. Esta aplicación hace uso de varias tablas Paradox. En una de estas tablas, tengo una con un campo de tipo SHORT llamado INFO. Me gustaria hacer una consulta que me seleccionara los registros que al hacerle un and al campo INFO con un valor entero (máscara) me retorne el valor esperado.

Por ejemplo:

SELECT *
FROM FACTURAS
WHERE (INFO AND 8) = 8

Muchas gracias.

marcoszorrilla 15-01-2010 15:50:11

Según creo que pides:
Código SQL [-]
SELECT *
FROM FACTURAS
WHERE INFO  = 8

Sino es así explícalo más ampliamente.

Un Saludo.

dtomeysoto 15-01-2010 17:31:41

No amigo, no es tan fácil ni tan obvio, al menos lo veo más complicado. El campo info como ya dije es un valor entero y estoy usando los bits para guardar más de una cosa en un único valor.

Por ejemplo, el bit 7 significa que la factura está cancelada, el 6 que fue impresa, el 5, el 4 y el 3 el tipo de factura, etc.

Entonces yo quiero en una consulta seleccionar todas las facturas que no están canceladas (bit 7 = 1) sin importarme el valor que puedan tener los demás bits.

Si pudiera en una sentencia SQL hacer lo siguiente:

Código SQL [-]
SELECT *
FROM FACTURAS
WHERE (INFO AND 128) = 0)

Estaría recuperando todos los registros (facturas) que el bit 7 del campo INFO lo tienen en 0.

Me expliqué mejor esta vez?

marcoszorrilla 15-01-2010 17:55:34

Es que eso en SQL no te va a funcionar al menos en Paradox.

Hubiese sido mejor en el caso de persistir en la idea de guardar en un solo campos tantas cosas utilizar un campo texto de ancho 8, en el que solamente sean válidos los 0 y 1, de esta manera con la función extract te sería fácil hacer lo que quieres.

Un Saludo.

dtomeysoto 15-01-2010 19:23:55

Bueno creo que voy a darme por vencido y probar algo como lo que me dices o sino poner los campos según sean mis necesidades aunque esto uncremente el tamaño de la base de datos.

Quería optimizar el espacio porque esta aplicación es para un PC algo viejito pero bueno no creo que pasando yo tanto trabajo logre mucho.

Gracias a todos, byeee

afunez2007 15-01-2010 20:18:13

Oye eso lo estas complicando mas de lo que deberias, normalmente ese tipo de manejos se hace con un campo de estado, ya sea integer o un campo de tipo varchar de un solo caracter, y guardas los estados por ejemplo:
A=activa
C=cancelada
E=emitida
D=Devuelta
o los que necesites, y luego con un simple where podrias hace lo que necesitas.
Es altamente recomendable que el estado quede independizado del tipo de facturas, y asi facilmente podrias combinar 2 wheres, por ejemplo asumiendo
que tipo 1= Contado y 2=Credito
podria ser asi:
Código SQL [-]
SELECT *FROM FACTURAS WHERE TIPO=1 AND STATUS='E'
Con eso filtrarias las facturas de contado que fueron impresas.
Espero te sirvan estas ideas.

Saludos

rgstuamigo 15-01-2010 20:20:27

Cita:

Empezado por dtomeysoto (Mensaje 350889)
Bueno creo que voy a darme por vencido y probar algo como lo que me dices o sino poner los campos según sean mis necesidades aunque esto uncremente el tamaño de la base de datos.

Quería optimizar el espacio porque esta aplicación es para un PC algo viejito pero bueno no creo que pasando yo tanto trabajo logre mucho.

Gracias a todos, byeee

Por que no hacer esta consulta:
Código SQL [-]
SELECT *
FROM FACTURAS
WHERE INFO >=128 and INFO <=255
Explicacion:
Todos los numero entre 128 y 255 tienen el bit # 7 con uno(1).;)

fer21unmsm 18-01-2010 17:03:22

Entiendo más o menos lo que deseas hacer, me parece que son operaciones con bits yo en sql he usado esto

Ejemplo:
Código SQL [-]
select rper.dni_ruc, rper.nom_usu, rper.clave, ascii(macc.nivel_acceso) & ascii(rol.nivel_acceso)
 from rol_persona 
rper left join roles rol on (rol.id_rol=rper.id_rol) left join mod_acceso macc
 on ((ascii(macc.nivel_acceso) & ascii(rol.nivel_acceso))=ascii(macc.nivel_acceso))
 where macc.id_modulo=@id_mod and rper.dni_ruc=@id_usuario
quizas puedas usar el mismo ampersand pero en sql tuve que usar el valor ascii

saludos.

dtomeysoto 18-01-2010 19:04:59

Y esto se puede hacer en tablas paradox?
Cual es el significado del @?

fer21unmsm 21-01-2010 20:56:24

Cita:

Empezado por dtomeysoto (Mensaje 351060)
Y esto se puede hacer en tablas paradox?
Cual es el significado del @?

Hola el @ son los variables que le paso a la consulta, nunca he usado paradox, pero si hace uso de transact-sql entonces quizá sea válido lo que te pasé

en el caso de la instrucción dentro de la consulta

(ascii(macc.nivel_acceso) & ascii(rol.nivel_acceso), el ampersand hace la operacion and (lógico) a nivel de bits.

Saludos.


La franja horaria es GMT +2. Ahora son las 10:39:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi