Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Crear SubConsulta en Sql con datos desde Tabla (https://www.clubdelphi.com/foros/showthread.php?t=68762)

RRenault 05-07-2010 19:32:43

Crear SubConsulta en Sql con datos desde Tabla
 
Saludos a Todos:
Estoy tratando de crear una subconsulta donde los campos y la tabla estan alojados en una tabla de configuracion. Tengo varios tipos de clientes que sus datos estan en tablas diferentes, pero cuando hago por ejemplo un recibo de ingreso elijo el tipo de cliente y la tabla de sus datos.

la tabla de Configuracion contiene el Tipo de Cliente, la base de datos y el campo de nombre de cliente almacenado.

el Qry es el siguiente:

Select a.Reci_Numero, a.Tipo_Codigo, a.Clte_Codigo,
'( Select ' + rtrim(b.clte_descripcion) + ' from ' + rtrim(b.Clte_Database)+ ')' as Clte_Descripcion
From Recibos_Ingresos a INNER JOIN Tabla_Tipos_Clientes b ON a.Tipo_Codigo = b.Tipo_Codigo

Donde b.CLTE_DESCRIPCION = 'CLTE_NOMBRES' o 'MDCO_NOMBRES'
y b.CLTE_DATABASE = 'DB_INVENTARIOS.DBO.TABLA_DE_CLIENTES' o 'DB_CONSULTORIO.DBO.TABLA_DE_MEDICOS'

El resultado es el siguiente:
1063, 2, 4, ( SELECT MDCO_NOMBRES from DB_CONSULTORIO.DBO.TABLA_MEDICOS)

En lugar de:
1063, 2, 4, DR. LEONARDO ROSARIO

Estoy usando SQL Server 2000
Windows Vista
Gracias.

ContraVeneno 06-07-2010 01:25:08

la única opción que se me viene a la mente es utilizar una consulta dinámica con un procedimiento almacenado....

The Curse and Blessings of Dynamic SQL


SQL Stored Procedure - update column/table names via variable

RRenault 07-07-2010 01:52:04

Gracias ContraVeneno, probare en los link A ver si puedo lograr algo.

fjcg02 07-07-2010 14:03:42

Es normal que te devuelva eso, estás pasando un literal, la select está entrecomillada.

Puedes hacer una cosa:

Una función
Select a.Reci_Numero, a.Tipo_Codigo, a.Clte_Codigo,
FUNCIONNOMBRE(b.clte_descripcion,b.Clte_Database) as Clte_Descripcion
From Recibos_Ingresos a INNER JOIN Tabla_Tipos_Clientes b ON a.Tipo_Codigo = b.Tipo_Codigo

siendo la funcion quien te devuelva el valor que obtiene (b.clte_descripcion) la select. Ahora, creo que te falta una pieza, que es el código del cliente (a.Clte_Codigo), ya que entiendo que dependerá el valor de lo que devuelva del valor del código.

quedaría así la select modificada

Select a.Reci_Numero, a.Tipo_Codigo, a.Clte_Codigo,
FUNCIONNOMBRE(a.Clte_Codigo, b.clte_descripcion,b.Clte_Database) as Clte_Descripcion
From Recibos_Ingresos a INNER JOIN Tabla_Tipos_Clientes b ON a.Tipo_Codigo = b.Tipo_Codigo

siendo la función la que monte la select

SELECT b.clte_descripcion FROM b.Clte_Database WHERE IDCLIENTE = a.Clte_Codigo

y devuelva el dato.

Nos cuentas.

Saludos

RRenault 08-07-2010 16:26:00

Gracias por Contestar fjcg02, Hice mas o menos lo siguiente, pero me devuelve lo mismo:



CREATE FUNCTION BuscaCliente(@Clte_Codigo Integer, @Clte_Campo VarChar(40), @Clte_Database VarChar(40), @Tipo_Codigo Integer )
RETURNS VarChar(150) as
BEGIN
declare @Clte_Nombre as varchar(150)
set @Clte_Nombre =

( Select ( ' Select ' + Rtrim(Clte_Descripcion) + ' From ' + Rtrim(Clte_Database) + ' Where ' + Rtrim(Clte_Codigo) + ' = ' + Cast( Clte_Codigo as Char(10)))
From Tabla_Tipos_Clientes Where Tipo_Codigo = @Tipo_Codigo )

return @Clte_nombre
end


Select a.Reci_Numero, a.Tipo_Codigo, a.Clte_Codigo,
dbo.BuscaCliente(a.Clte_Codigo, b.clte_descripcion, b.Clte_Database, b.Tipo_Codigo) as Clte_Descripcion
From Recibos_Ingresos a INNER JOIN Tabla_Tipos_Clientes b ON a.Tipo_Codigo = b.Tipo_Codigo


No se si estoy haciendo algo mal.

fjcg02 08-07-2010 23:17:47

Hola,
no se SQL Server, pero basándome en lo que escribes, podría ser lo siguiente


Código SQL [-]
CREATE FUNCTION BuscaCliente(@Clte_Codigo Integer, @Clte_Campo VarChar(40), @Clte_Database VarChar(40), @Tipo_Codigo Integer )
RETURNS VarChar(150) as
BEGIN
declare @Clte_Nombre as varchar(150)

Select  @Clte_nombre=@Clte_Descripcion  From @Clte_Database Where  @Clte_Codigo' =@Clte_Codigo
From Tabla_Tipos_Clientes Where Tipo_Codigo = @Tipo_Codigo

return @Clte_nombre
end

Se supone que la select sólo devuelve un valor, por supuesto.

Saludos

RRenault 09-07-2010 05:44:59

Aqui se produce un error:

Select @Clte_nombre=@Clte_Descripcion From @Clte_Database Where @Clte_Codigo =@Clte_Codigo
From Tabla_Tipos_Clientes Where Tipo_Codigo = @Tipo_Codigo



Server: Msg 170, Level 15, State 1, Procedure BuscaCliente, Line 9
Line 9: Incorrect syntax near '='.

fjcg02 10-07-2010 00:00:51

No sé tanto SQLServer como para darte la unción hecha, y tampoco tengo ejemplos para mirar.

Podría ser que @Clte_nombre y @Clte_Descripcion no son del mismo tipo ( VARCHAR (150) ), aunque no estoy seguro.

En Firebird la función es clara, se hace la SELECT campo from tabla where condicion INTO campo

y la variable campo se devuelve.


Mira a ver si encuentras información en la web.

Saludos

fjcg02 10-07-2010 00:11:43

Hola,
me he dado cuenta de que está mal escrita la SELECT.

tiene dos FROM, por lo que no creo que el parser del SQLServer lo trague.

Tendrás que poner algo parrecido a esto

Código SQL [-]
SELECT CAMPO
FROM TABLA1 T1 
INNER JOIN TABLA2 T2 ON ( T1.CODIGO=T2.CODIGO)
WHERE ( aqui la condición que pueda ser necesaria )
Supongo que será

Código SQL [-]
Select Clte_Descripcion From Clte_Database CDB
INNER JOIN  Tabla_Tipos_Clientes TTC ON (CDB.Tipo_Codigo = TTC.Tipo_Codigo
Where Clte_Codigo =@Clte_Codigo


Primero haz que te funcione la SELECT y luego vete poniendo parámetros.

Espero que te sirva.

Saludos


La franja horaria es GMT +2. Ahora son las 00:44:01.

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