Página 1 de 1

Append from

Enviado: 21 Mar 2013 14:29
por Jeferson
Boa tarde, pessoal.

olha só já estou a dias tentando executar esse comando para poder fazer essa rotina funcionar porem estou encontrando a seguinte dificuldade.

É criado o arquivo temporario, porem na hora de retornar o que foi gravado neste arquivo para o arquivo principal ele não faz.

Segue abaixo a rotina para melhor entendimento e fico no aguardo de uma ajuda com solução.

Código: Selecionar todos

        CASE    LASTKEY() = -4
                area    := SELECT()
                ind     := indexord()
                vRec    := RECNO()
                tmpdd   := " "
                t_conf  := "S"

                @ 22,01 CLEAR TO 23,77
                @ 01,43 SAY "[F5] Copiar " COLOR ["B/W"]
                DO WHILE .T.
                        t_usu   := TAB->USUARIO
                        d_usu   := SPACE(20)
                        @ 23,02 SAY "Copiar este Usu rio..: "
                        @ 23,25 SAY t_usu
                        @ 23,47 SAY "para..: "
                        @ 23,55 GET d_usu Picture "@!"
                        CLEAR TYPEAHEAD
                        SET CURSOR ON
                        READ
                        SET CURSOR OFF
                        IF LASTKEY() = 27
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                @ 01,01 SAY " Usu rio"
                                CENTRA(01,"  [INS]    [DEL]    [F5] Copiar ")
                                RETURN(1)
                        ENDIF
                        @ 24,23 SAY "Confirma as informa‡äes? S/N [ ]"
                        @ 24,53 GET t_conf Picture "@!" Valid t_conf $ "SN"
                        CLEAR TYPEAHEAD
                        SET CURSOR ON
                        READ
                        SET CURSOR OFF
                        d_usu  := STRTRAN(d_usu," ","")
                        IF t_conf = "N" .OR. LASTKEY() = 27
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                LOOP
                        ENDIF
                        IF t_conf = "S"
                                COPY TO c:\tmp\tmpnet WHILE t_usu = TAB->USUARIO
                                USE c:\tmp\tmpnet NEW
                                REPLACE ALL TMPNET->USUARIO WITH d_usu
                                SELECT 1
                                APPEND FROM C:\TMP\TMPNET
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                @ 01,01 SAY " Usu rio"
                                CENTRA(01,"   [INS]    [DEL]     [F5] Copiar ")
                                RETURN(1)
                        ENDIF
                ENDDO
                RETURN(1)
Grato pela ajuda.

Jeferson.

Append from

Enviado: 21 Mar 2013 15:45
por Jairo Maia
Olá Jeferson,

Se você abrir o arquivo em c:\tmp\tmpnet.dbf você vê os dados nele?

Pergunto porque você está usando a cláusula WHILE, e isto verifica a condição segundo o índice que está selecionado.

Append from

Enviado: 21 Mar 2013 16:05
por alxsts
Olá!

Talvez seja mesmo a condição WHILE. Ele avalia essa condição no primeiro registro. Ela retorna falso e ele encerra a operação de cópia. Troque por:

Código: Selecionar todos

COPY TO c:\tmp\tmpnet FOR t_usu = TAB->USUARIO

Append from

Enviado: 21 Mar 2013 16:27
por Jeferson
Não funcionou Alxsts.
Veja bem, copiar para o arquivo temporário eu consigo, só que eu quero trazer tudo que eu copiei para o arquivo principal novamente. Ai é que está o problema. Tenho outros .PRG's onde eu utilizei essa função sem problema algum. Só que agora eu não estou conseguindo. Não sei o que estou fazendo de errado. Não consigo enxergar o erro. Efetuei a troca do WHILE pelo FOR e de nada adiantou.

Append from

Enviado: 21 Mar 2013 16:37
por Jairo Maia
Olá Jeferson,

E você tem certeza que o aliás TAB está aberto na área 1?

Tente também alterar o SELECT 1 que está antes do APPEND por SELECT TAB

NOTA: Estamos considerando que você verificou o arquivo c:\tmp\tmpnet.dbf e constatou que ele não está vazio, ok?

Append from

Enviado: 21 Mar 2013 16:48
por Jeferson
Eu abro o arquivo no c:\tmp\tmpnet.dbf para confirmar e, realmente, o arquivo existe.
É, infelizmente, nenhuma das alternativas passada funcionou.
Realmente não estou entendendo.


Jeferson.

Append from

Enviado: 21 Mar 2013 16:55
por Jairo Maia
Olá Jeferson,

Pois é. Muito estranho...

Apenas para registro, onde eu escrevi:
Tente também alterar o SELECT 1 que está antes do APPEND por SELECT TAB
Entenda assim:
Tente também alterar o SELECT 1 que está antes do APPEND por SELECT Nome_da_Tabela destino

Append from

Enviado: 21 Mar 2013 17:25
por Jeferson
Segue a modificação solicitada por você:

Código: Selecionar todos

        CASE    LASTKEY() = -4
*                area    := SELECT()
*                ind     := indexord()
*                vRec    := RECNO()
                tmpdd   := " "
                t_conf  := "S"

                @ 22,01 CLEAR TO 23,77
                @ 01,43 SAY "[F5] Copiar " COLOR ["B/W"]
                DO WHILE .T.
                        t_usu   := TAB->USUARIO
                        d_usu   := SPACE(20)
                        COPY TO c:\tmp\tmpnet FOR t_usu = TAB->USUARIO
                        USE c:\tmp\tmpnet NEW
                        @ 23,02 SAY "Copiar este Usu rio..: "
                        @ 23,25 SAY t_usu
                        @ 23,47 SAY "para..: "
                        @ 23,55 GET d_usu Picture "@!"
                        CLEAR TYPEAHEAD
                        SET CURSOR ON
                        READ
                        SET CURSOR OFF
                        IF LASTKEY() = 27
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                @ 01,01 SAY " Usu rio"
                                CENTRA(01,"  [INS]    [DEL]    [F5] Copiar ")
                                RETURN(1)
                        ENDIF
                        @ 24,23 SAY "Confirma as informa‡äes? S/N [ ]"
                        @ 24,53 GET t_conf Picture "@!" Valid t_conf $ "SN"
                        CLEAR TYPEAHEAD
                        SET CURSOR ON
                        READ
                        SET CURSOR OFF
                        d_usu  := STRTRAN(d_usu," ","")
                        IF t_conf = "N" .OR. LASTKEY() = 27
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                LOOP
                        ENDIF
                        IF t_conf = "S"
                                REPLACE ALL TMPNET->USUARIO WITH d_usu
                                SELECT TAB
                                APPEND FROM C:\TMP\TMPNET
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                @ 01,01 SAY " Usu rio"
                                CENTRA(01,"   [INS]    [DEL]     [F5] Copiar ")
                                RETURN(1)
                        ENDIF
                ENDDO
                RETURN(1)
Porém a mesma não surtil efeito.

O arquivo TAB.DBF está locado no drive D:, mais precisamente em D:\ffrj\src\jeferson\tab3\, e copio os dados deste arquivo para o arquivo temporario tmpnet, neste endereço C:\tmp;
Será que o caminho é extenso e o clipper não suporta?
Depois, vou continuar verificando com mais calma.

De qualquer forma fica o codigo para exemplos futuros.

Abraço.


Jeferson.

Append from

Enviado: 21 Mar 2013 18:03
por Jairo Maia
Jeferson escreveu:Será que o caminho é extenso e o clipper não suporta?
Não. Me parece que tem sim limite para declarar um caminho no Clipper, mas se não estou enganado, é de 64 caracteres por caminho informado. Mas tamanho do caminho não se aplica a seu caso aqui, até porque se fosse algo do tipo você teria erro em tempo de excução, tal como aquele do tipo: variável não existe, etc...

Jeferson, ainda tem uma incógnita ai. Você extrai os registros da tabela TAB, coloca na tabela temporária TMPNET, e depois faz um APPEND da tabela TMPNET para a própria tabela TAB?

Isso não estou entendendo. Por isso fiz a correção na minha mensagem anterior. Ao invés de ser SELECT TAB, você precisa usar o alíás da tabela que vai receber os dados da tabela TMPNET. Como se chama essa tabela? É a própria de onde você extraiu os dados? Ous seja, a própria tabela TAB?

Append from

Enviado: 21 Mar 2013 18:56
por alxsts
Olá!

Precisa fechar a tabela temporária antes de fazer o APPEND FROM:

Código: Selecionar todos

                        IF t_conf = "S"
                                COPY TO c:\tmp\tmpnet WHILE t_usu = TAB->USUARIO
                                USE c:\tmp\tmpnet NEW
                                REPLACE ALL TMPNET->USUARIO WITH d_usu

                                TMPNET->( DbCloseArea() )  // Fecha a área corrente

                                SELECT 1
                                APPEND FROM C:\TMP\TMPNET
                                @ 23,01 CLEAR TO 23,77
                                @ 24,01,24,78 BOX B_DOUBLE
                                @ 01,01 SAY " Usu rio"
                                CENTRA(01,"   [INS]    [DEL]     [F5] Copiar ")
                                RETURN(1)
                        ENDIF

Append from

Enviado: 22 Mar 2013 08:15
por Jeferson
Perfeito.

O alxsts matou a charada.
Eu estava esquecendo de fechar o arquivo temporario, para depois chamar o Append From.
Valeu pela colaboração de todos que me ajudaram.
A gente fica no corre-corre que não consegue enxergar as coisas mais simples e que as vezes estavam na nossa cara.

Mais uma vez obrigado ao Jairo e o Alxsts pela ajuda.


Jeferson.