Power Builder - DATETIME en SQLServer 2012 y PowerBuilder 12.6 o 12.5

 
Vista:
sin imagen de perfil

DATETIME en SQLServer 2012 y PowerBuilder 12.6 o 12.5

Publicado por Alberto (16 intervenciones) el 03/03/2017 20:38:26
DATETIME en SQLServer 2012 y PowerBuilder 12.6 o 12.5
Migracion de PowerBuilder 8.0 a Powerbuilder 12.6 o 12.5
Necesito que me ayuden estoy migrando de powerbuilder 8.0 a powerbuilder 12.6
Después de que abrí el proyecto en la versión 12.6(ya descargué el crack y está liberado) me convirtió algunas funciones automáticamente como LEN a LENA, MID a MIDA, etc.
El manejador de base de datos es SQL Server 2012 y su intercalación es SQL_Latin1_General_CP850_CI_AI en el idioma Español .
En powerbuilder utilizo el perfil de base de datos Ado .Net, y de Namespace: System.Data.SqlClient y le declaré los formatos para las fechas
El código es el siguiente:

SQLCA.DBMS = "ADO.Net"
SQLCA.LogPass = "Contr4s3N1a"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Namespace='System.Data.SqlClient',DataSource='Compu',Database='BaseDatos'"+ &
",DateFormat='dd/mm/yyyy',DateTimeFormat='dd/mm/yyyy hh:mi:ss.fff',TimeFormat='hh:mi:ss'"
CONNECT USING SQLCA;
// Se abre la ventana
open( v_principal );

El problema que tengo es que en la versión 12.6 cuando intento modificar algún dato en un campo de tipo DATETIME en cualquier tabla me aparece el sig. Error:
Index #0 Source; .Net SqlClient Data Provider Message: Sintaxis incorrecta cerca de '00'. Number: 102 State: 1
En el código primero en una variable STRING cuyo formato es “dd/mm/yyyy” se almacena la fecha
lsFechaCadena = "28/02/2017" // Se ha intentado también con el formato "2017-02-28"
En una variable DATE se pasa el contenido de la variable STRING a través de un cast.
lfFechaAux = DATE( lsFechaCadena )
En una variable DATETIME se pasa el contenido de la variable DATE a través de un cast.
lfFecha = DATETIME( lfFechaAux )
Se insertan los campos en una tabla de la base de datos, uno de los campos es de tipo DATETIME (de SQLServer) y su valor es almacenado a través de la variable de tipo DATETIME(de Powerbuilder). En el script del INSERT se almacena la variable DATIME, se ejecuta y sale el error anteriormente mencionado.
El código completo de la ventana en su evento open es:
LONG llEdad
DECIMAL ldMonto
STRING lsNombre
DATETIME lfFecha

STRING lsFechaCadena
DATE lfFechaAux

llEdad = 44;
ldMonto = 2234.89
lsNombre = "nombre"

lsFechaCadena = "28/02/2017" // "2017-02-28"
lfFechaAux = DATE( lsFechaCadena)
lfFecha = DATETIME( lfFechaAux )
MessageBox(""," FechaAux: "+STRING(lfFechaAux)+char(13)+char(13)+ &
", Fecha: "+STRING(lfFecha)+ char(13)+char(13) )

INSERT INTO tabla VALUES( :llEdad, :ldMonto, :lsNombre, :lfFecha );

IF SQLCA.SQLCODE < 0 THEN
MessageBox("Error", "Error al guardar, "+char(13)+char(13)+ &
" FechaAux: "+STRING(lfFechaAux)+char(13)+char(13)+ &
", Fecha: "+STRING(lfFecha)+ char(13)+char(13)+ &
", Error: " +char(13)+char(13)+ SQLCA.SQLERRTEXT )
close(this);
RETURN -1
ELSE
MessageBox("EXCELENTE", "TODO BIEN" )
close(this);
RETURN 1
END IF
El mensaje de error que sale es:
Error al guardar,
FechaAux: 28/02/2017
, Fecha: 28/02/2017 00:00:00
,Error:
Index #0 Source; .Net SqlClient Data Provider Message: Sintaxis incorrecta cerca de '00'. Number: 102 State: 1

Para hacer la ejecución correcta en lugar de incluir la variable DATETIME en la sentencia INSERT se debe incluir la variable STRING y si lo almacena en el campo de la tabla y todo bien.
Pero resulta que el proyecto que debo migrar tiene demasiadas líneas de código en las cuales se insertan o actualizan campos de tipo DATETIME debido a que es el código de un ERP.
Necesito saber cómo se debe configurar correctamente una base de datos para que ejecute las sentencias INSERT o UPDATE sin necesidad de utilizar la variable STRING en cada sentencia INSERT o UPDATE de un campo DATETIME.
Yo digo que se debe poder porque es obvio, el tipo de datos DATETIME de una variable de PowerBuilder es para que se utilice en sentencias SQL de un manejador de base de datos, y también coincide con el tipo de dato del campo de la tabla el cual es DATETIME de SQLServer.





También he utilizado ADO.Net cuyo namespace es OLE DB:

SQLCA.DBMS = "ADO.Net"
SQLCA.LogPass = " Contr4s3N1a "
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Namespace='System.Data.OleDb',Provider='SQLOLEDB',DataSource='Compu',Database='BaseDatos',DateFormat='dd/mm/yyyy',DateTimeFormat='dd/mm/yyyy hh:mi:ss.fff',TimeFormat='hh:mi:ss'"
CONNECT USING SQLCA;
Ahí el error es el siguiente:
FechaAux: 28/02/2017
, Fecha: 28/02/2017 00:00:00
, Error:
Index #0 Source; Message: Sintaxis incorrecta cerca de '00'. NativeError. 102 Source: Microsoft OLE DB Provider for SQL Server SQLState: 42000


También he utilizado SNC SQL Native Client(OLE DB)
Al crear el perfil seleccioné en el parámetro Provider: SQLNCLI11( SNC 11.0 for SQL Server 2012) obviamente porque la versión del SQLServer es 2012
SQLCA.DBMS = "SNC SQL Native Client(OLE DB)"
SQLCA.LogPass = " Contr4s3N1a "
SQLCA.ServerName = "Compu"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Database='BaseDatos',Provider='SQLNCLI11',DateFormat='dd/mm/yyyy',DateTimeFormat='dd/mm/yyyy hh:mi:ss.fff',TimeFormat='hh:mi:ss'"
CONNECT USING SQLCA;
El error usando SNC SQL Native Client es:
FechaAux: 28/02/2017
, Fecha: 28/02/2017 00:00:00
, Error:
SQLState: 42000
Microsoft SQL Server Native Client 11.0
Sintaxis incorrecta cerca de '00'.

En la versión 8.0 si lo ejecutaba bien pero en la versión 12.5 o 12.6 no lo ejecuta hay algo que me falta por favor ayúdenme.
Alguna idea de como solucionarlo??
Espero y me puedan ayudar cuanto antes porque es urgente, gracias!.
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

DATETIME en SQLServer 2012 y PowerBuilder 12.6 o 12.5

Publicado por Alberto (16 intervenciones) el 03/03/2017 21:48:09
El Código del proyecto está en el archivo adjunto.

Ahí tambien va un archivo de word donde vienen mas detalle

gracias espero y me puedan ayudar.

Se aceptan toda clase de sugerencias.
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
Imágen de perfil de Charles
Val: 6
Ha aumentado su posición en 2 puestos en Power Builder (en relación al último mes)
Gráfica de Power Builder

DATETIME en SQLServer 2012 y PowerBuilder 12.6 o 12.5

Publicado por Charles (2 intervenciones) el 10/03/2017 13:32:12
Hola, el trabajo con fechas en sql server desde power builder siempre molesta, debes enviarla sin formato para que te la reciba

1
2
3
4
date fcorte
string fecha
 
fecha = string(year(fcorte)) + string(month(fcorte),'00') + string(day(fcorte),'00')

fecha devuelve 20170310 que es lo mismo que enviaras la fecha en formato yyyymmdd, segun me explicaron es el formato de fecha por defecto que maneja sql server. Yo lo prove y me funciono.

1
2
INSERT INTO Tabla ( fecha )  VALUES (  :fecha  )
USING SQLSV;
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