Editar y eliminar Registro con FoxyDb

198 views
Skip to first unread message

MartinS

unread,
Jun 4, 2015, 10:26:30 AM6/4/15
to publice...@googlegroups.com
Hola a todos he hecho este codigo para insertar registros a mi tabla de mi base de datos Mysql y todo funsiona bien, y alguien podria enseñarme para poder editar X registro


 PUBLIC opreg, vnom_cliold, vcodigo, vcod_cli, lnHandle, vnom_cli, lcStringCnxLocal, lnHandle
 vnom_cliold = ""
 lcStringCnxLocal =""
 opreg = 0
 vcod_cli =""
 vcodigo = 0
 lnHandle = 0
=CURSORSETPROP("MapBinary", .T., 0)       
=SQLSETPROP(0, "DISPLOGIN", 3)
=SQLSETPROP(0, "DispWarnings", .F.)
=SQLSETPROP(lnhandle, 'DispWarnings', .T.)
=SQLSETPROP(lnhandle, 'QueryTimeOut', 180) 
=SQLSETPROP(0,"ConnectTimeOut",5) &&Tiempo de Espera para la coneccion
=SQLSETPROP(0,"PacketSize",1000) && Tamaño de paquete utilizado en la red
Public oDb
oDb = NEWOBJECT("foxydb","foxydb.prg")
oDb.test()
oDb.Connect()

LOCAL BIMAGEN AS BLOB    
varimg = GETFILE()
BIMAGEN=(0h)         && Inicializamos la Variable
IF NOT EMPTY(varimg)
   BIMAGEN=FILETOSTR(varimg)        
ENDIF     
oDb.Sql("Select * from clientes_mysql","clientes_tmp")
GO bott
*!* BROWSE
IF RECCOUNT()=0
   vcod_cli ="1"
 ELSE   
   IF EMPTY(cod_cli)
      TRANSFORM(RECCOUNT()+1)
    ELSE    
      vcod_cli = TRANSFORM(RECCOUNT()+1)
   ENDIF    
ENDIF   
oDb.close("clientes_tmp")
oDb.New("clientes_mysql")
oDb.CursorEdit("clientes_mysql")
APPEND BLANK
GO bott
REPLACE cod_cli WITH "XXX" && vcod_cli
REPLACE NOM_CLI WITH "nombre cliente"
REPLACE FOTO WITH BIMAGEN
REPLACE FEC_NAC WITH DATE()
oDB.CursorChanges("clientes_mysql")
oDB.Update("clientes_mysql")
oDb.Save()


de antemano gracias

Francisco

unread,
Jun 4, 2015, 10:52:15 AM6/4/15
to publice...@googlegroups.com, marti...@gmail.com
Bueno primero traes al cursor los datos del cliente con el Query solo del cliente que quieras editar (puedes ponerle el nombre que quieras incluso el mismo que la tabla origen), llamas luego a Editcursor, una vez hecho esto muestras la opcion de guardar cambios en el boton o deshacer (cancelar)...

if oDb.Connect()
     oDb.Query("select.....","Clientes")
    oDb
.EditCursor("Clientes")
    oDb
.Disconnect()
endif


Dejas que el usuario modifique todo lo que quiera del cursor y cuando pulsa guardar....

if oDb.Connect()
   if oDb.Changes()
           oDb
.Update("Clientes")
           oDb
.Save()
   endif
   oDb
.Disconnect()
endif

Si da a deshacer o cancelar...

if oDb.Connect()
   oDb.Undo()
   oDb.Disconnect()
endif

Esto es mas o menos lo mínimo pero te aconsejo que mires el blog para ver el ejemplo que hay de como se hace eso:

Martin´S Consultora Informatica

unread,
Jun 4, 2015, 11:04:00 AM6/4/15
to publice...@googlegroups.com
ok gracias probaré
--
"CIM" Consultoria Informatica Martin´S
--
La información contenida en este mensaje electrónico tiene carácter
CONFIDENCIAL, está dirigida únicamente al destinatario de la misma y
sólo podrá ser usada por éste. Si el lector de este mensaje no es el
destinatario del mismo, se le notifica que cualquier copia o
distribución de éste se encuentra totalmente prohíbida. Si usted ha
recibido este mensaje por error, por favor notifique inmediatamente al
remitente por este mismo medio y borre el mensaje de su sistema.
Gracias.

Antonio Meza

unread,
Jun 4, 2015, 11:23:58 AM6/4/15
to publice...@googlegroups.com, marti...@gmail.com
Hola Martin!!!

Ya te contesto Francisco como hacerlo!!

Por otro lado, veo que tienes declarados unos SQLSETPROP, estos están dentro de la función .Connect() de Foxydb, por lo tanto si los inicias y luego te conectas se reemplazan por los de FoxyDb,

Te recomiendo que revises los que tiene foxydb y si puedes comentar que ventaja tiene al asignar esos valores si son diferentes a los que use en foxydb, ya que los tome de varios Blogs en internet viendo como los usaban, la mayoría del BLog de Walter Ojeda.

Analizando tu código, veo que estas obteniendo un Código de Cliente? y para ello te traes toda la tabla para saber cuantos registros tiene y luego sumarle 1 al reccount(), esto en Red no te va a funcionar, hay una función que se llama .Code() que te permite obtener un código consecutivo, deja busco el mensaje donde explique como usarlo.

Para editar un registro lo correcto es que en la consulta que hagas al servidor debes traer solo el registro que vas a editar, si es por ejemplo un catalogo de clientes, lo puedes buscar por el campo ID aunque normalmente seria por su campo clave o código, o nombre del cliente, una vez que ya lo tienes localizado y en un cursor devuelto por .Query() lo editas con CursorEdit(), lo modificas y luego lo actualizas con .Update() y guardas con .Save()

saludos
Antonio Meza

Martin´S Consultora Informatica

unread,
Jun 5, 2015, 11:32:12 AM6/5/15
to publice...@googlegroups.com
Ok, antonio estoy agradecido por tu respuesta, hoy estube haciendo prueba no me funsiona lo que quiero que suceda

Public oDb
oDb = NEWOBJECT("foxydb","foxydb.prg")
oDb.test()
oDb.Connect()
if oDb.Connect()
    oDb.Query("select * from clientes_mysql","Clientes")
    oDb.CursorEdit("Clientes")
    GO bott
    REPLACE cod_cli WITH "666" && vcod_cli
    REPLACE NOM_CLI WITH "MI FABIO MARTINS"
    REPLACE FEC_NAC WITH DATE()
    oDb.Update("Clientes")
    oDb.Save()    
    oDb.Disconnect()
endif

osea no va el final de la tabla o registro que necesito para modificar, estoy haciendo pruebas o experimentando con la clase  por eso es que la llamo a toda la tabla

Antonio Meza

unread,
Jun 5, 2015, 4:31:16 PM6/5/15
to publice...@googlegroups.com, marti...@gmail.com
Los requerimientos son para Mysql o MariaDb usar tablas InnoDb, y usar campos autoincrementables como Primary Key.

Si ya tienes toda la tabla en el cursor la puedes recorrer con LOCATE para localizar el registro que quieres y luego modificar.

Pero lo ideal es que la consulta a la tabla la hagas solo por el registro que necesitas así no viajan toda la tabla por la red y puede fácilmente modificar el registro.

Donde tienes 
oDb.Connect()
if oDb.Connect()

Elimina el oDb.Connect() esta de mas!!

Usa un Brow para ver donde esta el registro antes de Go y luego otro brow para ver si se movio, si en el formulario tienes los controlsource posiblemente te haga falta un Refresh al moverte de registro.

...
...
 oDb.Query("select * from clientes_mysql","Clientes")
    oDb.CursorEdit("Clientes")
    brow
    GO bott
    brow
    REPLACE cod_cli WITH "666" && vcod_cli
...
...


saludos
Antonio Meza

Martin´S Consultora Informatica

unread,
Jun 9, 2015, 12:10:54 AM6/9/15
to publice...@googlegroups.com
hola Antonio podrías informarme sobre la funsion CODE quiero entenderle para poder usarla

Francisco

unread,
Jun 9, 2015, 4:13:30 AM6/9/15
to publice...@googlegroups.com, marti...@gmail.com
Buenas te expongo lo que se ha dicho sobre el Code de FoxyDB por Antonio:

FoxyDb tiene una función que facilita realizar esta tarea se llama foxydb.Code() te permite hacer lo mismo que comentas que haces tu, incrementando el valor de un campo +1 con una sola linea de código, de igual forma aplica un bloqueo al registro para incrementarlo e impedir que otro usuario obtenga otro valor por lo que es muy pero muy importante no solicitar un Código si aun falta por confirmar algo, porque la transacción debe durar lo menos posible.

Antes de explicarte, note que comentas que obtienes ese valor y lo reemplazas tanto en la tabla principal como en las tablas hijas, y te comento que esto no es necesario y a demás no es una buena practica de diseño de base de datos, para eso tienes los campos ID para relacionar las tablas, solo debes almacenarlo en la tabla principal y del tipo carácter ni siquiera es necesario que sea numérico este campo en la tabla principal, donde si debe ser numérico es en la tabla Códigos que comentas que manejas.

El orden para guardar los datos en lo personal te recomiendo la siguiente forma.

1.- Verificar si hay cambios en cualquier tabla .Changes()
2.-.Si no hay cambios terminar (fin)
3.- Verificar si hay cambios en tabla principal .CursorChange("tabla_principal")
4.- Si hay cambios y esta tabla requiere de un campo código entonces obtener primero el código .Code()
5.- Una vez obtenido el código remplazar el valor en el campo correspondiente en la tabla principal
6.- Enviar a actualizar la tabla principal .Update("tabla_principal",.t.) y solicitar obtener el ultimo ID
7.- Verificar cambios en tablas hijas .CursorChange("tabla_hija1"), si hay cambios verificar si es un registro nuevo y remplazar campo ID que usas para relacionar la tabla principal con las tablas hijas.
8 remplazar el campo IDtabla_principal de la tabla hija con el valor del ultimo ID obtenido de la tabla principal .id_Last
9 Realizar el mismo punto 8 pero con otra tabla hija
10 Guardar los cambios .Save()

En conclusión, ya cuando vas a guardar y el usuario no tiene que intervenir ni confirmar nada, solicitas primero obtener el Código, luego remplazas el campo de la tabla principal por el código y mandas a actualizar la tabla principal solicitando el valor del campo ID autoincrementable, para luego remplazar solo este Id en las tablas hijas y guardar.

Según el nombre y estructura de tu tabla la función .Code() seria así para tu caso

If foxydb.Code("codigos","sign","tabla,serie","'FACTURAS','A'")
      wait windows foxyDb.id_Code
ENDIF

La función .Code() acepta 5 parámetros
1.- Nombre de la tabla real en el servidor
2.- Nombre del Campo a incrementar
3.- Lista de Campos separados por coma para filtrar el registro sin comillas simples por cada campo
4.- Lista de Valores usados para filtrar el registro, en el caso de valores carácter debe ir entre comillas simples
5.- Valor predeterminado, si quieres modificar el valor o que inicie en un valor especial

saludos
Antonio Meza

Martin´S Consultora Informatica

unread,
Jun 9, 2015, 9:58:28 AM6/9/15
to publice...@googlegroups.com
OK antonio, te agradezco tu tiempo
Reply all
Reply to author
Forward
0 new messages