FoxPro/Visual FoxPro - Problema con INDEXSEEK()

   
Vista:

Problema con INDEXSEEK()

Publicado por fran (3 intervenciones) el 24/09/2013 11:15:40
Buenos días, soy bastante nuevo en esto de Visual Fox Pro y me han pedido ampliar un código que no es mío. Estoy intentando importar datos desde un excel, eso lo llevo bien, el problema lo tengo al intentar comprobar con INDEXSEEK si el codigo de la clave primaria ya existe.

Este es el fragmento que me da problemas:
1
2
3
4
5
6
7
8
9
10
11
12
13
IMPORT FROM (fichero) TYPE XL8
SELECT * FROM (ficheroDBF) INTO CURSOR curper
SELECT curper
SCAN ALL
	IF ISBLANK(curper.a)
		LOOP
	ENDIF
		codigo = PADL(ALLT(curper.a), 8, "0")
		SELECT personas
		IF !INDEXSEEK(codigo, .T., "personas", "clavepersonas")
			APPEND BLANK IN personas
		ENDIF
ENDSCAN

Cuando lo ejecuto, me muestra correctamente los datos del excel, pero al llegar al INDEXSEEK me dice que la etiqueta del indice no existe. Hasta aqui bien, podría ser que "clavepersonas" no existiese y ahí estaría el error. La cosa está en que si copio y pego el INDEXSEEK y lo pongo al principio del método (antes de cargar el excel y demás) funciona perfectamente y no da error.

Hay algo que estoy pasando por alto seguro, creo que puedo tener un problema con los entornos y las tablas abiertas en cada uno, pero aun no controlo esa parte.

Gracias por la atención.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema con INDEXSEEK()

Publicado por Fidel (558 intervenciones) el 24/09/2013 15:24:36
1) la etiqueta "clavepersonas" es demasiado larga. Debes acortarla a 10 caracteres máximo
SELECT PERSONAS
INDEX ON CODIGO TAG CLAVEPER

"Tag names must begin with a letter or an underscore (_) and can consist of any combination of up to 10 letters, digits, or underscore characters. "
Trad: Los nombres de etiquetas pueden comenzar con una letra o un guión bajo y pueden consistir en cualquier combinación de hasta 10 caracteres de letras, dígitos y guiones bajos.

2) Fijate en la sintaxis, para que el código sea más eficiente. No necesitas SELECT PERSONAS si redactas correctamente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IMPORT FROM (fichero) TYPE XL8
SELECT * FROM (ficheroDBF) INTO CURSOR curper
SELECT curper
 
SCAN FOR !ISBLANK(a)
	codigo = PADL(ALLT(curper.a), 8, "0")
        && como solo necesitas saber si existe, utiliza el parámetro .F., será mucho más rápido.
	IF !INDEXSEEK(codigo, .F., "personas", "CLAVEPER")
                       && supuesto de reemplazo
                       && en lugar de APPEND BLANK / REPLACE , utiliza INSERT INTO PERSONAS
 
                       INSERT INTO PERSONAS (CAMPO1,CAMPO2,campo3) ;
                       VALUES (codigo,curper.b, curper.c)
	ENDIF
ENDSCAN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con INDEXSEEK()

Publicado por fran (3 intervenciones) el 24/09/2013 18:54:07
Hola Fidel, gracias por la ayuda.
A pesar de que ahora el código está más limpio (gracias), sigo teniendo el error
Index tag is not found (Error 1683)
Sé que la clave/índice es correcta, ya que en otras partes del programa funciona perfectamente la misma linea del INDEXSEEK.
La verdad es que ya no se que puede estar causandome este problema.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con INDEXSEEK()

Publicado por Fidel (558 intervenciones) el 25/09/2013 00:08:10
Usa ATAGINFO() para saber sobre las etiquetas:
select personas
nTags=AtagInfo(gaTags)
DEBUG

y busca en el cuadro el array gaTags. Ahí verás las etiquetas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con INDEXSEEK()

Publicado por fran (3 intervenciones) el 26/09/2013 10:42:06
Hola de nuevo, al final resulta que como tanto la tabla como el excel se llamaban personas, me estaba intentando leer y escribir en la tabla temporal del excel, por eso no encontraba los indices.

Gracias por la ayuda, misterio resuelto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar