Búsqueda formateada segun condiciones en SQL

Una pregunta, he creado la siguiente consulta:

SELECT CASE WHEN $[$1.U_VAH_FormCode.$] IS NOT NULL THEN $[$1.6.$] = 'Empresa' END

Me dá constantemente el siguiente error:

1). [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '='.
2). [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement '' (SWEI) (s) could not be prepared.

He probado a cambiar las comillas simples por dobles, a jugar con los espacios, a añadir coma entre el NULL y el THEN y todo con idéntico resultado.

Os dejo capturas de la info del sistema de esos campos

BF_Type
BF_Type.jpg1886x942 191 KB

BF_Type2
BF_Type2.jpg1822x937 165 KB

¿Alguno me podría indicar donde estoy metiendo la gamba?
Gracias
Un saludo

Me podrias explicar porque usas esto así?:

Desde mi punto de vista creo estas referenciando mal la columna.

Eso es porque lo cogí de otra búsqueda, pero he probado a usar $[$1.6.0] y el resultado es el mismo.
De todas formas, NO TENGO NI IDEA DE SQL más allá de lo que estoy aprendiendo sobre la marcha, y sinceramente referenciar columnas me está trayendo bastantes dolores de cabeza.
Seguro que lo estoy escribiendo mal.
Si puedes sugerirme alguna sintaxis @juliancab para probar te lo agradezco

Lo tienes asi:

SELECT CASE WHEN $[$1.U_VAH_FormCode.$] IS NOT NULL THEN $[$1.6.$] = 'Empresa' END

Debe ser:

SELECT CASE WHEN $[$1.U_VAH_FormCode.0] IS NOT NULL THEN 'Empresa' END
2 Me gusta

Se acerca, pero hay algo que no termina de funcionar, ahora dá igual si el campo Codigo Formación
está informado, selecciona siempre Empresa cuando ejecuto la búsqueda.

¿Podría necesitar usar un argumento tipo ELSE?
Para usarlo, lo suyo sería dejar el campo sin informar,

SELECT CASE WHEN $[$1.U_VAH_FormCode.0] IS NOT NULL THEN 'Empresa' 
ELSE WHEN $[$1.U_VAH_FormCode.0] IS NULL THEN IS NULL END

¿quedaría así?

Muchas gracias por tus consejos @juliancab

SELECT CASE WHEN $[$1.U_VAH_FormCode.0] IS NOT NULL THEN 'Empresa' ELSE NULL END
2 Me gusta

Hola @juliancab sigue fallando…
Si lo dejo como SELECT CASE WHEN $[$1.U_VAH_FormCode.0] siempre informa EMPRESA

Si lo cambio a SELECT CASE WHEN $[$1.U_VAH_FormCode.$] no me selecciona nada al hacer la consulta

Sigo sin ver donde estoy cometiendo el error, y además me acabo de dar cuenta que otras BF relacionadas con ese campo (Codigo Formacion) me están empezando a fallar.

Le daré unos cuantos intentos más y espero encontrar el problema.
Gracias

Bueno, lo que ayude es en corregirte la sintaxis, pero nose cual seria tu requerimiento o coo deseas que funcione, si plasmas algunos ejemplos creo quedaria mas claro.

1 me gusta

Amigo en tu comentario no se ve que has aplicado lo que dijo @juliancab

no veo el ELSE

Además ten en cuenta
Para cabecera
SELECT $[Tabla.Campo]
Para detalle
SELECT $[$Item.Column.Tipo_de_dato]

El tipo de datos es:
• 0 para alfanumérico
• DATE para fecha.
• MONEY para moneda.
• NUMBER para número.

1 me gusta

Hola @Ricardo_Quiro, en la búsqueda puse todos los argumentos, pero solo hice cambios en el SELECT:
$[$1.U_VAH_FormCode.0] VS $[$1.U_VAH_FormCode.$]
Por eso no puse la BF completa.

De todas formas me acabas de dar la vida con este apunte:

En cualquier caso, se me está complicando bastante más este tema…
Inicialmente, el plan de formación lo creé como un UDO de Datos Maestros pero después de meditarlo un poco , pensé que sería mejor cambiarlo a UDO de tipo Documento

Así que borré todas las UDT y BF y creé todo de 0.

Al principio (cuando el plan de formación erá un UDO de tipo Datos Maestros) las BF que había creado me funcionaban bien, y fué cuando empecé a probar está búsqueda con condiciones.

Os dejo una captura para que veáis la estructura de todo esto (igual tenéis que abrirla en una pestaña nueva para poder verla bien, depende de la pantalla que estéis usando):

A continuación os indico las BF que tengo asignadas a los campos de la ventana de Formación (Que es una matriz incrustada en los datos maestros de empleado, vienen por defecto):

CAMPO NOMBRE CAMPO BF
HEM2,Institute Instituto SELECT T0.[U_VAH_FormFor] FROM [dbo].[@VAH_FORMPLAN] T0 INNER JOIN [dbo].[HEM2] T1 ON T0.[DocNum] = T1.[U_VAH_FormCode] WHERE T0.[DocNum] = $[$1.U_VAH_FormCode.0]
HEM2,fromDate De fecha SELECT T0.[U_VAH_FormStrt] AS 'Fecha inicio' FROM [dbo].[@VAH_FORMPLAN] T0 INNER JOIN [dbo].[HEM2] T1 ON T0.[DocNum] = T1.[U_VAH_FormCode] WHERE T0.[DocNum] = $[$1.U_VAH_FormCode.0]
HEM2,toDate A SELECT T0.[U_VAH_FormEnd] AS 'Fecha finalización' FROM [dbo].[@VAH_FORMPLAN] T0 INNER JOIN [dbo].[HEM2] T1 ON T0.[DocNum] = T1.[U_VAH_FormCode] WHERE T0.[DocNum] = $[$1.U_VAH_FormCode.0]
HEM2,diploma Titulo de licenciatura SELECT T0.[U_VAH_FormName] AS 'Denominacion' FROM [dbo].[@VAH_FORMPLAN] T0 INNER JOIN [dbo].[HEM2] T1 ON T0.[DocNum] = T1.[U_VAH_FormCode] WHERE T0.[DocNum] = $[$1.U_VAH_FormCode.0]
HEM2,type Clase de Formacion SELECT CASE WHEN $[$1.U_VAH_FormCode.0] IS NOT NULL THEN 'Empresa' ELSE NULL END

Pues ahora ocurre esto al ejecutar cualquiera de las BF:

Parece como si en las que tiene que arrastrar el valor desde el UDO, me mostrase todos los registros que ya están en otras fichas de empleado.
Y en la BF que me indicó @juliancab siempre toma el valor Empresa, independientemente del valor dado en Código de formación.

La verdad que me estoy quedando un poco estancado en este punto…

¿Puede tener que ver con que un mismo documento pueda estar asignado a varias matrices de formación? ¿Hay alguna sintaxis adicional, específica para matrices, aparte de las dos que me has indicado @Ricardo_Quiro?

Se me ocurre que pueda venir por ahí el error…

De cualquier forma, muchas gracias a los dos por vuestros comentarios.
Un saludo

Encontré la solución (en parte):

Campo BF
HEM2,Institute SELECT T0.[U_VAH_FormFor] FROM [dbo].[@VAH_FORMPLAN] T0 , [dbo].[HEM2] T1 WHERE $[$1.U_VAH_FormCode.0] = T0.[DocNum] AND $[$1.0.0] = T1.[line]
HEM2,fromDate SELECT T0.[U_VAH_FormStrt] FROM [dbo].[@VAH_FORMPLAN] T0 , [dbo].[HEM2] T1 WHERE $[$1.U_VAH_FormCode.0] = T0.[DocNum] AND $[$1.0.0] = T1.[line]
HEM2,toDate SELECT T0.[U_VAH_FormEnd] FROM [dbo].[@VAH_FORMPLAN] T0 , [dbo].[HEM2] T1 WHERE $[$1.U_VAH_FormCode.0] = T0.[DocNum] AND $[$1.0.0] = T1.[line]
HEM2,diploma SELECT T0.[U_VAH_FormName] FROM [dbo].[@VAH_FORMPLAN] T0 , [dbo].[HEM2] T1 WHERE $[$1.U_VAH_FormCode.0] = T0.[DocNum] AND $[$1.0.0] = T1.[line]

Quitando el JOIN y añadiendo:

 AND $[$1.0.0] = T1.[line]

Ya selecciona el registro automáticamente en esos campos.

Pero la BF con condiciones sigue sin funcionar.

Hay alguna forma de meter un WHERE dentro del CASE?
He probado esto:

SELECT CASE WHEN $[$1.U_VAH_FormCode.0] IS NOT NULL 
WHERE $[$1.U_VAH_FormCode.0] = T0.[DocNum] AND $[$1.0.0] = T1.[line] 
THEN 'Empresa' ELSE NULL END

Pero me dá error de sintaxis en WHERE:
1). [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near the keyword 'WHERE'. 2). [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement '' (SWEI) (s) could not be prepared.

Hola @maik_spain, yo no creo sea necesario hacer un subquery dentro de tu CASE
Con esto debería funcionar sin problemas, nos avisas como te fue:

SELECT 
CASE WHEN $[$1.U_VAH_FormCode.0] <> '' THEN 'Empresa' ELSE NULL END
1 me gusta

A la primera @Ricardo_Quiro
Muchisimas gracias!!

1 me gusta