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)
-   -   Mover datos de Paradox a Interbase (https://www.clubdelphi.com/foros/showthread.php?t=14057)

Ignacio 08-09-2004 17:31:48

Mover datos de Paradox a Interbase
 
Hola a todos.
Estoy en los primeros pasos en Interbase.
Primero instalé Interbase servidor en una PC. ademas EMS para generar la base y las tablas. En otra PC instale Interbase cliente y delphi 5. Usando la experiencia, declaré el Alias con BDE Administrator. Luego en delphi escribi una rutinita que se encarga de recorrer una tabla de paradox moviendo cada registro e la tabla de interbase. Todo funciona fenómeno asta que se ejecuta ApplyUpdate dandome el siguiente mensage:

General SQL error
aritmetic exception, numeric overflow, or string truncation
Cannot transliterate character between characters sets.

el códogo no creo que sea el del problema pero por las dudas este es
Código:

procedure TForm1.FormActivate(Sender: TObject);
begin
  QryEntidades.Active:=True;
  QryClientes.Active:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  QryEntidades.First;
  while not QryEntidades.Eof do
  begin
    QryClientes.Insert;
    QryClientesNumero.Value:=QryEntidadesNumeroENT.Value;
    QryClientesNombre.Value:=QryEntidadesNombreENT.AsString;
    QryClientesDomicilio.Value:=QryEntidadesDomicilioENT.AsString;
    QryEntidades.Next;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  QryClientes.ApplyUpdates;
end;

Cuando vuelvo a abrir la tabla Interbase me doy cuenta que se han transferido algunos registros hasta encontrarse con alguno que tenga "ñ" o algun otro caracter por el estilo en un campo tipo string.
¿Puede tener esto algo que ver con el tipo de caracter que se declara al crear la base de datos o los campos de las tablas?

Gracias desde ya.

marcoszorrilla 08-09-2004 17:37:01

Tienes que utilizar:

ISO8859_1;

Un Saludo.

Ignacio 08-09-2004 17:50:04

Usando EMS, al crear un campo tipo char, te pide el tamaño, Juego de caracteres y collate. enn tamaño pongo 40, igual que en la tabla de paradox. En juego de caracteres pongo nuevamente ISO8859_1, lo mismo que puse al crear la base. Pero que pongo en "Collate"

Gracias nuevamente

marcoszorrilla 08-09-2004 18:20:59

Collate ES_ES

Un Saludo.

Ignacio 09-09-2004 00:14:18

continua sin funcionar.
Probé cargando una "ñ" desde el EMS y funcionó pero desde el programa no.
Entonces cambie los controles de acceso a datos. Usé los de Interbase pero tampoco. Y se acabó mi ciencia...

guillotmarc 09-09-2004 10:22:25

En los componentes Delphi también le tienes que indicar que usas el charset iso8859_1

Saludos.

Ignacio 10-09-2004 15:26:33

1) Al crear la base de datos Interbase usando el EMS especifiqué en juego de caracteres ISO8859_1
2) Al crear cada campo alfanumerico, elegí el tipo Varchar, en el juego de caracteres especifiqué ISO8895_1 y en Collate ES_ES
3) En la PC cliente creo con el BDE administrator un alias donde no debo especificar tipo de caracteres.
4) En la aplicación Delphi 5 tomo el control TDatabase, en la propiedad Alias elijo el alias declarada en el punto anterior, en la propiedad DatabaseName especifico un nombre, en el TString de la propiedad params escribo las lineas siguientes: user name=SYSDBA, password=masterkey, lc_ctype=ISO8859_1
5) Tomo un control TQuery y en su propiedad DatabaseName le especificoel nobre de la propiedad DatabaseName del control TDatabase
6) El código que uso lo describí en la pregunta inicial.

Ante todo esto y siguiendo sin funcionar, la pregunta posible es: Como se activan los parametros del control TDatabase? ¿Me estoy equivicando en algun paso? ¿Ma falta especificar algo más?

Nuevamente gracias

guillotmarc 10-09-2004 20:53:57

Hola.

En principio todo parece correcto, aunque nunca he usado BDE, por lo que la parametrización del TDatabase es lo que me parece más susceptible de tener el error (más que nada porqué no sé como se configura de forma correcta).

NOTA 1 : Para no tener que definir el juego de carácteres y collate set, cada vez que se crea un campo, puedes utilizar dominios. Al crear campos solo tienes que indicar el dominio al que pertenece (el cual contendrá toda esa información).

NOTA 2 : Para acceder a Interbase/Firebird te recomiendo los componentes FibPlus/IBO/IBX/dbExpress/UIB/Zeos/... en lugar del BDE. Basicamente porqué el BDE está descatalogado y hace años que no es actualizado por Borland (ya no sacarán nuevas versiones).

Saludos.

Jech 13-09-2004 21:28:44

Una pregunta mas...????
 
Bueno primero que nada quisiera saludarlos y felicitarlos por toda la ayuda que prestan, el motivo hacerles una interrogante, sobre el porque?? pasa esto a veces si y otras veces introduce normalmente??, espero puedan contestarme, y no se si habra otra forma mas fácil de realizarlo bueno si se puede me ayudarian bastante pues la verdad no se que es que significa EMS:confused: muchas gracias y saludos.
Atte. Jech

guillotmarc 14-09-2004 21:45:42

Hola.

En principio puede pasar cuando se utilizan distintas páginas de códigos en la base de datos, y en la aplicación que accede a ella. Entonces cuando se utiliza un carácter inexistente en una de las páginas de código, o que tengan códigos distintos (como las eñes, acentos, ...), salta el error.

La solución pasa por definir correctamente la página de códigos en ambos lugares, personalmente suelo utilizar la iso8859_1.

El EMS es una aplicación de Administración de Interbase, aunque mi preferida es el IB-Expert, que tiene una versión personal, gratuita.

Saludos.

Ignacio 18-09-2004 00:16:20

Re-pregunta
 
Hola

Marc Guillot
Para usar IBx de Delphi 5 debo hacerte unas preguntas. Puede ser?
* Como conecto el control IBdatabase a la base de datos? No se usan alias?
* El control IBqry va conectado a IBdatabase. Por qué debo tambien conectarlo a IBtransaction? Como uso IBtransaction?
* Los parámetros UserName, Password y Lc_type donde los declaro? Cómo hago para que los tome? Cómo evito que me pida la clave?
* Qué papel juega en todo esto la propiedad LogiPrompt y el evento OnLogin?

seguramente me faltan un montón de preguntas, pero creo que con estas tengo para empesar.

Muchísimas gracias.

guillotmarc 18-09-2004 13:14:44

Hola.

1) No, no se usan Alias. Se especifica la Base de Datos a la que nos queremos conectar en las propiedades del IBDatabase. En concreto en la propiedad DatabaseName.
2) En efecto debes conectarlo a un IBTransaction, puesto que cualquier consulta/operación en Interbase debe estar asociada a una transacción. En principio, la transacción solo debes iniciarla (StartTransaction) y finalizarla con un Commit o RollBack cuando hagas cambios en la Base de Datos y los quieras confirmar. Varias consultas (IBQuerys) pueden estar asociadas a la misma transacción.
3) En el Params del IBDatabase (aunque si haces un doble-click sobre el IBDatabase, te saldrá un editor para rellenarlas).
4) Poner el LoginPrompt a False, evita que te pida la clave. Respecto al evento OnLogin, sirve por si quieres realizar alguna acción adicional al registrarte en la Base de Datos.

Te recomiendo que te hagas con un buen libro de programación en Delphi, que toque la programación de Bases de Datos. Mis favoritos són (en este orden) :

a) La cara Oculta de Delphi 6 (de Ian Marteens)
b) Delphi 7 y Kylix (de Francisco Charte)
c) La Biblia de Delphi 7 (de Marco Cantú)

Igualmente, creo que te interesaran los artículos de esta web :

http://firebird.com.mx

Finalmente, si estás utilizando Interbase 6 OE porqué es gratuito, te recomiendo que te pases a Firebird, puesto que las nuevas versiones de Interbase són comerciales, a diferencia de Firebird que es un proyecto open source generado a partir de IB 6 OE.

En caso de cambiar a Firebird, te recomiendo utilizar componentes FibPlus o IBObjects en lugar de IBX, debido a que Borland no va a preocuparse en mantener IBX compatible con las futuras versiones de Firebird.

Saludos.

Ignacio 21-09-2004 05:38:58

Consulté www.firebird.com.mx
Entiendo que IBX, InterBaseExpres y la solapa InterBase de Delphi 5 es lo mismo.
En esa nota sugiere que no se usen IBtable ni IBQuery, proponiendo a cambio IBDataSet. Los controles serían: IBDatabase, el cual tendrá en la propiedad DatabaseName el camino a la base de datos InterBase, en la propiedad DefaultTransaction el nombre del componente IBTransaction y éste, en su propiedad DefaultDatabase el nombre del control IBDatabase.
El control IBDataSet, en su propiedad Database lleva el nombre del control IBDatabase; en las propiedades ...SQL se escribe el codigo nesezario segun el caso. A este último control está conectado un DataSourse y a éste, los controles de edisión.
Todo funciona a la perfección.
Pero cuando hago los siguientes cambios deja de fincionar

Cambios:
A la propiedad LogiPrompt del control IBDatabase la pongo en false para evitar el paso por "Nombre y Contraseña" y en la propiedad Params escribo lo siguiente:
user_name=SYSDBA
password=masterkey
lc_type=ISO8859_1

Error:
DPB Constant (0) is unknown

si a las tres lineas de la propiedad params le quito la última vuelve a funcionar a la perfección (ademas sin pedir "Nombre y contraseña"). Evidentemente el error tienerrelasión con el parámetro lc_type=ISO8859_1

Se te ocurre qué puede ser? Perdon por ser tan molesto.

El libro que leí para programar en delphi 5 fue GUíA DE DESARROLLO DELPHI 5 Teixeira / Pacheco pero no me ayuda en este problema puntual

guillotmarc 21-09-2004 10:23:59

Hola.

En lugar de poner manualmente los parámetros, prueba haciendo un doble-click sobre el componente IBDatabase para especificar estos parámetros en la pantalla de configuración que se abrirá.

Saludos.

Ignacio 21-09-2004 16:10:01

Ahora sí funcionó. Muchísimas gracias Marc Guillot y todos los que participaron en este hilo.

Más adelante los seguiré molestando.


La franja horaria es GMT +2. Ahora son las 23:30:46.

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