Error al usar Begin SQL con “LEFT OUTER JOIN”

Product :4D - 4D Server
4D : v16R2>OS : Windows

Muy buenas tardes a todo el foro y mucho gusto
Tenemos una consulta respecto al uso de comando Begin SQL con “LEFT OUTER JOIN”. La consulta es una base externa Postgres por Driver ODBC, que luego insertamos en un campo List Box.
Datos del Entorno:

  • Máquina del 4D Mono (Licencia Developer Professional)
    4D v16 R2 build 16R2.209603 64 bits
    Windows Server 2012 R2
    Driver ODBC vq6 64 bit 16.03.00.00
  • Máquina Base SQL
    Windows Server 2012 R2
    Postgres v 9.6.3

Al ejecutar el SELECT utilizando el comando “LEFT OUTER JOIN” la aplicación 4Dv16 muestra el error “4D Dejo de Funcionar” y luego se cierra. Si en lugar de usar LEFT OUTER JOIN usamos INNER JOIN el método funciona sin problema, más allá que el resultado no es el esperado.
Ejemplo del método que cuelga la aplicación:

// ----------------------------------------------------
// Nombre usuario (OS): XXXXX
// Fecha y hora: 30/08/17, 16:43:17
// ----------------------------------------------------
// Metodo: 4DForo
// Descripcion
//
//
// Parametros
// ----------------------------------------------------

C_BOOLEAN(Conecta)
ARRAY TEXT(arDSN;0) //Array de nombre de las datas de ODBC
ARRAY TEXT(arDS_DR;0) //Array con los controladores de ODBC

$myData:=“Data” //Nombre de la base de datos

GET DATA SOURCE LIST(User data source;arDSN;arDS_DR)

If (Find in array(arDSN;$myData)>0)

SQL LOGIN($myData;"postgres";"prueba";*)

If (Ok=1)
	
	Conecta:=True
	
Else 
	
	ALERT("Error en autentificacion en la base de datos")
	Conecta:=False
	
End if 

Else

ALERT("No se encuentra instalado el driver de la base de datos")
Conecta:=False

End if

If (conecta=True)

Begin SQL
	
	SELECT
	definicion_palletizado.codigo,
	definicion_palletizado.descripcion,
	definicion_palletizado.embalaje_id, 
	embalaje.descripcion
	FROM 
	definicion_palletizado inner join embalaje on definicion_palletizado.embalaje_id = embalaje.id
	
	limit
	10
	
	INTO
	:ListaSQL;
	
End SQL

SQL LOGOUT

End if

Desde ya muchas gracias
Saludos desde Argentina
Joaquin Scuccimarra

Hola Joaquin,

¿ Has probado con la R3 o la ultima 4D v16 R4 build 16R4.214911 ?

Yo tube problemas con SQL que se resolvieron en alguna R4

Hola Joaquin:

¿Has visto qué resultado obtienes cuando haces la consulta en Postgres?

¿Por ejemplo, hay datos con valores nulos?

Saludos,

Muy buenas tardes Alfonso, mucho gusto muchas y gracias por tu pronta respuesta .

Realizamos la prueba sugerida, instale el ultimo BetaBuilds 214911 tanto para el 4Dv16 como para el Driver ODBC pero seguimos con el mismo inconveniente, funciona bien si uso INNER JOIN pero se cuelga el 4D si usamos los comando LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN.

Saludos

Muy buenas tardes Angelo como estas? tanto tiempo.

Al ejecutar el query usando LEFT OUTER JOIN se muestran todo los registros de la tabla de la izquierda mas allá que en la tabla de la derecha tenga o no relación, en el caso de no tener relación el campo viene vació.

Así es como se ve la consulta desde la el PgAdmin de Postgres exportado a un txt. En los casos que no encuentra relación en la tabla de la derecha, si el campo es bigint llega sin ningún valor y si es String llega con “”:

“0100248705”;“0100248705”;23241596;“A granel”
“0100248700”;“0100248705”;23241589;“2 Alveoleras de Ctón y PLU”
“0100248805”;“0100248705”;;""
“0100248783”;“0100248705”;;""
“0100248898”;“0100248705”;;""
“0100252029”;“0100248705”;23241596;“A granel”
“0100252034”;“0100248705”;23241592;“4 Bjas,Bja Invertida y PLU”
“0100252045”;“0100248705”;;""
“0100252046”;“0100248705”;;""
“0100252048”;“0100248705”;;""
“0100252047”;“0100248705”;;""
“0100252049”;“0100248705”;;""
“0100252050”;“0100248705”;23251349;“2 Alv Ctón,Bols,100%PapVerde”
“0100252053”;“0100248705”;;""
“0200998889”;“0100248705”;23252322;“Prueba embalaje”
“9999999999”;“0100248705”;23241596;“A granel”
“”;“0100248705”;23241596;“A granel”

esta es la imagen de dicha consulta :

[]20558203;“Your comment here…”[/]

Desde ya muchas gracias

Saludos

Hola Joaquín:

Todo muy bien por acá, y tú qué tal?. Bienvenido al foro.

Al parecer esos valores son nulos. Una solución es convertir los nulos en cadena vacía o 0.

SELECT
definicion_palletizado.codigo,
definicion_palletizado.descripcion,
NULLIF(definicion_palletizado.embalaje_id, 0),
NULLIF(definicion_palletizado.descripcion, ‘’)
FROM definicion_palletizado
LEFT OUTER JOIN embalaje ON definicion_palletizado.embalaje_id = embalaje.id
LIMIT 10
INTO :ListaSQL;

Saludos,

Muy buenos días Angelo, y muchas gracias!

Efectivamente al reemplazar los valores Null de la tabla de la derecha por cero en el caso de los campos bigint y por un texto en el caso de los String, el método funciona sin problema y los resultados son los correcto.
EN el caso particular de la query a la base postgres reemplazamos el NULLIF por COALESCE, así quedo el código final:

“Begin SQL
SELECT
definicion_palletizado.codigo,
definicion_palletizado.descripcion,
(COALESCE(definicion_palletizado.embalaje_id,0)) as “Embalaje ID”,
(COALESCE(embalaje.descripcion,‘null’)) as “Embalaje Descripcion”
FROM
definicion_palletizado LEFT OUTER JOIN embalaje on definicion_palletizado.embalaje_id = embalaje.id
limit
50
INTO
:ListaSQL;
End SQL

¡Nuevamente muchas gracias!

¿Si no es muchos pedir, podrías comentarnos por qué surge este inconveniente y si esto ocurre con todos los valores null de todas las tabla o solo los que intervienen el JOIN?

Saludos

Joaquín,

Acabo de caer en cuenta de que la función que necesitas no es NULLIF (esta hace lo opuesto, que es que si encuentra un valor le asigna nulo).

Lo que necesitas es convertir el nulo en 0 o ‘’. Para eso se usa COALESCE.

SELECT
definicion_palletizado.codigo,
definicion_palletizado.descripcion,
COALESCE(definicion_palletizado.embalaje_id, 0),
COALESCE(definicion_palletizado.descripcion, ‘’)
FROM definicion_palletizado
LEFT OUTER JOIN embalaje ON definicion_palletizado.embalaje_id = embalaje.id
LIMIT 10
INTO :ListaSQL;

Saludos,

Buenísimo Angelo, ¡cruzamos mensajes al mismo tiempo!

Como te consultaba, si no es mucho pedir y podes, coméntanos porque se genera el problema y si esto pasa con todo el campo null de las tablas consultadas o solo los que interviene en los OUTER JOIN.

¡Desde ya nuevamente muchísimas gracias!
Saludos

Buen días, marco el ítem como resulto, muchas gracias todos.

Saludos