Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

.: Vitrine

Carregando artigos...

Views

VBA Access - Usando o DML - Data Definition Language - Using DML (Data Definition Language) Effectively

VBA Access - Usando o DML - Data Definition Language - Using DML (Data Definition Language) Effectively


Exemplos de Código com o DDL

SQL padrão é uma sublinguagem utilizada no MS Access para lidar com os dados, tabelas, querys, etc...

ObjetoTipo
Tabela1
Query5
Tabela Conectada 4, 6, or 8
Formulário-32768
Relatório-32764
Módulo-32761

 

  • Data Manipulation Language (DML)O comando SELECT e queries de ação (DELETE, UPDATE, INSERT INTO, ...)

  • Data Definition Language (DDL)Comandos que alterem o "schema" (Mudando tabelas, campos, índices, relações, queries, etc.)

Usando o DML para queries, poderemos ler alguns aspectos do "schema" do banco de dados.

Poderá listar os objetos na base de dados Access como abaixo: 

SELECT MSysObjects.Type, MSysObjects.Name FROM MSysObjects WHERE MSysObjects.Name Not Like "~*" ORDER BY MSysObjects.Type, MSysObjects.Name;

Onde Type poderá colocar um dos valores da tabela acima. (Infelizmente, o modo provido pelo DML não é o caminho mais fácil para se ler os nomes dos campos nas tabelas.)

DDL provê outras características de intervenção como:

  • CREATE TABLE para gerar uma nova tabela, especificando os nomes dos campos, tipos, e constraints.

  • ALTER TABLE para adicionar uma coluna para a tabela, deletar uma coluna na tabela, ou mudar a tabela como tipo e tamanho da mesma.

  • DROP TABLE para deletar uma tabela.

Similarmente, você pode aplicar o comandos CREATE/ALTER/DROP em outras coisas tais como índicesconstraintsviews e procedures (queries), usuário e grupos (segurança.)

Enquanto o DDL é importante para algumas bases de dados enormes, ele é limitado no uso com o MS Access. Você pode criar um campo Texto, mas não pode configurá-lo com a propriedade Largura Diferente de Zero, ou características similares. Pode criar um campo Yes/No, mas não pode dizer que o dataentry ocorrerá por meio de um text box, ou um check box. Também poderá criar um campo Date/Time, mas não poderá configurar a sua propriedade Format. DDL não pode criar campos Hyperlink, ou campos Attachment.

Poderá executar uma query DDL sob o DAO ou ADO.

Parar DAO, use: dbEngine(0)(0).Execute strSql, dbFailOnError
Parar ADO, use: CurrentProject.Connection.Execute strSql

Algumas características do JET 4 (Access 2000 e superior) são suportados somente sob o ADO.

Uma situação na qual o DDL é realmente utilizável é quanto a mudança do Tipo ou Tamanho dos campos. Você não pode fazer isto com o DAO ou ADOX, utilizar o DDL é a técnica mais prática para estes fins. Obviamente existem outras saídas mais trabalhosas e incoerentes pelo simples fato de serem mais demoradas tanto na implementação quanto na execução.

Abaixo disponibilizo alguns exemplos para que você possa iniciar-se nas técnicas de utilização do DDL.
Índice das FunçõesDescrição
CreateTableDDL()Cria duas tabelas, seus índices e relacionamentos, ilustrando os diferentes tipos de campos suas propriedades configuradas.
CreateFieldDDL()Ilustra como adicionar um campo para uma tabela.
CreateFieldDDL2()Adiciona um campo a uma tabela em outra base de dados.
CreateViewDDL()Cria uma nova query.
DropFieldDDL()Deleta o campo de uma tabela.
ModifyFieldDDL()Muda o tipo ou tamanho de um campo. (Este é o mais comum uso do DDL.)
AdjustAutoNum()Configura o start da AutoNumeração.
DefaultZLS()Cria um campo que tem por default ser uma stringque não suporta ficar vazia.

   15.01.2025 

Option Compare Database

Option Explicit


' Função para criar a tabela tblDdlContractor

Sub CreateTableDDL()

    ' Declaração das variáveis necessárias

    Dim cmd As New ADODB.Command

    Dim strSql As String


    ' Define a conexão ativa para o comando

    Let cmd.ActiveConnection = CurrentProject.Connection


    ' Cria a tabela tblDdlContractor com seus campos e restrições

    strSql = "CREATE TABLE tblDdlContractor " & _

             "(ContractorID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _

             "Surname TEXT(30) WITH COMP NOT NULL, " & _

             "FirstName TEXT(20) WITH COMP, " & _

             "Inactive YESNO, " & _

             "HourlyFee CURRENCY DEFAULT 0, " & _

             "PenaltyRate DOUBLE, " & _

             "BirthDate DATE, " & _

             "EnteredOn DATE DEFAULT Now(), " & _

             "Notes MEMO, " & _

             "CONSTRAINT FullName UNIQUE (Surname, FirstName));"


    ' Executa o comando SQL para criar a tabela

    Let cmd.CommandText = strSql

    cmd.Execute


    ' Imprime mensagem de sucesso

    Debug.Print "tblDdlContractor criada."


    ' Cria a tabela tblDdlBooking

    strSql = "CREATE TABLE tblDdlBooking " & _

             "(BookingID COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " & _

             "BookingDate DATE CONSTRAINT BookingDate UNIQUE, " & _

             "ContractorID LONG REFERENCES tblDdlContractor (ContractorID) " & _

             "ON DELETE SET NULL, " & _

             "BookingFee CURRENCY, " & _

             "BookingNote TEXT(255) WITH COMP NOT NULL);"


    ' Executa o comando SQL para criar a tabela

    cmd.CommandText = strSql

    cmd.Execute


    ' Imprime mensagem de sucesso

    Debug.Print "tblDdlBooking criada."

End Sub


' Função para adicionar um novo campo à tabela MyTable

Sub CreateFieldDDL()

    ' Declaração das variáveis necessárias

    Dim strSql As String

    Dim db As DAO.Database


    ' Inicializa a conexão com o banco de dados

    Set db = CurrentDb()


    ' SQL para adicionar o novo campo à tabela

    strSql = "ALTER TABLE MyTable ADD COLUMN MyNewTextField TEXT(5);"


    ' Executa o comando SQL para adicionar o campo

    db.Execute strSql, dbFailOnError


    ' Libera recursos

    Set db = Nothing


    ' Imprime mensagem de sucesso

    Debug.Print "MyNewTextField adicionado para MyTable"

End Sub


' Função para adicionar um campo à tabela de um banco de dados externo

Function CreateFieldDDL2()

    ' Declaração das variáveis necessárias

    Dim strSql As String

    Dim db As DAO.Database


    ' Inicializa a conexão com o banco de dados

    Set db = CurrentDb()


    ' SQL para adicionar o novo campo à tabela no banco de dados externo

    strSql = "ALTER TABLE Table IN 'C:\A&A\Junkki.mdb' ADD COLUMN MyNewField TEXT(5);"


    ' Executa o comando SQL para adicionar o campo

    db.Execute strSql, dbFailOnError


    ' Libera recursos

    Set db = Nothing


    ' Imprime mensagem de sucesso

    Debug.Print "MyNewField Adicionado!"

End Function


' Função para criar uma visualização (VIEW)

Function CreateViewDDL()

    ' Declaração da variável para o comando SQL

    Dim strSql As String


    ' SQL para criar a visualização (VIEW)

    strSql = "CREATE VIEW qry1 AS SELECT tblInvoice.* FROM tblInvoice;"


    ' Executa o comando SQL para criar a visualização

    CurrentProject.Connection.Execute strSql


    ' Imprime mensagem de sucesso

    Debug.Print "Visualização qry1 criada."

End Function


' Função para excluir um campo de uma tabela

Sub DropFieldDDL()

    ' Declaração da variável para o comando SQL

    Dim strSql As String


    ' SQL para excluir o campo da tabela

    strSql = "ALTER TABLE [MyTable] DROP COLUMN [DeleteMe];"


    ' Executa o comando SQL para excluir o campo

    DBEngine(0)(0).Execute strSql, dbFailOnError


    ' Imprime mensagem de sucesso

    Debug.Print "Campo DeleteMe excluído da tabela MyTable."

End Sub


' Função para modificar um campo de uma tabela

Sub ModifyFieldDDL()

    ' Declaração da variável para o comando SQL

    Dim strSql As String


    ' SQL para alterar o tipo de um campo (alterando o tamanho do campo MyText2Change)

    strSql = "ALTER TABLE MyTable ALTER COLUMN MyText2Change TEXT(100);"


    ' Executa o comando SQL para modificar o campo

    DBEngine(0)(0).Execute strSql, dbFailOnError


    ' Imprime mensagem de sucesso

    Debug.Print "Campo MyText2Change alterado para TEXT(100)."

End Sub


' Função para ajustar a configuração do tipo de campo COUNTER

Function AdjustAutoNum()

    ' Declaração da variável para o comando SQL

    Dim strSql As String


    ' SQL para ajustar o valor inicial do campo COUNTER

    strSql = "ALTER TABLE MyTable ALTER COLUMN ID COUNTER(1000,1);"


    ' Executa o comando SQL para ajustar o campo COUNTER

    CurrentProject.Connection.Execute strSql


    ' Imprime mensagem de sucesso

    Debug.Print "Campo COUNTER ID ajustado para iniciar em 1000."

End Function


' Função para adicionar um campo com valor padrão (ZLS)

Function DefaultZLS()

    ' Declaração da variável para o comando SQL

    Dim strSql As String


    ' SQL para adicionar um campo com valor padrão vazio (ZLS)

    strSql = "ALTER TABLE MyTable ADD COLUMN MyZLSfield TEXT(100) DEFAULT ' ';"


    ' Executa o comando SQL para adicionar o campo

    CurrentProject.Connection.Execute strSql


    ' Imprime mensagem de sucesso

    Debug.Print "Campo MyZLSfield adicionado com valor padrão."

End Function

 Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes


 PUDIM PROJECT 

eBook - PT - PUDIM PROJECT 2024 - Python Volume 01 - Funções Essenciais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 02 - Funções Essenciais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 03 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 04 - Funções para Automatização - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 05 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 06 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 07 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 08 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 09 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 10 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 11 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes

VBA Access - Registrando o nome das máquinas (Workstation) - VBA Access: How to Record Workstation Names (Machine Names)

VBA Access - Registrando o nome das máquinas (Workstation) - VBA Access: How to Record Workstation Names (Machine Names)

Muitas vezes queremos deixar registrados os nomes do computadores qeu acessaram a nossa aplicação. Isso é possível através do uso de uma fnução como a demonstrada abaixo: Com poucas alterações esse código poderá ser utilizado também no Word, Excel, Powerpoint e quaisquer aplicações que utilizem o VBA. 




 15.01.2025 
' Função que obtém o nome do computador (nome da máquina)
Function ComputerN() As String
    ' Tratamento de erros
    On Error GoTo Err_Handler

    ' Declaração das variáveis
    Dim strName As String ' Variável para armazenar o nome do computador
    Dim lngLen As Long ' Variável para armazenar o comprimento da string do nome do computador

    ' Definindo o comprimento do nome do computador
    lngLen = 16&

    ' Inicializando a string strName com caracteres nulos (vbNullChar)
    strName = String$(lngLen, vbNullChar)

    ' Chamando a API para obter o nome do computador
    If apiGetComputerName(strName, lngLen) = 0& Then
        ' Se a função apiGetComputerName falhar, atribui "Desconhecido"
        ComputerN = "Desconhecido"
    Else
        ' Caso contrário, retorna o nome do computador (removendo caracteres nulos adicionais)
        ComputerN = Left$(strName, lngLen)
    End If

    ' Saída sem erros
    Exit_Handler:
        Exit Function

    ' Tratamento de erros
    Err_Handler:
        ' Em caso de erro, loga o erro com número e descrição
        Call LogError(Err.Number, Err.Description, "ComputerN")
        Resume Exit_Handler
End Function


 Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes


 PUDIM PROJECT 

eBook - PT - PUDIM PROJECT 2024 - Python Volume 01 - Funções Essenciais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 02 - Funções Essenciais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 03 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 04 - Funções para Automatização - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 05 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 06 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 07 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 08 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 09 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes


eBook - PT - PUDIM PROJECT 2024 - Python Volume 10 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes eBook - PT - PUDIM PROJECT 2024 - Python Volume 11 - Automatizando Postagens em Redes e Plataformas Sociais - Série PUDIM PROJECT — André Luiz Bernardes

VBA Excel - Ordenando e-mails pelo Domínio (Sort on Domain Name)

Não será rara a ocasião onde desejará observar um lista de pessoas pelo domínio do e-mail no qual está cadastrada.

Isso pode ser facilmente resolvido pela código abaixo: =IF(ISERR(FIND("@",A1)),"",RIGHT(A1,LEN(A1)-FIND("@",A1,1)))


Tags: VBA, Excel, email, e-mail, ordenar, sort, domain, domínio,

VBA - Exibindo a Lista de Processos ativos na sua máquina usando (WMI)

Vez ou outra listamos todos os programas que estão sendo executados em nossa máquina. Podemos disponibilizar tais informações aos usuários da nossa aplicação através da funcionalidade abaixo, podemos saber todos os processo que estão rodando na máquina. Function LoadInProcess() Dim colProcessList Dim objProcess Set colProcessList = GetObject("Winmgmts:").ExecQuery("Select * from Win32_Process") ListProcessNow.clear For Each objProcess In colProcessList ListProcessNow.additem objProcess.Name Next Set colProcessList = Nothing Se você quiser detalhes sobre um proceso específico, poderá filtrá-los por processo. Por exemplo, se desejar analisar ou finalisar o Iexplore.exe rodando na sua máquina, poderá tentar o código abaixo: Let strProcess = "Iexplore.exe" Dim colProcessList Dim objProcess Set colProcessList = GetObject("Winmgmts:").ExecQuery("Select * from Win32_Process where name = '" & strProcess & "'") For Each objProcess In colProcessList objProcess.Terminate Next Set colProcessList = Nothing Queira aprofundar o seu conhecimento no link abaixo, afinal, foram eles que criaram o que podemos explorar hoje... http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_reference.asp
André Luiz Bernardes A&A - WORK, DON´T PLAY! http://al-bernardes.sites.uol.com.br/ bernardess@gmail.com

VBA Excel - Desbloqueando as worksheets com VBA (How to hack a lost worksheet password with VBA to unprotect the worksheet)




Por estarmos envolvidos em tantos projetos simultaneamente, não raro acontece de esquecermos as senhas de proteção das worksheets. Neste momento saimos correndo atrás de programas que possam desbloquear nossas planilhas. Abaixo está um bem estruturado código capaz de retirar a proteção das nossas woksheets. É uma implementação válida e digna de ficar sempre à mão. Agora poderá a qualquer momento copiá-la daqui e implementá-la em sua planilha para o pronto desbloqueio. Use a chamada para evocar a solução:

Call AllPasswordsRemover(ActiveWorkbook)

Public Sub AllPasswordsRemover(wb As Workbook)
 Dim w1 As Worksheet Dim w2 As Worksheet
 Dim i As Integer Dim j As Integer Dim k As Integer
 Dim l As Integer Dim m As Integer Dim n As Integer
 Dim i1 As Integer Dim i2 As Integer Dim i3 As Integer
 Dim i4 As Integer Dim i5 As Integer Dim i6 As Integer
 Dim PWord1 As String Dim ShTag As Boolean
 Dim WinTag As Boolean ' Início da tentativa de desproteger o wb (workBook), Application.ScreenUpdating = False ' Verifica se está protegido With wb Let WinTag = .ProtectStructure Or .ProtectWindows End With Let ShTag = False ' Estão realmente protegidos? For Each w1 In Worksheets Let ShTag = ShTag Or w1.ProtectContents Next w1 ' Caso não haja proteção, o processo é encerrado! If Not ShTag And Not WinTag Then GoTo exx End If ' Dependendo da senha e de quantas planilhas estiverem protegidas com diferentes senhas, ' o processo talvez leve um tempo considerável. Estimo entre 3-6 minutos por senha. If Not WinTag Then ' Workbook não está protegido... vai checar as planilhas... Else ' Workbook está protegido, desprontegendo-o On Error Resume Next Do For i = 65 To 66: For j = 65 To 66: For k = 65 To 66 For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66 For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66 For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126 With wb .Unprotect Chr(i) & Chr(j) & Chr(k) & _ Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _ Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) If .ProtectStructure = False And _ .ProtectWindows = False Then Let PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _ Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _ Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) ' Achamos o password para este workbook. MsgBox "A Worksheet '" & w1.Name & "' foi desprotegida usando o seguinte hash " & _ "Hashed Password:" & Chr(13) & PWord1 & Chr(13) & "Tente desproteger outras " & _ "planilhas com este mesmo password..." Exit Do End If End With Next: Next: Next: Next: Next: Next Next: Next: Next: Next: Next: Next Loop Until True On Error GoTo 0 End If If WinTag And Not ShTag Then ' Worksheets Não estão protegidas. GoTo exx End If ' Caso as worksheets estiverem protegidas... On Error Resume Next For Each w1 In Worksheets w1.Unprotect PWord1 Next w1 On Error GoTo 0 ShTag = False ' Checa se a tentativa foi bem sucedida. For Each w1 In Worksheets ' Checa para todas as ShTag engatilhadas para 1, se não. Let ShTag = ShTag Or w1.ProtectContents Next w1 ' Caso haja worksheet protegida, desprotege-a. If ShTag Then For Each w1 In Worksheets With w1 If .ProtectContents Then On Error Resume Next Do For i = 65 To 66: For j = 65 To 66: For k = 65 To 66 For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66 For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66 For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126 .Unprotect Chr(i) & Chr(j) & Chr(k) & _ Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _ Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) If Not .ProtectContents Then PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _ Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _ Chr(i4) & Chr(i5) & Chr(i6) & Chr(n) ' Achamos 1! MsgBox "A Worksheet '" & w1.Name & "' foi desprotegida usando o seguinte hash " & _ "Hashed Password:" & Chr(13) & PWord1 & Chr(13) & "Tente desproteger outras " & _ "planilhas com este mesmo password..." For Each w2 In Worksheets w2.Unprotect PWord1 Next w2 Exit Do End If Next: Next: Next: Next: Next: Next Next: Next: Next: Next: Next: Next Loop Until True On Error GoTo 0 Else Debug.Print ("Estas worksheets '" & w1.Name & "' não estavam protegidas.") End If End With Next w1 End If GoTo exx exx: Application.ScreenUpdating = True
End Sub

 Para os que desejarem aprofundar-se na lógica do como foi possível chegar a este resultado poderão fazê-lo Aqui.
diHITT - Notícias