Registros de 4 tablas

Hola víctor tengo 4 tablas A, B, C, DE las tablas A y B son ingresos, las tablas C y DE son egresos y tengo una tabla temporal a donde quiero agregar los registros de las 4 tablas en la parte izquierda los ingresos (tablas A y B) y en la derecha los egresos (tablas Cy D). He estado haciendo esto pero no sale como quisiera al final en la tabla me sale así:
Ingresos egresos
0001 XXXXXX 1000.52 000251 XXXXXXXXX 2,563.52
Espacio en blanco
¿000252 XXXXXXXX 3652.25
y en otras ocasiones no me muestra todos los egresos será por que hay más registros de egresos que registros de ingresos?. Espero me puedas apoyar a solucionar esto.
SET TALK OFF
SET DELETED ON
CLOSE DATABASES ALL
PUBLIC tabla1,tabla2,indic1,indic2
unidad="D:"
tabla1=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\temping"
tabla2=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\tempegr"
tabla3=unidad+ "\PRUEBAS\SICOFI\PR_TESOR\BASES\final"
IF USED(tabla3+".Dbf")
CLOSE DATABASES
Erase Tabla3+".Dbf"
ELSE
If File(Tabla3+".Dbf")
Erase Tabla3+".Dbf"
ENDIF
Endif
CREATE TABLE &tabla3 ( ncorr C(8), fec_ope d(8),m_pago C(5), desc_oper C(40), r_social C(40), numero C(14),;
codigo C(8), denom c(50), deudor n(12,2), acreedor n(12,2),da c(1),;
ncorr1 C(5), fec_ope1 d(8),m_pago1 C(5), desc_oper1 C(40), r_social1 C(40), numero1 C(14),;
codigo1 C(8), denom1 c(40), deudor1 n(12,2), acreedor1 n(12,2), da1 c(1),nommes c(9),año c(4) )
indic1=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\temping"
indic2=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\tempegr"
indic3=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\final"
If File(indic1+".Idx") Or File(indic2+".Idx") Or File(indic3+".Idx")
Erase indic1+".Idx"
Erase indic2+".Idx"
Erase indic3+".Idx"
Endif
USE &tabla1 SHARED
INDEX ON ncorr TO &indic1
USE &tabla2 SHARED
INDEX ON ncorr1 TO &indic2
USE &tabla3 SHARED
INDEX ON ncorr TO &indic3
SELECT 1
USE &tabla1 inde &indic1 ALIAS t1 SHARED
COPY TO d:\pruebas\sicofi\pr_tesor\bases\ingfinal FOR ini="RI"
COPY TO d:\pruebas\sicofi\pr_tesor\bases\ingfinal1 FOR ini="CD" AND SUBSTR(cj,1,1)="2"
COPY TO d:\pruebas\sicofi\pr_tesor\bases\ingfinal2 FOR ini="CD" AND SUBSTR(cj,1,1)="1"
SELECT 2
USE ingfinal ALIAS t SHARED             Tabla A   (Ingresos)
SELECT 3
USE ingfinal1 ALIAS ff1 SHARED         Tabla B   (Ingresos)
SELECT 4
USE ingfinal2 ALIAS ff2 SHARED          Tabla C  (egresos)
SELECT 5
USE &tabla2 inde &indic2 ALIAS t2 SHARED    Tabla D (egresos)
SELECT 6
USE &tabla3 inde &indic3 ALIAS t3 SHARED  tabla temporal
SELECT 2
Go Top
Do While !Eof()
Select 6
Append Blank
Replace ncorr With t->ncorr, fec_ope With t->fec_ope,;
m_pago With t->m_pago,desc_oper With t->desc_oper,r_social With t->r_social,;
numero With t->numero,codigo With t->codigo,denom With t->denom,;
deudor With t->deudor,acreedor With t->acreedor,da With t->da,año WITH cAño
SELECT 2
SKIP
EndDo
m.nNueva1=.f.
SELECT 6
GO bott
SELECT 3
GO TOP
DO WHILE !EOF()
SELECT 6
SKIP
IF EOF()
APPEND BLANK
m.nNueva1=.t.
ELSE
SKIP -1
ENDIF
Replace ncorr With ff1->ncorr, fec_ope With ff1->fec_ope,;
m_pago With ff1->m_pago,desc_oper With ff1->desc_oper,r_social With ff1->r_social,;
numero With ff1->numero,codigo With ff1->codigo,denom With ff1->denom,;
deudor With ff1->deudor,acreedor With ff1->acreedor,da With ff1->da
IF !m.nNueva1
SKIP
ENDIF
SELECT 3
SKIP
EndDo
m.nNueva = .F.
Select 6
Go Top
SELECT 5
Go Top
Do While !Eof()
Select 6
SKIP
IF EOF()
append Blank
m.nNueva = .T.
Else
Skip -1
ENDIF
Replace ncorr1 With t2->ncorr1,fec_ope1 With t2->fec_ope1,;
m_pago1 With t2->m_pago1,desc_oper1 With t2->desc_oper1,r_social1 With t2->r_social1,;
numero1 With t2->numero1,codigo1 With t2->codigo1,denom1 With t2->denom1,;
deudor1 With t2->deudor1,acreedor1 With t2->acreedor1,da1 With t2->da1
If !m.nNueva
Skip
Endif
SELECT 5
SKIP
EndDo
m.nNueva2=.f.
SELECT 6
GO bott
SELECT 4
GO TOP
DO WHILE !EOF()
SELECT 6
SKIP
IF EOF()
APPEND BLANK
m.nNueva2=.t.
ELSE
SKIP -1
ENDIF
Replace ncorr1 With ff2->ncorr, fec_ope1 With ff2->fec_ope,;
m_pago1 With ff2->m_pago,desc_oper1 With ff2->desc_oper,r_social1 With ff2->r_social,;
numero1 With ff2->numero,codigo1 With ff2->codigo,denom1 With ff2->denom,;
deudor1 With ff2->deudor,acreedor1 With ff2->acreedor,da1 With ff2->da
IF !m.nNueva2
SKIP -1
Endif
SELECT 4
SKIP
EndDo
CLOSE DATABASES all
RETURN

1 Respuesta

Respuesta
1
Algunas observaciones:
*!* ¿No sobrecarga mucho la memoría usar macros
*!* en lugar de trabajar directamente con la ruta?
unidad="D:"
tabla1=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\temping"
tabla2=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\tempegr"
tabla3=unidad+ "\PRUEBAS\SICOFI\PR_TESOR\BASES\final"
y
indic1=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\temping"
indic2=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\tempegr"
indic3=unidad + "\PRUEBAS\SICOFI\PR_TESOR\BASES\final"

*!* La instrucción Close Databases All cerró
*!* todas las tablas, esta opción ¿Se ejecuta
*!* en algún momento?
IF USED(tabla3+".Dbf")
Y respecto a los huecos ¿En qué momento de la ejecución del código se capturan los campos vacíos?
Bueno hasta el momento no me sobrecarga la meoria en todo caso lo podría por una ruta directa.
La opcion closedatab all cierra las tablas despues de haber ejecutado el modulo .
La linea de codigo if Used (tabla3+."DBF") indica que si esta en uso el temporal lo elimina luego lo crea, cada vez que netra al modulo elimina la tabla y luego lo vuelve a crear.
No entiendo a que te refieres con capturar campos vacíos, ya que las tablas que tengo no tienen campos vacíos.
Pero la instrucción Close Databases All está antes de la verificación.
Si en la tabla te marca huecos en la tabla temporal, los campos están vacíos ¿No?
Si hay campos vacíos, al final en la tabla temporal me sale así.
05/08/2008     xxxxxxxxx 1284.65                            12/05/2008  xxxxxxxx    500.00
05/08/2008     xxxxxxxxxx 6000.25                          /     /                                   0.00
  /    /                                                                    13/05/2008  xxxxxxxxx   300.00
Eso quiere decir que está guardando campos vacíos si ejecutas el código paso a paso, de preferencia con el depurador, podrías encontrar porque sucede eso.
Me parece que cuando hay más registros de egresos que registro de ingresos deja un registro en blanco y continua mostrando los demás registros de egresos.
                  INGRESOS
05/08/2008 xxxxxxxxx 1284.65                                12/05/2008 xxxxxxxx 500.00
05/08/2008 xxxxxxxxxx 6000.25                                 /    /                            0.00 
                                                                                  13/05/2008 xxxxxxxx 653.52                                                                                   14/05/2008 xxxxxxxx 700.20
He cambiado el codigo asi:
SET DEFAULT TO d:\pruebas\sicofi\pr_tesor\bases
CREATE TABLE final;
( ncorr C(8), fec_ope d(8),m_pago C(5), desc_oper C(40), r_social C(40), numero C(14),;
codigo C(8), denom c(50), deudor n(12,2), acreedor n(12,2),da c(1),;
ncorr1 C(5), fec_ope1 d(8),m_pago1 C(5), desc_oper1 C(40), r_social1 C(40), numero1 C(14),;
codigo1 C(8), denom1 c(40), deudor1 n(12,2), acreedor1 n(12,2), da1 c(1),nommes c(9),año c(4) )
SELECT 1
USE finaling SHARED
SELECT 2
USE finalegr SHARED
SELECT 3
USE final SHARED
Select finaling
Go Top
Do While !Eof()
Select final
Append Blank
Replace final.ncorr With finaling.ncorr, final.fec_ope With finaling.fec_ope,;
final.m_pago With finaling.m_pago,final.desc_oper With finaling.desc_oper,final.r_social With finaling.r_social,;
final.numero With finaling.numero,final.codigo With finaling.codigo,final.denom With finaling.denom,;
final.deudor With finaling.deudor,final.acreedor With finaling.acreedor,final.da With finaling.da,final.año With cAño
Select finaling
Skip
EndDo
m.nNueva = .F.
Select final
Go Top
Select finalegr
Go Top
Do While !Eof()
Select final
SKIP
IF EOF()
      append Blank
      m.nNueva = .T.
Else
      Skip -1
ENDIF
Replace final.ncorr1 With finalegr.ncorr1, final.fec_ope1 With finalegr.fec_ope1,;
final.m_pago1 With finalegr.m_pago1,final.desc_oper1 With finalegr.desc_oper1,final.r_social1 With finalegr.r_social1,;
final.numero1 With finalegr.numero1,final.codigo1 With finalegr.codigo1,final.denom With finalegr.denom1,;
final.deudor1 With finalegr.deudor1,final.acreedor1 With finalegr.acreedor1,final.da1 With finalegr.da1
If !m.nNueva
    Skip
Endif
Select finalegr
SKIP
EndDo
If !m.nNueva
    Skip
Endif

Esa es la parte que está generando los registros en blanco, si no se añadió un registro, se salta dejando los campos en blanco, elimínala
Al eliminar esta parte del código:
f !m.nNueva
    Skip
Endif
En la parte final de ingresos ya no me sale registros en blanco pero en la parte de egresos solo me sale el ultimo registro el resto de registros no me parce.
Eso es porque el agregar los registros en el segmento:
IF EOF()
      append Blank
      m.nNueva = .T.
Else
      Skip -1
ENDIF

Estás invalidando el ingreso de nuevos registros.
Entonces ese segmento de código como tuviera que quedar. He puesto así:
IF EOF()
       append Blank
Endif
¿Y ahora el registro en blanco me sale al inicio en la parte de egresos hay forma de corregir esto?.
Regresa el epuntador al inicio del archivo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas