Ayuda para modificar datos en campos de un DBF desde un PRG de VFP 6

639 views
Skip to first unread message

Luis Courcelle

unread,
May 29, 2017, 1:19:56 AM5/29/17
to Comunidad de Visual Foxpro en Español
Hola, que tal. Antes que nada mi fuerte no es la programacion y lo mas cerca que estoy es el aprender html, asi que estoy algo lejos.
Este problema que traigo en manos es una herencia en el trabajo el cual debo resolver para dar continuidad a un proceso mayor, pero debido a mi ignorancia es que mejor recurro a los que saben.

El asunto es este.

Debo modificar una base de datos (DBF) en la cual existen de 3 a 5 campos, de los cuales solo se modificaran 2 en especifico y solo cuando cumplan cierta condicion.
Ejemplo:

cuando en el campo B exista el numero 128 y en el campo C existe el dato 1-B cambiar el campo: B por numero: 37 y el campo: C por el dato: 4-D

y la forma como esta desarrollado es la sig:

USE "C:\Prueba Datos.dbf"

    Replace PL with 128, LOC with "1-A" for PL= 68 .and. LOC="3-A"


la linea de REPLACE se repite tantas veces como cambios distintos tiene que hacerse. Este desarrollo esta es un archivo PRG que se supone debe correr en VFP, y el problema no es el numero de registros que debe hacerse ya que es un trabajo muy especifico, sino que no ha funcionado de la forma que esta hecho el PRG o no se esta haciendo de la forma adecuada, ya que al ejecutarse no hace ningun cambio.

Cualquier ayuda que puedan darme se las agradecere muchisimo.
Quedo a sus ordenes.

Carlos Miguel FARIAS

unread,
May 29, 2017, 6:58:50 AM5/29/17
to Grupo Fox
Hace un browse for pl=68 and loc="3-A" para ver que te muestra.
Esos registros luego del comando indicado, deben aparecer con PL = 128 u LOC = "1-A"
Luego con un browse for pl=128 and loc="1-A" debería mostrarte el menos los mismos registros del anterior
Saludos: Miguel, La Pampa (RA)

Fidel Charny

unread,
May 29, 2017, 7:16:06 AM5/29/17
to Comunidad de Visual Foxpro en Español
REPLACE tiene como Scope por defecto el registro actual. Por lo que si el registro actual no responde a la condición de FOR, no se reemplazará nada.
USE C:\Prueba\Datos.dbf
Replace ALL PL with 128, LOC with "1-A" for PL= 68 .and. LOC="3-A"
USE
Alternativamente puedes poner los cambios en un bucle
USE C:\Prueba\Datos.dbf
SET ORDER TO            && esto se necesita solamente si tienes un índice estructural sobre la tabla y afecta a alguno de los campos reemplazados.
DO WHILE !EOF()
               IF PL = 68 AND LOC = "3-A"
                        REPLACE PL with 128,;
                             LOC WITH "1-A"
               ENDIF
              SKIP
ENDDO
use


Carlos Miguel FARIAS

unread,
May 29, 2017, 11:52:57 AM5/29/17
to Grupo Fox
Me parece Fidel que estás equivocado
REPLACE lo hace dentro del Scope (rango) indicado, si no indica nada es igual a NEXT 1, que es el registro actual, pero si indica WHILE o FOR o ALL, lo hace para los que cumplan la condición o todos.
El tema es que tendría que revisar si hay registros que cumplan ambas condiciones.
Saludos: Miguel, La Pampa (RA)

Luis Courcelle

unread,
May 29, 2017, 12:11:53 PM5/29/17
to Comunidad de Visual Foxpro en Español
Que tal Fidel, antes que nada gracias y gracias tambien a quienes se toman la molestia de leer y aportar.
Te comento que para mi caso particular me funciono la segunda opcion.: 

USE C:\Prueba\Datos.dbf
SET ORDER TO    
DO WHILE !EOF()
               IF PL = 68 AND LOC = "3-A"
                        REPLACE PL with 128,;
                             LOC WITH "1-A"
               ENDIF
              SKIP
ENDDO
use


Ahora el problema que tengo es como agrego mas cambios para que se ejecuten en el mismo proceso, ya que son varias decenas de cambios de ese estilo, ¿como puedo armar la secuencia?
De antemano gracias

Fidel Charny

unread,
May 29, 2017, 4:34:07 PM5/29/17
to Comunidad de Visual Foxpro en Español
Con VFP6 yo no complicaría más la cosa: una estructura DO CASE / CASE / ENDCASE dentro del bucle DO WHILE / ENDDO
Algo así:
USE C:\Prueba\Datos.dbf
SET ORDER TO    
DO WHILE
!EOF()

    DO CASE
        CASE PL
= 68 AND LOC = "3-A"

            REPLACE PL
with 128,;
            LOC WITH
"1-A"

        CASE PL
=67 AND LOC = "4-B"
            REPLACE PL WITH
130,;
            LOC WITH
"1-A"
           
        CASE
&& etc
   
    ENDCASE
    SKIP
ENDDO
use

Fidel Charny

unread,
May 29, 2017, 4:42:43 PM5/29/17
to Comunidad de Visual Foxpro en Español
Si Miguel, estoy equivocado.
Debe ser que me acostumbré al SCAN / ENDSCAN o, dejando las excusas de lado, mi cabeza ya no está funcionando bien.
Bah, no se si alguna vez funcionó bien.

Carlos Miguel FARIAS

unread,
May 29, 2017, 5:29:17 PM5/29/17
to Grupo Fox
La solución al problema planteado es tan simple que no da ganas de pasarle una solución.
Bueno, hoy no puedo porque estoy con laburo que tengo que sacar urgente, pero más adelante, si les interesa, paso algo.
Saludos: Miguel

Luis Courcelle

unread,
May 29, 2017, 6:41:13 PM5/29/17
to Comunidad de Visual Foxpro en Español
Fidel, te agradezco mucho tu ayuda. La solucion que mandaste con CASE me vino como anillo al dedo. Ya estoy trabajando en ella vaciando los datos, Muchisimas gracias y saludos.

Miguel, me da gusto que para ti sea algo tan facil, por desgracia para otros como yo no ya que no es mi campo y por ellos recurrimos a la ayuda de estos grupos. De todos modos agradezco la ayuda y la atencion.

Carlos Miguel FARIAS

unread,
May 30, 2017, 7:22:38 AM5/30/17
to Grupo Fox
Siempre que puedo ayudo, pero estos días estoy hasta las manos.
Saludos: Miguel

Luis Courcelle

unread,
Jun 15, 2017, 2:58:54 PM6/15/17
to Comunidad de Visual Foxpro en Español
Que tal Fidel, aqui ando de nuevo con un problemita sobre lo mismo. Ya capture los datos a cambiar con la estructura que me hiciste. El problema ahora es que llegado cierto punto o mejor dicho, cierto numero de registros, (alrededor de 1,100) me marca un error y me dice que el archivo datos.FXP no es un archivo de objeto. Podrias ayudarme para que me trabaje en todos los registros??

De antemano gracias!!!

Fidel Charny

unread,
Jun 15, 2017, 4:28:02 PM6/15/17
to Comunidad de Visual Foxpro en Español
Los archivos fxp son el código objeto de un archivo prg. (por ejemplo, datos.prg). Tal vez si pones el código nos podemos enterar del problema. Digo porque, es raro que ese error no te aparezca de entrada.
1100 registros no es nada.

Luis Courcelle

unread,
Jun 15, 2017, 5:14:18 PM6/15/17
to Comunidad de Visual Foxpro en Español
EL archivo FXP que genero esta vacio. De todos modos lo adjunto por si tu puedes ver algo que yo no.
Gracias
prog cambiar coordenadas rv guad 2017.FXP

Fidel Charny

unread,
Jun 15, 2017, 8:06:56 PM6/15/17
to Comunidad de Visual Foxpro en Español
No se puede ver nada en un .fxp. Tienes que mandar el prg correspondiente (espero que no tenga ese nombre)

Luis Courcelle

unread,
Jun 16, 2017, 1:05:58 PM6/16/17
to Comunidad de Visual Foxpro en Español
Perdon, si tenia ese nombre pro ya lo cambie. Te anexo el PRG. Como dato extra que creo no explique bien es que lo probe quitando registros y si me lo ejecuta, (aprox 1,100), pero si lo dejo completo (aprox 1,250) ya no lo hace.
CambiaLoc.prg

Fidel Charny

unread,
Jun 16, 2017, 6:13:12 PM6/16/17
to Comunidad de Visual Foxpro en Español
Hola Luis
Creo que el problema está en los 1250 case que escribiste. Es una locura.

Fijate en el archivo prg adjunto. Tiene dos procedimientos. El primero (cambialoc) es el que terminaría haciendo los reemplazos. El segundo (Put_tag) no es más que un ayudante para la escritura de etiquetas tipo xml.
Lo que hace esto es lo siguiente:
1) Reescribe tu código en una cadena de caracteres marcados (tipo xml) para poder determinar los cambios a realizar
2) Convierte la cadena de marcado a un cursor
3) Abre y realiza un Scan sobre la tabla GuaGuia. Para cada registro arma la clave de búsqueda, busca en el cursor y si la encuentra, reemplaza los valores de PL y LOC por los del cursor (que surgen del procedimiento escrito)

Mira el archivo CambiaLocMod.prg donde tenés que cambiarle la ruta para que encuentre a CambiaLoc.prg

O sea que tu archivo PRG se utiliza solamente para terminar generando el cursor (curTags) con el cual se actualizarán los campos de Guaguia. CurTags tendra 1250 registros.
Tenés que agregar el CambiaLocMod.prg a tu aplicación y abrir el archivo de prodimientos con SET PROCEDURE TO \PROGS\cambialocMod.prg ADDITIVE (o pones todo al principio de la aplicación)
Luego para llamar:
CambiaLoc()

Obviamente guardate una copia de la tabla original.
CambiaLocMod.prg

Fidel Charny

unread,
Jun 16, 2017, 6:49:09 PM6/16/17
to Comunidad de Visual Foxpro en Español
Luis
Ahora que me doy cuenta, el programa no te va a servir porque es para VFP9 y dices que tienes VFP6.

En reemplazo te mando una tabla curTags.dbf (está pasada a xbase para que sea compatible con VFP6)
Y el procedimiento (fijate dónde colocás la tabla curtags.dbf )
*<Proceso de modificación>  
USE curtags IN
0 EXCLUSIVE
SELECT CURTGAS
INDEX ON CLAVE TAG iClave
 
USE
"F:\2017\Red Vial Guadalajara 2017\Indice\Pruebas\GuaGuia.dbf" IN 0
SELECT guaguia
SET ORDER TO    
SCAN
    lcTag
= "<PL>"+LTRIM(STR(PL,5,0))+"</PL>";
       
+ "<LOC>"+ALLTRIM(LOC)+"</LOC>"
    IF INDEXSEEK
(m.lcTag,.t.,"curTags","iClave")
        REPLACE PL WITH curTags
.plVal,;
            loc WITH curTags
.LocChar
    ENDIF
ENDSCAN
*</Proceso de modificación>  

*<Limpieza>
USE IN curTags
USE IN
GuaGuia
*</Limpieza>
curTags.DBF
Reply all
Reply to author
Forward
0 new messages