Problema con acceso ODBC

Cordial Saludo,

Tengo un problema con un servidor 4D version 13 ejecutandose en un Mac OS Yosemite. Por ser este un sistema operativo de 64 bits casi todas sus aplicaciones son de 64 bits, pero 4D server sigue siendo de 32 bits.

Tengo que acceder a la base de datos 4D desde otra aplicación no 4D desde otro sistema equipo que tiene instalado el sistema operativo Mac de 64bits, para ello es necesario instalar el driver de 64 bits para 4D v13 en esta maquina, pero obviamente es imposible por que no existe driver para Mac de 64 bits para V13.

Que opciones tengo para poder acceder desde un Mac a 4D server de otro Mac? pero sin usar 4D? es decir usar Java, Python, o incluso c# ?

Gracias de antemano.

Buenos días Jaime:

Primero quiero hacer un precisión respecto a:

: Jaime ALVAREZ

pero 4D server sigue siendo de 32 bits.

4D Server desde 4D v15 es 64 bits. También en esta versión hay drivers ODBC de 64 bits.

: Jaime ALVAREZ

Que opciones tengo para poder acceder desde un Mac a 4D server de
otro Mac? pero sin usar 4D? es decir usar Java, Python, o incluso c# ?

Una alternativa para acceder 4D Server v13 es utilizar el driver ODBC de 4D para v15 que se puede descargar de:
http://download.4d.com/Products/Current/4D_v15_4/ODBC/Mac/4D_ODBC_Driver_v15.4_Mac_64-bit.zip

Otra alternativa es desarrollar un servicio web ya sea SOAP o REST para que se pueda acceder desde Java, Python u otro.

Saludos,

Hola Angelo,

Agradezco tu nota de precisión con respecto a la arquitectura del server, quiero aclarte que estaba pensando solo en la version 13 que es de 32 bits.

En cuanto a que si es posible instalar la version de 64 bits del controlador ODBC correspondiente a la versión 15 para acceder a 4D V13 server, he seguido las siguientes instrucciones para instalar dichos controladores en mac usando el siguiente URL:
http://doc.4d.com/4Dv15/4D/15.2/Installing-an-ODBC-driver-on-OS-X.300-2885364.en.html

Pero luego de intentar hacer el test para corroborar que no existen problemas con la conexión he encontrado el mismo error en distintas versiones de Mac OS: ( El Capitan ) (favor ver adjuntos)

Error 01000: General Warning
Error 08004: Server Rejected the connection: Failed to Authenticate.

[]20760054;“Error General Warning”[/]

[]20760056;“Error Failed to autenticate”[/]

En Yosemite obtengo los siguientes resultados al hacer el Test de la conexión ODBC con el server en el Localhost:

[]20760110;“Resultado del Test en Yosemite…”[/]

Lo extraño es que al hacer el test desde Windows con con 32 y 64 bits con el usuario Designer (sin password) la conexión es exitosa, pero en cambio desde Mac siempre muestra esos errores. Estoy seguro de haber introducido el usuario correctamente. Estare haciendo caso omiso de algún detalle? o acaso puedo pensar que existe un fallo en el Driver ODBC de 64 bits?

[]20760068;“Test exitoso desde Windows …”[/]

Si logro superar estos errores procederé a probar el driver ODBC desde un programa diferente a 4D.

Espero tus comentarios y gracias de antemano.

Jaime A.

Hola Jaime:

En vez de usar localhost, prueba con 127.0.0.1 como dirección del servidor.

En el Explorador, cerciórate de borrar el método de On SQL Authentication con el botón [-]

En la configuración del driver ingresa la siguiente información:
Server = 127.0.0.1
Port = 19812
UID = odbc
PWD = odbc
SSL = false
PhysicalConnectionTimeout = 30
LoginTimeout = 30
QueryTimeout = 240
DefaultPageSize = 400
FavouriteImageFormats = .png
NetworkCacheSize = 128
CharsEncoding = UTF-8
OpenQuery = true
MSAccess = false

Baja el driver ODBC de 4D v16, me dio mejores resultados:
http://download.4d.com/Products/Current/4D_v16_2/Installers/ODBC/Mac/4D_ODBC_Driver_v16.2_Mac_64-bit.zip

Saludos,

Hola Angelo.

He seguido tus instrucciones al pie de la letra, pero sigue mostrando el error de autenticación usando el driver de 64 bits para acceder tanto a un 4D server V15 64bits y a un 4D Server V13 de 32 Bits.

Al hacer el test intentando acceder a la version 13 de 4D Server 32 bits tengo este error:

[]20769232;“Resultado en 4D Server v13 32 bits”[/]

Al hacer el test intentando acceder a la version 15 de 4D Server 32 bits tengo este error:

[]20769244;“Resultado en 4D Server v15 64 Bits”[/]

Incluso he intentado borrar el Metodo solicitado pero este no se deja borrar.

[]20769256;“Borrado metodo ON SQL Authentication”[/]

No estoy muy seguro que sobre Mac sea posible usar una version de 64 bits (version 16) intentando acceder una version 13 de 4D que corre a 32 bits. Sino estoy mal alguna vez lei que era necesario que coincidieran las versiones del ODBC con las de 4D. Aunque con tu información no estoy seguro ahora.

He probado en otras versiones de Mac (Yosemite, Sierra) y tienen el mismo problema.

Tu hiciste las pruebas sobre Mac? Sobre Windows todo funciona perfecto incluso el cruce de versiones de ODBC de 32 y 64 accediendo a 4D Server. El problema soloocurre sobre Mac.

Creo que a mi se me acabaron las opciones, tienes alguna otra idea? Lo agradecería mucho.

Saludos

Jaime:

Según tu pantallazo parece que el método On SQL authentication no está borrado. mira que tiene barra de desplazamiento y además los botones Preview y Comments. Intenta nuevamente borrar con el botón [-]

Saludos,

Gracias Angelo.

Para documentar la solución de este tema en este foro agrego la solución:

Solo basta adicionar las siguientes lineas en el método On SQL Authentication:

<code 4D>

// $1: usuario
// $2: contraseña
// {$3: dirección IP del cliente}

C_TEXT($1;$2;$3;$4)
C_BOOLEAN($0)

CHANGE CURRENT USER(“Administrator”;"")

If (OK=1)
$0:=True
Else
$0:=False
End if

</code 4D>

La siguiente documentación aclara lo que sucede al usar el comando CHANGE CURRENT USER en el método On SQL authentication: http://doc.4d.com/4Dv15/4D/15/Metodo-de-base-On-SQL-Authentication.300-2007433.es.html

Lo anterior permite que el acceso ODBC sea posible.

Jaime:

Claro, el método On SQL Authentication es necesario una vez se configure el driver y una vez se definan los diferentes grupos en el esquema de acceso por defecto en las propiedades SQL de la base.

Saludos,

Angelo muchas gracias por tu ayuda en la solución de este problema.

Me quedan algunos sinsabores que debo mencionar:

  1. Con el tema del codigo en el método: Si desde windows puedo acceder a la base de datos desde casi cualquier cliente (C#, Java etc) sin tener que pensar en hacer cambios en ese metodo On SQL Authentication por que desde Mac hay que hacer cambios en dicho método?.

  2. Uno supondría que el driver debe trabajar de la misma forma en Mac y Windows pero no es así. Ademas el acceso desde Mac via ODBC esta supremamente restringido ya que con los tips que me mandaste hay que usar productos de terceros para acceder a 4D desde Mac. como PDO para 4D o desde python. que no sabemos si funcionarán correctamente.

  3. Sabemos que para acceder a los datos fácilmente desde cualquier plataforma una opción es crear un API REST, pero en versiones viejas de 4D como V13 solo existe la opción de crear SOAP Web services estos esfuerzos requieren tener muy claro el tema de licenciamiento que de pronto lo hacen no viable, aún sabiendo que existe un driver ODBC.

  4. Si la base de datos esta compilada la podré solo acceder desde Windows por que desde Mac no será posible por el problema de la autenticación y al no tener acceso al codigo fuente, esto no sera posible.

  5. La idea de crear un driver para Mac o Windows es no tener que depender de terceras soluciones, la documentación dice que sería posible acceder desde Java, C# u otras, esto es cierto desde Windows, pero desde Mac no lo es. No he podido ver un solo ejemplo FUNCIONAL de acceso desde Mac a una base de datos 4D server.

Para efectos de documentación dejo estos links suministrados por Angelo sobre otras formas de acceder a 4D desde una Mac:

http://kb.4d.com/assetid=76914

Desde Python:

Dejaré este tema abierto hasta encontrar un ejemplo funcional de como acceder 4D desde una Mac. Estaré publicando la solución para beneficio de todos los desarrolladores 4D.

Saludos,

Jaime A.

Jaime:

Gracias por tus comentarios e inquietudes. Solucionando tus inquietudes.

  1. Por definición se debe tener el método On SQL Authentication como indica la documentación. Aunque en mi base de pruebas funciona correctamente en Mac sin necesidad de tener el método On SQL Authentication, incluso con la base de datos de pruebas que me enviaste, sería necesario que revisaras las propiedades de acceso SQL en tu base de datos.

Por otro lado la utilización del método On SQL Authentication se recomienda para aumentar la seguridad del acceso a la base de datos.

  1. No hay que confundir ODBC con PDO, son cosas muy diferentes. ODBC está pensado principalmente para aplicaciones de escritorio mientras PDO es para soluciones web desarrolladas con PHP. Supongo que te refieres a cualquier acceso SQL desde el exterior a 4D.

  2. Con 4D v13 se puede desarrollar un API REST. Basta con tener la licencia de servidor web.

  3. Eso depende del desarrollador de la aplicación si quiere o no dar acceso a la base de datos por SQL.

  4. ODBC es una tecnología nacida para Windows, no es algo común en el mundo Mac. La prueba es que si por ejemplo tú quieres acceder a una base SQL Server usando ODBC desde Mac, debes pagar por el driver.

Sin embargo el driver ODBC de 4D sí funciona en Mac. Si no hay ejemplos es porque no es una funcionalidad popular o que llame la atención.

Es por esto que se recomienda implementar tecnologías como REST.

Saludos,

Hola Angelo,

Entiendo perfectamente tus comentarios. Muchas gracias.

Una cosa: Puedes decirme donde puedo documentarme para implementar servicios API REST usando versiones 4D v13 y superiores?

Saludos y gracias de nuevo.

Jaime A.

Hola todos.

Gracias a un tercero he obtenido este ejemplo de acceso a una base de datos usando Node.js, desconozco quien es el autor de esta libreria Node-4d pero le agradezco su colaboración, no utiliza ODBC solo es acceso TCP a 4D.

Funciona perfectamente desde Mac y Windows. Lo único es que deben instalar node.js desde aqui: https://nodejs.org/en/download/

para probarlo solo deben cambiar la IP, el puerto de su server 4D, ademas del nombre de la tabla y nombres de campos a los cuales de quiere acceder.

Adjunto los archivos y la librería:

http://forums.4d.com/4DBB_Main/x_User/4517/files/20782192.zip

Deben ejecutarlo con el comando: node 4dAccess.js:

[]20782226;"Ejecución del test usando node "[/]

Saludos,

Jaime A.

Anexo una solución para acceder a 4D usando el Driver ODBC 64bits desde PHP ejecutandose en un Mac OS X El Capitan.

  1. Instalar una distribución de PHP para Mac que tenga la extensión ODBC:

$ curl -s https://php-osx.liip.ch/install.sh | bash -s 5.6

  1. Adicionar al PATH La nueva instalacion:

$ export PATH=/usr/local/php5/bin:$PATH (This is temporal)

  1. Verificar la versión de PHP instalada en su Mac:

$ php -version

PHP 5.6.31 (cli) (built: Aug 17 2017 16:41:40)
Copyright © 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright © 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright © 1999-2016, by Zend Technologies
with Xdebug v2.5.3, Copyright © 2002-2017, by Derick Rethans

  1. Instalar el driver ODBC para mac y Verificar que la conexión ODBC si se conecte a 4D, puede usar iODBC para probarla.

  2. Probar el script adjunto. cambie el nombre del DSN y User Name a su conveniencia.

$ php test.php

Contenido del archivo tesp.php:

<?php $dsn = 'Server4Dv16x64'; //DSN created by the 4D ODBC driver $user = 'Designer'; $pswd = ''; /* Open connection and get records from table Countries */ $conn = odbc_connect($dsn,$user,$pswd); if(!$conn) die("Connection failed"); $sql = "SELECT code, name FROM Countries"; $rs=odbc_exec($conn,$sql); if (!$rs) {exit("Error in SQL");} // Print selected records printf("\n\n %s \t %s \n","Country Code","Country Name"); printf(" %s \t %s \n","------------","---------------------------------"); while (odbc_fetch_row($rs)) { $seq=odbc_result($rs,"code"); $name=odbc_result($rs,"name"); printf(" %s \t\t %s \n",$seq,$name); } odbc_close($conn); printf("\n\n"); ?>

Espero les haya servido esta información.