Ir al contenido



Foto

Migración BD Paradox a Mysql en RED


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

#1 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 09 enero 2017 - 03:27

Estimados necesito su orientación ...

 

Ya de hace alguno tiempo vengo programando con Delphi 7 y usando el motor de BD Paradox para sistemas Locales, tengo un sistema ya terminado, pero ahora requiero que en lugar de ser una BD Local, sea de compartido y por Red, al decir compartido es para que varios usuarios puedan usar las tablas al mismo tiempo ya sea para consulta o trabajar en ellas, por cuestiones de tiempo no puedo "por ahora" usar otro tipo de sistema, osea veo en los foros que recomiendan usar firebird entre otros ..

 

Pero en mi caso ya que el sistema esta corriendo bien local migrarlo a una base de datos compartida, por que a Mysql, bueno considero que este manejador es muy confiable "cuestión de gustos", estuve usando los componentes Table y Datasource para tal trabajo (guardar, modificar, eliminar) y para las consultas usaba el query con sentencias SQL. Veo que hay un poco de similitud usando las tablas ADOTable, mi pregunta sería .. es suficiente usar en lugar de usar las TTables ahora el ADOTable para guardar mi datos?..

 

Para guardar usaba la sintaxis:


php
  1. Table1.insert;
  2. tryTable1.FieldByName('CONT').AsInteger:=StrToInt(Edit1.Text);
  3. Table1.FieldByName('NOM').AsString:=Edit2.Text;
  4. finally
  5. Table1.post;

 
Para Editar el:
 

php
  1. Table1.Edit;
  2. tryTable1.FieldByName('CONT').AsInteger:=StrToInt(Edit1.Text);
  3. Table1.FieldByName('NOM').AsString:=Edit2.Text;
  4. finally
  5. Table1.post;

 

y para eliminar el :


php
  1. Table1.Delete;  

Puedo seguir usando los mismo parámetros ahora con el ADOTable? o es que se requiere hacer as cosas ..

 

Escenario:

 

La Base de datos estará en Mysql en un equipo en red llámese "equiposerver"

Otro equipo estará en la misma red para hacer las operaciones llámese "equipoperador"

y un último equipo solo para consulta, llámese "equipocosulta"

 

 

Lo que se requiere es que el "equipoperador" al momento que este trabajando (cargando,editando, borrando datos) pueda el "equipoconsulta" poder hacer "valga la redundancia" realizar consultas y generar reportes, estos dos trabajando simultaneamente en el "equiposervidor".

 

Me podrían aclarar si es correcto que lo que expongo o hay alguna mejor idea?

 

Gracias por su tiempo!!


  • 0

#2 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 09 enero 2017 - 09:02

Bueno, hasta ahora he logrado convertir mis BD Paradox a Mysql con una herramienta, todo bien hasta ahora...
 
Estuve practicando con un formulario nuevo para visualizar los datos de la Tabla (ahora en sql) en un DBGrid, agregé un AdoConnection + DataSoucer + AdoQuery
 
 
Logre hacer una buena conección a la Base de datos conectando el DataSoucer al ADOQuery y el ADOQuery al ADOConecction. Lo active y listo .. se visualizó mis datos en en DBGrid, incluso agregué un DBText vinculando con un ADOTable para que igual alli me mostrara los datos ...
 
 
Practiqué la búsqueda con e ADOQuery ta cual lo hacia con el Query y veo funcionó muy bien .. eso si, es ligeramente tardado la búsqueda pero la realiza finalmente.
 
Ahora lo que intenté es hacer la opción de Editar un campo .. usé el ADOTable con el siguiente código ..
 
Antes con el Table buscaba el campo llave para posicionarme en el registro y así poder realizar el cambio .. lo hacía con 
Table1.FindKey([algo]), por ejemplo
 

php
  1. if Table1.FindKey([Edit1.Txt]) Then
  2.   showmessage ('Encontrado')

 
Ahora con el ADOTable veo no me aparece tal parámetro, intenté hacerlo usando FindField, pero veo no funcionó, al menos no como esperaba.
 

php
  1. if ADOTable1.Active = True Then
  2.    ADOTable1.Active:= False;
  3.  
  4.  
  5. ADOTable1.Active := True;
  6.  
  7.  
  8. if ADOTable1.FindField('ID_CL').AsInteger  = StrToInt(DBText1.Caption) Then
  9.   Begin
  10.   showmessage('Encontrado');
  11.   End
  12.    Else
  13.     Begin
  14.      showmessage('No Encontrado');
  15.     End;

La comparación lo hice con el DBText ya que alli aparece el ID llave para buscar el registro, pero si hago otra búsqueda y el DBText cambia este no lo encuentra ...
 
Alguna idea o voy mal ??

  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 enero 2017 - 07:41

Sólo un pequeño detalle:

 

en vez de:


delphi
  1. Table1.insert;
  2. try
  3. Table1.FieldByName('CONT').AsInteger:=StrToInt(Edit1.Text);
  4. Table1.FieldByName('NOM').AsString:=Edit2.Text;
  5. finally
  6. Table1.post;
  7. end;

Lo siguiente:


delphi
  1. Table1.Insert;
  2. Table1.FieldByName('CONT').AsInteger := StrToInt(Edit1.Text);
  3. Table1.FieldByName('NOM').AsString := Edit2.Text;
  4. try
  5. Table1.post;
  6. except
  7. on E:EDataBaseError do begin
  8. ShowMessage('Ocurrió un error al guardar los datos!: ' + E.Message);
  9. Abort;
  10. end;
  11. end;

Si mal no recuerdo en ADO se utiliza Locate.

 

Saludos.


  • 0

#4 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 627 mensajes
  • LocationCiudad de México

Escrito 10 enero 2017 - 03:04

Voy  meter mi cuchara, espero no decir una barrabasada.

 

Paradox es una tecnología de tabas independientes (entiendo que pueden crearse joins, pero hablando en el sentido purista) y MySQL es una Base de datos Relacional, con tablas, vistas, índices, SP, etcétera, todo manejado por el motor de base de datos.

 

Las tecnologías de tablas independientes (DBase, Clipper, Paradox) implica que cuando tu estableces una conexión hacia una de las tablas, por ejemplo, para mostrar en un grid, esta se carga COMPLETAMENTE en memoria, esto alenta el acceso a los datos y sobre todo, genera un riesgo de corrupción de datos. Implica que cuando modificas un registro este permanece bloqueado hasta que lo sueltas, e implica que para un post debes checar la concurrencia, cosa que con una transacción en MySQL esto queda del lado completo del motor de la base de datos.

 

Imagino que usas el objeto Table para mantener la compatibilidad hacia los objetos que actualmente tienes en tu código, pero creo, desde mi punto de vista, que meter un motor de BDD como MySQL y accederlo por medio de objetos Table es una desproporción. El uso de objetos Table te convierte las tablas relacionadas de MySQL en tecnología de tablas Paradox. 

 

Creo que lo conducente sería modificar tu acceso directamente a Querys y Stored Procedures, o bien, si tu aplicación será local, cambiar a un SQLite, así tienes todos tus objetos de base de datos en un solo archivo, y además te evitas la instalación y configuración del MySQL lo cual a veces es un verdadero dolor de...

 

Saludos!!


  • 1

#5 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 10 enero 2017 - 03:22

Voy  meter mi cuchara, espero no decir una barrabasada.

 

Paradox es una tecnología de tabas independientes (entiendo que pueden crearse joins, pero hablando en el sentido purista) y MySQL es una Base de datos Relacional, con tablas, vistas, índices, SP, etcétera, todo manejado por el motor de base de datos.

 

Las tecnologías de tablas independientes (DBase, Clipper, Paradox) implica que cuando tu estableces una conexión hacia una de las tablas, por ejemplo, para mostrar en un grid, esta se carga COMPLETAMENTE en memoria, esto alenta el acceso a los datos y sobre todo, genera un riesgo de corrupción de datos. Implica que cuando modificas un registro este permanece bloqueado hasta que lo sueltas, e implica que para un post debes checar la concurrencia, cosa que con una transacción en MySQL esto queda del lado completo del motor de la base de datos.

 

Imagino que usas el objeto Table para mantener la compatibilidad hacia los objetos que actualmente tienes en tu código, pero creo, desde mi punto de vista, que meter un motor de BDD como MySQL y accederlo por medio de objetos Table es una desproporción. El uso de objetos Table te convierte las tablas relacionadas de MySQL en tecnología de tablas Paradox. 

 

Creo que lo conducente sería modificar tu acceso directamente a Querys y Stored Procedures, o bien, si tu aplicación será local, cambiar a un SQLite, así tienes todos tus objetos de base de datos en un solo archivo, y además te evitas la instalación y configuración del MySQL lo cual a veces es un verdadero dolor de...

 

Saludos!!

 

Gracias por la explicación ...

 

Lo que pretendo es tenerlo en modo red local para realizar los procedimientos de altas, bajas, mod, consultas y que diferentes usuarios interactuen con la misma tablas mientras uno captura el otro consulta y asi  ... para después realizar un módulo sólo de consulta via Internet a un servidor MSQL remoto donde estará alojada una copia de la BD.

 

Es por eso que el sistema actual maneja Paradox de forma local y lo que pretendo es migrarlo a Mysql y que local habrá un servidor CentOS bajo Linux y de alli almacenar las BD de Mysq para trabajar con el con las operaciones mencionadas.


  • 0

#6 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 10 enero 2017 - 03:26

 

Creo que lo conducente sería modificar tu acceso directamente a Querys y Stored Procedures, o bien, si tu aplicación será local, cambiar a un SQLite, así tienes todos tus objetos de base de datos en un solo archivo, y además te evitas la instalación y configuración del MySQL lo cual a veces es un verdadero dolor de...

 

 

Me amó la atención esto que mencionas .. cómo que los objetos de base de datos es un solo archivo? y cómo es que es posibe tener una aplicación SQLite sin instalación y configuración de un servidor MySqL ??


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 enero 2017 - 04:12

SQLite no depende de MySQL, es un motor de Base de Datos aparte, no necesita instalación, es parecido a paradox pero con esteroides, la única desventaja se utiliza para un sólo usuario.


  • 0

#8 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 10 enero 2017 - 04:37

SQLite no depende de MySQL, es un motor de Base de Datos aparte, no necesita instalación, es parecido a paradox pero con esteroides, la única desventaja se utiliza para un sólo usuario.

 

mmm alli esta el detalle ... lo que requiero es tener diferentes accesos y trabajando las tablas por diferentes usario ... y ya tocando esto ... hy que hacer algo a aparte para manejar las sesiones de las tablas? osea hay que hacer agún procedimiento para que diferentes usuarios puedan estar trabajando e la misma tabla?


  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 enero 2017 - 04:51

Con MySQL, no hay que hacer nada, salvo que diseñes bien tus consultas.


  • 1

#10 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 10 enero 2017 - 05:09

Con MySQL, no hay que hacer nada, salvo que diseñes bien tus consultas.

 

Pues bien entonces hice una buena elección de manejador de BD, pues creo que por ahora ya tengo algo mas claro respecto a todo lo que han dicho y comentado, las tablas se manejan igual que local en el aspecto de Abrir => Trabajar => Cerrar ... es correcto? .. o recomiendan tener algun componente activo en el caso de las conexiones? .. esto lo comento ya que he visto por el foro que as sesiones se cierran al no estar activas.


  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.269 mensajes
  • LocationArgentina

Escrito 10 enero 2017 - 06:26

Pues bien entonces hice una buena elección de manejador de BD, pues creo que por ahora ya tengo algo mas claro respecto a todo lo que han dicho y comentado, las tablas se manejan igual que local en el aspecto de Abrir => Trabajar => Cerrar ... es correcto? .. o recomiendan tener algun componente activo en el caso de las conexiones? .. esto lo comento ya que he visto por el foro que as sesiones se cierran al no estar activas.

 

Por regla general, la conexión es un proceso relativamente más "costoso". Se recomiendo tener activa la conexión al servidor y no estar desconectado y conectando cada vez que se interactúa con él. Pero hay casos en los que quizá se pueda justificar las conexiones por demanda.

 

Es más importante tener controlado el aislamiento y el tiempo de las transacciones. Las transacciones son lo que te permitirá mantener la DB en orden siempre, y la regla es: mantener la transacción abierta lo menos posible. Para ello se recomiendo iniciarla y tener las operaciones que se van a realizar en ella lo más "cerca" posible. Esto es para evitar que estén abiertas perdiendo tiempo y evitar algunos conflictos por registros que pudieran haber cambiado o eliminado por otras transacciones mientras esta estaba ociosa y ni enterada.

 

Saludos,


  • 0

#12 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 10 enero 2017 - 07:23

Por regla general, la conexión es un proceso relativamente más "costoso". Se recomiendo tener activa la conexión al servidor y no estar desconectado y conectando cada vez que se interactúa con él. Pero hay casos en los que quizá se pueda justificar las conexiones por demanda.

 

Es más importante tener controlado el aislamiento y el tiempo de las transacciones. Las transacciones son lo que te permitirá mantener la DB en orden siempre, y la regla es: mantener la transacción abierta lo menos posible. Para ello se recomiendo iniciarla y tener las operaciones que se van a realizar en ella lo más "cerca" posible. Esto es para evitar que estén abiertas perdiendo tiempo y evitar algunos conflictos por registros que pudieran haber cambiado o eliminado por otras transacciones mientras esta estaba ociosa y ni enterada.

 

Saludos,

 

Ose mantener la conexión en todo momento pero las transacciones (conectar y desconectar) en cada proceso que se haga, es correcto?


  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.269 mensajes
  • LocationArgentina

Escrito 10 enero 2017 - 07:52

Ose mantener la conexión en todo momento pero las transacciones (conectar y desconectar) en cada proceso que se haga, es correcto?

 

Las transacciones no se conectan/desconectan; se inician (Start) y luego se confirman (Commit) o se deshacen los cambios (RollBack)

 

En el mundo de las bases de datos C/S las transacciones son un concepto importante. Es una forma de "agrupar" una serie de operaciones en una base de datos que se realizarán de forma atómica: o se hace todas, o no se hace nada. Son la vía segura para trabajar... Un cliente inicia una transacción, realizará insert, updates, etc, y procederá a confirmar o a descartarlo.

De esta forma la base de datos está siempre en un estado consistente: antes de una transacción y después de una transacción.

Cuando se trabaja con transacciones, debe considerar el nivel de aislamiento de éstas. Dependiendo de las necesidades operativas en ocasiones uno necesita que una transacción sea capáz de "ver" los cambios y confirmaciones de otras.

 

Ya no existe el concepto de bloqueo... algo típico en el viejo modelo en donde uno accedía a la tabla, bloqueaba su uso, operaba y al finalizar liberaba el bloqueo. Ahora todo es concurrente, no existe el bloqueo per se... los clientes trabajan en simultáneo... el servidor se encarga de "sincronizar" las transacciones según como se van dando.

 

Debes cambiar el chip mental. Estudia sobre transacciones, cuanto antes. Es mi mayor consejo.

 

Saludos,


  • 0

#14 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 627 mensajes
  • LocationCiudad de México

Escrito 11 enero 2017 - 02:37

Ose mantener la conexión en todo momento pero las transacciones (conectar y desconectar) en cada proceso que se haga, es correcto?

 

Hablando de las transacciones, imagina que vas a realizar una factura con afectación a inventarios y estado de cuenta de un cliente. 

 

Tienes 3 procesos en un solo movimiento

 

- GENERACIÓN DE FACTURA

- AFECTACIÓN DE INVENTARIOS

- AFECTACIÓN DE ESTADO DE CUENTA

 

En un esquema de tablas planas (Paradox) tenías que estar cazando los errores y después deshacer los movimientos, si por ejemplo, generabas bien la factura, afectabas inventarios pero tenías un error al momento de la afectación del estado de cuenta.

 

Con transacciones:

 

- INICIA TRANSACCIÓN

- GENERACIÓN DE FACTURA

- AFECTACIÓN DE INVENTARIOS

- AFECTACIÓN DE ESTADO DE CUENTA

- CIERRAS TRANSACCIÓN

 

El motor de base de datos genera las operaciones de insert, update, delete,. de cada uno de los procesos, y hasta que tu cierras la transacción asientas en las tablas los movimientos, y si hubiera algún error durante el proceso, solo das un roll back y la base de datos se encarga de echar para atrás todo sin afectar tus tablas.

 

Esto amigo, es una maravilla una vez que lo descubres y lo aplicas.

 

Saludos!! 

 

Busqué un ejemplo de transacción con MySQL pero no la hallé pero si llego temprano a casa lo busco y te lo mando.


  • 0

#15 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 627 mensajes
  • LocationCiudad de México

Escrito 11 enero 2017 - 02:44

Me amó la atención esto que mencionas .. cómo que los objetos de base de datos es un solo archivo? y cómo es que es posibe tener una aplicación SQLite sin instalación y configuración de un servidor MySqL ??

 

 

SQLite es un motor de SQL embebido en un DLL, el cual te permite en un solo archivo integrar tablas, índices, etc. (no acepta stored procedures no tengo idea de por qué, aunque existe un add-on que te permiten agregar SP a esta base de datos). Eso si, soporta transacciones.

 

Puedes imitar un servidor como lo haciamos a la antigua, poniendo el archivo de base de datos en una carpeta compartida y luego direccionar la ruta de tu base de datos hacia esa carpeta. No lo he hecho aunque he visto este esquema trabajando, supongo que opera sin problemas.

 

Saludos!!


  • 0

#16 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 11 enero 2017 - 05:55

Hablando de las transacciones, imagina que vas a realizar una factura con afectación a inventarios y estado de cuenta de un cliente. 

 

Tienes 3 procesos en un solo movimiento

 

- GENERACIÓN DE FACTURA

- AFECTACIÓN DE INVENTARIOS

- AFECTACIÓN DE ESTADO DE CUENTA

 

En un esquema de tablas planas (Paradox) tenías que estar cazando los errores y después deshacer los movimientos, si por ejemplo, generabas bien la factura, afectabas inventarios pero tenías un error al momento de la afectación del estado de cuenta.

 

Con transacciones:

 

- INICIA TRANSACCIÓN

- GENERACIÓN DE FACTURA

- AFECTACIÓN DE INVENTARIOS

- AFECTACIÓN DE ESTADO DE CUENTA

- CIERRAS TRANSACCIÓN

 

El motor de base de datos genera las operaciones de insert, update, delete,. de cada uno de los procesos, y hasta que tu cierras la transacción asientas en las tablas los movimientos, y si hubiera algún error durante el proceso, solo das un roll back y la base de datos se encarga de echar para atrás todo sin afectar tus tablas.

 

Esto amigo, es una maravilla una vez que lo descubres y lo aplicas.

 

Saludos!! 

 

Busqué un ejemplo de transacción con MySQL pero no la hallé pero si llego temprano a casa lo busco y te lo mando.

 

Agradezco mucho tu explicación estimado y mil gracias ojala puedas encontrar ese ejemplo para estudiarlo y entender mejor esto .. 

 

Saludos !! 


  • 0

#17 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 141 mensajes
  • LocationMéxico

Escrito 11 enero 2017 - 06:08

Pues bien tengo lo siguientes códigos para que porfavor me ayuden analizarlo y decirme si me falta algún procedimiento mas o con lo que tengo es suficiente...

 

Módulo de ALTA/INSERTAR

 


php
  1. procedure TForm1.BGuardarClick(Sender: TObject);
  2. Var MSG : String;
  3. begin
  4.  
  5.  
  6. // *******************************
  7. // *******************************
  8. // PROCEDO PARA GUARDAR UN REGISTRO
  9. // *******************************
  10. // *******************************
  11.  
  12.  
  13.   Form1.Cursor:= crSQLWait;
  14. if ADOQuery1.Locate ('MAC_ONT', Edit3.Text,[loCaseInsensitive,loPartialKey]) then
  15.   Begin
  16.     AdoQuery1.Close;            // cierro la tabla.
  17.     AdoQuery1.Open;             // abro la Tabla
  18.     Form1.Cursor:= crDefault;
  19.     showmessage('Ya se encuentra registrado, porfavor verifica los datos.');
  20.     Edit3.SetFocus;
  21.     exit;
  22.   End
  23.   Else   // En caso de Si haber un resultado
  24.    Begin
  25.     If MessageDlg('¿Está seguro que desea GUARDAR el registro? ',mtConfirmation,[mbYes,mbNo],0) = mrYes then
  26.       begin
  27.   AdoConnection1.BeginTrans;   // Inicio la Transacción
  28.        try
  29.        ADOQuery1.Insert;            // INSERTA la Tabla
  30.        ADOQuery1.FieldByName('MAC_ONT').AsString := Edit3.Text;
  31.        ADOQuery1.FieldByName('MOD_ONT').AsString := Edit4.Text;
  32.        ADOQuery1.FieldByName('SERIE_ONT').AsString := Edit5.Text;
  33.        ADOQuery1.FieldByName('PON_ONT').AsString := Edit6.Text;
  34.        ADOQuery1.Post;            // Guardo Datos;
  35.        if ADOConnection1.InTransaction then
  36.        AdoConnection1.CommitTrans; // actualizo la BD
  37.        Form1.Cursor:= crDefault;
  38.        AdoQuery1.Close;            // cierro la tabla.
  39.        AdoQuery1.Open;             // abro la Tabla
  40.        Application.MessageBox( 'Se GUARDO SATISFACTORIAMENT.', 'ATENCIÓN ...',
  41.         MB_ICONINFORMATION );
  42.        Edit1.Clear;
  43. except
  44. on E:Exception do      // Si hay Error de Conexión
  45. begin
  46. AdoConnection1.RollbackTrans;
  47.         Form1.Cursor:= crDefault;
  48.         MSG:='Ocurrió un error al guardar los datos: ' + E.Message;
  49. Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
  50. Abort;
  51. end;  // on
  52.        End; // try
  53.   End
  54. Else
  55.  Begin
  56.       AdoQuery1.Close;            // cierro la tabla.
  57.       AdoQuery1.Open;             // abro la Tabla
  58.       Form1.Cursor:= crDefault;
  59.       Application.MessageBox( 'Proceso Cancelado por el usuario', 'CANCELADO...',
  60.         MB_ICONINFORMATION );
  61.  End;
  62.    End;
  63.  
  64.  

Módulo de BAJA/ELIMINAR
 

php
  1. procedure TForm1.BEliminarClick(Sender: TObject);
  2. Var MSG : String;
  3. begin
  4. // *******************************
  5. // *******************************
  6. // PROCEDO PARA ELIMINAR UN REGISTRO
  7. // *******************************
  8. // *******************************
  9.  
  10.  
  11. Form1.Cursor:= crSQLWait;
  12. if Not ADOQuery1.Locate ('MAC_ONT', Label2.Caption,[loCaseInsensitive,loPartialKey]) then
  13.   Begin
  14.     AdoQuery1.Close;            // cierro la tabla.
  15.     AdoQuery1.Open;             // abro la Tabla
  16.     Form1.Cursor:= crDefault;
  17.     showmessage('No se encuentra registrado, porfavor verifica los datos.');
  18.   End//if
  19.   Else   // Si lo encuentra  Avisa antes de Eliminar
  20.    Begin
  21.    Form1.Cursor:= crDefault;
  22.  if MessageDlg('¿Esta seguro de borrar el registro?', mtConfirmation, [mbYes,mbNo],0)= mrYes then
  23.       Begin
  24.       Form1.Cursor:= crSQLWait;
  25.         //Table1.Active := True;  // Activo la Tabla
  26.         AdoConnection1.BeginTrans;  // Inicio Transacción
  27.         try
  28.         ADOQuery1.Delete;
  29.         AdoConnection1.CommitTrans; // Efectu Transacción-Actualizo la BD
  30.         AdoQuery1.Close;            // cierro la tabla.
  31.         AdoQuery1.Open;             // abro la Tabla
  32.         Form1.Cursor:= crDefault;
  33.         ShowMessage( 'El Registro de Terminales ONU - FUE ELIMINADO.');
  34.         Edit1.Clear;
  35.         except
  36.           on E:Exception do      // Si hay un error en el transcurso
  37.             Begin
  38.             AdoConnection1.RollbackTrans;    // Regreso la Transaccion
  39.             Form1.Cursor:= crDefault;
  40.             MSG:='Ocurrió un error al guardar los datos: ' + E.Message;
  41.    Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
  42.  Abort;
  43. end; // on
  44.         end; // try
  45.       end // MessageDlg
  46. Else
  47.  Begin
  48.         AdoQuery1.Close;            // cierro la tabla.
  49.         AdoQuery1.Open;             // abro la Tabla
  50.         Form1.Cursor:= crDefault;
  51. ShowMessage('¡CANCELADO POR EL USUARIO!.');
  52.          Edit1.Clear;
  53.  End; //else
  54.    End;// else
  55.  
  56.  

Módulo de ACTUALIZAR/MODIFICAR
 

php
  1. procedure TForm1.BEditarClick(Sender: TObject);
  2. var msg : String;
  3. begin
  4. // *******************************
  5. // *******************************
  6. // PROCEDO PARA EDITAR UN REGISTRO
  7. // *******************************
  8. // *******************************
  9. if Not ADOQuery1.Locate ('MAC_ONT', Edit3.Text,[loCaseInsensitive,loPartialKey]) then
  10.   Begin
  11.     AdoQuery1.Close;            // cierro la tabla.
  12.     AdoQuery1.Open;             // abro la Tabla
  13.     showmessage('No se encuentra registrado, porfavor verifica los datos.');
  14.   End
  15.   Else   // En caso de Si haber un resultado
  16.    Begin
  17.     If MessageDlg('¿Está seguro que desea ACTUALIZAR el registro? ',mtConfirmation,[mbYes,mbNo],0) = mrYes then
  18.       begin
  19.   AdoConnection1.BeginTrans;   // Inicio la Transacción
  20.        try
  21.        ADOQuery1.Edit;            // Edito la Tabla
  22.        ADOQuery1.FieldByName('MAC_ONT').AsString := Edit2.Text;
  23.        ADOQuery1.Post;            // Guardo Datos;
  24.        AdoConnection1.CommitTrans; // actualizo la BD
  25.        Form1.Cursor:= crDefault;
  26.        Application.MessageBox( 'Se ACTUALIZÓ SATISFACTORIAMENT.', 'ATENCIÓN ...',
  27.         MB_ICONINFORMATION );
  28.         AdoQuery1.Close;            // cierro la tabla.
  29.         AdoQuery1.Open;             // abro la Tabla
  30.        Edit1.Clear;
  31. except
  32. on E:Exception do      // Si hay Error de Conexión
  33. begin 
  34. AdoConnection1.RollbackTrans;
  35.         Form1.Cursor:= crDefault;
  36.         MSG:='Ocurrió un error al guardar los datos: ' + E.Message;
  37. Application.MessageBox(PChar(MSG),'ERROR !!!', MB_ICONSTOP );
  38. Abort;
  39. end;  // on
  40.        End; // try
  41.   End
  42. Else
  43.  Begin
  44.       AdoQuery1.Close;            // cierro la tabla.
  45.       AdoQuery1.Open;             // abro la Tabla
  46.       Form1.Cursor:= crDefault;
  47.       Application.MessageBox( 'Proceso Cancelado por el usuario', 'CANCELADO...',
  48.         MB_ICONINFORMATION );
  49.  End;
  50.    End;
  51.  
  52.  
  53.  
  54.  

Módulo de CONSULTA/
 

php
  1. // ********************************
  2. //  consulta mienstras teclea 
  3. // ********************************
  4.  
  5.  
  6. procedure TForm1.Edit1Change(Sender: TObject);
  7. begin
  8.  
  9. with ADOQuery1 do
  10.   begin
  11.     Close;
  12.     SQL.Clear;
  13.     SQL.Add('SELECT * FROM ONT ');
  14.     SQL.Add('WHERE MAC_ONT LIKE ' +quotedstr('%' + Edit1.Text + '%')+' ');
  15.     Open;
  16.     LABEL2.Caption:= aDOQUERY1.FieldByName('MAC_ONT').AsString;
  17.   end;
  18.  

 
Gracias anticipadas por su tiempo !!
 
Saludos !! ..
 
 
 
 
 
 
 
 
 
 
 

  • 0