Relacionar dos tablas maestras
Hola experto, estoy realizando un programa para Libro Caja - Banco y tengo dos tablas principales ingresos y egresos la idea es relacionar estas dos tablas principales para poder emitir un reporte mostrando infoemacion en la misma hoja tanto de ingresos y egresos.
La tabla Ingresos tienes estos campos: numauto (autoinc), n_corr c(5),f_oper d(8),m_pago c(3), id_desc n(3),id_prov c(11), numero c(14), id_den c(8), deudor n(12,2), acreedor n(12,2), mes c(2),año c(4), nommes c(9) los indices son numauto (principal), id_desc, id_prov, id_den (regulares), las tres tablas relacionadas son desc_oper_ingresos que tiene estos campos id_desc n(3), operacion c(40) y su indice es id_desc, prov_ingresos que tienen estos campos id_prov c(11) , r_social c(40) y su indice es id_prov, denom_ingresos que tiene estos campos id_den c(8), descripcion c(40) y indice es id_den.
La tabla Egresos tienes estos campos: numauto (autoinc), n_corr1 c(5),f_oper1 d(8),m_pago1 c(3), cod_desc n(3),cod_prov c(11), numero1 c(14), cod_den c(8), deudor1 n(12,2), acreedor1 n(12,2), mes c(2),año c(4), nommes c(9) los indices son numauto (principal), cod_desc, cod_prov, cod_den (regulares), las tres tablas relacionadas son desc_oper_egresos que tiene estos campos cod_desc n(3), operacion1 c(40) y su indice es cod_desc, prov_egresos que tienen estos campos cod_prov c(11) , r_social1 c(40) y su indice es cod_prov, denom_egresos que tiene estos campos cod_den c(8), descripcion1 c(40) y indice es cod_den.
He hecho dos formularios uno para ingresos y otro para egresos y se guardan en tablas diferenetes ya que a veces solamente puede haber ingresos y no egresos, si tienes alguna sugerencia te lo agradeceré.
La tabla Ingresos tienes estos campos: numauto (autoinc), n_corr c(5),f_oper d(8),m_pago c(3), id_desc n(3),id_prov c(11), numero c(14), id_den c(8), deudor n(12,2), acreedor n(12,2), mes c(2),año c(4), nommes c(9) los indices son numauto (principal), id_desc, id_prov, id_den (regulares), las tres tablas relacionadas son desc_oper_ingresos que tiene estos campos id_desc n(3), operacion c(40) y su indice es id_desc, prov_ingresos que tienen estos campos id_prov c(11) , r_social c(40) y su indice es id_prov, denom_ingresos que tiene estos campos id_den c(8), descripcion c(40) y indice es id_den.
La tabla Egresos tienes estos campos: numauto (autoinc), n_corr1 c(5),f_oper1 d(8),m_pago1 c(3), cod_desc n(3),cod_prov c(11), numero1 c(14), cod_den c(8), deudor1 n(12,2), acreedor1 n(12,2), mes c(2),año c(4), nommes c(9) los indices son numauto (principal), cod_desc, cod_prov, cod_den (regulares), las tres tablas relacionadas son desc_oper_egresos que tiene estos campos cod_desc n(3), operacion1 c(40) y su indice es cod_desc, prov_egresos que tienen estos campos cod_prov c(11) , r_social1 c(40) y su indice es cod_prov, denom_egresos que tiene estos campos cod_den c(8), descripcion1 c(40) y indice es cod_den.
He hecho dos formularios uno para ingresos y otro para egresos y se guardan en tablas diferenetes ya que a veces solamente puede haber ingresos y no egresos, si tienes alguna sugerencia te lo agradeceré.
1 Respuesta
Respuesta de Víctor Arturo Mercado Fernández
1
1

Hola experto te explico: la tabla ingresos tiene los campos id_desc, id_prov, id_den estos son los campos comunes para relacionarse con las tablas desc_oper_ingresos que tiene el campo id_desc, prov_ingresos que tiene el campo id_prov, denom_ingresos que tiene el campo id_den.
La tabla egresos tiene los campos cod_desc, cod_prov, cod_den estos son los campos comunes para relacionarse con las tablas desc_oper_egresos que tiene el campo cod_desc, prov_egresos que tiene el campo cod_prov, denom_ingresos que tiene el campo cod_den.
La tabla egresos tiene los campos cod_desc, cod_prov, cod_den estos son los campos comunes para relacionarse con las tablas desc_oper_egresos que tiene el campo cod_desc, prov_egresos que tiene el campo cod_prov, denom_ingresos que tiene el campo cod_den.

Las tablas de ingresos y egresos no comparten algún campo en común, ya que cada una alamacena información independientemente. Cada una se relaciona con tres tablas diferentes. Justamente a eso quiero llegar relacionar las dos tablas maestras para poder generar un reporte final juntando la tabla ingresos relacionadas con sus tres tablas y egresos relacionada con sus tres tablas. Ojala y me deje entender.

Agrega un campo a cada tabla que permita relacionarlas, te sugiero que mediante la cuenta de afectación se cree la llave

Agrego un campo a cada tabla, y esos campos agregados que información guardarían, a que cuenta de afectación te refieres.

¿Cómo deseas que se relacionen? No porque, como.
Los egeresos e ingresos deben de afectar a una cuenta contable ¿Me equivoco?
Los egeresos e ingresos deben de afectar a una cuenta contable ¿Me equivoco?

Te explico sucede que los ingresos y egresos lo ingresan manualmente (a puño y letra) en un Libro y ese libro se llama Libro Caja Bco, me piden mecanizarlo y lo que ingresan manualmente ahora lo tienen hacer a través del programa que estoy haciendo, es como si seria un mantenimiento tanto para egresos como para ingresos es por eso que tengo dos formularios, lo que se ingresa en ingresos es numero correlativo, fecha de operación medio de pago, descripción de la operación, apellidos y nombres, código, denominación, deudor y acreedor los mismos campos se ingresan para egresos, me han dado un reporte de muestra que ellos han hecho en excel y en ese reporte están los ingresos y egresos en la misma hoja, y eso lo quiero aplicar en mi programa relacionar las dos tablas maestras para poder emitir reportes tanto en vista preliminar como a la impresora mostrando o imprimiendo todo junto (ingresos y egresos), no puedo hacer los reportes por separado de ingresos y de egresos. Para vista preliminar lo tengo que hacer desde el reporteador de windows y para imprimir lo tengo que hacer desde un prg.

Eso responde el porque.
Pregunta como fue que relacionaron las tablas, debe de ser por medio de una clave combinada, una vez que obtengas ese dato puedes crear la llave que puede servir para relacionarlas.
Si no existe una llave, ya sea formada por un campo o por varias, no puedes establecer la relación.
Pregunta como fue que relacionaron las tablas, debe de ser por medio de una clave combinada, una vez que obtengas ese dato puedes crear la llave que puede servir para relacionarlas.
Si no existe una llave, ya sea formada por un campo o por varias, no puedes establecer la relación.

Yo estoy haciendo un programa nuevo independiente al sistema que ya existe en mi empresa, el programa nuevo es solo para mecanizar el Libro Caja - banco.

No cuestiono que ni para que, solo inquiero el como ¿Cómo se crea esa relación actualmente?, respondiendo esa pregunta podemos crear una forma automática de crearla.

Eso es lo que quiero hacer crear la relación entre las dos tablas primarias, suponiendo que en ingresos ingresas 10 items y en egresos solo 5 items, en el reporte tengo que mostrar los 15 ingresos y los 5 egresos en la misma hoja.

Mencionaste que te mostraron una hoja de Excel con la relación que deseas, para crear esa relación en VFP es necesario saber como se hizo en Excel.
¿O solo deseas mostrar los 10 ingresos y los 5 egeresos, uno después de otro y no relacionados entre si?
¿O solo deseas mostrar los 10 ingresos y los 5 egeresos, uno después de otro y no relacionados entre si?

A ver en la hoja de calculo tengo lo siguiente:
Ingresos Egresos
Numero fecha medio descripción ... numero fecha medio descripción ...
00141 05/05/08 0041 cobranza 00540 12/05/08 Pago AFP
00141 15/05/08 0041 cobranza 00541 17/05/08 Pago sunass
....... ...........
........ ...........
Así seria el reporte en Vfox, tanto en vista preliminar y en impresora. Que me muestre los ingresos y egresos. Y como te dije antes la tabla ingresos se relaciona con tres tablas y la tabla egresos también se relaciona con tres tablas.
tabla Ingresos tabla denom_ingresos
numauto autoinc id_den c(8)
n_corr c 5 descripcion c(40)
f_oper d 8 indice
m_pago c 3 id_den c(8)
id_desc n 3
id_prov c 11 tabla desc_oper_ingresos
numero c 14 id_desc n(3)
id_den c 8 operacion c(40)
deudor n 12,2 indice
acreedor n 12,2 id_desc c(8)
mes c 2
año c 4
nommes c (9) tabla prov_ingresos
indices id_prov c(11)
numauto autoinc r_social c(40)
id_desc n 3 indice
id_prov c 11 id_prov c(11)
id_den c 8
-----------------------------------------------------------------------------------
tabla Egresos tabla denom_egresos
numauto autoinc cod_den c(8)
n_corr c(5) descripcion1 c(40)
f_oper d (8) indice
m_pago c(3) cod_den c(8)
cod_desc n(3)
cod_prov c(11) tabla desc_oper_egresos
Numero c(14) cod_desc n(3)
cod_den c(8) operacion1 c(40)
deudor n(12,2) indice
acreedor n(12,2) cod_desc c(8)
mes c(2)
año c(4)
nommes c (9) tabla prov_egresos
indices cod_prov c(11)
numauto autoinc r_social1 c(40)
cod_desc n(3) indice
cod_prov c(11) cod_prov c(11)
cod_den c(8)
Ahí te muestro las tablas ingresos y egresos con las tablas que se relacionan la idea es sacar el reporte relacionando las tablas ingresos y egresos.
Ingresos Egresos
Numero fecha medio descripción ... numero fecha medio descripción ...
00141 05/05/08 0041 cobranza 00540 12/05/08 Pago AFP
00141 15/05/08 0041 cobranza 00541 17/05/08 Pago sunass
....... ...........
........ ...........
Así seria el reporte en Vfox, tanto en vista preliminar y en impresora. Que me muestre los ingresos y egresos. Y como te dije antes la tabla ingresos se relaciona con tres tablas y la tabla egresos también se relaciona con tres tablas.
tabla Ingresos tabla denom_ingresos
numauto autoinc id_den c(8)
n_corr c 5 descripcion c(40)
f_oper d 8 indice
m_pago c 3 id_den c(8)
id_desc n 3
id_prov c 11 tabla desc_oper_ingresos
numero c 14 id_desc n(3)
id_den c 8 operacion c(40)
deudor n 12,2 indice
acreedor n 12,2 id_desc c(8)
mes c 2
año c 4
nommes c (9) tabla prov_ingresos
indices id_prov c(11)
numauto autoinc r_social c(40)
id_desc n 3 indice
id_prov c 11 id_prov c(11)
id_den c 8
-----------------------------------------------------------------------------------
tabla Egresos tabla denom_egresos
numauto autoinc cod_den c(8)
n_corr c(5) descripcion1 c(40)
f_oper d (8) indice
m_pago c(3) cod_den c(8)
cod_desc n(3)
cod_prov c(11) tabla desc_oper_egresos
Numero c(14) cod_desc n(3)
cod_den c(8) operacion1 c(40)
deudor n(12,2) indice
acreedor n(12,2) cod_desc c(8)
mes c(2)
año c(4)
nommes c (9) tabla prov_egresos
indices cod_prov c(11)
numauto autoinc r_social1 c(40)
cod_desc n(3) indice
cod_prov c(11) cod_prov c(11)
cod_den c(8)
Ahí te muestro las tablas ingresos y egresos con las tablas que se relacionan la idea es sacar el reporte relacionando las tablas ingresos y egresos.

Sencillo, solo crea una tabla temporal con los campos de ambas tablas que deseas y genera el informe, no se necesita ninguna relación entre ellas.

La verdad no he trabajado usando tablas temporales, ¿sabes de algún ejem?, en todo caso en que parte puedo crear la tabla temporal ya que esa tabla(temporal) lo tuviera que usar en el reporteador de windows para el reporte - vista preliminar lo mismo para crear el reporte a la impresora,

La tabla temporal se crea como lo harías con un cursor, o puedes crearla mediante el comando Create Table, una vez creada puedes usarla y manipularla de la manera que desees.

Disculpa pero como crearía la tabla temporal tomando en cuenta las tablas que te envíe.
Por ejm. para la parte de ingresos tengo que mostrar ncorr, fecha, razón social ... deudor acreedor y para la parte de egresos también ncorr1, razón social1, ... deudor acreedor
Por ejm. para la parte de ingresos tengo que mostrar ncorr, fecha, razón social ... deudor acreedor y para la parte de egresos también ncorr1, razón social1, ... deudor acreedor

Puedes cambiar los nombres agregando la letra "i" a los campos que provienen de la tabla de ingresos y "e" a los que provienen de la tabla de egeresos.

A ver estoy podría ser así pero en que patrte del programa coloco estas lineas y como añado registros a esta tabla final.
(create table final incorr c(5),f_oper id(8),im_pago c(3), aqui adeberia venir el campo operacion, pero este campo esta en la tabla desc_oper_ingresos y se relaciona por un campo comun id_desc, luego seguiría inumero c(14),ideudor n(12,2), iacreedor n(12,2), encorr, ef_oper d(8), em_pago c(3), aqui deberia venir el campo operacion1, pero este campo esta en la tabla desc_oper_egresos y se relaciona por un campo comun cod_desc, luego seguiría enumero c(14),edeudor n(12,2),eacreedor n(12,2))
(create table final incorr c(5),f_oper id(8),im_pago c(3), aqui adeberia venir el campo operacion, pero este campo esta en la tabla desc_oper_ingresos y se relaciona por un campo comun id_desc, luego seguiría inumero c(14),ideudor n(12,2), iacreedor n(12,2), encorr, ef_oper d(8), em_pago c(3), aqui deberia venir el campo operacion1, pero este campo esta en la tabla desc_oper_egresos y se relaciona por un campo comun cod_desc, luego seguiría enumero c(14),edeudor n(12,2),eacreedor n(12,2))

He creado la tabla, pero como hago para jalar los datos de la tabla ingresos y la tabla egresos. Estuve haciendo esto si hay alguna sugerencia o de repente estoy fallando en algo.
set defa to d:\libros\datos
cretae table final (In_corr c(5), Iid_prov c(11),Im_pago c(3), En_corr1 c(5), Ecod_prov c(11), Em_pago c(3)
appe from ingresos ** Aca se añaden los registros de la tabla ingresos los campos En_corr1, Ecod_prov,Em_pago estan en blanco por que faltaria agregar los registros de la tabla egresos. Como haria para agregar los registros de la tabla egresos.
set defa to d:\libros\datos
cretae table final (In_corr c(5), Iid_prov c(11),Im_pago c(3), En_corr1 c(5), Ecod_prov c(11), Em_pago c(3)
appe from ingresos ** Aca se añaden los registros de la tabla ingresos los campos En_corr1, Ecod_prov,Em_pago estan en blanco por que faltaria agregar los registros de la tabla egresos. Como haria para agregar los registros de la tabla egresos.

Select ingresos
Go Top
Do While !Eof()
Select temporal
Append Blank
Replace temporal.campo1 With ingresos.campo1, temporal.campo2 With ingresos.campo2
Select ingresos
Skip
EndDo
Select temporal
Go Top
Select Egresos
Go Top
Do While !Eof()
Select Temporal
Skip
If Eof()
Append Blank
Else
Skip -1
EndIf
Replace Temporal.campo10 With egresos.campo1, Temporal.campo11 With egresos.campo2
Select egresos
Skip
EndDo
Go Top
Do While !Eof()
Select temporal
Append Blank
Replace temporal.campo1 With ingresos.campo1, temporal.campo2 With ingresos.campo2
Select ingresos
Skip
EndDo
Select temporal
Go Top
Select Egresos
Go Top
Do While !Eof()
Select Temporal
Skip
If Eof()
Append Blank
Else
Skip -1
EndIf
Replace Temporal.campo10 With egresos.campo1, Temporal.campo11 With egresos.campo2
Select egresos
Skip
EndDo

He probado en un formulario y he creado una tabla llamada final con los campos de ambas tablas (ingresos y egresos) pero solo me graba los registros de la tabla ingresos y los campos que corresponden a la tablalos deja en blanco.
En el load del form hay este codigo:
USE lbcjbco SHARED AGAIN IN 0 && ingresos
USE lbcjbco1 SHARED AGAIN IN 0 && egresos
USE final SHARED AGAIN IN 0 && Tabla con campos de ingresos y egresos
En el init del form puse el codigo:
IF USED("lbcjbco")
Select lbcjbco &&Ingresos
ENDIF
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.numauto With lbcjbco.numauto, final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
final.m_pago With lbcjbco.m_pago,final.id_desc With lbcjbco.id_desc,final.id_prov With lbcjbco.id_prov,;
final.numero With lbcjbco.numero,final.id_den With lbcjbco.id_den,final.deudor With lbcjbco.deudor,;
final.acreedor With lbcjbco.acreedor
Select lbcjbco
Skip
EndDo
Select final
Go Top
IF USED("lbcjbco1")
Select lbcjbco1 &&Egresos
ENDIF
Go Top
Do While !Eof()
Select final
Skip
If Eof()
Append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
final.m_pago1 With lbcjbco1.m_pago1,final.cod_desc With lbcjbco1.cod_desc,final.cod_prov With lbcjbco1.cod_prov,;
final.numero1 With lbcjbco1.numero1,final.cod_den With lbcjbco1.cod_den,final.deudor1 With lbcjbco1.deudor,;
final.acreedor1 With lbcjbco1.acreedor1
Select lbcjbco1
Skip
EndDo
En el load del form hay este codigo:
USE lbcjbco SHARED AGAIN IN 0 && ingresos
USE lbcjbco1 SHARED AGAIN IN 0 && egresos
USE final SHARED AGAIN IN 0 && Tabla con campos de ingresos y egresos
En el init del form puse el codigo:
IF USED("lbcjbco")
Select lbcjbco &&Ingresos
ENDIF
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.numauto With lbcjbco.numauto, final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
final.m_pago With lbcjbco.m_pago,final.id_desc With lbcjbco.id_desc,final.id_prov With lbcjbco.id_prov,;
final.numero With lbcjbco.numero,final.id_den With lbcjbco.id_den,final.deudor With lbcjbco.deudor,;
final.acreedor With lbcjbco.acreedor
Select lbcjbco
Skip
EndDo
Select final
Go Top
IF USED("lbcjbco1")
Select lbcjbco1 &&Egresos
ENDIF
Go Top
Do While !Eof()
Select final
Skip
If Eof()
Append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
final.m_pago1 With lbcjbco1.m_pago1,final.cod_desc With lbcjbco1.cod_desc,final.cod_prov With lbcjbco1.cod_prov,;
final.numero1 With lbcjbco1.numero1,final.cod_den With lbcjbco1.cod_den,final.deudor1 With lbcjbco1.deudor,;
final.acreedor1 With lbcjbco1.acreedor1
Select lbcjbco1
Skip
EndDo

¿Podrías identar el código? Leer de esa manera es muy complicado.
Ejecuta el código paso a paso y verifica que esté ejecutando la parte de ingreso de los datos de la segunda tabla.
Ejecuta el código paso a paso y verifica que esté ejecutando la parte de ingreso de los datos de la segunda tabla.

Logró copiar los 7 registros de la tabla ingresos pero en la tabla egresos tengo 2 registros y solo copia el ultimo de ellos.

En la parte:
IF USED("lbcjbco1")
Select lbcjbco1 &&Egresos
Endif
¿Qué sucede si la tabla lbcjbco1 NO está en uso?
IF USED("lbcjbco1")
Select lbcjbco1 &&Egresos
Endif
¿Qué sucede si la tabla lbcjbco1 NO está en uso?

Si no está en uso la tabla lo tengo que abrir ya modifique el código pero igual solo me jala los 7 registros de la tabla ingresos y solo el ultimo registro de la tabla egresos. También probé sleccionando la tabla (select lbcjbco1) sin el used y sigue lo mismo a que se deberá.
if used("lbcjbco1")
select lbcjbco1
else
Use lbcjbco1shared again in 0
Endif
if used("lbcjbco1")
select lbcjbco1
else
Use lbcjbco1shared again in 0
Endif

Cuando graba apunta al ultimo registro de la tabla lbcjbco1 (egresos) en la barra de estado dice lbcjbco1: record Nº 3

¿Por qué?
Te recuerdo que la aplicación la tienes tu, si en algún momento te parece que mis preguntas son muy obvias es porque yo no tengo la misma visión que tu
Te recuerdo que la aplicación la tienes tu, si en algún momento te parece que mis preguntas son muy obvias es porque yo no tengo la misma visión que tu

Bueno, en realidad no pienso que tus preguntas son obvias solo trato de ser lo más explicito en mis respuestas para que me entiendas mejor y poder llegar a la solución. Yo estoy agradecido por tu tiempo y por que estoy aprendiendo más de este lenguaje. Ahora estoy revisando el código que me proporcionaste y quiero encontrar la solución de por que solo me añade el ultimo registro de la tabla egresos, para es importante esto por que me va a permitir generar mis reportes, espero seguir contando con tu apoyo.

Unas cuantas posibles causas:
- El apuntatodor en la tabla egresos se mueve
- Existe una condición que impide que la tabla egresos pueda ser recorrida
- El código no está moviendo el apuntador de manera adecuada
- En la condicional está modificando el apuntador
- Existe un desencadenate o condición para insertar.
- Etc.
Ejecuta el código línea a línea y encuentra la causa, repito, yo no tengo la aplicación y el código, tal cual, no presenta un motivo por el cual esté teniendo ese comportamiento.
- El apuntatodor en la tabla egresos se mueve
- Existe una condición que impide que la tabla egresos pueda ser recorrida
- El código no está moviendo el apuntador de manera adecuada
- En la condicional está modificando el apuntador
- Existe un desencadenate o condición para insertar.
- Etc.
Ejecuta el código línea a línea y encuentra la causa, repito, yo no tengo la aplicación y el código, tal cual, no presenta un motivo por el cual esté teniendo ese comportamiento.

Gracias, entonces a que se deberá que me añade a la tabla temporal todos los registros de la tabla ingresos y solo el ultimo de la tabla egresos.

Solo si se ejecuta el código y se ven las acciones y resultados es posible determinar cual o cuales condiciones aplican para cada una de las tablas.

A que las condiciones y/o restricciones en la tabla ingresos no son las mismas que las que aplican a la tabla egresos.

Entonces no hay forma de corregirlo solo he logrado que se añadan uno de los registros de la tabla egresos pero no todos.

Si hay forma de corregirlo, solo es necesario localizar porque solo puedes agregar un registro de la tabla y eliminar/modificar esa condición.
Se me ocurre que puedes volver a generar los índices, o ver si se encuentran relacionadas las tablas de alguna manera, o que cuando selecciones el área de trabajo asegurarte de que es el área y el registro esperado, o...
A riesgo de parecer necio, solo si se ejecuta y constata cada línea de código puedes verificar que el código se está ejecutando de la manera deseada, no hay otra forma.
Se me ocurre que puedes volver a generar los índices, o ver si se encuentran relacionadas las tablas de alguna manera, o que cuando selecciones el área de trabajo asegurarte de que es el área y el registro esperado, o...
A riesgo de parecer necio, solo si se ejecuta y constata cada línea de código puedes verificar que el código se está ejecutando de la manera deseada, no hay otra forma.

Bueno, las tablas lo abro de esta manera en el evento load :
SET DEFAULT TO d:\libros\datos
USE lbcjbco shared AGAIN IN 0 order n_corr
USE lbcjbco1 shared AGAIN IN 0 order n_corr1
USE final shared AGAIN IN 0
Y en un botón de comando tengo el código para copiar las tablas ingresos y egresos, a la tabla final. Las teblas lo selecciono usando select nombre de tabla, la primera parte del código lo realiza bien ya que copia los registros de la tabla ingresos (lbcjbco):
Select lbcjbco
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
.......
Select lbcjbco
Skip
EndDo
Es en esta segunda parte del código donde solo copia el ultimo registro de la tabla egresos (lbcjbco1)
Select final
Go Top
Select lbcjbco1
Go Top
Do While !Eof()
Select final
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1
Skip
EndDo
SET DEFAULT TO d:\libros\datos
USE lbcjbco shared AGAIN IN 0 order n_corr
USE lbcjbco1 shared AGAIN IN 0 order n_corr1
USE final shared AGAIN IN 0
Y en un botón de comando tengo el código para copiar las tablas ingresos y egresos, a la tabla final. Las teblas lo selecciono usando select nombre de tabla, la primera parte del código lo realiza bien ya que copia los registros de la tabla ingresos (lbcjbco):
Select lbcjbco
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
.......
Select lbcjbco
Skip
EndDo
Es en esta segunda parte del código donde solo copia el ultimo registro de la tabla egresos (lbcjbco1)
Select final
Go Top
Select lbcjbco1
Go Top
Do While !Eof()
Select final
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1
Skip
EndDo

Bueno, las tablas lo abro de esta manera en el evento load :
SET DEFAULT TO d:\libros\datos
USE lbcjbco shared AGAIN IN 0 order n_corr
USE lbcjbco1 shared AGAIN IN 0 order n_corr1
USE final shared AGAIN IN 0
Y en un boton de comando tengo el codigo para copiar las tablas ingresos y egresos, a la tabla final. Las teblas lo selecciono usando select nombre de tabla, la primera parte del código lo realiza bien ya que copia los registros de la tabla ingresos (lbcjbco):
Select lbcjbco
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
.......
Select lbcjbco
Skip
EndDo
Es en esta segunda parte del código donde solo copia el ultimo registro de la tabla egresos (lbcjbco1)
Select final
Go Top
Select lbcjbco1
Go Top
Do While !Eof()
Select final
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1
Skip
EndDo
SET DEFAULT TO d:\libros\datos
USE lbcjbco shared AGAIN IN 0 order n_corr
USE lbcjbco1 shared AGAIN IN 0 order n_corr1
USE final shared AGAIN IN 0
Y en un boton de comando tengo el codigo para copiar las tablas ingresos y egresos, a la tabla final. Las teblas lo selecciono usando select nombre de tabla, la primera parte del código lo realiza bien ya que copia los registros de la tabla ingresos (lbcjbco):
Select lbcjbco
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.n_corr With lbcjbco.n_corr, final.f_oper With lbcjbco.f_oper,;
.......
Select lbcjbco
Skip
EndDo
Es en esta segunda parte del código donde solo copia el ultimo registro de la tabla egresos (lbcjbco1)
Select final
Go Top
Select lbcjbco1
Go Top
Do While !Eof()
Select final
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1
Skip
EndDo

¿Y dónde se encuentra el apuntador y cual es la tabla activa cuando entra la condicionante que copia desde la segunda tabla?

Condición que copia desde la segunda tabla:
Select final && Tabla temporal - tabla activa
Go Top
Select lbcjbco1 &&Tabla Egresos
Go Top
Do While !Eof()
Select final && tabla temporal
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1 && Tabla Egresos
Skip
EndDo
Select final && Tabla temporal - tabla activa
Go Top
Select lbcjbco1 &&Tabla Egresos
Go Top
Do While !Eof()
Select final && tabla temporal
SKIP
IF EOF()
append Blank
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
Select lbcjbco1 && Tabla Egresos
Skip
EndDo

El código aparentemente no tiene ningún problema, ¿Dónde se encuentra el apuntador y cual es la tabla activa cuando entra a esta condicionante?
Voy a ser repetitivo, pero es que no hay ninguna forma en que puedas encontrar el error si no ejecutas paso a paso el código verificando todas las condiciones que intervienen. No importa cuantas veces pongas el código, solo es necesario que respondas el lugar donde se encuentra el apuntador antes, mientras y después de entrar a esa condicionante, sin ese dato poco podemos hacer.
Voy a ser repetitivo, pero es que no hay ninguna forma en que puedas encontrar el error si no ejecutas paso a paso el código verificando todas las condiciones que intervienen. No importa cuantas veces pongas el código, solo es necesario que respondas el lugar donde se encuentra el apuntador antes, mientras y después de entrar a esa condicionante, sin ese dato poco podemos hacer.

Antes de entrar a la segunda condición la tabla activa es la de ingresos (lbcjbco), y el puntero debes apuntar al ultimo registro de esta tabla por que hay un skip después del select lbcjbco.

Si la tabla ingresos es la activa y el apuntador se encuentra en el último registro es la razón de que solo copie un registro.
Sin embargo en el código que me muestras se hace activa la tabla de Egresos (Select lbcjbco1) y se mueve el apuntador al primer registro (Go Top), o el código que describes no es el que estás utilizando o existe un conflicto con los apuntadores y se están "saltando" de tabla (y registro).
¿Este es el único caso en que los apuntadores presentan este comportamiento errático?
Sin embargo en el código que me muestras se hace activa la tabla de Egresos (Select lbcjbco1) y se mueve el apuntador al primer registro (Go Top), o el código que describes no es el que estás utilizando o existe un conflicto con los apuntadores y se están "saltando" de tabla (y registro).
¿Este es el único caso en que los apuntadores presentan este comportamiento errático?

Disculpa, tienes razón hubo una equivocación, cuando entra a la segunda condición la tabla activa es egresos (lbcjbco1) y el puntero va hacia el primer registro. Sigo sin entender por que solo añade el ultimo registro.

Si el puntero está en el primer registro de la tabla, y dado que no existe ningún movimiento en esa tabla, los valores que copia, o debería copiar, son los del primer registro. Dado que no es así, y puesto que aseguras que el comportamiento del apuntador no es errático, solo me surgen dos posibilidades:
1.- El apuntador no está en el primer registro cuando entra.
2.- El apuntador se mueve en algún momento dentro del ciclo.
Tu aseguras que si está en el primer registro, por lo que la primera posibilidad no es factible, por lo tanto debe ser la segunda.
Cuando ejecutas el código paso a paso ¿En qué momento se mueve el apuntador de la tabla?
1.- El apuntador no está en el primer registro cuando entra.
2.- El apuntador se mueve en algún momento dentro del ciclo.
Tu aseguras que si está en el primer registro, por lo que la primera posibilidad no es factible, por lo tanto debe ser la segunda.
Cuando ejecutas el código paso a paso ¿En qué momento se mueve el apuntador de la tabla?

A todo esto ¿Sabes cómo ejecutar el código paso a paso?, porque insisto, mientras no lo hagas yo no puedo encontrar porque esta comportándose de esta forma, solo puedo imaginármelo.

He colocado set step en la primera linea de código, ¿en todo caso si hay otra forma de ejecutar el código paso a paso?.

Si, hay otra forma y, por cierto, es la que se recomienda.
Utiliza el depurador y en cada línea verifica la situación de los apuntadores y tablas activas para encontrar cual es la discrepancia.
Utiliza el depurador y en cada línea verifica la situación de los apuntadores y tablas activas para encontrar cual es la discrepancia.

Bueno he usado el depurador menu tools/debugger y antes de la segunda condición he colocado set step on y a la hora que ejecuto el código entro al depurador y ejecuto el código paso a paso: Te indico como sigue el puntero.
SET STEP ON
Select final El puntero llega acá
Go Top Continua acá
Select lbcjbco1 Continua acá
Go Top Continua acá
Do While !Eof() Continua acá
Select final Continua acá
SKIP Continua acá
IF EOF() Continua acá
append Blank el puntero salta esta linea
Else
Skip -1 Y continua acá
ENDIF Continua acá
Replace ....... Continua acá
select lbcjbco1 continua acá
SKIP continua acá
EndDo continua acá
SET STEP ON
Select final El puntero llega acá
Go Top Continua acá
Select lbcjbco1 Continua acá
Go Top Continua acá
Do While !Eof() Continua acá
Select final Continua acá
SKIP Continua acá
IF EOF() Continua acá
append Blank el puntero salta esta linea
Else
Skip -1 Y continua acá
ENDIF Continua acá
Replace ....... Continua acá
select lbcjbco1 continua acá
SKIP continua acá
EndDo continua acá

El puntero debe moverse en la instrucción donde agregas un registro nuevo, es lógico, pero debe hacerlo sobe la tabla donde se están ingresando los registros, no sobre la de egresos.
Si no se ha alcanzado el final del archivo no tiene caso que se añadan nuevos registros, por eso se "salta" esa instrucción.
El puntero es el indicador del número de registro de una tabla, no tiene nada que ver en absoluto con un código o un programa, si actualmente se encuentra visible el registro 1 de la tabla maestro, se dice que el apuntador está en el registro 1 de la tabla maestra, no importa si se visualiza en un formulario o en una consulta.
Sigo insistiendo, ¿En qué parte del código el apuntador, el que indica el número de registro de la tabla, altera su posición en la tabla activa?
Déjame simplificar un poco el código para un mejor seguimiento:
m.nNueva = .F.
Select final && Tabla temporal - tabla activa
Go Top
Select lbcjbco1 &&Tabla Egresos
Go Top
Do While !Eof()
Select final && tabla temporal
Skip
If Eof()
Append Blank
m.nNueva = .T.
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
If !m.nNueva
Skip
Endif
Select lbcjbco1 && Tabla Egresos
Skip
EndDo
Si no se ha alcanzado el final del archivo no tiene caso que se añadan nuevos registros, por eso se "salta" esa instrucción.
El puntero es el indicador del número de registro de una tabla, no tiene nada que ver en absoluto con un código o un programa, si actualmente se encuentra visible el registro 1 de la tabla maestro, se dice que el apuntador está en el registro 1 de la tabla maestra, no importa si se visualiza en un formulario o en una consulta.
Sigo insistiendo, ¿En qué parte del código el apuntador, el que indica el número de registro de la tabla, altera su posición en la tabla activa?
Déjame simplificar un poco el código para un mejor seguimiento:
m.nNueva = .F.
Select final && Tabla temporal - tabla activa
Go Top
Select lbcjbco1 &&Tabla Egresos
Go Top
Do While !Eof()
Select final && tabla temporal
Skip
If Eof()
Append Blank
m.nNueva = .T.
Else
Skip -1
EndIf
Replace final.n_corr1 With lbcjbco1.n_corr1, final.f_oper1 With lbcjbco1.f_oper1,;
........
If !m.nNueva
Skip
Endif
Select lbcjbco1 && Tabla Egresos
Skip
EndDo
- Compartir respuesta
- Anónimo
ahora mismo
