Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Tablas Relacionadas y SQL (https://www.clubdelphi.com/foros/showthread.php?t=46877)

Deiv 12-08-2007 15:56:46

Tablas Relacionadas y SQL
 
Hola,
Tengo una BD de Química Relacionada en Access y quizá por este lado no se me entienda, por ello he tratado de asemejar lo que deseo obtener con un ejemplo casi similar al de abajo donde se relacionan Tabla1-> Tabla2-> Tabla3:
Código:


TABLA1
IdDepto    Nombre
D1          Departamento1
D2          Departamento2
D3          Departamento3
 
TABLA2
IdOficina    Descripcion  IdDepto
OF1          Oficina1      D2
OF2          Oficina2      D1
OF3          Oficina3      D1
 
TABLA3
Muebles      IdOficina
Mesa          OF1
Silla        OF1
Vitrina      OF1
Estante      OF2
Librero      OF2
Mesa          OF2
Silla        OF3
Librero      OF3
Mesa          OF3
Vitrina      OF3

- ¿Cúal sería el código SQL para mostrar únicamente de D1 y la OF3 los valores de Muebles?
- ¿Cúal sería el código SQL para mostrar TODOS los Muebles del D1 (OF2 + OF3)

De repente digais que no está muy bien Relacionada (confeccionada) mi BD, el objetivo de la BD Química es mostrar en alguna línea de mi código las Valencias de No Metales DIFERENCIANDO las negativas de las positivas (Ej. Cloro= -1+1+3+5+7). Para el caso IdDepto llegaría a ser el Nombre del No Metal (Elemento), IdOficina vendría a ser como "positivas" ó "negativas", etc, cada una de ellas contendría en la Tabla3 (Muebles) sus valores (-1+1+3+5+7). Pues trato de crear TRadioButtons en tiempo de ejecución según el Elemento (No Metal) seleccionado, crearía la CANTIDAD de TRadioButtons que tenga cada uno como valores y de Caption mostraría sus contenidos; pero esa es otra pregunta, primero necesito salir de dudas de aquellas 2 consultas que les mencioné, por favor

Caral 12-08-2007 16:19:30

Hola Deiv
Que base de datos usas?
Si puedo te ayudo, con gusto.
Saludos

Deiv 12-08-2007 16:35:26

Uy!.... que olvido, pues estoy con Access, mis perdones. Y en mi aplicación estoy trabajando con TADOQuery.

Caral 12-08-2007 16:52:53

Hola
Coloca la tabla aqui en un zip, vere que puedo hacer.
Si tenes el codigo del programa y no es muy grande lo puedes subir tambien.
Saludos

Deiv 12-08-2007 22:27:20

En realidad, ni tengo Delphi a mano, ni escribo de casa sino que desde un Cyber, lo traeré mañana para que lo observen, pero..... en realidad es solo ese ejemplo que puse, que si viera la forma de: cómo encarases el código SQL relacionado a mi pregunta sería suficiente para darme cuenta; pues aquellos ítemes que puse de ejemplo son los mismos que tengo preparado en mi BD hecha en Access.
Lo otro la Aplicación "Química" aún no está muy bien confeccionada, tampoco tendré problemas con la creación de los objetos, solo requiero esas 2 consultas inicilamente por fis.

Caral 12-08-2007 22:34:22

Hola
Que dificil sin ver, bueno para mi, aqui hay un ejemplo, no se si es lo que buscas, necesito la base de datos, soy novato, no lo se hacer al aire.
Ejemplo:
Código SQL [-]
SELECT Clientes.CodCliente, Clientes.NombreCliente, CxCobrar.CodTransac, CxCobrar.TipoTransac, CxCDetalle.Documento, CxCDetalle.Monto, CxCDetalle.TipoDocumento
FROM (Clientes INNER JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente) INNER JOIN CxCDetalle ON CxCobrar.CodTransac = CxCDetalle.Documento;
Esto es en base a otra tabla, pero te indica la secuencia.
Saludos

Deiv 12-08-2007 22:49:00

Gracias Caral por responder nuevamente, pero te prometo que tal como escribí textualmente en mi primer post, así igualito lo tengo la BD en Access (sin mas ítemes). De todos modos mañana lo adjunto. Y relacionado a mi post:
Cita:

Empezado por Deiv
- ¿Cúal sería el código SQL para mostrar únicamente de D1 y la OF3 los valores de Muebles?

Cita:

Empezado por Deiv
- ¿Cúal sería el código SQL para mostrar TODOS los Muebles del D1 (OF2 + OF3)

Ahí es precisamente donde voy lidiando. Voy a revisar tu ejemplo (me es nuevo el Inner Join) pero además ¿cómo obtener dicho filtrado sobre mis preguntas???

Caral 12-08-2007 22:53:39

Hola
Truco:
Usas access, pues este tiene un generador de consultas, puedes hacer una consulta usando el asistente y ver el codigo sql que genera, lo puedes pulir lo que necesites, se aprende mucho.
Este codigo, lo copias y lo pegas en delphi, funciona.:D
Saludos

Deiv 13-08-2007 00:28:34

Gracias por el Truco en esto había pensado aquella vez que empezaba con SQL (recientemente) me resultaba más cómodo copiarlo que pensar el código correspondiente, observé algo en ese "trajín" de muchas consultas que realicé trabajando en Access (quizá esté Yo mal) nunca vi la sentencia where, hablo inclusive de tablas relacionadas, ¿será aquí donde debo entender que existen muchas versiones de SQL?? :( ; pues si fuera así relacionado a mi post como aplicar esta sentencia where.?

Delphius 13-08-2007 04:02:53

Cita:

Empezado por Deiv
(...)pues si fuera así relacionado a mi post como aplicar esta sentencia where.?

La clausura where va al final de una consulta (excepto cuando hay una clausura ORDER BY, O HAVING).

Recuerda que el orden es:
SELECT: Lo que se desea obtener
FROM: De donde hay que obtener
WHERE: Alguna condición que deban cumplir

Una instrucción WHERE está constituída por al menos una condición. Es decir:

WHERE condicion

Donde condición puede tiene esta forma:

(ElCampo OPERADOR parametro). Ejemplo de operadores: =, <=, >=, AND, OR, NOT.

Bueno... como ejemplo:

- ¿Cúal sería el código SQL para mostrar únicamente de D1 y la OF3 los valores de Muebles?

Código SQL [-]
SELECT Tabla3.Muebles
FROM (Tabla1 INNER JOIN Tabla2 ON Tabla1.idDepto = Tabla2.idDepto)
         INNER JOIN Tabla3 ON Tabla2.idOficina = Tabla3.idOficina
WHERE (Tabla1.idDepto = D1) AND (Tabla2.idOficina = OF3)

Y la expresión "equivalente":
Código SQL [-]
SELECT Tabla3.Muebles
FROM Tabla1, Tabla2, Tabla3
WHERE (Tabla1.idDepto = Tabla2.idDepto) AND (Tabla2.idOficina = Tabla3.idOficina) AND (Tabla1.idDepto = D1) AND (Tabla2.idOficina = OF3)

La instruccion INNER JOIN sirve para obtener un encuentro natural entre las tablas y se desea obtener en una consulta los campos que pertenecen a una o más tablas. Omite los nulos. En cambio emplear por condiciones del tipo AND es más liviana: no es restrictiva con respecto a los nulos.

Espero que te sea util mi breve y corto resumen introductorio al SQL.

Saludos,

Deiv 14-08-2007 15:26:33

Gracias por tan didáctica explicación. He probado vuestro código y, por alguna razón sale este error:
Código:

Raised exception class EOleException with message 'El parámetro D1 no tiene un valor predeterminado'
De tanto averiguar y hacer algunos "experimentos" con el código en Access, pude comprobar que sololamente le faltan comillas a "D1" y "OF3" y luego funciona a la perfección.
Agradecer a Delphius y Caral por la preocupación prestada. Gracias amigos es bueno saber que siempre vamos a disponer de vuestra ayuda en el Foro.
Saludos
Deiv


La franja horaria es GMT +2. Ahora son las 23:50:18.

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