Relación de tablas

Hola de nuevo, tengo esta consulta:
Ya he logrado realizar la impresión desde un archivo temporal, para eso hice esto:
SELECT DISTINCT ltivo, lcta, lflagdh, ldoc1, SUM(limpo) AS timpo;
FROM (cDilmmaa);
GROUP BY ltivo, lcta, lflagdh, ldoc1;
INTO CURSOR temp READWRITE ORDER BY ltivo
ALTER TABLE temp ADD COLUMN n_asiento n(3,0);
ADD COLUMN fec_ope d(8);
ADD COLUMN nom_glosa c(90);
ADD COLUMN cod_libro c(2);
ADD COLUMN n_corr c(6);
ADD COLUMN doc_sust c(15);
ADD COLUMN cod_cta c(10);
ADD COLUMN denom c(40);
ADD COLUMN debe n(10,2);
ADD COLUMN haber n(10,2)
SCAN
nomcta=SPACE(30)
nomtivo=SPACE(20)
nomglosa=SPACE(80)
fecha=SPACE(10)
fecha=IIF( Seek(ldoc1,"t03"), t03.fect, "No Hay Fecha")
nomcta=IIF( Seek(lcta,"t01"), Subst(Alltrim(t01. Desc), 1,30), "No hay cuenta")
...
Endscan
Ahora en la tabla temporal tengo un campo nom_glosa y para llenar este campo tengo que buscar el campo ldoc1 en una tabla xx que tiene el campo doc1 pero sucede que el campo ldoc1 almacena por ejm 00164 y en la tabla xx tengo el campo doc1 que almacena RI00164 los dos don de tipo carácter y tienen longitud 10 quiero hacer esto:
nomglosa=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.glos), 1,45), "No Hay Glosa")
Pero comno el campo ldoc1 almacena 00164 no lo encuentra ya que en el alias t04 el campo doc1 almacena RI00164. Como haría para buscarlo he querido usar substr. Gracias

1 respuesta

Respuesta
1
Si "RI" es constante simplemente buscalo usando SEEK("RI"+ldoc1,"t04")
Bueno en realidad me piden almacenar en el campo nom_glosa, la glosa de diferentes tablas, por ejem cuando ltivo=1,2 y 4 la glosa lo tengo que buscar en la tabla "A", cuando ltivo=5 la glosa lo tengo que buscar en la tabla "B", cuando ltivo=10 la glosa lo tengo que buscar en la tabla "C", cuando ltivo=11 la glosa lo tengo que buscar en la tabla "D", cuando ltivo=12 la glosa lo tengo que buscar en la tabla "E", cuando ltivo=13 la glosa lo tengo que buscar en la tabla "F", cuando ltivo=15 la glosa lo tengo que buscar en la tabla "G", cuando ltivo=16 la glosa lo tengo que buscar en la tabla "H" y cuando ltivo=17 la glosa lo tengo que buscar en la tabla "I" ahora yo hice esto para cuando ltivo=1,2 y 4:
Select 1
Use h:\sicofi\pr_conta\setup\xx Index h:\sicofi\pr_conta\setup\xx.idx Alias t01 Share
Select 2
Use h:\sicofi\pr_conta\setup\document Index h:\sicofi\pr_conta\setup\document.idx Alias t02 Share
Select 3
USE (cDicmmaa) INDEX (cDicmmaa) ALIAS t03 share
Select 4
USE (cTecmmaa) INDEX (cTecmmaa) ALIAS t04 share &&Tabla "A"
Select 5
use ... tabla "B" Alias t05
Selec 6
use ... tabla "C" Alias t06
...
..
Use tabla "I" Alias ...
SELECT DISTINCT ltivo, lcta, lflagdh, ldoc1, SUM(limpo) AS timpo;
FROM (cDilmmaa);
GROUP BY ltivo, lcta, lflagdh, ldoc1;
INTO CURSOR temp READWRITE ORDER BY ltivo
ALTER TABLE temp ADD COLUMN n_asiento n(3,0);
ADD COLUMN fec_ope c(10);
ADD COLUMN nom_glosa c(90);
ADD COLUMN cod_libro c(2);
ADD COLUMN n_corr c(6);
ADD COLUMN doc_sust c(15);
ADD COLUMN cod_cta c(10);
ADD COLUMN denom c(40);
ADD COLUMN debe n(10,2);
ADD COLUMN haber n(10,2)
Solo cuando ltivo es igual 1, 2 y 4 los nros de documentos en la tabla "A" tienen este tipo RI00164, CC0056 y CD00287, para el resto de tablas B, C, D... I los nros documentos es normal.
SCAN
IF ltivo=1    &&Como ltivo almacena en el temporal 00164
REPLACE ldoc1 WITH "RI"+ldoc1  &&aqui agrego RI para q el documento sea RI00164
ELSE
IF ltivo=2
REPLACE ldoc1 WITH "CC"+ldoc1 &&aqui agrego CC para q el documento sea CC0056
ELSE
IF ltivo=4
REPLACE ldoc1 WITH "CD"+ldoc1 &&aqui agrego CD para q el documento sea CD00287
ENDIF
ENDIF
ENDIF
nomcta=SPACE(30)
nomtivo=SPACE(20)
nomglosa=SPACE(80)
fecha=SPACE(10)
fecha=IIF( Seek(temp.ldoc1,"t04"), t04.fect, "No Hay Fecha")
nomcta=IIF( Seek(temp.lcta,"t01"), Subst(Alltrim(t01.desc),1,30), "No hay cuenta")
nltivo= IIF( Seek(temp.ltivo,"t02"), PADR(t02.correl,3),0)
***Aqui busco ldoc1 en el alias t04(tabla "A") y como ldoc1 ahora vale RIxxx, CCxxx, CDxxx encuentra los documentos. 
nombre=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.enom),1,40), "No Hay Glosa")
nomglosa=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.glos),1,45), "No Hay Glosa")
cdoc=IIF( Seek(temp.ldoc1,"t03"), Subst(Alltrim(t03.ndocu),1,15), "No Hay Documento")
REPLACE temp.n_asiento WITH VAL(nltivo)
REPLACE temp.fec_ope WITH fecha
REPLACE temp.nom_glosa WITH nombre+" "+nomglosa &&Aqui guardo el contenido del alias t04(Tabla "A"), como guardo las glosas en este mismo campo del resto de tablas? estuve haciendo con IF pero no llego al resultado.
REPLACE temp.cod_libro WITH "5"
REPLACE temp.doc_sust WITH cdoc
REPLACE temp.cod_cta WITH temp.lcta
REPLACE temp.denom WITH nomcta
REPLACE temp.debe WITH IIF(temp.lflagdh="D",temp.timpo,0)
REPLACE temp.haber WITH IIF(temp.lflagdh="H",temp.timpo,0)
ENDSCAN
Gracias de antemano.
¿EL campo ldoc1 debe Buscar en varias tablas?, si la respuesta es SI realiza lo siguiente:
Select 1
Use h:\sicofi\pr_conta\setup\xx Index h:\sicofi\pr_conta\setup\xx.idx Alias t01 Share
Select 2
Use h:\sicofi\pr_conta\setup\document Index h:\sicofi\pr_conta\setup\document.idx Alias t02 Share
Select 3
USE (cDicmmaa) INDEX (cDicmmaa) ALIAS t03 share
Select 4
USE (cTecmmaa) INDEX (cTecmmaa) ALIAS t04 share &&Tabla "A"
Select 5
use ... tabla "B" Alias t05
Selec 6
use ... tabla "C" Alias t06
...
..
Use tabla "I" Alias ...
SELECT DISTINCT ltivo, lcta, lflagdh, ldoc1, SUM(limpo) AS timpo;
FROM (cDilmmaa);
GROUP BY ltivo, lcta, lflagdh, ldoc1;
INTO CURSOR temp READWRITE ORDER BY ltivo
ALTER TABLE temp ADD COLUMN n_asiento n(3,0);
ADD COLUMN fec_ope c(10);
ADD COLUMN nom_glosa c(90);
ADD COLUMN cod_libro c(2);
ADD COLUMN n_corr c(6);
ADD COLUMN doc_sust c(15);
ADD COLUMN cod_cta c(10);
ADD COLUMN denom c(40);
ADD COLUMN debe n(10,2);
ADD COLUMN haber n(10,2)
DIMENSION mi_Tabla[5] &&Este es un array donde van los alias delas tablas que contienen las glosas y que van a ser accesadas por el campo ldoc1 y ltivo va a ser el indice de busqueda
mi_tabla[1]="T04"
mi_tabla[2]="T04" 
mi_tabla[3]="T05"  && es una referencia no se el nombre de la tabla
mi_tabla[4]="T04"
mi_tabla[5]="T06"  && "
etc,etc,etc,
SCAN
IF ltivo=1 &&Como ltivo almacena en el temporal 00164
REPLACE ldoc1 WITH "RI"+ldoc1 &&aqui agrego RI para q el documento sea RI00164
ELSE
IF ltivo=2
REPLACE ldoc1 WITH "CC"+ldoc1 &&aqui agrego CC para q el documento sea CC0056
ELSE
IF ltivo=4
REPLACE ldoc1 WITH "CD"+ldoc1 &&aqui agrego CD para q el documento sea CD00287
ENDIF
ENDIF
ENDIF
nomcta=SPACE(30)
nomtivo=SPACE(20)
nomglosa=SPACE(80)
fecha=SPACE(10)
fecha=IIF( Seek(temp.ldoc1,"t04"), t04.fect, "No Hay Fecha")
nomcta=IIF( Seek(temp.lcta,"t01"), Subst(Alltrim(t01.desc),1,30), "No hay cuenta")
nltivo= IIF( Seek(temp.ltivo,"t02"), PADR(t02.correl,3),0)
mi_file=mi_tabla[ltivo] && coloca el nombre de la tabla segun el indice ltivo
nombre=IIF( Seek(ldoc1,mi_file), Subst(Alltrim(&mi_file..enom),1,40), "No Hay Glosa")
nomglosa=IIF( Seek(ldoc1,mi_file), Subst(Alltrim(&mi_file..glos),1,45), "No Hay Glosa")
cdoc=IIF( Seek(temp.ldoc1,"t03"), Subst(Alltrim(t03.ndocu),1,15), "No Hay Documento")
REPLACE temp.n_asiento WITH VAL(nltivo)
REPLACE temp.fec_ope WITH fecha
REPLACE temp.nom_glosa WITH nombre+" "+nomglosa
REPLACE temp.cod_libro WITH "5"
REPLACE temp.doc_sust WITH cdoc
REPLACE temp.cod_cta WITH temp.lcta
REPLACE temp.denom WITH nomcta
REPLACE temp.debe WITH IIF(temp.lflagdh="D",temp.timpo,0)
REPLACE temp.haber WITH IIF(temp.lflagdh="H",temp.timpo,0)
ENDSCAN
Es más o menos lo que he podido entender de tu programa espero te sea útil
Bueno lo que sucede es que en la tabla "A" el nro de doc se almacena así: RI001, CC001, CD001 y la glosa se almacena en el campo enom y glos, en la tabla "B" y el resto de tablas el nro de doc se almacena así: 000521, 0000556, etc. y la glosa se almacena en diferentes campos por ejm. para la tabla "B" la glosa se almacena en el campo refer, para la tabla "C" la glosa se almacena en el campo glosa1 no todas las tablas tiene el mismo campo para almacenar la glosa. Yo he hecho esto solo para la tabla "A":
SCAN
IF ltivo=1
REPLACE ldoc1 WITH "RI"+ldoc1 &&Para poder buscar en la tabla "A" el nro de doc, antepongo RI, CC y CD a ldoc1,
ELSE
IF ltivo=2
REPLACE ldoc1 WITH "CC"+ldoc1
ELSE
IF ltivo=4
REPLACE ldoc1 WITH "CD"+ldoc1
ENDIF
ENDIF
ENDIF
nomcta=SPACE(30)
nomtivo=SPACE(20)
nomglosa=SPACE(45)
nombre=SPACE(40)
fecha=SPACE(10)
fecha=IIF( Seek(temp.ldoc1,"t04"), t04.fect, "No Hay Fecha")
nombre=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.enom),1,40), "No Hay Glosa")
nomglosa=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.glos),1,45), "No Hay Glosa")
cdoc=IIF( Seek(temp.ldoc1,"t04"), Subst(Alltrim(t04.doc1),1,10), "No Hay Documento")
Replace nom_glosa with nombre+" "+nomglosa &&Aqui me almacena normal la glosa de la tabla "A" la idea es buscar el resto de docs en las demas tablas y guardar sus glosas
...
...
Endscan
En mi tabla se guarda así:
ltivo          ldoc1        glosa
1 RI00164 XXXXXXXXXXX
1 RI00025 FDFDFDDF
2 CC776 FDFDFDF
2 CC757 7YURYRYRYU
4 cd636 uuuuuuu
4 CD689 CCCCCCCC
5 000222 VACÍO
5 000245 VACÍO
6 00022 VACÍO
6 00023 VACÍO
... vacío
... vacío
Entonces simplemente pregunta por el estado de Ltivo y según el numero busca en la tabla correspondiente por ejemplo
SCAN
DO CASE
CASE ltivo=1
nomglosa=IIF( Seek(ldoc1,"t04"), Subst(Alltrim(t04.glos),1,45), "No Hay Glosa")
CASE ltivo=2
.
.
.
Endcase
Endscan
Hice esto pero no me graba la glosa o algo estoy haciendo mal:
SCAN
nomcta=SPACE(30)
nomtivo=SPACE(20)
nomglosa=SPACE(45)
nombre=SPACE(40)
fecha=SPACE(10)
DO CASE
CASE ltivo=1
fecha=IIF( Seek("RI"+temp.ldoc1,"t04"), t04.fect, "No Hay Fecha")
nombre=IIF( Seek("RI"+temp.ldoc1,"t04"), Subst(Alltrim(t04.enom),1,40), "No Hay Glosa")
nomglosa=IIF( Seek("RI"+temp.ldoc1,"t04"), Subst(Alltrim(t04.glos),1,45), "No Hay Glosa") 
cdoc=IIF( Seek("RI"+temp.ldoc1,"t04"), Subst(Alltrim(t04.doc1),1,10), "No Hay Documento")
ENDCASE
****.*****
nomcta=IIF( Seek(temp.lcta,"t01"), Subst(Alltrim(t01.desc),1,30), "No hay cuenta") &&Tabla Planctas
nltivo= IIF( Seek(temp.ltivo,"t02"), PADR(t02.correl,3),0) &&Tabla Document
REPLACE temp.n_asiento WITH VAL(nltivo)
REPLACE temp.fec_ope WITH fecha
REPLACE temp.nom_glosa WITH nombre+" "+nomglosa
REPLACE temp.cod_libro WITH "5"
REPLACE temp.doc_sust WITH cdoc
...
..
Endscan
Si todos los campos quedan en blanco quiere decir que Ltivo no cumple la condición de =1
si nomglosa graba="No hay Glosa" quiere decir que no existe el código,
Te recomiendo que los campos de trabajo (NomGlosa) no sean similares al de los archivos, colocales algo para indicar que son de trabajo como xNomGlosa
el resto parece estar bien.

Añade tu respuesta

Haz clic para o