<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

Nada se pode esculpir sobre a madeira podre
corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Verificar registos agendados ⁄ >




clicks: 13157 13157 2006-10-11 2006-10-11 goto mySnippets mySnippets vba  Download  Bookmark This Bookmark This



Suponhamos que estamos a construir um formulário em ADP (access data project, a ideia base poderá servir para outras plataformas) para ser trabalhado por uma ou mais pessoas, basicamente é um script em que as pessoas vão fazendo umas perguntas por telefone (mas não necessáriamente) a um cliente e a certa altura (ou logo no inicio do contacto) deparam-se com a situação de que o cliente não pode continuar a responder ao questionário e pede para entrarem em contacto mais tarde, digamos por exemplo, amanhã de manhã.
- "Ok, então amanhã de manhã voltaremos a falar consigo", dirá a pessoa que está a efectuar o questionário. Mas e depois? Terá essa pessoa de apontar num papel e amanha efectuar o contacto? Ou colocar um reminder no telemóvel? Ou pôr o despertador a tocar para aquela hora? Bem se fosse só um cliente até que nem era muito dificil gerir, facilmente (digo eu) iriamos nos lembrar quando chegasse a hora, mas e com 2? Os problemas não iriam necessariamente duplicar! Mas ... e com 100, repartidos por varios dias e várias horas? Pois ...
Bem então embora lá chatear o gajo dos bits e dos bytes ...

Suponhamos que a nossa BD é composta por várias tabelas, mas daremos especial atenção a 3. Vamos chamar a uma tabela "dadosClientes", outra "dadosCampanha" e a outra "dadosOperadores".
Será fácil perceber que a "dadosClientes" é a que contém os dados principais do cliente, o seu ID (chave primária da tabela), Nome, Telefone, Telemovel, BI, etc, etc; ao passo que a "dadosQuestionarios" irá conter a informação em relação ao questionario, tais como as respostas às perguntas, quem fez o questionário, etc, etc; por fim a "dadosOperadores" irá conter algumas informações tais como o ID (chave primária), Nome, password, etc. das pessoas que fazem os questionários (operadores).

A estrutura destas 3 tabelas poderá ser +/- a seguinte:

- dadosClientes(pk_cliente, nome, telefone, telemovel, bi, ...)
- dadosQuestionarios(pk_questionario, fk_cliente,fk_operador,pergunta1, ...)
- dadosOperadores(pk_operador, nome, password, ...)

Os campos começados por "pk" são as chaves primária (primary key), os que começam por "fk" serão as chaves estrangeiras (foreign key), poderão então ver que existe uma chave estrangeira de dadosQuestionarios para os dadosClientes (dadosQuestionarios.fk_cliente ... dadosClientes.pk_cliente), servirá para sabermos a quem (cliente) pertence o questionário; e uma chave estrangeira de dadosQuestionarios para dadosOperadores (dadosQuestionarios.fk_operador ... dadosClientes.pk_operador), servirá para sabermos quem preencheu o questionário.

Voltando à nossa história, o gajo dos bits e dos bytes ao receber o pedido para que fossem automatizados os registos agendados, vai então analisar o que já está feito e tentar arranjar uma possivel maneira de satisfazer o pedido (ordem)! Ok, então os operadores pretendem ter a opção de agendar contactos ligados a um Questionário, que por sua vez está indexado a um Cliente, ou seja, vamos ter de trabalhar na "dadosQuestionarios".
Para dizermos que queremos ligar num determinado dia, às determinadas horas, não será mais do que dizer especificar 2 valores: data e hora. Então vamos pegar na "dadosQuestionarios" e vamos adicionar esses 2 campos, vamos chamá-los: dataCont e horaCont. A nossa tabela ficará essencialmente assim:
- dadosQuestionarios(pk_questionario, fk_cliente, fk_operador, pergunta1, ..., dataCont, horaCont)

Agora basta ir ao formulário e adicionar esses 2 campos para que o operador possa agendar os questionários para datas posteriores e resolvemos a parte mais fácil do problema (se bem que a solução final não será dificil). Agora só temos de instruir a aplicação a verificar num intervalo periódico (vulgo timer) se existem ou não registos agendados para aquele operador, tal poderá ser feito à custa desta função:

nota: o procedimento recebe 2 valores, o nome da tabela da campanha (neste caso será o "dadosQuestionarios" e o código do operador (dadosOperadores.pk_operador), no entanto poderá ser facilmente adaptável para funcionar de outra maneira. Este procedimento faz uso do função isOpen que já tinha demonstrado num snippet anterior. Caso existam registos agendados o que a procedimento irá fazer é abrir outro formulário "formPesquisaAgendados" que por exemplo poderá indicar uma lista(gem) com o(s) registo(s) que se encontra(m) agendado(s), mas tal não parte do objectivo deste snippet.

  1. Public Sub checkRegistosAgendados(tabelaCampanha, codOperador)
  2.  
  3. On Error Resume Next
  4.  
  5. Dim cnn As ADODB.Connection
  6. Dim rst As ADODB.Recordset
  7. Dim sql, bdSettings
  8.  
  9. bdSettings = "driver={SQL Server};" & _
  10. "server=endereco_servidor;" & _
  11. "database=nome_da_base_dados;" & _
  12. "UID=username;" & _
  13. "pwd=password"
  14.  
  15. Set cnn = New ADODB.Connection
  16.  
  17. cnn.ConnectionString = bdSettings
  18. cnn.ConnectionTimeout = 30
  19. cnn.Open
  20.  
  21. Set rst = New ADODB.Recordset
  22.  
  23. 'instrução SQL
  24. sql = " " _
  25. & " SELECT " _
  26. & " COUNT(" & tabelaCampanha & ".pk_questionario) As id_mestre " _
  27. & " FROM " _
  28. & " dbo.Clientes " _
  29. & " INNER Join " _
  30. & " dbo." & tabelaCampanha & " ON dbo.Clientes.pk_cliente = dbo." & tabelaCampanha & ".fk_cliente " _
  31. & " WHERE " _
  32. & " (dbo." & tabelaCampanha & ".dataCont <= GETDATE()) " _
  33. & " AND " _
  34. & " (dbo." & tabelaCampanha & ".horaCont <= GETDATE())" _
  35. & " AND " _
  36. & " (dbo." & tabelaCampanha & ".fk_operador = " & codOperador & ")"
  37.  
  38. With rst 'optimizar a busca na BD
  39. .CursorLocation = adUseClient
  40. .CursorType = adOpenStatic
  41. End With
  42.  
  43. rst.Open sql, cnn
  44.  
  45. If rst(0) > 0 Then ' foram encontrados registos
  46. If isOpen("formPesquisaAgendados") Then 'verificar se o form já se encontrava aberto
  47. Forms!formPesquisaAgendados.Visible = True 'se já se encontrava aberto é porque está escondido
  48. Else
  49. DoCmd.OpenForm "formPesquisaAgendados", acNormal 'c.c abrimos o form
  50. end If
  51. Else
  52. MsgBox "Não Existem Registos Agendados", vbInformation
  53. If isOpen("formPesquisaAgendados") Then Forms!formPesquisaAgendados.Visible = False 'se o form já estiver aberto, escondemos-o
  54. End If
  55.  
  56. rst.Close
  57. cnn.Close
  58.  
  59. Set rst = Nothing
  60. Set cnn = Nothing
  61.  
  62. If Err Then MsgBox Err.Description
  63.  
  64. End Sub



Qualquer erro/ dúvida é só dizer!









clicks: 13157 13157 2006-10-11 2006-10-11 goto mySnippets mySnippets vba  Download  Bookmark This Bookmark This