remplazar registros masivos en un campo en MySQL

191 views
Skip to first unread message

Enrique

unread,
Aug 28, 2022, 9:16:19 PM8/28/22
to Comunidad de Visual Foxpro en Español

Hola a Todos.  No he podido dar con una solución que lo podía hacer fácilmente con tablas nativas.

Necesito remplazar registros masivos en un campo que cumplan una condición, pero ahora en MySQL.

Con DBF, ocupaba el comando Replace, de esta manera:

Select mitabla

GO top

SCAN 

 IF nom_muni="ISLA DE PASCUA"    

    REPLACE PROVINCIA WITH "ISLA DE PASCUA"

   ELSE

 ENDIF

 IF nom_muni="LOS ANDES" 

   REPLACE PROVINCIA WITH "LOS ANDES"

  ELSE

 ENDIF

Etc..

ENDSCAN

En MySQL trato de hacer algo parecido, de la siguiente manera;

Para actualizar ocupo la siguiente sintaxis:

update 'nombre_tabla' set nombre_campo= replace(nombre_campo, 'string_a_encontrar', 'string_a_reemplazar');

 El código es el siguiente:

=sqlexec(Con,"SELECT todos.region,nombre_region,provincia,nom_muni,ano FROM todos where region ='V' Order By nom_muni and ano=2021 ","cursorcambia") 

 

SELECT cursorcambia 

GO top

SCAN 

 IF  nom_muni="ISLA DE PASCUA"  && Campo provincia esta vacío o en blanco

 update todos set provincia= replace(provincia, ' ', 'ISLA DE PASCUA')

  ELSE

 ENDIF 

IF  nom_muni=" LOS ANDES"  && Campo provincia esta vacío o en blanco

  update todos set provincia= replace(provincia, ' ', ' LOS ANDES')

  ELSE

 ENDIF 

ENDSCAN

 lnRet = SQLEXEC(Con, "cursorcambia")            

If lnRet > 0 Then                 

 =sqlexec(Cone,"COMMIT")          

 =TableUpdate(.T.)

 MESSAGEBOX("Se Actualizaron.. ",0+16,"El Sistema Informa",1500) 

ELSE

 MESSAGEBOX("ERROR ",0+16,"El Sistema Informa",1500)

ENDIF

No Me manda error, pero no hace los cambios.

Alguna sugerencia de como ocupar el comando replace o bien tengo que hacer otro procedimiento.

Muchas gracias.

Message has been deleted

HernanCano

unread,
Aug 29, 2022, 12:25:43 AM8/29/22
to Comunidad de Visual Foxpro en Español

En la parte que mencionas como "segunda parte", la que quisieras hacer sorbe MySQL, también la estás ejecutando cobre el cursor en VFP, no sobre la tabla MySQL.
La diferencia entra la "primera parte" y la "segunda" es que en la primera utilizas REPLACE y en la segunda UPDATE (pero los Update está malos).

Si bien estás ejecutando el comando =TableUpdate(.T.) para que "envíe los datos cambiados al motor (bien !!!), la sintaxis de los comandos UPDATE sobre el cursor en VFP es incorrecta, pues 

update todos set provincia= replace(provincia, ' ', 'ISLA DE PASCUA')

no es un comando correcto en VFP (debes estar recibiendo "Sintaxis incorrecta", es lo más probable).

Ahora si no estás recibiendo mensaje de error, es por que debes tener un comando ON ERROR que lo inhabilite, o todo lo q muestras dentro de un TRY/CATCH, o en la clase del formulario tuenes una método Error() que inhabilita también.

Probable solución:

Cambiar los UPDATE por algo como:

replace PROVINCIA with M.cNuevoNombre

El comando 
lnRet = SQLEXEC(Con, "cursorcambia")

es inválido. No sé cuál es el objetivo, para darte un comando que pueda funcionar. Pero me parece que se puede quitar para que toda la secuencia funcione.
El realmente útil es  =TableUpdate(.T.), pero considero q no necesitas el COMMIT.... o tal vez después del TableUpdate().

Después de usar comandos correctos pudiéramos agregar formas de encontrar los errores, con la función AERROR().

Todavía estoy tratando de entender los comentarios en la segunda parte:

HernanCano

unread,
Aug 29, 2022, 12:26:45 AM8/29/22
to Comunidad de Visual Foxpro en Español
El mensaje borrado es por que se me fue parcial (sin terminar) lo q quería escribir; y todavía no estaba clara la idea.

Antonio Meza

unread,
Aug 29, 2022, 8:52:25 AM8/29/22
to Comunidad de Visual Foxpro en Español
Hola, usar un servidor de base de datos con VFP por medio de SQLEXEC no es sencillo hay muchos aspectos que debes entender y aplicar, por ejemplo conexión, transacciones, manejo de cursores, conocimiento de SQL, etc, etc.

Para tu ejemplo solo necesitas enviar instrucciones SQL desde VFP por SQLEXEC de forma directa para mas rápido, sin pasar por un cursor de VFP, algo así:

1.- Conectarte al servidor Mysql desde VFP
2.- Preparar una transacción de lectura y escritura
3.- Enviar los comandos Update necesarios
4.- Confirmar la transacción si todo salió bien o cancelar la transacción si algo salió mal.
5.- Desconectarte.

En el punto 3 seria algo así:

sql = "update todos set provincia = 'ISLA DE PASCUA' where nom_muni='ISLA DE PASCUA' "

sqlexec(Con, _sql)

Puedes usar FoxyDb que te va a permitir hacer lo mismo de arriba pero con control de conexión y transacciones, o traerte la tabla completa controlada por FoxyDb para que simplemente modifiques el cursor con tus comandos de VFP y luego mandas a guardar sin preocuparte por los comandos SQL al servidor, ejemplo de la segunda forma con FoxyDB.

odb.Connect()   && Conectarte
odb.Query("select * from todos", " cursorcambia", "todos")     && Obtener todos los registros de la tabla
odb.CursorEdit(" cursorcambia")    && Hacer el cursor editable

*******************
** Usar lo que sabes de VFP **

SELECT cursorcambia 

SCAN 

 IF  nom_muni="ISLA DE PASCUA"  && Campo provincia esta vacío o en blanco

  update todos set provincia= replace(provincia, ' ', 'ISLA DE PASCUA')

  ELSE

 ENDIF 

IF  nom_muni=" LOS ANDES"  && Campo provincia esta vacío o en blanco

  update todos set provincia= replace(provincia, ' ', ' LOS ANDES')

  ELSE

 ENDIF 

ENDSCAN

if odb.Update("cursorcambia")    && Actualizar Mysql
    odb.commit()    && Confirmar cambios
else
    odb.rollback()    && Deshacer cambios
endif

saludos
Antonio Meza

Enrique

unread,
Aug 29, 2022, 11:54:21 AM8/29/22
to Comunidad de Visual Foxpro en Español

Muchas gracias Hernán y Antonio por sus ayudas y tiempo que dedican a orientarme. 

Antonio: Como Puedo implementar FoxyDb en el formulario. Existe algún manual o ayuda al respecto. Pues nunca he trabajado con FoxyDb.

En mi caso me conecto a un Hosting de esta forma: 

PUBLIC Con
         Con = SQLSTRINGCONNECT("DRIVER={MySQL ODBC 5.1 Driver};" + ;
            "SERVER=168.194.197.2;" + ;
            "UID=municipa;" + ;
            "PWD=913#*Q1pBdItqV;" + ;
            "DATABASE=municipa_muni;" + ;
            "OPTIONS=131329;")
           
        IF Con > 0
           MESSAGEBOX("CONEXION EXITOSA....")
          =sqlexec(Con,"SELECT region,nombre_region,nom_muni FROM todos where ano=2021 Group By  nom_muni Order By nom_muni","curClientes")
         SELECT curClientes   
        ELSE
          MESSAGEBOX("Existe un Error de Conexión....")
          THISFORM.RELEASE

        ENDIF   

 

 ¿qué tengo que cambiar en la conexión? Y finalmente, como implemento FoxyDb en el formulario.

Por otra parte, realicé lo indicado. Pero solo graba algunas condiciones, dejando la mayoría de las Provincias en blanco (como estaban). 

Me doy cuenta que si realizó de solo una Provincia, funciona perfectamente. Pero no me sirve esa alternativa.

Scan

 IF nom_muni="ISLA DE PASCUA"  

  _sql = "update todos set provincia = 'ISLA DE PASCUA' where nom_muni='ISLA DE PASCUA' "  


  ELSE
ENDIF

 IF nom_muni="LOS ANDES"  

  _sql = "update todos set provincia = 'LOS ANDES' where nom_muni='LOS ANDES' "
  ELSE
 ENDIF 

Etc...
ENDSCAN 

lnRet =sqlexec(Con, _sql)

 If lnRet > 0 Then
   =TableUpdate(.T.)  
   =sqlexec(Con,"COMMIT")
   MESSAGEBOX("Se Actualizaron Los Registros.. ",0+16,"El Sistema Informa",1500)
   brow
  ELSE
   MESSAGEBOX("Existe un Error ",0+16,"El Sistema Informa",1500)  
 ENDIF


Hernan: Ya había probado con lo que indicas.

 El cursor creado de nombra "cursorcambia", al visualizar con el comando Brow, muestra todos los registros creados (eso estaría muy bien). 

Pero al consultar en cPanel para comprobar, estos no fueron reemplazados en su mayoría, reemplazando solo algunas provincias.

SELECT cursorcambia
GO top

SCAN
 IF  nom_muni="ISLA DE PASCUA"    

   REPLACE PROVINCIA WITH "ISLA DE PASCUA"
  ELSE
 ENDIF

IF  nom_muni="LAS CONDES"  
   REPLACE PROVINCIA WITH "SANTIAGO"
  ELSE
 ENDIF

ENDSCAN

 =TableUpdate(.T.)  
   =sqlexec(Con,"COMMIT")
   MESSAGEBOX("Se Actualizaron los registros.. ",0+16,"El Sistema Informa",1500)
   brow


 Nuevamente, muchas gracias por la ayuda recibida.

Reply all
Reply to author
Forward
0 new messages