Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Modificar Sql access en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=51658)

Caral 22-12-2007 22:57:35

Modificar Sql access en Firebird
 
Hola a todos
Estoy haciendo unas pruebas y quisiera poder cambiar la sentencia sql que tengo en access para que funcione en firebird.
Esta es la sentencia:
Cita:

SELECT IIf([TipoTransac]="FA","Factura","Nota Débito") AS Documento, CxCobrar.CodTransac, CxCobrar.FechaTransac, CxCobrar.CodCliente, Clientes.NombreCliente, Clientes.DiasCredito, Clientes.LimiteCredito, CxCobrar.Balance, CxCobrar.PagosRec, [Balance]-[PagosRec] AS Saldo, Date()-CxCobrar!FechaTransac AS Días
FROM Clientes RIGHT JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente
WHERE (((CxCobrar.CodCliente)=[PRI]) AND (([Balance]-[PagosRec])>0) AND ((CxCobrar.TipoTransac)="FA" Or (CxCobrar.TipoTransac)="ND"))
ORDER BY CxCobrar.CodCliente, CxCobrar.OrdTrans;
La parte del iif mas o menos la tengo resuelta, pero me topo con la parte Date ( ), y los corchetes.
Los errores que me dan (usando Ib Expert) son numéricos, no los entiendo o donde puedo encontrar de que se tratan.
Si me podéis ayudar os lo agradeceré.
Saludos

fjcg02 22-12-2007 23:49:13

Hola Caral,
para el date, creo que tienes que sustituirlo por

cast('NOW' as date)

Respecto a los corchetes, creo que quitandolos es suficiente. Si los que tienes en la parte del where es un parámetro, pues tendrás que ponerlo como

CxCobrar.CodCliente)=:PRI

y asignarle el correspondiente valor antes de ejecutar la query.
El resto de los corchetes de la parte WHERE, con quitarlos creo que es suficiente.

Saludos y suerte. O suerte y saludos

Caral 23-12-2007 01:55:50

Hola
Gracias por responder, me ha servido mucho.
Tengo un error y no se de que se trata.

Sentencia sql:
Cita:

SELECT IIf(CxCobrar.TipoTransac='FA','Factura','Nota Débito') AS Documento, CxCobrar.CodTransac, CxCobrar.FechaTransac, CxCobrar.CodCliente, Clientes.NombreCliente, Clientes.DiasCredito, Clientes.LimiteCredito, CxCobrar.Balance, CxCobrar.PagosRec, Balance-PagosRec AS Saldo, cast('NOW' as date)-CxCobrar.FechaTransac AS Dias
FROM Clientes RIGHT JOIN CxCobrar ON Clientes.CodCliente = CxCobrar.CodCliente
WHERE (((CxCobrar.CodCliente)=:PRI) AND ((Balance-PagosRec)>0) AND ((CxCobrar.TipoTransac)='FA' Or (CxCobrar.TipoTransac)='ND'))
ORDER BY CxCobrar.CodCliente, CxCobrar.OrdTrans;
El error es en delphi:
Cita:

Projet Producción.exe raised execption class EoleExecption with message [ODBC Firebird Driver][Firebird []execption evaluation not supported’’. Process stopped
El error en IBExpert:
Cita:

Expression Evaluation Not Supported
En la pantalla de abajo en el mismo IBExpert:
Cita:

Plan
PLAN SORT (JOIN (CLIENTES INDEX (CUSTNUM), CXCOBRAR INDEX (CxCobrarCodCliente)))

Adapted Plan
PLAN SORT (JOIN (CLIENTES INDEX (CUSTNUM), CXCOBRAR INDEX (CxCobrarCodCliente)))
No se que significa?
La sentencia funciona siempre que el cliente no tenga cuentas atrasadas, ojala fuera asi.:D, pero desgraciadamente si hay clientes con cuentas atrasadas.
Saludos

Al González 23-12-2007 03:30:18

Current_Date es la expresión para obtener la fecha actual.

Intenta con ésta en lugar de Now, pero sin hacer molde de tipo.

No dejes de avisarnos cómo te resulta Carlos.

Un abrazo.

Al González. :)

JXJ 23-12-2007 04:34:34

Yo prefiero hacer funcionar primero la sentencia sql y que funcione,
y despues pasarla al desarrollo (poryecto abierto en el IDE)

yo uso mi propia implementacion de IDE o GUI para firebird

Caral 23-12-2007 14:22:44

Hola Al
He cambiado lo que me dijiste y sigue el mismo problema, que sera?.
El asunto es que si el cliente NO tiene cuantas pendientes, Funciona, de lo contrario me envía el error que mencione.
No se lo que es un molde de tipo?.
Si me pudieran modificar la sentencia para darme una idea se los agradecería.
Saludos

Casimiro Notevi 23-12-2007 15:13:03

Por probar: "cast('NOW' as date)" simplemente como 'now', o usa 'today' que no devuelve hora, sólo fecha.

Al González 23-12-2007 17:33:41

Tal vez sea el IIf, que yo sepa no es estándar. ¿Cuál es la última versión de tu sentencia?

Prueba reduciéndola a expresiones más simples, aisla las diferentes partes hasta dar con el elemento que falla.

¿De qué manera podríamos reproducir nosotros el problema? ¿Qué tablas y campos debemos crear? Danos más datos para poder indagar más.

Saludos.

Al González. :)

Caral 24-12-2007 00:00:48

Hola
Muchas gracias voy en camino, así lo siento, gracias a vosotros.
Probé cortando parte de la sentencia para tratar de identificar que pasa.
Me he dado cuenta de varias cosas interesantes, os comento:
Quite la parte de IIF, y seguía el mismo problema, osea, la descarte.
Entonces me he ido a la parte del date.
Lo quite del todo y si funciona, osea el problema esta ahi.
He puesto esto:
No funciona.
Cita:

cast('today' as date) - CxCobrar.FechaTransac AS Dias
He puesto esto:
No funciona.
Cita:

cast('NOW' as date) - CxCobrar.FechaTransac AS Dias
He puesto esto:
No funciona.
Cita:

Current_Date - CxCobrar.FechaTransac AS Dias
Con este pedazo de codigo lo que se pretende es que reste al dia de hoy el dia de la cxcobrar, con esto se sacara la diferencia en dias, en access funciona, en firebird, no se por que no?.
La version de firebird que tengo es 2.0
Si conoceis otra manera de hacer esto u otro codigo, os lo agradeceria.
Saludos

Al González 24-12-2007 00:19:14

¿Qué sucede si en lugar de la expresión

Current_Date - CxCobrar.FechaTransac AS Dias

usas simplemente la expresión

CxCobrar.FechaTransac AS Dias

?

Sospecho que algo tiene ese campo FechaTransac, ¿de qué tipo es?

Saludos.

Al.

Caral 24-12-2007 00:42:20

Hola
Muchas gracias Al, excelente apreciación.
Pensando en lo que comentaste, me pregunte eso mismo, que tipo de campo es?.
Revisando el campo estaba en TimeStamp, lo he cambiado a Date y funciona con cualquiera de las sentencia como estaban.
Esto ha sucedido por que al pasar la base de datos de access a firebird con el datapump, este ha colocado los campos según el criterio de firebird, en access este era un campo date.
Es parecido al problema que he tenido con los campos memo de access, en firebird me los pone blob y me genera problemas en la aplicación, así que los he cambiado por char (250).
Esa es otra pregunta, pero quería hacerla en otro hilo.
Que usar si se viene de access en un campo memo, que usar en firebird.
Para empezar hay que saber que el campo blob no camina, asi que quedarian:
Char o varchar.
Cual escoger?
Con mi poco conocimiento creo que char no limita el campo y varchar lo limita a la cantidad de caracteres, creo.
Muchas gracias, siempre lo he sabido, que haría sin vosotros.
Saludos

Al González 24-12-2007 01:44:48

BLOb, subtipo 1
 
Me alegra que se haya resuelto ese punto.

Tanto Char como VarChar limitan la longitud máxima del valor almacenado. La diferencia es que el segundo ocupa sólo el espacio requerido para cada valor, dependiendo de su longitud.

Considera que el tipo más parecido al famoso "Memo" de otras bases de datos es el tipo BLOb, pero recuerda que éste lleva un subtipo. El subtipo 1 (Text) es el que te conviene para almacenar cadenas de caracteres muy largas en Firebird / InterBase.

No obstante, en lo personal procuro no tener que recurrir a ese tipo de campos para almacenar texto, ya que el SQL estándar les da un tratamiento más pobre (como no poder usar Like para hacer comparaciones, entre otras cuestiones). De ahí que prefiero usar VarChar, cuando la longitud máxima no es mayor a 1000 caracteres (mi límite convencional para no usar BLOb).

Cabe mencionar que, dependiendo de diversos factores, en situaciones críticas puede ser preferible usar campos BLObs incluso para almacenar cadenas de unas cuantas decenas de caracteres. Pero en las "aplicaciones comunes" eso rara vez es necesario.

Me despido para comprar los víveres de estos días, mañana habrá un caos en las tiendas con tanto loco navideño que anda suelto. :D

Feliz cumpleaños Carlos y bienvenido al mundo Firebird. :cool:

Un abrazo.

Al González. :)

Caral 24-12-2007 13:46:21

Hola
Muchas gracias Al.
Espero que pueda seguir entendiendo esta nueva base de datos, me gusta mucho.
Gracias por la explicación, tu tiempo y por supuesto por acordarte de mi.
Saludos


La franja horaria es GMT +2. Ahora son las 22:25:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi