VETORES ou MATRIZES

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

VETORES ou MATRIZES

Mensagem por asimoes »

É Quintas,

Você sabe que o Try Catch funciona assim:

Try
atualizando a tabela nova
Deu Erro no meio da atualização, vai pro Catch
Catch o Erro
Trata o erro
Restauro a tabela original, sem perda de dados
End

Simplificando, no meio do append from, deu crash e ai? tabela com metade ou parte dos registros?

Quintas explica pra gente como você trata isso.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Eu só mexo no final, só renomeio, porque não uso FPT.
Se chegou até lá, deu tudo certo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

VETORES ou MATRIZES

Mensagem por microvolution »

gente os Srs. são tão "ninjas" em tudo... que até agora não vi nada que os Srs. não resolvessem ou desse uma opinião certa!
até de "software de rádio" os srs. quase entendem... rsrsrs
por enquanto fiz o procedimento assim (até estudar melhor o do JQuintas ou asimoes):
*************** função para alterar/incluir um campo (tamanho, tipo, etc) 18/2/16w ***************

Código: Selecionar todos

static function ALTERA_ARQUIVO ( MATRIZ , MATRIZA , MATRIZN )
     local ARQUIVO      := MATRIZ [ 1 , 1 , 1 ],;
           NOME_EXTERNO := MATRIZ [ 1 , 1 , 3 ],;
           NOME_INDICE  := nil,;
           CHAVE        := nil,;
           MATRIZ_AUX   := aclone (MATRIZ),;
           I            := 0
     local n_stru       := 1 , a_stru := stru_antiga := stru_nova := {} // acrescentado em 7/2/16w (pctoledo)
     local lATUALIZA    := .t.
     local lATUALIZA2   := .f.
     local tela_anterior
     static INICIO      := .f.
     private L          :=  3 // 1

     lboxmessage( "Por favor, pressione [ENTER] ou clique em [OK] para uma verificação inicial e saber se o arquivo "+ARQUIVO+" precisa ou não ser atualizado!!!" )

     if file (NOME_EXTERNO) .and. INICIO
          return
     endif
     adel (MATRIZ_AUX,1)
     asize (MATRIZ_AUX,len (MATRIZ_AUX) - 1)
     if file (NOME_EXTERNO)
          a_stru := dbstruct()
          for n_stru = 1 to len(MATRIZN)
            if ascan( a_stru , { |x| x[1] = MATRIZN [ n_stru , 1 ] } ) = 0
               aadd ( a_stru , { MATRIZN [ n_stru , 1 ] , MATRIZN [ n_stru , 2 ], MATRIZN [ n_stru , 3 ] , MATRIZN [ n_stru , 4 ] } )
            else
               lATUALIZA := .f.
            end
          next
          if lATUALIZA
            lboxmessage( "A verificação inicial foi feita, e, realmente o arquivo "+ARQUIVO+" precisa ser atualizado. Pressione [ENTER] ou clique em [OK] para ele ser atualizado imediatamente!" , , 2 )
               if lYesNo( "Arquivo de dados " + ARQUIVO + " existe ! Deseja alterar ?" )
                  &ARQUIVO.->(dbclosearea())
                  COPY FILE (NOME_EXTERNO)  TO (NOME_EXTERNO) + "-BACK"
                  if frename(NOME_EXTERNO, NOME_EXTERNO+"2") = 0
                        dbcreate(NOME_EXTERNO, a_stru)
                        use (NOME_EXTERNO) exclusive new
                        append from (NOME_EXTERNO)+"2"
                        use
                        ferase(NOME_EXTERNO+"2")
                        lboxmessage( "Atualização do arquivo " + ARQUIVO + " efetuada com sucesso!!!" )
                  else
                        lboxmessage( "Não foi possível renomear o arquivo! Favor verificar se existe um arquivo com esse nome! A atualização não será possível. O DBatualiza será encerrado." , , 3 )
                     return
                  endif
               else
                  lboxmessage( "Não foi alterado nada. A atualização não será realizada. Aplicativo será encerrado!" , , 3 )
                  return
               endif
          else
            lboxmessage( "A verificação inicial foi feita, e, realmente o arquivo "+ARQUIVO+" não possui novos campos!" , , 2 )
            lboxmessage( "ATENÇÃO! Agora verificaremos no arquivo " + ARQUIVO + " se algum campo foi modificado. Pressione [ENTER] ou clique em [OK] para iniciar a verificação!" , , 2 )
               stru_antiga := dbstruct()
               stru_nova   := MATRIZN
               tela_anterior := savescreen ( 03 , 19 , 21 , 69 )
               // moldura ( 03 , 19 , 21 , 69 )
               janela ( 03 , 19 , 21 , 69 , "w* /n" )
               for n_stru = 1 to len(stru_antiga)
                  @ scrolMV( 04 , 20 , 20 , 68 )     , 20 say "valor atual  : " + stru_antiga[n_stru,1] + stru_antiga[n_stru,2] + str( stru_antiga[n_stru,3] ) + str (stru_antiga[n_stru,4] )
                  @ scrolMV( 04 , 20 , 20 , 68 )     , 20 say "valor correto: " + stru_NOVA[n_stru,1]   + stru_NOVA[n_stru,2]   + str( stru_NOVA[n_stru,3] )   + str (stru_NOVA[n_stru,4] )
                  if     stru_antiga [n_stru,1] <> stru_nova [n_stru,1]
                     lATUALIZA2 := .t.
                  elseif stru_antiga [n_stru,2] <> stru_nova [n_stru,2]
                     lATUALIZA2 := .t.
                  elseif stru_antiga [n_stru,3] <> stru_nova [n_stru,3]
                     lATUALIZA2 := .t.
                  elseif stru_antiga [n_stru,4] <> stru_nova [n_stru,4]
                     lATUALIZA2 := .t.
                  endif
               next
               if lATUALIZA2
                  lboxmessage( "A verificação foi feita, e, realmente o arquivo "+ARQUIVO+" precisa ter os campos corrigidos. Pressione [ENTER] ou clique em [OK] para ele ser atualizado imediatamente!" , , 2 )
                  if lYesNo( "Arquivo de dados "+ARQUIVO+" existe ! Deseja alterar?" )
                     &ARQUIVO.->(dbclosearea())
                     COPY FILE (NOME_EXTERNO)  TO (NOME_EXTERNO) + "-BACK"
                     if frename(NOME_EXTERNO, NOME_EXTERNO+"2") = 0
                        // dbcreate(NOME_EXTERNO, a_stru)
                        dbcreate(NOME_EXTERNO, stru_nova)
                        use (NOME_EXTERNO) exclusive new
                        append from (NOME_EXTERNO) + "2"
                        use
                        ferase(NOME_EXTERNO+"2")
                        lboxmessage( "Atualização do arquivo "+ARQUIVO+" efetuada com sucesso!!!" )
                     else
                        lboxmessage( "Não foi possível renomear o arquivo! Favor verificar se existe um arquivo com esse nome! A atualização não será possível. O DBatualiza será encerrado." , , 3 )
                        return
                     endif
                  else
                     lboxmessage( "Não foi alterado nada. A atualização não será realizada. Aplicativo será encerrado!" , , 3 )
                     return
                  endif
               else
                  lboxmessage( "ATENÇÃO! O arquivo "+ARQUIVO+" já estava atualizado. Isso significa que não precisa ser atualizado por este aplicato, ou este aplicativo já foi executado anteriormente!" , , 2 )
                  return
               endif
          endif
     else
         if lYesNo( "Arquivo "+ARQUIVO+" não encontrado. Será criado então um novo arquivo! Você Concorda ???" , , 2)
            dbcreate (NOME_EXTERNO,MATRIZ_AUX)
         else
            lboxmessage( "Arquivo "+ARQUIVO+" não foi criado. Tudo continuará do jeito em que estava!" , , 3 )
         endif
     endif
     use (NOME_EXTERNO) shared new
     CHAVE := MATRIZ [1,2,2]
     index on &CHAVE to (MATRIZ [1,2,3])
     for I = 3 to len (MATRIZ [1])
          CHAVE := MATRIZ [1,I,2]
          index on &CHAVE to (MATRIZ [1,I,3])
     next
     restscreen ( 03 , 19 , 21 , 69 , tela_anterior )
return
*************** função para alterar/incluir um campo (tamanho, tipo, etc) 18/2/16w ***************
esta é a função que cheguei até o presente momento... isso foi antes de ver as postagens dos srs.
aqui nesta função ela (pelo menos é o que entendi) faz 2 coisas:
1 - verifica se tem novos campos (se tiver toma as providências);
2 - verifica se algum campo foi alterado.
Estou testando, e, até agora não apresentou erros...
Por enquanto é só...
Nota: abro o arquivo em modo EXCLUSIVO.
O que acharam?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Complicada pra entender, muito fonte, e com erros.
Nem quero saber porque 3 arrays.
Só olhei por cima, aonde achei que teria erro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

É possível que seja criado um arquivo com extensão .dbf.dbf
Ou que falhe a cópia, sei lá o que passa como parâmetro.
Como usa o mesmo nome nos dois casos, um dos dois vai falhar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

VETORES ou MATRIZES

Mensagem por alxsts »

Olá!
JoséQuintas escreveu: E com Try/catch?
Vai em frente, e os dados serão perdidos?
Claro que não! Catch serve exatamente para se colocar o tratamento adequado para o erro encontrado. Tem gente que não coloca e deixa o programa seguir, como se nada errado houvesse ocorrido. Isto vem de longe... tempos onde o programador despreocupado fazia no VB:

Código: Selecionar todos

Public Sub SubA()
On Error Goto ProcError

  ' código
End Sub

ProcError:

  Resume NEXT   ' <=========

End Sub
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Ou usando código Harbour, que pode ser considerado no estilo do VB:

Código: Selecionar todos

lOk := .F.
BEGIN SEQUENCE WITH __ErrorBlock()
   sdhsdfhdsd
   lOk := .T.
END SEQUENCE
IF .NOT. lOk
   ? "Deu problema"
ENDIF
Mas a rotina é de converter arquivos.
Uso a minha por 20 anos, nunca escondi erros.
Por isso pude ir acrescentando tudo que pode acontecer.
Se imaginar um fonte desses acima, com rotinas de erro, vai ser complicado.

Minha rotina roda SEMPRE, sempre que o sistema é carregado.
Dá pra dizer que já foi executada milhões de vezes.
Nunca precisei do TRY/CATCH nela.

TRY/CATCH é pra exceções, não pra virar regra.
E muito menos aonde tem a ver com os dados do cliente.
Se der erro, é porque não previu alguma coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Que erros podem acontecer?

não existir o arquivo. if .not. file()
não abrir o arquivo. neterr()
erro no append from: aborta. o temporário fica na pasta, mas não atrapalha nada
estourar capacidade do campo: checagem prévia
campo string pra número e vice-versa: comparar primeiro
erro no rename que já existe: File()
erro de HD: aborta, nem tem como contornar, é um problema de hardware a ser resolvido, nenhum aplicativo roda com erro no HD.

E o try/catch... não sei aonde.
Inventaram que isso é sofisticado, e saem usando em qualquer lugar.

Vai ficar demorado fazer tudo isso?
Se impedir problemas, ótimo, a demora é justificada.
Depois é agilizar rotina.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Try/catch pra erro no hd.

Só vai estar trocando a mensagem de erro padrão por outra.
De qualquer jeito, é abortar e resolver o HD.
E isso a mensagem de erro padrão já faz.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

VETORES ou MATRIZES

Mensagem por JoséQuintas »

Só pra voltar ao assunto do tópico:
Não faço isso, mas:

E pra vários arquivos?
Não precisa alterar a rotina pode criar uma nova, intermediária:

Código: Selecionar todos

FUNCTION AlteraVarios( aArray )

   LOCAL lOk := .T., oFile

   FOR EACH oFile IN aArray
      lOk := lOk .AND. AlteraUm( oFIle[ 1 ], oFile[ 2 ] ) // nome e estrutura
   NEXT
   RETURN lOk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder