Scatter Memvar / Gather Memvar

1,334 views
Skip to first unread message

GETIANG

unread,
Jun 3, 2015, 9:04:10 AM6/3/15
to publice...@googlegroups.com
Buenos días foro...!

Esta vez recurro a ustedes porque necesito realizar (Scatter Memvar / Gather Memvar) pero en mysql

Este proceso es para clonar documentos...

Gracias de antemano por la colaboración prestada...!

Rick C. Hodgin

unread,
Jun 3, 2015, 9:27:06 AM6/3/15
to publice...@googlegroups.com, getia...@gmail.com
Por Google Translate:  MySQL no utiliza motor de datos de VFP directamente, así que si quieres hacer esto, usted tendrá que escribir un algoritmo que toma el objeto nombrado como entrada y, a continuación, convierte a través de la iteración en el SQL basado en texto pass-thru declaración, que se emite a continuación.

Podría estar equivocado, sin embargo. Puede haber una manera de hacerlo.

Saludos cordiales,
Rick C. Hodgin

English: Mysql doesn't use VFP's data engine directly, so if you want to do this, you'll need to write an algorithm which takes the named object as input, and then converts it through iteration into the text-based SQL pass-thru statement, which is then issued.

I could be wrong, however.  There may be a way to do it.

Irwin Rodriguez

unread,
Jun 3, 2015, 9:34:43 AM6/3/15
to publice...@googlegroups.com
Hola GETIANG


(Scatter Memvar / Gather Memvar) pero en mysql

En MySQL no he visto funciones parecidas al MemVar de VFP, lo más parecido es insertar datos utilizando el comodín [?]


Este proceso es para clonar documentos...

a que te refieres con eso? Si es copiar una fila a otra tabla podría entonces usa un INSERT INTO SELECT




--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

GETIANG

unread,
Jun 3, 2015, 10:06:57 AM6/3/15
to publice...@googlegroups.com, getia...@gmail.com
Gracias por responder irwin...

No es copiar un registro a otra tabla... es copiar un registro a otro registro

Para que me entiendas mejor...

Lo que necesitamos es CLONAR un documento (x) con el fin de agilizar la transcripción de datos.... Ya que un documento aduanal posee demasiados campos

Se puede clonar registros de la siguiente manera

 insert into nomtabla(nombre, de, campos) (select nombre, de, campos from nomtabla where campos='valor')

Pero lo que quiero es evitar a toda costa es evitar la transcripción de los campos

Irwin Rodriguez

unread,
Jun 3, 2015, 10:26:30 AM6/3/15
to publice...@googlegroups.com
Entiendo, una opción es hacer un INSERT INTO SELECT pero ambas tablas deben tener la misma estructura. Ejemplo:

Tabla 1: codigo, nombre, direccion, telefono
Tabla 2: codigo, nombre, direccion, telefono

Entonces:

INSERT INTO TABLA1 SELECT * FROM TABLA2 WHERE CONDICION

de lo contrario no te serviría esta opción.

Saludos!

Antonio Meza

unread,
Jun 3, 2015, 1:18:32 PM6/3/15
to publice...@googlegroups.com, getia...@gmail.com
Es muy sencillo!!

Tienes tu cursor local de VFP y ya localizado el registro a copiar 

Select tabla
SCATTER TO oCopiarRegistro

Ahora Agregas un registro nuevo a la tabla

Append Blank

Y copias el contenido del registro anterior en el nuevo

GATHER FROM oCopiarRegistro

saludos
Antonio Meza

Carlos Miguel FARIAS

unread,
Jun 4, 2015, 1:51:53 PM6/4/15
to Grupo Fox
Antonio, es para mysql

Antonio Meza

unread,
Jun 4, 2015, 2:14:00 PM6/4/15
to publice...@googlegroups.com, carlosmig...@gmail.com
Hola Miguel!!

Intuyo que usa VFP para conectarse a Mysql y realizar todo por medio de cursores de VFP y luego enviar a Mysql, por lo tanto es lo que le comente si ya tiene el cursor en VFP lo clona y luego ya vera su procedimiento para enviarlo a Mysql.

saludos
Antonio Meza


El jueves, 4 de junio de 2015, 12:51:53 (UTC-5), Miguel escribió:
Antonio, es para mysql


Carlos Miguel FARIAS

unread,
Jun 4, 2015, 2:57:13 PM6/4/15
to Grupo Fox
Tiene insert into () select, es un poco pesado porque debe enumerar todos los campos, pero es lo correcto, y se hace en el servidor, sin mover datos a vfp (o al lenguaje en si).
Hasta hay opciones de que si al copiar, se produce una repetición de claves primarias, unicas, hacer algun acción como remplazar datos.
Saludos: Miguel, La Pampa (RA)

Antonio Meza

unread,
Jun 4, 2015, 4:05:18 PM6/4/15
to publice...@googlegroups.com, carlosmig...@gmail.com
Ya me perdí jajaja

Si tienes un formulario para capturar un registro y ese registro se parece a otro y le das la opción de copiarlo o clonarlo, lo ajustas y ya luego lo envías a Mysql no es así?

No creo que lo quiera hacer directo desde Mysql, a poco tu enviaras un Insert al servidor Mysql para duplicar un registro y luego te lo traes a VFP para agregarle o quitarle cosas?

Primero traes el registro, lo copias o clonas, luego lo editas a gusto y lo retornas a Mysql si es que al final lo vas a insertar, a lo mejor es flojo el usuario y lo deja para mañana y cancela todo jajaja entonces de que sirvió clonar el registro directamente en Mysql?

saludos
Antonio Meza

GETIANG

unread,
Jun 4, 2015, 5:15:57 PM6/4/15
to publice...@googlegroups.com, getia...@gmail.com
Buenas tardes...

Comparto mi solución.... 

Utilizo un cursor READWRITE
replace campoclave WITH 0
LOCAL lcins, lcvalues
lcins = "Insert TABLAMYSQL ("
lcvalues = " Values ('"
AFIELDS(lcstruct, "clo_fact")
FOR ki = 1 TO ALEN(lcstruct, 1)
       lcins = lcins+lcstruct(ki, 1)+IIF(ki<ALEN(lcstruct, 1), ",", ")")
       lcvalues = lcvalues + CambiarDatos(EVALUATE("clo_fact." + FIELD(ki))) + IIF(ki<ALEN(lcstruct, 1), "','", "')")
ENDFOR
    
LOCAL lcQuery
lcQuery = " "
lcQuery = lcQuery + lcins + " "
lcQuery = lcQuery + lcvalues
MySQL.Ejecutar(lcQuery)

Gracias por sus respuestas...!

El miércoles, 3 de junio de 2015, 8:34:10 (UTC-4:30), GETIANG escribió:

Rick C. Hodgin

unread,
Jun 4, 2015, 5:25:09 PM6/4/15
to publice...@googlegroups.com, getia...@gmail.com
+1   :-)

Por Google Translate:  Se podría concluir que el código en una función y pase el nombre de tabla y alias ("TABLAMYSQL" y "clo_fact"), y pasar en un tercio parámetro opcional que indica si en realidad debe ser escrito.

FUNCTION mysql_ejecutar
LPARAMETERS tcTabMysql, tcAlias, tlNoExecute
LOCAL lcins, lcvalues

lcins = "Insert " + tcTabMysql + " ("
lcvalues = " Values ('"
AFIELDS(lcstruct, tcAlias)
FOR ki = 1 TO ALEN(lcstruct, 1)
       lcins = lcins+lcstruct(ki, 1)+IIF(ki<ALEN(lcstruct, 1), ",", ")")
       lcvalues = lcvalues + CambiarDatos(EVALUATE(tcAlias + "." + FIELD(ki))) + IIF(ki<ALEN(lcstruct, 1), "','", "')")
ENDFOR

LOCAL lcQuery
lcQuery = " "
lcQuery = lcQuery + lcins + " "
lcQuery = lcQuery + lcvalues
IF !tlNoExecute
    MySQL.Ejecutar(lcQuery)
ENDIF

RETURN lcQuery

Saludos cordiales,
Rick C. Hodgin

English:  You could wrap that code in a function and pass in the table name and alias ("TABLAMYSQL" and "clo_fact"), and pass in an optional 3rd parameter which indicates if it should actually be written.

GETIANG

unread,
Jun 4, 2015, 5:52:27 PM6/4/15
to publice...@googlegroups.com, getia...@gmail.com
Gracias Rick


El miércoles, 3 de junio de 2015, 8:34:10 (UTC-4:30), GETIANG escribió:

Antonio Meza

unread,
Jun 4, 2015, 6:19:46 PM6/4/15
to publice...@googlegroups.com, rick.c...@gmail.com, getia...@gmail.com
Hola Rick!!

En mi caso uso la librería FoxyDb que hace algo parecido a lo que hace Getian, pero si una tabla de mysql tiene 10 campos por ejemplo y solo modificas 1 o 2 solo se generar el Update o Insert con los campos modificados.


saludos
Antonio Meza

Victor Espina

unread,
Jun 5, 2015, 10:11:00 AM6/5/15
to publice...@googlegroups.com, getia...@gmail.com
No se como funcionaria en MySQL, pero en SQL Server lo puedes lograr de esta forma:

SELECT * INTO #temp FROM tabla WHERE id = valor
UPDATE
#temp SET id = nuevovalor
INSERT INTO tabla SELECT
* FROM #temp
DROP TABLE
#temp


Saludos

Victor Espina

Rick C. Hodgin

unread,
Jun 5, 2015, 2:03:58 PM6/5/15
to publice...@googlegroups.com, solv...@gmail.com, rick.c...@gmail.com, getia...@gmail.com
Por Google Translate:  Sí. Esto se puede lograr mediante el uso NOMBRE DISPERSIÓN abc y luego comparar cada campo con ==, y sólo la creación de la instrucción UPDATE para aquellos campos que han cambiado. También puede crear una tabla en un recipiente que tiene disparadores en cada campo, y luego construir la expresión a medida que avanza de forma automática. También puede agregar mediante programación _f1, _f2, _f3 ... campos para cada campo en AFIELDS (), que almacena el (2007) el valor para cada campo SYS, y luego sólo las actualizaciones si ha cambiado, etc. Muchas de las soluciones. El implementado por GETIANG es una solución de "fuerza bruta", que es muy fácil de implementar, siempre va a funcionar, y es fácil de depurar.


Saludos cordiales,
Rick C. Hodgin

English:  Yes.  This can be accomplished by using SCATTER NAME abc and then comparing each field with ==, and then only creating the UPDATE statement for those fields which have changed.  You could also create a table in a container which has triggers on each field, and then build the expression as it goes automatically.  You could also programmatically add _f1, _f2, _f3... fields for every field in AFIELDS(), which stores the SYS(2007) value for each field, and then only updates if it has changed, etc.  Many solutions.  The one implemented by GETIANG is a "brute force" solution which is very easy to implement, will always work, and is easy to debug.

Hugo C.

unread,
Jun 5, 2015, 2:50:06 PM6/5/15
to publice...@googlegroups.com, vesp...@gmail.com, getia...@gmail.com
Lo que comenta Vicctor en MySql es de esta manera

CREATE TEMPORARY TABLE tmp SELECT * FROM facturas WHERE id = 99;
UPDATE tmp SET id=100 WHERE id = 99;
INSERT INTO facturas SELECT * FROM tmp WHERE id = 100;
DROP TABLE tmp

Saludos.

Abel Flecha

unread,
Apr 1, 2021, 9:44:32 AM4/1/21
to Comunidad de Visual Foxpro en Español
Hola estimado, me decís por favor que hace la función CambiarDatos()???
y porque no está detallada la sintaxis?¿
Gracias.

Reply all
Reply to author
Forward
0 new messages