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.
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
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.