locked
Relatorio(layout) RRS feed

  • Pergunta

  • Na empresa onde trabalho havia um sistema feito em php que recebia dados (em formato txt)de um cartão de ponto e gerava relatorios com o seuinte layout:

     

    http://cid-620870c8a097e457.skydrive.live.com/self.aspx/P%c3%bablico/exemploPonto.jpg

     

    Agora tenho o trabalho de construir um sistema que gere um relatório identico, só que em Access!

     

    O grande problema é que o arquivo do cartão de ponto não lista os dias em que os funcionarios faltaram.

    por exemplo: ele pula de 20071011 para 20071015 na 3º coluna 

    http://cid-620870c8a097e457.skydrive.live.com/self.aspx/SharedAll/ponto2.txt

     

    Como o arquivo não lista os dias faltosos e por isso meu relatorio  Access está listando apenas os dias em que os funcionarios bateram o cartão.

     

     

    Em outras comunidades me disseram para para fazer uma tabela calendario(contendo datas 01/01/2000 a 01/01/2030) e relacionar com a tabela ponto em uma consulta:

    "Incluir TODOS os registros de 'Calendar' e somente os registros de 'Ponto' qundo os campos associados forem iguais"

     

    Só que não estou sabendo organizar essa consulta em um relatório no mesmo layout do 1º arquivo

    http://cid-620870c8a097e457.skydrive.live.com/self.aspx/SharedAll/exemplo%7C_ponto.mdb

     

     

    Qualquer dik ou ajuda....

    Muito obrigado pela atenção

     

     

     

    quinta-feira, 4 de dezembro de 2008 21:39

Respostas

  • 1) DAO e ADO são muito parecidos para fazer o que precisa. Para bases de dados Access, eu prefiro DAO, pois o código fica mais enxuto.

    2)
    [code]
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String

    strSQL="SELECT * FROM TabelaX"
    Set db=CurrentDB()
    Set rst=db.OpenRecordset(strSQL)
    'Teste
    Do Until rst.EOF
         Debug.Print "CampoX: " & rst!CampoX
         .MoveNext
    Loop

    Set rst=Nothing
    Set db=Nothing
    [/code]


    3) A resposta acima serve.
    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    • Marcado como Resposta Abraão Alves quinta-feira, 5 de fevereiro de 2009 20:15
    domingo, 1 de fevereiro de 2009 15:41
    Moderador

Todas as Respostas

  • Os links não estão funcionando.

     

    Como é o layout que você precisa?

     

     

    sábado, 13 de dezembro de 2008 02:28
    Moderador
  •  Luiz Cláudio - MVP wrote:

    Os links não estão funcionando.

     

    Como é o layout que você precisa?

     

     

     

     

    Aqui os linhks:
    ModeloLayoutJPG:
    http://www.4shared.com/file/72520348/8e5cabf9/Relatrio_de_Ponto.html

     

    ArquivoTXT:
    http://www.4shared.com/file/72520501/9761aaeb/ponto2.html

     

    MeuRelatorioMDB:
    http://www.4shared.com/file/76086403/b3f4532d/_2__exemplo_ponto.html

     

     

     

    Oi Luiz Cláudio!

    Desculpa se me expressei mal, talvez você pense que eu quero o trabalho todo pronto!

    Andei pesquisando e descobri que StoredProcedures podem resolver o meu problema:

     

    Fazendo uma ProcedimentoArmazenado que gere linha a linha as datas do mês requerido e se a data gerada for igual a data da tabela onde contem os dados do Ponto ele armazena o horário, se não ele deixa o campo com algum caractere predefinido, deixando deste modo de omitir as datas como Domingo, Sábado e dias Faltosos que não existem na tabela Ponto!

     

    Gostaria de saber se o Access 2007 tem suporte para está StoredProcedure e se possível alguma dika.

    Muito obrigado pela atenção.

    segunda-feira, 15 de dezembro de 2008 16:58
  • Falando em Stored Procedure propriamente dita, no Access não há como criá-la, você precisaria criar no SQL Server e consumi-la no Access por meio de uma consulta de passagem.

    O que você pode fazer no Access é usar uma tabela prenchida na hora (como se fosse temporária) com as datas que precisa. Usando código VBA, você consegue preencher a tabela com as datas que precisa. 
    sexta-feira, 9 de janeiro de 2009 01:14
    Moderador
  • Oi Cludio!

    Passei um bom tempo penssado como resolver este problema e tive uma ideia um pouco maluca, mas que com certeza há de dar certo!

    A ideia foi a seguinte:

     

    1.Criar uma tabela para cada funcionario a partir da tabele de principal com os dados do mes atual

    1.2.Analizar cada tabela criada e verificar quais dias do mes atual não consta nela.

    1.2.3.Digitar os dias que estão faltando e colocando  um caractere qualquer no campo hora [:#]####

    E finalmente jogar todos os dados de todas as tabelas criadas para uma tabela final e ai com certeza não terei mais problemas com dados inexistentes!

     

    Comecei a estudar linguagem de programação e fiz um algoritmo para executar a tarefa acima.

     

    FOR EACH ID in TabFuncio ' Essa é a tab dos funcionarios
     str1= "SELECT * FROM iPonto WHERE iPonto.ID = " & ID & ";"
     str2 = "CREATE TABLE " & ID &  "(campos as tipos, ....);"
     str3= "INSERT INTO " & ID & " " & str1

     ExecutaSQL(str2) 'Não sei se existe função parecida
     ExecutaSQL(str3) 'Gostaria de saber a sintaxe correta

     

     for each VarData in ConsultaMes(VarMes)
      str4 = "SELECT * FROM " & ID & " WHERE " & ID & ".dtData = " & VarData
      set ConsutaVar = CriarConsultaSQL (str4)

      

       IF  CountRegistros(ConsultaVar) = 0 THEN ' Tambem inventei esse
          FOR x = 1 to 6
             str5 = "INSERT INTO " & ID & "VALUE (" & ID & ", " & VarData & ", -----, x)
              set consultaVar2 = CriarConsultaSQL(str5)                                                                          

           next x

        EndIF

     next

    next

     

    FOR EACH ID in TabFuncio

     str6 = "INSERT INTO fPonto SELECT * FROM " & ID & ";"
     ExecutaSQL (str6)

    NEXT

     

     

    Agora minha duvida é como transformar isso em codigo VBA no Access?

    Ajudaria muito se as proximas perguntas perguntas fossem respondidas, para que eu possa direcionar melhor os meus estudos:

     

    1.Por onde começar? ADO ou DAO, qual é o melhor para o algoritmo acima?

    2.Como instanciar uma variavel para retornar uma coluna de uma tabela ou consulta?

    3.Existe algum objeto do tipo registro para que eu possa efetuar o comando:

    for each Registro IN Tabela.Campo

    ''Comandos

    next

     

     

    Muito Obrigado pela atenção

    terça-feira, 20 de janeiro de 2009 21:05
  • 1) DAO e ADO são muito parecidos para fazer o que precisa. Para bases de dados Access, eu prefiro DAO, pois o código fica mais enxuto.

    2)
    [code]
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String

    strSQL="SELECT * FROM TabelaX"
    Set db=CurrentDB()
    Set rst=db.OpenRecordset(strSQL)
    'Teste
    Do Until rst.EOF
         Debug.Print "CampoX: " & rst!CampoX
         .MoveNext
    Loop

    Set rst=Nothing
    Set db=Nothing
    [/code]


    3) A resposta acima serve.
    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    • Marcado como Resposta Abraão Alves quinta-feira, 5 de fevereiro de 2009 20:15
    domingo, 1 de fevereiro de 2009 15:41
    Moderador
  • Muito obrigado Luiz!!!
    O loop 'do until'  é perfeito !!!
    Finalmente consegui finalizar o codigo!!

    Agora com relação as duas ultimas instruções que você utilizou: porque usa-las? e pra que?

    Essas instruções tem o mesmo valor da instrução "  rs.Close " ?! Qual a diferença?!

    Desculpa perguntar d+!!!
    Obrigado pela atenção Luiz.
    quinta-feira, 5 de fevereiro de 2009 20:29
  • Costumo colocar o Nothing para explicitamente destruir a variável. A rigor não é necessário, pois ao sair de escopo (quando a Sub acaba) as variáveis são automaticamente destruídas.

    Já o rs.Close é diferente. Ele apenas fecha o recordset, mas a variável permanece na memória. Você pode fazer outro Open em cima dela.
    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    sexta-feira, 6 de fevereiro de 2009 02:35
    Moderador