{Problema} Siempre guarda en el primer registro

87 views
Skip to first unread message

Sergio Cisak

unread,
Sep 25, 2013, 1:32:00 AM9/25/13
to publice...@googlegroups.com
Muy buenas amigos, me urge resolver el siguiente error y no he podido hallar la manera de encontrarle la solucion... Todo el codigo funciona correctamente, solo que me guarda en el primer registro de la tabla siempre. Hace todo bien los calculos, pero guarda en el primer registro. Alguna idea? desde ya, mil gracias...


ELSE

            nDet=1
            =TABLEUPDATE(.T.,.T.,this.Parent.datos_tabla_maestro)
            =TABLEUPDATE(.T.,.T.,this.Parent.datos_tabla_detalle)
            *******
            thisform.Refresh
            SELECT MAX(cmaestro) AS ultinum;
            FROM tabla_maestro;
            INTO CURSOR ultimo_cod

            *******
            SELECT SUM(subtotal) as subtotal;
            FROM tabla_detalles;
            WHERE tabla_detalles.cmaestro = ultimo_cod.ultinum;
            INTO CURSOR cursortemp
            IF _TALLY > 0
            LOCATE
            impor_total=cursortemp.subtotal
            ENDIF
            this.Parent.variable_total=subtotal
           
            REPLACE importe WITH this.Parent.variable_total IN this.Parent.datos_tabla_maestro
ENDIF

HernanCano

unread,
Sep 25, 2013, 1:46:14 AM9/25/13
to publice...@googlegroups.com
Te falta indicar dónde haces la búsqueda y ubicación del registro en el Maestro (this.Parent.datos_tabla_
maestro)
Al no verla, se considera que graba (efectivamente) sobre el mismo registro donde se para cuando ejecutas

Sergio Cisak

unread,
Sep 25, 2013, 1:48:18 AM9/25/13
to publice...@googlegroups.com
No entendi eso de indicar donde se busca, y la ubicacion del registro... Podrias explicarmelo rapidamente? Mil disculpas por la ignorancia....

HernanCano

unread,
Sep 25, 2013, 1:56:56 AM9/25/13
to publice...@googlegroups.com
Estás haciendo un REPLACE sobre this.Parent.datos_tabla_. Entonces se graba sobre el regiatro donde está parado el puntero de registro (¿se pùede decir así en xBase?).

Si deseas grabarle el "importe" a un cliente, entonces debes ubicarte en el registro de ese cliente. Pero no hay una instrucción que ubique el cliente, es decir no hay un LOCATE ni un SEEK, ni una SEEK(), ni una INDEXSEEK(), ni un SCAN/ENDSCAN, ni un DO WHILE/SKIP/ENDDO, etc (ANTES DEL REPLACE... ¿o sí hay uno de éstos entes del REPLACE?---por que no lo vemos en lo que nos envías.....)

Sergio Cisak

unread,
Sep 25, 2013, 2:02:04 AM9/25/13
to publice...@googlegroups.com
No, efectivamente no lo hay. O sea, inmediatamente antes del replace, deberia poner algo como: SEEK(cursor.codigo_maximo) ?

Sergio Cisak

unread,
Sep 25, 2013, 2:23:11 AM9/25/13
to publice...@googlegroups.com
Alguien me podria dar un ejemplo sobre como hacerlo? Porque creo que el amigo tiene razon. Es ahi donde esta mi problema. Solo debo posicionarme en el registro, pero no se si usar LOCATE, SEEK, ni tampoco de que manera implementarlo... Gracias desde ya

Fernando D. Bozzo

unread,
Sep 25, 2013, 3:08:24 AM9/25/13
to publice...@googlegroups.com
Hola Sergio:

Acordate siempre que toda la operativa que se hace a nivel informático tiene su origen en cómo se hace en el papel.
Cuando tenés que actualizar el legajo o la ficha de papel de un cliente que está en un archivo junto con muchos otros, ¿qué hacés? ¿agarrás el primero que encontrás y comenzás a escribir? No, vas mirando en lomo por la letra o el código buscando uno en particular, y cuando lo encontrás lo sacás del archivo, lo modificás y lo volvés a guardar.
Acá es lo mismo: querés reemplazar los datos de un cliente, pero estás reemplazando directamente el primer registro disponible sin haberlo ubicado antes (lo que con el papel no hubieras hecho). Entonces te falta mover el puntero del registro en la tabla donde vas a reemplazar, para lo que se necesita hacer una búsqueda previa con LOCATE o SEEK(). Yo te diría que uses LOCATE, que tiene la misma velocidad que el SEEK si se usa el índice correcto, y con la ventaja de que si no hay un índice busca igualmente.

Saludos.-

Sergio Cisak

unread,
Sep 25, 2013, 5:37:21 PM9/25/13
to publice...@googlegroups.com

Gente adjunto una imagen para que se den una idea, de como es el problema que me surgio...Veanla por favor
Consulta.jpg

Fernando D. Bozzo

unread,
Sep 25, 2013, 7:05:49 PM9/25/13
to publice...@googlegroups.com
Hola Sergio:

Por lo que veo en la imagen, hacés tu código bastante complejo innecesariamente, y eso te ocasiona que no tengas control sobre lo que pasa.

Te dejo algunas cosas que deberías arreglar/modificar antes de seguir con el problema, y es probable que se solucione:

1) ¿por casualidad "this.parent.datos_tabla_maestro" es la misma "tabla_maestro" que aparece en varias partes del código?. Si es así deberías usar siempre la misma nomenclatura, o usás la propiedad o usás el nombre de la tabla, pero los 2 a la vez no tiene sentido. (Repito: Si es la misma tabla)

2) Si no son la misma tabla, entonces te pasa que estás intentando hacer un LOCATE del campo "tabla_maestro.cmaestro", pero estando ubicado en la tabla "this.parent.datos_tabla_maestro" que abrís justo antes, por lo que realmente el puntero de "this.parent.datos_tabla_maestro" no se mueve y por eso se queda siempre en el mismo registro. Asumo que son 2 tablas distintas porque si no el código anterior al LOCATE no tiene mucho sentido.

3) La búsqueda es un desastre: ¿En qué tabla se supone que querés buscar? porque si crees que está buscando en tabla_maestro te equivocás, está buscando en "this.parent.datos_tabla_maestro", pero con una condición que no hace referencia a esa tabla, sino a "tabla_maestro", y finalmente para rematar el error no verificás si realmente encuentra el registro y hacés directamente el reemplazo.

Si querés hacer una búsqueda y reemplazo sin problemas, tenés que tener orden:

SELECT "LaTablaDondeQuierasBuscarYReemplazar"
LOCATE FOR <CondiciónSobreEstaTablaYNoOtra> && No uses "IN tabla" porque estamos ubicados en la tabla
IF FOUND()
   REPLACE importe with ..... && Nuevamente, no uses "IN tabla" porque ya estamos ubicados en la tabla
ENDIF


Saludos.-

Sergio Cisak

unread,
Sep 25, 2013, 7:23:48 PM9/25/13
to publice...@googlegroups.com
Fernando, ambas son la misma tabla. Las tengo asi porque todavia estoy en etapa de depuracion del proyecto. Obviamente mas adelante las cambiare para que quede una sola. Y quiero decirle que me funcionó el codigo que me paso al final. Evidentemente no me estaba posicionando correctamente. No sabe lo que sufri con este error. Sin ir mas lejos, ayer estuve hasta las 4am, y hoy toda la tarde y no lo pude sacar, hasta ahora. Muchisimas gracias y disculpe, pero estoy aprendiendo y a veces por cosas simples, tomo el atrevimiento de quitarle el tiempo a programadores expertos como los que encontre en este grupo. Mil gracias y disculpas de nuevo. Seguire adelante con mi proyecto, asi que seguramente me veran de nuevo por aqui... Saludos

Fernando D. Bozzo

unread,
Sep 25, 2013, 7:35:36 PM9/25/13
to publice...@googlegroups.com
Hola Sergio:

No te disculpes, todos cometemos errores. Lo que sí me interesaría que recuerdes para los programas que sigas haciendo e investigando, es en mantener "la limpieza del código" y la "simplicidad". Son dos factores claves para que no te pase eso, perder horas buscando algo. Cuando te ocurre algo así (y en algún momento seguro te vuelve a pasar, por cansancio u otros motivos), lo que tenés que hacer es mirar todo el código con el que estás trabajando y comenzar a poner orden:

- Indentá siempre el código, usando la herramienta "Beautify" del menú Tools (marcale todos los checks, menos el del CASE)

- Usá siempre el nombre de la tabla o una variable, pero siempre lo mismo. Nunca lo dejes "para después", porque los errores ocurren en el "mientras" y solo te dilatan el "después"

- Hacelo siempre lo más simple posible. En el caso de las tablas, siempre ubicate primero en la misma, luego la búsqueda y luego los reemplazos, no intentes trabajar "IN otraTabla" por lo menos hasta que lo tengas bien claro, pero incluso así tampoco te lo recomiendo. Yo no lo hago en mis programas.

Suerte, y nos seguimos leyendo :-)

Saludos.-

Fernando D. Bozzo

unread,
Sep 25, 2013, 7:43:57 PM9/25/13
to publice...@googlegroups.com
Olvidé comentarte algo más, también importante:

1) Intentá siempre escribir el código "definitivo" y no "por ahora así", porque todo tu esfuerzo en pruebas lo vas a gastar en él y dejar los reemplazos y mejoras para "después" solo te va provocar nuevos fallos y tener que volver a probar todo otra vez. No desperdicies ese tiempo valioso.

2) Te sería muy útil comenzar a practicar el "Unit Testing" o testeo automatizado del código, que además de ahorrarte tiempo de pruebas repetitivas, te obliga a hacer un "mejor código" y más encapsulado, lo que va a favorecer que puedas reutilizar cada vez más y mejores técnicamente.

Bueno, por hoy nada más ;-)

Víctor Hugo Espínola Domínguez

unread,
Sep 25, 2013, 8:48:43 PM9/25/13
to publicesvfoxpro
Hola Sergio

Te falta agregar un nuevo registro a Tabla_Maestro:

INSERT INTO Tabla_Maestro ( cMaestro ) VALUES ( ultimo_cod.cMaestro )

Saludos,
Víctor.
Lambaré - Paraguay.

Luis Maria Guayan

unread,
Sep 25, 2013, 10:34:53 PM9/25/13
to publice...@googlegroups.com
Te está faltando el FOUND()

Mira en la ayuda de VFP el comando FOUND()


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 25/09/2013 18:37, Sergio Cisak escribió:
Reply all
Reply to author
Forward
0 new messages