Você está na página 1de 10

Aqui veremos detalhado as rotinas para conexo, criao de base de dados e criao de tabelas e seus campos, alm de Dicas

de quando usar uma Sub, uma Function, uma chamada Call, etc. Conectar-se ao banco de Dados Option Explicit obriga a que todas as variveis utilizadas sejam declaradas. Declarar uma varivel colocar o DIM, ex.: Dim MeuAluno as string. Estou declarando que a varivel MeuAluno do tipo texto. Option Base 1 informa ao vb que num procedimento onde haja arrays, para assumir que os valores do array devem comear do 1. Se isto no estiver explicito para o vb, ele vai assumir que o array comecar do 0. Vou colocar um exemplo: Dim MinhaArray as variant MinhaArray = Array("Aula1", "Aula2", "Aula3") Se o Option Base estiver declarado como 0, a MinhaArray(1) ser "Aula2", se o Option Base estiver declarado como 1, a MinhaArray(1) ser "Aula1". Em resumo, cada item da MinhaArray vair estar sempre associado a uma sequncia numrica, que poder comear a partir do 0 ou a partir do 1, dependendo de como seja declarado o Option Base. Public rs As ADODB.Recordset, rsAux As ADODB.Recordset, db As ADODB.Connection, SQLString As String Public ct As ADOX.Catalog Public sRelatorio As Worksheet Aqui apenas a declarao de variveis pblicas (pblicas so variveis que podero ser utilizadas em qualquer lugar do aplicativo) Public Const Banco = "Caixa.mdb" Public Const Desenv = "Felipe Dasi" Public Const Provedor = "Microsoft.Jet.OLEDB.4.0" Variveis Pblicas e Constantes (Public Const) so variveis que j levam o valor, ex. o Valor da varivel publica Desenv = "Felipe Dasi". Isto significa que sempre que eu quiser que eu quiser mostrar o nome Felipe Dasi por meio de uma mensagem, por exemplo, ao invs de escrever "Felipe Dasi", bastar escrever "Desenv". Bom, vamos ao cdigo. Temos que comear por ele, pois para o sistema comear a funcionar ele precisar se conectar a uma base de dados. Sub ConectarBanco() Dim Achou As String, MsgErr As String Achou = Dir(ThisWorkbook.Path & "\" & Banco, vbArchive) A varivel "Achou", atravs da funo "Dir(ThisWorkbook.Path & "\" & Banco, vbArchive)", procurar no folder onde est o arquivo que estamos trabalhando, um arquivo chamado "Caixa.mdb". que o valor da varivel Banco. Se o arquivo "Caixa.mdb" no existir, Achou estar valendo 0. Desta forma, se o Len (tamanho) da varivel Achou for = a 0 (ou seja, o arquivo "Caixa.mdb", que a nossa base de dados, no existe e desta maneira necessrio cri-la. O Else, neste procedimento, signfica que, caso a base de dados (Caixa.mdb) j exista, ento abra-a. If Len(Achou) = 0 Then

CriarBase Else Set db = New ADODB.Connection (est estabelecendo que a varivel db ser uma varivel para acesso a base de dados) On Error Resume Next (se houver algum erro, saia do aplicativo) db.Provider = Provedor (estabelece o nome do provedor, ou mecanismo de acesso a base de dados) db.Open ThisWorkbook.Path & "\" & Banco (e finalmente abre a base de dados, que est no diretorio do aplicativo (ThisWorkbook) If Err.Number <> 0 Then (se houver algum erro, e trabalhando com base de dados h uma infinidade de erros possveis, o Err.Number mostrar o cdigo do erro, e colocar na varavel MsgErr um texto que ser uma mensagem para o usurio saber qual foi o erro.) MsgErr = "Descrio do erro:" & Chr(13) & Chr(13) & "Error # " & Str(Err.Number) & Chr(13) & Err.Source & Chr(13) & Err.Description MsgBox MsgErr, , Desenv, Err.HelpFile, Err.HelpContext (mostra a mensagem de erro) End (sai do aplicativo) End If End If End Sub

Criar Base Aps estabelecida Conexo com a Base de Dados (tpico "Conectar-se ao banco de dados), verificamos que a base de dados no existia. Explicao do procedimento "Criar Base", abaixo: Sub CriarBase() Set ct = New ADOX.Catalog (est estabelecendo que a varivel ct ser uma varivel para gerao de base de dados, usando a biblioteca ADOX) ct.Create "Provider=" & Provedor & "; Data Source=" & ThisWorkbook.Path & "\" & Banco a varivel ct vai receber a varivel Provedor, que uma varivel constante e pblica ("Microsoft.Jet.OLEDB.4.0") Set db = New ADODB.Connection db a varivel de conexo com a base de dados db.Provider = Provedor Aqui a linha de instruo est dizendo que o provedor de acesso da varivel db = "Microsoft.Jet.OLEDB.4.0", que o nome do provedor. db.Open ThisWorkbook.Path & "\" & Banco VerificarBase (aqui vamos chamar a Sub "Verificar Base" End Sub Resumo: No procedimento ConectarBanco verificamos se no diretrio do aplicativo havia uma base de dados chamada Caixa.mdb Esta base no foi encontrada. O procedimento ConectarBanco, no encontrando a base Caixa.mdb, chamou a sub CriarBase A sub CriarBase, criou e abriu a base de dados, mas a base est vazia, ou seja no possui ainda nenhuma tabela. A sub CriarBase chamou a sub VerificarBase, que o procedimento que ir gerar todas as tabelas.

Verificar Base Sub VerificarBase() Dim rstSchemaT As ADODB.Recordset, Tabela_rst As String, Achei As Integer, i As Integer, ArrayCampos As Variant Dim rstSchemaC As ADODB.Recordset, AcheiCampo As Boolean, ArrayCamposTip As Variant, z As Integer, Cod As Long Dim ArrayTabelas As Variant, x As Integer, c As Integer, n As Integer, AcheiTabela As Boolean ArrayTabelas = Array("Contas", "Rubricas", "Movimento")

For i = 1 To 3 Neste For vamos correr de 1 a 3, porque iremos verificar/gerar 3 tabelas Importante: Na primeira passagem desse For, o i estar valendo 1 AcheiTabela = False Comeo estabelecendo que ainda no achei nenhuma tabela. A varivel AcheiTabela vai ser igual a false. Set rstSchemaT = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE")) rstSchemaT uma varivel que utilizaremos com a biblioteca ADOX Do Until rstSchemaT.EOF Faa algo at o final do arquivo Tabela_rst = rstSchemaT!TABLE_NAME A varivel Tabela_rst receber o nome da tabela que o rstSchema encontrar na base de dados anteriormente criada. If UCase(Tabela_rst) = UCase(ArrayTabelas(i)) Then Se o nome da tabela (em maisculas) for igual ao nome da tabela em ArrayTabelas (tambm em maisculas), a varivel AcheiTabela ser igual a true. AcheiTabela = True Se a varivel AcheiTabela for = true, ns teremos encontrada a tabela e iremos ento verificar como esto os campos dessa tabela Call BuscarCamposTabela(Tabela_rst, ArrayCampos, ArrayCamposTip, n) Aqui uma explicao de quando usar Call: Usaremos Call sempre que quisermos chamar um procedimento, que depois de rodar, nos devolva uma informao. No caso do nosso aplicativo, a varivel Tabela_rst levar para a sub BuscarCampoTabela, o nome da tabela, e retornar o ArrayCampos, o ArrayCamposTip e o valor de n Bom, agora temos o ArrayCampos, o ArraCampoTip e o n, onde: ArrayCampos o nome de cada um dos campos da tabela

ArrayCamposTip o tipo de cada um dos campos, ex: tipo INTEGER, tipo TEXT, tipo CURRENCY Comeamos um novo For que vai correr de 1 at n (n a varivel que traz a quantidade de campos da tabela) For c = 1 To n Na primeira passagem, o c vale 1 AcheiCampo = False Set rstSchemaC = db.OpenSchema(adSchemaColumns, Array(Empty, Empty, ArrayTabelas(i))) Faa algo at o final do arquivo Do Until rstSchemaC.EOF Se o nome do primeiro campo for = ao nome do campo encontrado pelo rstSchema, ento a varivel AcheiCampo ser true If UCase(ArrayCampos(c)) = UCase(rstSchemaC!COLUMN_NAME) Then AcheiCampo = True O Exit Do fora a sada do loop Exit Do End If rstSchemaC.MoveNext Loop If AcheiCampo = False Then Se o campo no for encontrato ento o db.Execute alterar a tabela adicionando o campo que no foi encontrato. O db.Execute estar assim: "ALTER TABLE Contas ADD COLUMN CtaCod INTEGER db.Execute "ALTER TABLE " & ArrayTabelas(i) & " ADD COLUMN " & ArrayCampos(c) & " " & ArrayCamposTip(c) End If Next c O Exit Do fora a sado do Loop, pois j foi encontrado o que se estava buscando. Exit Do End If rstSchemaT.MoveNext Loop Se a varivel AcheiTabela for = false, ns no teremos encontrado a tabela e iremos cri-la. E criaremos os campos da tabela. If AcheiTabela = False Then O db.execute vai criar a primera tabela. Lembremos que o For, na sua primeira passagem est valendo 1, logo, a tabela que vamos criar agora a tabela "Contas", que no ArrayTabelas st na posio 1 db.Execute "CREATE TABLE " & ArrayTabelas(i) Depois de criar a tabela, chamada a sub BuscarCamposTabela, que trar informaes como nome e tipo de campo.

Call BuscarCamposTabela(ArrayTabelas(i), ArrayCampos, ArrayCamposTip, n) For c = 1 To n O For vai correr de 1 at n, e em cada passagem adicionar uma coluna (campo) na tabela. db.Execute "ALTER TABLE " & ArrayTabelas(i) & " ADD COLUMN " & ArrayCampos(c) & " " & ArrayCamposTip(c) Next c End If Next i End Sub

Buscar Campos da Tabela No Select Case, cada uma das opes estabelece informaes sobre o campo, tais como: O nome do campo, e o tipo de campo (se TEXT, INTEGER, etc) A sub BuscarCamposTabela recebeu o parmetro Tabela_rst, que na primeira chamada valia 1, e portanto tinha como valor o nome "Contas", e devolveu o valor para as variveis ArrayCampos, ArrayCamposTip e n Se na primeira chamada da sub BuscarCamposTabela, a varivel Tabela_rst era = a "Contas", os valores das variveis foram: ArrayCampos = Array("CtaCod", "CtaDsc", "LctVal") ArrayCamposTip = Array("INTEGER", "TEXT(30)", "CURRENCY") n = 3 (que a quantidade de campos da tabela) Na segunda chamada da sub BuscarCamposTabela, a varivel Tabela_rst ser = a "Rubricas", os valores das variveis sero: ArrayCampos = Array("RubCod", "RubDsN", "RubDsT") ArrayCamposTip = Array("INTEGER", "TEXT(15)", "TEXT(30)") n = 3 (que a quantidade de campos da tabela) Note a relao: RubCob ser um campo do tipo INTEGER, RubDsN ser do tipo TEXT com tamanho 15, e RubDsT to tipo TEXT com tamnho 30. Sub BuscarCamposTabela(Tabela_rst, ArrayCampos, ArrayCamposTip, n) Select Case Tabela_rst Case "Contas" ArrayCampos = Array("CtaCod", "CtaDsc", "LctVal") ArrayCamposTip = Array("INTEGER", "TEXT(30)", "CURRENCY") n=3 Case "Rubricas" ArrayCampos = Array("RubCod", "RubDsN", "RubDsT") ArrayCamposTip = Array("INTEGER", "TEXT(15)", "TEXT(30)") n=3

Case "Movimento" ArrayCampos = Array("LctNum", "CtaCod", "RubCod", "LctDat", "DscDat", "DocNum", "DocDsc", "LctVal", "LctTip") ArrayCamposTip = Array("INTEGER", "INTEGER", "INTEGER", "DATE", "INTEGER", "TEXT(30)", "TEXT(30)", "CURRENCY", "TEXT(1)") n=9 End Select End Sub

A funo Nreg ser exaustivamente utilizada em todo o aplicativo. Sua funo ser a de abrir um ou vrios record (registros) numa tabela e retornar sua quantidade e valores. Function Nreg(SQLString) As Long Set rs = New ADODB.Recordset With rs .CursorType = adOpenStatic .CursorLocation = adUseClient .LockType = adLockOptimistic .Open SQLString, db End With Nreg = rs.RecordCount End Function

INFORMAES TEIS (Dicas) Aqui vale a pena ressaltar a diferena entre uma Sub e uma Function, quando chamar uma Sub por Call Quando usar uma Sub e quando usar uma Function? Por qu a necessidade de uma Sub chamar outra?

Dica 1. Fazendo vrias pequenas Subs que chamam outras Sempre que possvel faa pequenas Sub. sempre mais prtico ter vrias pequenas Sub do que uma nica muito grande. Por qu: Vamos imaginar que eu tenha feito uma Sub que, aps o usurio clicar num boto, ela, alm de uma poro de outras coisas, tambm preencha um combo com dados. Vamos imaginar que quando o usurio clicar um outro boto, novamente seja necessrio preencher um outro combo com os mesmos dados. Se eu tiver colocado a rotina de preenchimento de dados num combo dentro da primeira Sub, eu terei que repetir todo o mesmo cdigo para preencher o combo quando o usurio tiver clicado no segundo boto. Ento melhor que a Sub de preenchimento de combo esteja isolada (seja uma pequena Sub), pois assim, eu sempre poderei cham-la a partir de qualquer Sub que necessite dessa mesma rotina. Ex.

Sub UsuarioClicandoNoBotao1() Faa isso Faa aquilo etc. PreencherCombo End Sub Sub UsuarioClicandoNoBotao2() Faa isso Faa aquilo etc. PreencherCombo End Sub Sub PreencherCombo() Rotina de preenchimento de Combo ............ ............ ............ ............ ............ End Sub Note que se a rotina de preenchimento de combo no estivesse isolada em uma Sub especfica, a Sub do Boto 1 e a Sub do Boto 2 deveriam repetir a mesma rotina de preenchimento de combo, o que em termos informticos pssimo, pois se houver a necessidade de se fazer alguma alterao, ser necessrio sair mexendo em vrios lugares, alm de o aplicativo ficar com repetio de cdigos. Dica2. Quando chamar uma Sub usando Call Vamos imaginar que tenho uma Sub que preencha um TextBox com o resultado lquido de uma operao Esta Sub vai fazer uma srie de coisas e precisar que, dada a UF do cliente, seja calculado o IPI. Sub MostrarValorLiquido() (A Sub UsuarioClicandoNoBotao2 est chamando a Sub PreencherCombo) (A Sub UsuarioClicandoNoBotao1 est chamando a Sub PreencherCombo)

Dim UF as String, ValorAliq as Currency, ValorNF as Currency Faa isso Faa aquido ...... ValorNF = 10.000 UF = "SP" Call BuscarAliquota(UF, ValorAliq) TextBox1.Text = ValorNF * ValorAliq End Sub Neste exemplo foi usada a chamada "Call" porque eu quero chamar a Sub BuscarAliquota e passar como parmetro a UF, e quero que a Sub me devolva o valor da alquota. Sub BuscarAliquota(UF, ValorAliq) If UF = "SP" then ValoAliq = 10 If UF = "RJ" then ValorAliq = 15 If UF = "BH" then ValoAliq = 18 etc ........... Ed Sub Em resumo, numa chamada Call, eu envio parmetros para uma Sub e ela me "devolve" informaes, atravs de variveis. Como o parmetro enviado foi "SP", a Sub BuscarAliquota devolver o valor 10 para a varivel ValorAliq (10.000 * 10)

Dica 3. Quando usar uma chamada Call e quando usar uma Function? Numa chamada Call eu posso enviar para uma Sub vrios parmetros e receber vrias informaes. Chamando uma Function, eu apenas poderei enviar parmetros, mas a Function apenas retornar UMA informao. Ex. Sub MostrarQuantidadeDeClientes UF = "SP" SQLString = "SELECT * FROM Clientes WHERE UF='SP' (traduzindo: Selecione os clientes na tabela Clientes cuja UF seja igual a SP)

TextBox2.text = Nreg(SQLString) End Sub Chamei a Function Nreg e passei como parmetro a sentena SELECT ....... E ele me devolveu o Nreg que a qtde. de clientes. Em resumo, o nome da Funo j a varivel que retornar a informao solicitada. Function Nreg(SQLString) As Long Set rs = New ADODB.Recordset With rs .CursorType = adOpenStatic .CursorLocation = adUseClient .LockType = adLockOptimistic .Open SQLString, db End With Nreg = rs.RecordCount End Function

RELATRIO DE MOVIMENTAO DE CAIXA


Conta: Rubrica: Perodo: Data Saldo Inicial 0001 - 20796-9 Todas Geral Dcto Descrio Entrada 100.00 Sada Saldo Plan Cta 100.00 Rubrica

08/14/2011 - 18:53:52 - 10/10

Você também pode gostar