Actualizar Tablas en VFP

1,109 views
Skip to first unread message

Alfredo Q

unread,
Dec 4, 2013, 12:27:53 AM12/4/13
to publice...@googlegroups.com

Soy nuevo en VFP, a partir de una tabla Db_1, debo extraer registros para actualizar una segunda tabla Db_2, este es mi código y no actualiza, se que el tema es simple pero mucho agradeceré vuestro apoyo:


Select db_1
Scan
cNumonly=" "
cTest=db_1.columna2
For ncnt=32 to 82
cCharacter=substr(cTest, nCnt, 1)
If !Isdigit(cCharacter) .and. cCharacter!='-'
cNumonly=cNumonly+cCharacter
Endif
Endfor
Select db_2
If !eof()
Replace db_2.campo with cNumonly
Endif
Endscan

Edgar Acevedo

unread,
Dec 4, 2013, 3:07:20 AM12/4/13
to publice...@googlegroups.com
Bueno, siendo que eres nuevo aquí va el primer consejo:  dale estructura visual a tu código, así como lo escribiste me recuerda al viejo Basic de DOS de los años 80.  Es muy dificil seguirle asi la huella a la lógica.  Por lo tanto, tu código debiera verse algo así como ésto:

SELECT db_1
SCAN
   cNumonly=" "
   cTest=db_1.columna2
   FOR ncnt=32 TO 82
      cCharacter=SUBSTR(cTest, ncnt, 1)
      IF !ISDIGIT(cCharacter) .AND. cCharacter!='-'
         cNumonly=cNumonly+cCharacter
      ENDIF
   ENDFOR
   SELECT db_2
   IF !EOF()
      REPLACE db_2.campo WITH cNumonly
   ENDIF
ENDSCAN

Dicho lo anterior el problema podría estar en el IF !EOF() ya que no nos consta que el puntero esté sobre algún registro válido de la tabla  db_2, por lo tanto, posiblemente jamás está entrando a hacer el REPLACE.
¿Cómo sabemos que realmente el puntero de la tabla db_2 está posicionado en un registro válido y no está "siempre" en el  EOF (lugar donde no puede escribir)?

Podrías pedirle a VFP que te muestre "como ejecuta" el código agregándole un SET STEP ON antes de esta rutina que escribiste.  Se abrirá la ventana "Debug" donde podrás darle clic al botón que indica "Next" (próximo paso) para ver "paso a paso" que está sucediendo realmente.

Saludos,



Edgar Acevedo.









José Antonio Soto Urtubia

unread,
Dec 4, 2013, 8:11:55 AM12/4/13
to publice...@googlegroups.com

SI lo que quieres es agregar registros a la segunda tabla, de todas maneras te falta el  APPEND BLANK antes del REPLACE.

 

JASU

Fidel Charny

unread,
Dec 4, 2013, 8:47:56 AM12/4/13
to publice...@googlegroups.com
Alfredo Q:
Lo primero que deberías especificar es en qué registro de db_2 quieres producir una modificación. Tal vez escribiste ese código porque estás usando un SET RELATION, porque de otra forma no tiene sentido. Si no es eof(), siempre reemplazaría el mismo registro y te quedaría la última actualización.
1) Este .and. es obsoleto. Escribe solamente AND.
IF !ISDIGIT(cCharacter) AND cCharacter!='-'
2) Con la definicion cNumOnly=" " && (1 espacio) y luego cNumOnly=cNumONly+loquesea, pones un espacio al inicio de la cadena. Como reemplazas un campo completo, el primer caracter del campo será un Chr(32). Tal vez no sea lo que necesites. Yo pondría cNUmOnly="" && nada
3) Si no estás usando SET RELATION, debes proveer algún método de búsqueda de registro en la db_2 (LOCATE si no tiene índices, Seek() ó Indexseek() si tiene índices.
4) Si no se puede efectuar la modificación (Eof() puede ocurrir por tabla vacía o porque el puntero está en Eof() ), sería conveniente recoger información al respecto, por ejemplo, cuántas actualizaciones fallaron.
5) Si estás utilizando SET RELATION, revisa la relación y que la tabla db_1 tenga el  SET ORDER TO adecuado.
6) Trata de que las variables tengan un nombre representativo de su empleo. Cuando defines cNumOnly, uno espera que traerá una cadena de solo números. Pero el código hace lo contrario:
 IF !ISDIGIT(cCharacter) .AND. cCharacter!='-'
Traducido:
Si No es un dígito y (además) es distinto de "-", Entonces
      Agregue este caracter a la cadena
Fin
El resultado es que se ignorarán todos los dígitos y el signo "menos". Por lo tanto la cadena tendrá solo letras. Y en mi parecer debería llamarse cOnlyAlpha.

Si querías que tuviera solamente números como parece indicar el nombre de la variable, la instrucción debería ser
IF ISDIGIT(cCharacter) .AND. cCharacter!='-'

Analyzer

unread,
Dec 4, 2013, 9:28:06 AM12/4/13
to publice...@googlegroups.com
Quizás le sirva revisar la ayuda de las instrucciones scatter memvar y gather memvar.

Tambien scatter name e insert into. (Por favor busque el tema en la interfaz web del grupo: Forma usual de usar Scatter Name)

Saludos!

HernanCano

unread,
Dec 5, 2013, 12:30:07 AM12/5/13
to publice...@googlegroups.com
Hola, Alfredo.
Parece que estás desaparecido.

>>>... debo extraer registros para actualizar una segunda tabla...

A mí que se me hace es que necesitas extraer DATOS de un dbf para llevar a otra dbf.

El segundo dbf debe recibir los datos ¿(1) creando un registro nuevo, o (2) modificando datos de algún registro que ya exista en el segundo dbf?

De lo que nos muestras no se deduce nada, pues se está haciendo un REPLACE pero [[sin buscar (LOCATE) un registro existente]] [[ni agregando (APPEND/INSERT) un registro nuevo]].

Message has been deleted

John Rada Ruiz

unread,
Dec 12, 2013, 3:24:57 PM12/12/13
to publice...@googlegroups.com
Alfredo para poder realizar este procedimiento, debe existir un campo en comun entre las tablas db_1 y db_2
hagamos de cuenta que este campo se llame ID.

Select db_1
Scan
    cNumonly=""
    cTest= db_1.columna2
    xId  = db_1.id && <<<< Agrego esta linea

    For ncnt=32 to 82
        cCharacter=substr(cTest, nCnt, 1)
        If !Isdigit(cCharacter) .and. cCharacter!='-'
            cNumonly=cNumonly+cCharacter
        Endif
    ENDFOR
    ***ANULO ESTE FRAGMENTO DE TU CODIGO******
    ***Select db_2                                                      
        *
    ***If !eof()                                                                      *
    *******Replace db_2.campo with cNumonly                 *
    ***Endif                                                                         *
    **************************************************************
    SELECT db_2 && <<<< Agrego esta linea
    LOCATE FOR ALLTRIM(UPPER(db_2.id))==ALLTRIM(UPPER(xId))
    *Tambien puedes usar el comando  SEEK para realizar la busqueda si asi lo deseas.
    IF FOUND()
            *Si el registro existe lo actualizamos
       Replace db_2.campo with cNumonly IN db_2
            *O bien podrias utilizar UPDATE db_2 SET campo = cNumonly
            *where  ALLTRIM(UPPER(db_2.id))==ALLTRIM(UPPER(xId))
            *Pero esto haria mas lento el proceso si manejas una tabla con muchos registros
     ELSE
            *Si no existe lo Insertamos
          INSERT INTO db_2 (campo);
          value(cNumonly)
   EndIf
Endscan

Espero te sirva mi ayuda...



Reply all
Reply to author
Forward
0 new messages