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é.

1 Respuesta

Respuesta
1
¿Las tablas comparten algún campo en común?
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.
Ok.
Las tablas de ingreso y egresos ¿Comparten algún campo en común?
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?
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.
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?
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.
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
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))
Puedes crear la tabla antes de generar el reporte, por ejemplo.
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.
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
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
¿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.
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?
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
Cuando entra en la segunda condicional ¿Dónde se encuentra ubicado el apuntador en el archivo?
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
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.
Cuentas con mi 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.
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.
Porque posiblemente esas restricciones no aplican para la tabla ingresos
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.
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
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
¿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
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.
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?
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?
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.
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á
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
Estoy probando el código y hasta el momento está copiando los registros de ambas tablas hacia la tabla temporal (final).
Gracias por tu apoyo y tu tiempo, espero seguir contanto contigo.
Cuando gustes, si no tienes nada más en lo que consideres que pueda ayudarte, favor de cerrar la pregunta para que pueda continuar respondiendo otras inquietudes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas