Copiar de una tabla a otra

Hola... Ya a pasado bastante tiempo.. Je je
Bueno el problema es que tengo una tabla (T1) con los campos Num_emp y Num_cst, los cuales debo buscar en la tabla (T2). Si lo encuentra debe de verificar en la T1 si los campos mes_et, mes_jop, mes_asist, mes_final son = 0. Si lo son debe copiar de T2 a T1. Y así con cada uno de los empleados registrados en T1. Si no lo encuentra el num_emp y num_cst en T2, pues no hace nada, y pasa al siguiente empleado en T1... Aquí te pongo el código que llevo.. Para que verifiques cual es el error que tengo..
set exact on
fecini1=thisform.text1.value   **aqui pongo el rango de fecha
fecter1=thisform.text2.value
x=year(fecini1)
y=year(fecter1)
if ( empty(fecini1) .or. Empty(fecter1) .or. X<2002 .or. Y<2002 .or. Fecini1>fecter1)
messagebox("fecha incorrecta... Favor de introducir la fecha del periodo a evaluar...",0+64,"sistema de eficiencia (evaluación)")
thisform.refresh
return
endif
fec=upper(alltrim(cmonth(fecini1)))  **aqui extraigo el mes
tablita =getfile('dbf') **busco la tabla de la cual se copiaran los campos, esta seria (T2)
select 55
use (tablita)
*****************por administrador de plazas de cobro*********************
if apc=1
select 1 **esta sería (T1)
go top
scan
n=alltrim(numemp)
cst=alltrim(num_cst)
select 55
go top
scan
locate for alltrim(numemp)=n .and. Alltrim(num_cst)=cst
if found()
if (fec="septiembre" .or. Fec="september")
select 1
if(sep_et=0 .and. Sep_jop=0 .and. Sep_asist=0 .and. Sep_final=0)
select 55
replace por_apc2.sep_et with sep_et
replace por_apc2.sep_jop with sep_jop
replace por_apc2.sep_asist with sep_asist
replace por_apc2.sep_final with sep_final
endif
endif
if (fec="octubre" .or. Fec="october")
select 1
if(oct_et=0 .and. Oct_jop=0 .and. Oct_asist=0 .and. Oct_final=0)
select 55
replace por_apc2.oct_et with oct_et
replace por_apc2.oct_jop with oct_jop
replace por_apc2.oct_asist with oct_asist
replace por_apc2.oct_final with oct_final
endif
endif
if (fec="noviembre" .or. Fec="november")
select 1
if(nov_et=0 .and. Nov_jop=0 .and. Nov_asist=0 .and. Nov_final=0)
select 55
replace por_apc2.nov_et with nov_et
replace por_apc2.nov_jop with nov_jop
replace por_apc2.nov_asist with nov_asist
replace por_apc2.nov_final with nov_final
endif
endif
if (fec="diciembre" .or. Fec="december")
select 1
if(dic_et=0 .and. Dic_jop=0 .and. Dic_asist=0 .and. Dic_final=0)
select 55
replace por_apc2.dic_et with dic_et
replace por_apc2.dic_jop with dic_jop
replace por_apc2.dic_asist with dic_asist
replace por_apc2.dic_final with dic_final
endif
endif
endif
endscan
endscan
endif
Saludos y gracias por tu ayuda

1 respuesta

Respuesta
1
Te mando el mismo código con algunas recomendaciones y el posible problema.
Líneas comentadas con "*-/-*": Solo recomendaciones
Líneas comentadas con "*-!-*": Errores detectados
SET EXACT ON
fecini1=ThisForm.text1.Value   && aqui pongo el rango de fecha
fecter1=ThisForm.text2.Value
x=YEAR(fecini1)
Y=YEAR(fecter1)
IF ( EMPTY(fecini1) .OR. EMPTY(fecter1) .OR. x<2002 .OR. Y<2002 .OR. fecini1>fecter1)
    MESSAGEBOX("fecha incorrecta... favor de introducir la fecha del periodo a evaluar...",0+64,"sistema de eficiencia (evaluación)")
    ThisForm.Refresh()
    RETURN
ENDIF
** Aquí te conviene usar el número del mes en vez del nombre
** Obviamente tendrías que cambiar al programación donde usas
** la variable Fec
*-/-*  fec=UPPER(ALLTRIM(CMONTH(fecini1)))  && aqui extraigo el mes
nMes = MONTH(FecIni1)
tablita =GETFILE('dbf') && busco la tabla de la cual se copiaran los campos, esta seria (T2)
** Aquí puedes prevenir errores al checar si se selecciono el archivo
IF EMPTY(Tablita)
    MESSAGEBOX("No seleccionó la tabla de Destino", 48, "Aviso")
    RETURN
ENDIF
** Aquí no entiendo por qué seleccionas el área de trabajo 55
** Puedes utilizar "IN 0 ALIAS cAlias" para que se abra en la siguiente
** área de trabajo disponible con el "Alias" que tu le especifiques
*-/-*  SELECT 55
*-/-*  USE (tablita)
USE (Tablita) IN 0 ALIAS T2
*****************por administrador de plazas de cobro*********************
IF apc=1
    ** Aquí podrías usar el "Alias" de la tabla para seleccionarla, por ejemplo:
    ** SELECT T1 en vez de SELECT 1
    SELECT 1 && esta sería (T1)
    GO TOP
    SCAN
        N=ALLTRIM(numemp)
        cst=ALLTRIM(num_cst)
        *-/-*  SELECT 55
        SELECT T2
        *-/-*  GO TOP
        ** Creo que aquí es donde esta el problema
        ** No tiene caso que uses un "SCAN" y luego un "LOCATE" ya que el "LOCATE"
        ** Recorre toda la tabla en busca de las condiciones que le especifiques.
        ** Así que solo necesitas usar el "LOCATE"
        *-!-*  SCAN
            LOCATE FOR ALLTRIM(numemp)=N .AND. ALLTRIM(num_cst)=cst
            IF FOUND()
                ** Aquí podrías usar el siguiente código, quite el que tenías
                SELECT 1 && o SELECT por_apc2, que creo es la tabla T1
                DO CASE
                    CASE nMes == 09
                        IF sep_et == 0 AND sep_jop == 0 AND sep_asist == 0 AND sep_final == 0
                            REPLACE ;
                                sep_et        WITH T2.sep_et, ;
                                sep_jop        WITH T2.sep_jop, ;
                                sep_asist    WITH T2.sep_asist, ;
                                sep_final    WITH T2.sep_final
                        ENDIF
                    CASE nMes == 10
                        IF oct_et == 0 AND oct_jop == 0 AND oct_asist == 0 AND oct_final == 0
                            REPLACE ;
                                oct_et        WITH T2.oct_et, ;
                                oct_jop        WITH T2.oct_jop, ;
                                oct_asist    WITH T2.oct_asist, ;
                                oct_final    WITH T2.oct_final
                        ENDIF
                    CASE nMes == 11
                        IF nov_et == 0 AND nov_jop == 0 AND nov_asist == 0 AND nov_final == 0
                            REPLACE ;
                                nov_et        WITH T2.nov_et, ;
                                nov_jop        WITH T2.nov_jop, ;
                                nov_asist    WITH T2.nov_asist, ;
                                nov_final    WITH T2.nov_final
                        ENDIF
                    CASE nMes == 12
                        IF dic_et == 0 AND dic_jop == 0 AND dic_asist == 0 AND dic_final == 0
                            REPLACE ;
                                dic_et        WITH T2.dic_et, ;
                                dic_jop        WITH T2.dic_jop, ;
                                dic_asist    WITH T2.dic_asist, ;
                                Dic_final WITH T2.dic_final
                        ENDIF
                ENDCASE
            ENDIF
        *-!-*  ENDSCAN
        ** Aquí debes asegurarte de seleccionar la tabla sobre la cual estas "escaneando"
        SELECT 1
    ENDSCAN
Endif
Ok... lo eh probado con las recomendaciones y errores que mencionaste... y aunque no lo ocupe exactamente igual... me sirvieron de guía y me ayudaron a cumplir con mi objetivo.
Saludos y gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas