Ir al contenido


Foto

Proyecto MTF (MySQL to Firebird)


  • Por favor identifícate para responder
105 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 08 noviembre 2008 - 07:32

Hola amigos, estoy haciendo una aplicación cuya función es migrar bases de datos MySQL a Firebird, estoy usando los componentes ZEOS para conectarme con MySQL y IBX para crear las bases de datos Firebird y un proyecto de Eliseo como punto de referencia, la cosa va quedando así:

Imagen Enviada

A medida que avanzo la cosa se verá mejor, el que quiera ayudarme con este proyecto, será sumamente bienvenido :D .

Saludos.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 10 noviembre 2008 - 02:25

A ver, tengo un pequeñito problema, estoy tratando de sacar los índices de la tabla con ZEOS, ya para colmo ZEOS no tiene la propiedad IndexDefs como los IBX, ¿Y ahora quién podrá defenderme?  ::).

Saludos.
  • 0

#3 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 10 noviembre 2008 - 03:57

los ibx nunca me han trabajado bien con Firebird, vaya dios a saber porque, pero Firebird tiene tablas del sistema por alli podrias sacar los indices, de pronto mySql tambien las tenga seria cuestion de averiguar cuales son
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 10 noviembre 2008 - 07:14

Sé que en MySQL puedo listar todos los índices de una tabla de la siguiente manera:



sql
  1. SHOW INDEX FROM tabla FROM basededatos



Ahora lo que no sé si haciendo con un query funcionaría como la propiedad IndexDefs de las IBX, haré la prueba y luego les comento.

Saludos.
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 11 noviembre 2008 - 06:02

aja, pero el show index te devuelve un conjunto de registros o que cosa?
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 noviembre 2008 - 06:32

No amigo eduarcol, el show index muestra los campos que son índices de una tabla, por ejemplo, si tengo una tabla con una clave primaria y un índice, el show index me muestra esos dos campos la clave primaria y el índice.

Saludos.
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 11 noviembre 2008 - 06:47

¿pero como te los muestra?  ::)  ¿podrias colocar un ejemplo?
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 noviembre 2008 - 06:51

Pues claro compadre ;) .



sql
  1. mysql> SHOW INDEX FROM reg_pedidos FROM sigesped;
  2. +-------------+------------+----------+--------------+-------------+-----------+
  3. -------------+----------+--------+------+------------+---------+
  4. | TABLE      | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
  5. Cardinality | Sub_part | Packed | NULL | Index_type | Comment |
  6. +-------------+------------+----------+--------------+-------------+-----------+
  7. -------------+----------+--------+------+------------+---------+
  8. | reg_pedidos |          0 | PRIMARY  |            1 | no          | A        |
  9.         4185 |    NULL | NULL  |      | BTREE      |        |
  10. +-------------+------------+----------+--------------+-------------+-----------+
  11. -------------+----------+--------+------+------------+---------+
  12. 1 ROW IN SET (0.00 sec)



Saludos.
  • 0

#9 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 11 noviembre 2008 - 07:03

no se a ti, pero eso me parece un conjunto de registros, si lo lanzas en un query, ¿que obtienes de vuelta?
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 noviembre 2008 - 07:13

A mí sólo me interesa el campo column_name donde me especifíca el nombre del campo índice, para usarlo cuando cree el DDL, no sé, a mí gustaría usar los MyDAC que sí tienen la propiedad IndexDefs, pero la hostia es de pago, de todos modos en la tarde haré el intento con querys a ver qué sucede.

Saludos.
  • 0

#11 joseme

joseme

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 62 mensajes
  • LocationCosta Rica

Escrito 12 noviembre 2008 - 10:23

Amigo, estuve investigando algo y encontré esta página:
http://www.oreillyne...ndexes_usi.html
donde me enteré que existe un view llamado STATISTICS que contiene toda la información de índices, entre otras cosas. En la misma página podrás ver algunos ejemplos de querys, tal vez eso te pueda ayudar.
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 12 noviembre 2008 - 10:38

¡Vaya!, Interesante link amigo, me has dado una serie de ideas que aplicaré a este proyecto, muchíssimas gracias compañero. ;)

Saludos.
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 noviembre 2008 - 06:30

Bueno, siguiendo con este proyecto, he agregado el componente SynEdit para el resaltado de syntaxis de MySQL, muy bueno por cierto, así va quedando la cosa:

Imagen Enviada

El SynEdit al parecer es un descendiente del TMemo y hay algo que no me convence, y es que cada salto de línea lo sustituye con un cuadrito si se fijan en la imagen anterior ya comprenderán a lo que me refiero, en un RichEdit, eso no sucede. ¿Alquien me puede decir cómo corregir eso?.

Un Saludos compañeros.
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 noviembre 2008 - 07:34

Bueno, problema resuelto, sólo era una burrada, estaba cargando el SynEdit de esta forma:



delphi
  1. mysqlDDL.lines.Add(ZShowCreate.Fields[1].AsString);



De esa forma no me calculaba el salto de línea, así que lo resolví haciendolo de esta manera:



delphi
  1. mysqlDDL.text := ZShowCreate.Fields[1].AsString;



Hasta el momento estoy terminando la parte del muestreo de información de datos MySQL para luego entrar a la migración a DDL de Firebird.

Eso es todo por hoy,

Saludos.
  • 0

#15 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 14 noviembre 2008 - 08:24

por fin que resolvistes con los indices???







[move]Miren que lindo se mueve esta linea ...[/move]
  • 0

#16 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 noviembre 2008 - 09:35

por fin que resolvistes con los indices???


Lo de los índices viene en la parte de generar el DDL de firebird, decidí hacerlo por parte para ir programando organizadamente, ya casi llego a esa parte, es probable que hoy trabaje con ese asunto.

Saludos.
  • 0

#17 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2008 - 06:36

¿Alguien me podría explicar cómo funciona el IndexDefs, qué datos se obtiene con ella?, lo pregunto antes de aventurarme sin saber, así sé como aplicar alternativas (ZEOS no tiene esa propiedad  8o|), por favor se lo agradecería que me explicaran :(.

Saludos.
  • 0

#18 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 noviembre 2008 - 07:17

Mientras, me explican lo del IndexFields, decidí usar el ClientDataset conjuntamente con ZEOS, pero estoy teniendo problemas en el recorrido de los campos, estoy seguro de que algo se me escapa, usando un código de nuestro compañero Egostar, lo estuve adaptandolo a mis necesidades quedando de esta manera:



delphi
  1. procedure TFMain.Button4Click(Sender: TObject);
  2. Var
  3.   Lineas,I,J,Idx: Integer;
  4.   Separador: String;
  5.   NombreCampo,Indice: String;
  6. begin
  7.   Memo1.Clear;
  8.   for i := 0 to Tablas.Items.Count - 1 do begin
  9.     ZTablas.Close;
  10.     ZTablas.TableName := Tablas.Items[i].Text;
  11.     Try
  12.       ZTablas.Open;
  13.       cdTablas.Open;
  14.     except
  15.       ShowMessage('se produjo un problema al abrir');
  16.       Exit;
  17.     End;
  18.     cdTablas.First;
  19.  
  20.     Memo1.Lines.Add('CREATE TABLE '+UpperCase(Tablas.Items[i].Text));
  21.     Memo1.Lines.Add('(');
  22.  
  23.     for J := 0 to cdTablas.FieldCount-1 do begin
  24.  
  25.         if J < cdTablas.FieldCount-1 then Separador := ','
  26.         else begin
  27.               if (J = cdTablas.FieldCount-1) and
  28.                   (cdTablas.IndexFieldCount > 0) then begin
  29.                   Separador := ',';
  30.               end
  31.               else Separador := ' ';
  32.         end;
  33.         if cdTablas.Fields[j].IsIndexField then Separador := ' NOT NULL' + Separador;
  34.         NombreCampo := cdTablas.Fields[j].FieldName;
  35.         If UpperCase(NombreCampo) = 'PASSWORD' Then
  36.           NombreCampo := 'PASSCODE';
  37.         If UpperCase(NombreCampo) = 'SIZE' Then
  38.           NombreCampo := 'SIZE1';
  39.  
  40.         //Elimine estas lineas porque agregué caracteres a las constantes
  41.         //usadas por la función TranslateChars() de Federico Firenze
  42.         //NombreCampo := StringReplace(NombreCampo,' ','_',[rfReplaceAll]);
  43.         //NombreCampo := StringReplace(NombreCampo,'ñ','n',[rfReplaceAll]);
  44.         //NombreCampo := StringReplace(NombreCampo,'Ñ','N',[rfReplaceAll]);
  45.  
  46.         NombreCampo := StringReplace(NombreCampo,'(','',[rfReplaceAll]);
  47.         NombreCampo := StringReplace(NombreCampo,')','',[rfReplaceAll]);
  48.         NombreCampo := TranslateChars(NombreCampo, CHARS_ACENTUADOS, CHARS_SINACENTO);
  49.         case cdTablas.Fields[j].DataType of
  50.             ftString,
  51.             ftWideString: begin
  52.                             Memo1.Lines.Add(' '+NombreCampo+' VARCHAR('+
  53.                                             inttostr(cdTablas.Fields[j].DisplayWidth)+')'+
  54.                                             Separador);
  55.                           end;
  56.             ftFloat    : begin
  57.                             Memo1.Lines.Add(' '+NombreCampo+' FLOAT'+Separador);
  58.                           end;
  59.             ftCurrency  : begin
  60.                             Memo1.Lines.Add(' '+NombreCampo+' NUMERIC(10,2)'+Separador);
  61.                           end;
  62.             ftTime      : begin
  63.                             Memo1.Lines.Add(' '+NombreCampo+' TIME'+Separador);
  64.                           end;
  65.             ftDate      : begin
  66.                             Memo1.Lines.Add(' '+NombreCampo+' DATE'+Separador);
  67.                           end;
  68.             ftDateTime,
  69.             ftTimeStamp  : begin
  70.                             Memo1.Lines.Add(' '+NombreCampo+' TIMESTAMP'+Separador);
  71.                           end;
  72.             ftAutoInc,
  73.             ftInteger  : begin
  74.                             Memo1.Lines.Add(' '+NombreCampo+' INTEGER'+Separador);
  75.                           end;
  76.             ftMemo      : begin
  77.                             Memo1.Lines.Add(' '+NombreCampo+' BLOB SUB_TYPE 1'+Separador);
  78.                           end;
  79.             ftBlob,
  80.             ftTypedBinary,
  81.             ftGraphic  : begin
  82.                             Memo1.Lines.Add(' '+NombreCampo+' BLOB SUB_TYPE 0'+Separador);
  83.                           end;
  84.             ftBoolean,
  85.             ftSmallint : begin
  86.                             Memo1.Lines.Add(' '+NombreCampo+' SMALLINT'+Separador);
  87.                           end;
  88.         end;
  89.     end;
  90.  
  91.     if cdTablas.IndexFieldCount > 0 then begin
  92.       for Idx := 0 to cdTablas.IndexDefs.Count - 1 do begin
  93.           Indice := cdTablas.IndexDefs[Idx].Fields;
  94.           If UpperCase(Indice) = 'PASSWORD' Then
  95.               Indice := 'PASSCODE';
  96.           If UpperCase(Indice) = 'SIZE' Then
  97.               Indice := 'SIZE1';
  98.           Indice := StringReplace(Indice,'(','',[rfReplaceAll]);
  99.           Indice := StringReplace(Indice,')','',[rfReplaceAll]);
  100.           Indice := TranslateChars(Indice, CHARS_ACENTUADOS, CHARS_SINACENTO);
  101.           with cdTablas.IndexDefs[Idx] do begin
  102.                 if ixPrimary in Options then begin
  103.                   Memo1.Lines.Add(' CONSTRAINT PK_'+Tablas.Items[i].Text+' PRIMARY KEY ('+Indice+')');
  104.                   Memo1.Lines.Add(');');
  105.                   Memo1.Lines.Add('');
  106.                 end;
  107.                 if ixCaseInsensitive in Options then begin
  108.                   Memo1.Lines.Add('CREATE INDEX '+Tablas.Items[i].Text+'_IDX'+inttostr(Idx)+
  109.                                   ' ON '+Tablas.Items[i].Text+' ('+Indice+');');
  110.                   Memo1.Lines.Add('');
  111.                 end;
  112.           end;
  113.       end;
  114.     end
  115.     else begin
  116.           Memo1.Lines.Add(');');
  117.           Memo1.Lines.Add('');
  118.     end;
  119.   end;
  120. end;



El resultado es este:

CREATE TABLE AREA
(
area VARCHAR(25)
);

CREATE TABLE CAJACHICA
(
area VARCHAR(25)
);

CREATE TABLE CARTADETALLES
(
area VARCHAR(25)
);

CREATE TABLE CARTASORDEN
(
area VARCHAR(25)
);

CREATE TABLE CAT_USER
(
area VARCHAR(25)
);

CREATE TABLE COMPCAJA
(
area VARCHAR(25)
);

CREATE TABLE CUENTAS
(
area VARCHAR(25)
);

CREATE TABLE DEPARTAMENTO
(
area VARCHAR(25)
);

CREATE TABLE DESPEXP
(
area VARCHAR(25)
);

CREATE TABLE DOCUMENTO
(
area VARCHAR(25)
);

CREATE TABLE FACTURAS
(
area VARCHAR(25)
);

CREATE TABLE FONDO
(
area VARCHAR(25)
);

CREATE TABLE HIST_TRA
(
area VARCHAR(25)
);

CREATE TABLE HISTORICO
(
area VARCHAR(25)
);

CREATE TABLE ITEMS
(
area VARCHAR(25)
);

CREATE TABLE MODALIDAD
(
area VARCHAR(25)
);

CREATE TABLE MONEDA
(
area VARCHAR(25)
);

CREATE TABLE ORDENES
(
area VARCHAR(25)
);

CREATE TABLE ORDENGAS
(
area VARCHAR(25)
);

CREATE TABLE ORDGASDETALLES
(
area VARCHAR(25)
);

CREATE TABLE PED_DETALLES
(
area VARCHAR(25)
);

CREATE TABLE REG_PEDIDOS
(
area VARCHAR(25)
);

CREATE TABLE REPOSICION
(
area VARCHAR(25)
);

CREATE TABLE RESPONSABLES
(
area VARCHAR(25)
);

CREATE TABLE RESPONSABLES1
(
area VARCHAR(25)
);

CREATE TABLE RUBROS
(
area VARCHAR(25)
);

CREATE TABLE SISTEMA
(
area VARCHAR(25)
);

CREATE TABLE STATUS
(
area VARCHAR(25)
);

CREATE TABLE STATUS_ORDEN
(
area VARCHAR(25)
);

CREATE TABLE STATUS_OUT
(
area VARCHAR(25)
);

CREATE TABLE STATUS_PAGO
(
area VARCHAR(25)
);

CREATE TABLE SUPLI_RUBRO
(
area VARCHAR(25)
);

CREATE TABLE SUPLIDORES
(
area VARCHAR(25)
);

CREATE TABLE TRAMITES
(
area VARCHAR(25)
);

CREATE TABLE URGENCIA
(
area VARCHAR(25)
);

CREATE TABLE USERS
(
area VARCHAR(25)
);

CREATE TABLE USERS_LOGGED
(
area VARCHAR(25)
);

CREATE TABLE USERS_LOGS
(
area VARCHAR(25)
);


Como pueden ver, no está recorriendo correctamente los campos de cada tabla pero si las tablas contenidas en un TreeView, asume el único campo de la primera tabla y la asigna a todas.

Saludos.
  • 0

#19 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 noviembre 2008 - 08:49

¿Qué pasa?, ¡Se están durmiendo!  8o|  :^)  (a)  :-#  :p  :p
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 18 noviembre 2008 - 06:05

Amigo enecumene

Y no te hace falta esto ? ? ?



delphi
  1. cdTablas.next;



Salud OS
  • 0




IP.Board spam blocked by CleanTalk.