viernes, 6 de junio de 2025

Try catch end

 // --------------------------------------------------
// Procedure principal que executa uma query com tratamento de exceção
// --------------------------------------------------
PROCEDURE ExecutarConsultaComTratamento()
sSQL is string = "SELECT * FROM cliente WHERE cidade = 'Curitiba'"
TRY
   IF NOT HExecuteSQLQuery(MyQuery, hQueryDefault, sSQL) THEN
      // Se a query falhar, forçamos uma exceção manual
      Error("Erro na consulta")
      ExceptionThrow(HError()) // Dispara a exception com o código de erro
   END
   // Continua a execução se der certo
   HReadFirst(MyQuery)
   WHILE NOT HOut()
      Trace(MyQuery.Nome + " - " + MyQuery.Email)
      HReadNext(MyQuery)
   END
CATCH (ErroBD)
   Info("Erro capturado via exceção: " + FazerAcaoCasoErro(ErroBD))
END

WHEN EXCEPTION IN

 PROCEDURE ValeurChamp(sNomChamp)
WHEN EXCEPTION IN
 RETURN (sNomChamp)
DO
 IF ExceptionInfo(errCode) = ExIDInconnu THEN 
RETURN ""
End 
END

/////////////
// Procedure : InserirClienteComTransacao
// Objetivo  : Inserir cliente e endereço com transação segura
// Autor     : Adriano Boller - WX Soluções
// --------------------------------------------------
PROCEDURE InserirClienteComTransacao()

// Dados de exemplo
sNome        is string = "Maria Silva"
sEmail       is string = "maria@exemplo.com"
sEndereco    is string = "Rua Exemplo, 123"
sCidade      is string = "Curitiba"

TRY
   // Inicia transação
   HTransactionStart()

   // Inserir cliente
   cliente.Nome  = sNome
   cliente.Email = sEmail

   IF NOT HAdd(cliente) THEN
      ExceptionThrow(HError()) // dispara erro se falhar
   END

   // Inserir endereço (relacionado ao cliente recém-inserido)
   endereco.IDCliente = HRecNum(cliente)
   endereco.Logradouro = sEndereco
   endereco.Cidade     = sCidade

   IF NOT HAdd(endereco) THEN
      ExceptionThrow(HError())
   END

   // Se tudo deu certo, confirmamos a transação
   HTransactionCommit()
   Info("Cliente e endereço inseridos com sucesso!")

CATCH(ErroTransacao)
   // Se qualquer erro acontecer, desfaz tudo
   HTransactionCancel()
   Error("Erro ao inserir dados: " + InterpretarErroHFSQL(ErroTransacao))
END

Manejo de errores al modificar tablas

//adriano boller
//Modo de usar

If hadd(tabela) = false
    FazerAcaoCasoErro()

End 

FazerAcaoCasoErro()

PROCEDURE FazerAcaoCasoErro() 

Info("Algo deu errado", HErrorInfo(), ErrorInfo())

SWITCH HError()

CASE 70001

info( "Erro ao abrir a conexão com o banco de dados. Verifique se o servidor está disponível.")

              //Execute70001

CASE 70002

info( "Erro de autenticação. Usuário ou senha inválidos.")

              //Execute70002

CASE 70003

info( "Erro ao executar a query. Verifique a sintaxe SQL.")

              //Execute70003

CASE 70004

info( "A tabela referenciada não foi encontrada no banco de dados.")

              //Execute70004

CASE 70005

info "Violação de integridade referencial (chave estrangeira ou primária).")

               //Execute70005

CASE 70006

info( "Tentativa de inserir um registro duplicado (chave única).")

               //Execute70006

CASE 70007

info( "Erro ao acessar o arquivo de dados (possível corrupção ou ausência).")

              //Execute70007

CASE 70008

info( "Problema ao gravar no banco de dados. Verifique espaço em disco ou permissões.")

               //Execute70008

CASE 70009

info( "Erro de bloqueio. O registro já está sendo usado por outro processo.")

  //Execute70009
CASE 70010
info( "O campo solicitado não existe na estrutura da tabela.")
               //Execute70010
CASE 70011
info( "Problema na transação. Pode ser necessário usar HTransactionCancel().")
                //Execute70011
CASE 70012
info( "Erro de comunicação com o banco. Verifique a rede ou timeouts.")
              //Execute70012
OTHER CASE
info( "Erro desconhecido” + HErrorInfo())
END

ZIP

CÓDIGO DE ADRIANO BOLLER
//Generar un archivo zip
sArquivoZip is string = fCurrentDir() + "\backup_projeto.zip"
// Caminho da pasta a ser compactada
sPasta is string = fCurrentDir() + "\projeto_completo"
// Se o ZIP já existe, remove
IF fFileExist(sArquivoZip) THEN
    fDelete(sArquivoZip)
END
// Cria o arquivo ZIP
IF NOT zipCreate(sArquivoZip) THEN
    Error("Error criar o arquivo zip: " + zipMsgError())
    RETURN
END
// Adiciona a pasta inteira recursivamente
IF NOT zipAddDirectory(sArquivoZip, sPasta, zipDirectoryRecursive) THEN
    Error("Erro ao adicionar pasta ao zip: " + zipMsgError())
    zipClose(sArquivoZip)
    RETURN
END
// Fecha o arquivo zip após adicionar tudo
zipClose(sArquivoZip)
// Confirmação
Info("Backup compactado com sucesso: " + sArquivoZip)

//
// Procedure: ZipAllFilesInFolder
// Finalidade: Adiciona todos os arquivos de uma pasta no arquivo ZIP
PROCEDURE ZipAllFilesInFolder(sZipFileName is string, sFolderPath is string)

MyArchive is zipArchive
ResOpen is boolean
ResAddFile is boolean
sFileList is array of strings
sCurrentFile is string

// Abre o arquivo ZIP para criação
ResOpen = zipCreate(MyArchive, sZipFileName)

IF NOT ResOpen THEN
   Error("Erro ao criar arquivo ZIP:", zipMsgError(MyArchive))
   RETURN
END

// Garante que o caminho termina com "\"
IF Right(sFolderPath, 1) <> "\" THEN
   sFolderPath += "\"
END

// Lista todos os arquivos na pasta (não inclui subpastas)
sFileList = fListFile(sFolderPath + ".", frFile)

// Loop para adicionar cada arquivo individualmente
FOR EACH sCurrentFile OF sFileList
   // Adiciona o arquivo no ZIP
   ResAddFile = zipAddFile(MyArchive, sFolderPath + sCurrentFile, zipDrive)
   
   IF NOT ResAddFile THEN
      Error("Erro ao adicionar arquivo: " + sCurrentFile + " - " + zipMsgError(MyArchive))
   END
END

// Fecha o arquivo ZIP
zipClose(MyArchive)

// Mensagem de sucesso
Info("Todos os arquivos foram adicionados ao ZIP com sucesso!")

Try catch end

 // -------------------------------------------------- // Procedure principal que executa uma query com tratamento de exceção // -----------...