Usuário com melhor resposta
Relatorio(layout)

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:41Moderador
Todas as Respostas
-
Os links não estão funcionando.
Como é o layout que você precisa?
sábado, 13 de dezembro de 2008 02:28Moderador -
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.htmlArquivoTXT:
http://www.4shared.com/file/72520501/9761aaeb/ponto2.htmlMeuRelatorioMDB:
http://www.4shared.com/file/76086403/b3f4532d/_2__exemplo_ponto.htmlOi 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:14Moderador
-
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 & " " & str1ExecutaSQL(str2) 'Não sei se existe função parecida
ExecutaSQL(str3) 'Gostaria de saber a sintaxe corretafor 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:41Moderador -
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.brsexta-feira, 6 de fevereiro de 2009 02:35Moderador