SQL - Crear Vista SQL Server

 
Vista:

Crear Vista SQL Server

Publicado por nacho (6 intervenciones) el 05/08/2010 08:13:27
Buenas a todos,
Estoy intentando crear una vista que contendría x campos de una tabla y 1 campo de otra.
La sentencia que he hecho es esta:
USE [NAME_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[MOV_CLIENTES]
AS
SELECT [Customer No_], [Posting Date], [Due Date], [Payment Method], [Document Type], [Document No_], [Document Situation], [Document Status], [Original Amt. (LCY)], [Remaining Amt. (LCY)], [Open], [Name]
FROM dbo.[XXXXX$Cust_Ledger Entry]
INNER JOIN dbo.XXXXX$Customer on dbo.[XXXXX$Cust_ledger Entry].[Customer No_]=dbo.XXXXX$Customer.[Customer No_]
GO

El fallo que me encuentra es el siguiente:
El nombre de objeto 'dbo.XXXXX$Cust_Ledger Entry' no es válido.

La base de datos en la que quiero crear la vista se llama: NAME_DB
Esta base de datos contiene datos de varias empresas. La estructura de tablas para cada empresa se repite diferenciandose la tabla por el nombre de empresa. en este caso XXXXX
La tabla en donde se encuentran todos los campos salvo el campo Name es:
dbo.XXXXX$Cust_Ledger Entry
y la tabla donde se encuentra el campo Name es: dbo.XXXXX$Customer
Estas dos tablas se pueden relacionar por el campo Customer No_ ya que aparece en las dos.


Alguien me podría ayudar por favor? no se mucho de SQL y estoy totalmente atascado.
Muchas gracias.
Saludos,
NACHO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:Crear Vista SQL Server

Publicado por Leonardo Josue (1173 intervenciones) el 05/08/2010 16:17:57
Hola Nacho, no mencionas qué manejador de BD estás utilizando, pero puedo suponer por la sintaxis que se trata de SQL Server... sinceramente no encuentro nada raro en tu consulta. sólo hay un detalle en esta línea

INNER JOIN dbo.XXXXX$Customer on
dbo.[XXXXX$Cust_ledger Entry].[Customer No_] =
dbo.XXXXX$Customer.[Customer No_]

puede ser que el tengas problemas con el identificador $, por lo que sería mejor que lo pongas así

INNER JOIN dbo.[XXXXX$Customer] on
dbo.[XXXXX$Cust_ledger Entry].[Customer No_] =
dbo.[XXXXX$Customer].[Customer No_],

De cualquier manera esto no tienen nada que ver con el error que te está apareciendo, ya que por lo que comentas parece ser que tu tabla dbo.XXXXX$Cust_Ledger Entry no existe en la base de datos o que no tengas permisos de lectura sobre el. ¿si ejecutas sólo la consulta te regresa algún resultado?

Otra recomendación. Mencionas que en la BD manejas los datos de varias empresas, sería conveniente que manejaras un esquema de BD para cada una de ellas, en lugar de tenerlas todas como dbo. es decir, pudieras tener algo como esto en tus tablas.

XXXXX.COSTUMER
XXXXX.CUST_LEDGER_ENTRY
YYYYY.COSTUMER
YYYYY.LEDGER_ENTRY
ZZZZZ.COSTUMER
ZZZZZ.CUST_LEDGER_ENTRY

Se que esto puede ser dificil de implementar sobre todo si ya tienes sistemas trabajando, pero de cualquier manera te hago la observación.

Saludos.
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear Vista SQL Server

Publicado por Nacho (6 intervenciones) el 06/08/2010 08:57:10
Gracias por tu respuesta Leo,

Tal y como dices, uso SQL Server. Voy a seguir probando y te comunico donde está el fallo.

Saludos,
NACHO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear Vista SQL Server

Publicado por Nacho (6 intervenciones) el 06/08/2010 14:31:05
Ya lo he encontrado... el fallo era un espacio!!!
Al final he creado un alias para que fuera todo más fácil:

SELECT MOV.[Customer No_], MOV.[Posting Date],
MOV.[Due Date], CLI.[Payment Method Code],
MOV.[Document Type], MOV.[Document No_],
MOV.[Document Situation], MOV.[Document Status],
MOV.[Open],
CLI.[Name]
FROM dbo.[XXXXX$Cust_ Ledger Entry] MOV
INNER JOIN dbo.XXXXX$Customer CLI on MOV.[Customer No_]=CLI.[No_]

Un par de campos me pueden dar como resultado 0, 1, 2, 3, 4 o 5. ¿qué línea tendría que añadir para que me sustitura cada uno de esos resultados por una palabra?

Ejemplo:

"Document Status" --> resultado posibles 0 ó 1
yo querría que si fuera 0 escribiera el resultado "Pendiente" y si fuera 1 "Pagado"

Muchas gracias por la ayuda!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:Crear Vista SQL Server

Publicado por Leonardo Josue (1173 intervenciones) el 06/08/2010 16:20:38
Hola de nuevo Nacho. Para codificar un resultado puedes hacer uso de la cláusula CASE WHEN, el uso sería más o menos así.

select
case TuTabla.[Document Status]
when 0 then 'Pendiente''
when 1 then 'Pagado'
when 2 then 'Otro'
when 3 then 'Uno más'
else 'No especificado'
end
from TuTabla

Otra solución más formal y que sería conveniente que trataras de implementar es la utilización de tablas catálogo, especificando entonces llaves foraneas entre las tablas. De esta manera haciendo un INNER JOIN hacia los catálogos podrías obtener las descripciones. Si en un futuro tuvieras necesidad de agregar un estatus a tu catálogo, pues no tendrías que modificar nada de código, sólo lo agregarías a la tabla.

Saludos.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear Vista SQL Server

Publicado por Nacho (6 intervenciones) el 18/08/2010 13:34:19
Muchas gracias de nuevo por tu ayuda Leo. He estado unos días fuera y no he podido acceder a Internet para comprobarlo.
Estoy intentando implementar lo que me dices pero no lo consigo. Me sigue dando fallos.

después de varios intentos... (soy novatillo) he conseguido que las subconsultas funcionen, pero dentro de la consulta general hay algo que falla.

he probado así ..:

SELECT MOV.[Customer No_] as Cod_Cliente, MOV.[Posting Date] as Fecha,
MOV.[Due Date] as Vencimiento, FRA.[Payment Method Code] as Forma_pago,
MOV.[Document Type] as Tipo, MOV.[Document No_] as Num_Documento,
(select case MOV.[Document Situation]
when 0 then ' '
when 1 then 'Remesa Registrada'
when 2 then 'Remesa Cerrada'
when 3 then 'PreRemesa'
when 4 then 'Cartera'
when 5 then 'Documentos Cerrados'
else 'No especificado'
end
from XXXXX$Cust_ Ledger Entry] MOV) as Situacion,
(select case MOV.[Document Status]
when 0 then ' '
when 1 then 'Pendiente'
when 2 then 'Pagado'
when 3 then 'Impagado'
when 4 then 'Recirculado'
else 'No especificado'
end
from XXXXX$Cust_ Ledger Entry] MOV) as Estado,
CLI.[Name] as Cliente
FROM XXXXX$Cust_ Ledger Entry] MOV
INNER JOIN dbo.XXXXX$Customer CLI on MOV.[Customer No_]=CLI.[No_]
INNER JOIN XXXXX$Sales Invoice Header] FRA on MOV.[Document No_]= FRA.[No_]

El error que me da:
Mens. 512, Nivel 16, Estado 1, Línea 1
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

y me marca una línea en amarillo a la izquierda de:
las tres primeras líneas, la segunda subconsulta desde el from hasta la línea del último when y el from de la última subconsulta...

¿qué puede estar pasando?
Muchas gracias de nuevo.

Saludos,
NACHO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:Crear Vista SQL Server

Publicado por Leonardo Josue (1173 intervenciones) el 18/08/2010 17:25:38
Hola Nacho, te comento que para codificar una columna no es necesario hacerlo mediante subconsultas, sino poniendo directamente la instrucción case como un campo. Lo que puede estar pasando es que alguna de las subconsultas no te está regresando un valor único, por lo tanto no puede ejecutarse la consulta. Vamos a ver si estoy en lo cierto.

Creo que lo único que tienes que hacer es eliminar la sobconsulta y dejar directamente el CASE WHEN para cada uno de los campos, quedaría más o menos así:

SELECT MOV.[Customer No_] as Cod_Cliente, MOV.[Posting Date] as Fecha,
MOV.[Due Date] as Vencimiento, FRA.[Payment Method Code] as Forma_pago,
MOV.[Document Type] as Tipo, MOV.[Document No_] as Num_Documento,
case MOV.[Document Situation]
when 0 then ' '
when 1 then 'Remesa Registrada'
when 2 then 'Remesa Cerrada'
when 3 then 'PreRemesa'
when 4 then 'Cartera'
when 5 then 'Documentos Cerrados'
else 'No especificado'
end as Situacion,
case MOV.[Document Status]
when 0 then ' '
when 1 then 'Pendiente'
when 2 then 'Pagado'
when 3 then 'Impagado'
when 4 then 'Recirculado'
else 'No especificado'
end as Estado,
CLI.[Name] as Cliente
FROM XXXXX$Cust_ Ledger Entry] MOV
INNER JOIN dbo.XXXXX$Customer CLI
on MOV.[Customer No_]=CLI.[No_]
INNER JOIN XXXXX$Sales Invoice Header] FRA
on MOV.[Document No_]= FRA.[No_]

Intentalo y me comentas los resultados.
Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

FUNCIONA!!

Publicado por Nacho (6 intervenciones) el 18/08/2010 20:55:24
Muchìsimas gracias Leo. Así ya funciona!!
A ver si puedo sacar más tiempo para seguir aprendiendo y poder resolver alguna duda en el foro.
...anda que no me queda todavía por aprender ... :-)

Un saludo,
NACHO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ALGUN RESULTADO NO SALE..

Publicado por NACHO (6 intervenciones) el 19/08/2010 10:56:10
Buenas de nuevo....

me he dado cuenta que no salen todos los resultados de la consulta, en concreto, no muestra los tipos de documento 3 ni 6 (abonos ni reembolsos). ¿por qué puede pasar esto?
El resto me lo saca sin problemas.

SELECT MOV.[Customer No_] as Cod_Cliente,
CLI.[Name] as Cliente, MOV.[Posting Date] as Fecha,
MOV.[Due Date] as Vencimiento,
FRA.[Payment Method Code] as Forma_pago, MOV.[Document No_] as Num_Documento,
case MOV.[Document Type]
when 0 then ' '
when 1 then 'Pago'
when 2 then 'Factura'
when 3 then 'Abono'
when 4 then 'Doc. Interés'
when 5 then 'Recordatorio'
when 6 then 'Reembolso'
when 21 then 'Efecto'
else 'No especificado'
end as Tipo,
case MOV.[Document Situation]
when 0 then ' '
when 1 then 'Remesa Registrada'
when 2 then 'Remesa Cerrada'
when 3 then 'PreRemesa'
when 4 then 'Cartera'
when 5 then 'Documentos Cerrados'
else 'No especificado'
end as Situacion,
MOV.[Remaining Amount (LCY) stats_] as Importe,
case MOV.[Document Status]
when 0 then ' '
when 1 then 'Pendiente'
when 2 then 'Pagado'
when 3 then 'Impagado'
when 4 then 'Recirculado'
else 'No especificado'
end as Estado, VEND.[Name]
FROM dbo.[XXXXX$Cust_ Ledger Entry] MOV
INNER JOIN dbo.XXXXX$Customer CLI on MOV.[Customer No_]=CLI.[No_]
INNER JOIN dbo.[XXXXX$Sales Invoice Header] FRA on MOV.[Document No_]= FRA.[No_]
INNER JOIN dbo.[XXXXX$Salesperson_Purchaser] VEND on CLI.[Salesperson Code]=VEND.[Code]
where MOV.[Remaining Amount (LCY) stats_]>0

Además de esto, he intentado ordenar los resultados de la vista, añadiendo al select lo siguiente:
select top 100 PERCENT
y al final de la consulta ORDER BY MOV.[Customer No_]

Esto tampoco me da fallo pero no ordena los resultados...

Gracias de nuevo por tu tiempo!

Saludos,
NACHO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar