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.
Public Sub checkRegistosAgendados(tabelaCampanha, codOperador)
On Error Resume Next
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql, bdSettings
bdSettings = "driver={SQL Server};" & _
"server=endereco_servidor;" & _
"database=nome_da_base_dados;" & _
"UID=username;" & _
"pwd=password"
Set cnn = New ADODB.Connection
cnn.ConnectionString = bdSettings
cnn.ConnectionTimeout = 30
cnn.Open
Set rst = New ADODB.Recordset
'instrução SQL
sql = " " _
& " SELECT " _
& " COUNT(" & tabelaCampanha & ".pk_questionario) As id_mestre " _
& " FROM " _
& " dbo.Clientes " _
& " INNER Join " _
& " dbo." & tabelaCampanha & " ON dbo.Clientes.pk_cliente = dbo." & tabelaCampanha & ".fk_cliente " _
& " WHERE " _
& " (dbo." & tabelaCampanha & ".dataCont <= GETDATE()) " _
& " AND " _
& " (dbo." & tabelaCampanha & ".horaCont <= GETDATE())" _
& " AND " _
& " (dbo." & tabelaCampanha & ".fk_operador = " & codOperador & ")"
With rst 'optimizar a busca na BD
.CursorLocation = adUseClient
.CursorType = adOpenStatic
End With
rst.Open sql, cnn
If rst(0) > 0 Then ' foram encontrados registos
If isOpen("formPesquisaAgendados") Then 'verificar se o form já se encontrava aberto
Forms!formPesquisaAgendados.Visible = True 'se já se encontrava aberto é porque está escondido
Else
DoCmd.OpenForm "formPesquisaAgendados", acNormal 'c.c abrimos o form
end If
Else
MsgBox "Não Existem Registos Agendados", vbInformation
If isOpen("formPesquisaAgendados") Then Forms!formPesquisaAgendados.Visible = False 'se o form já estiver aberto, escondemos-o
End If
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
If Err Then MsgBox Err.Description
End Sub
Qualquer erro/ dúvida é só dizer!