Usando o Controle MonthView com ADO e MSHFlexGrid


O Visual Basic 6 trouxe alguns controles novos. Dentre eles temos o controle MonthView  que permite ao usuário uma interface com  um calendário quando fazemos entradas/tratamento de datas.

Para usar este controle você tem que incluir o arquivo MSCOMCT2.OCX - Microsoft Windows Commons Controls - ao seu projeto, e quando você for distribuir sua aplicação esta OCX deverá estar presente no diretório System do Windows.(Voce deverá providenciar a instalação da Ocx durante a instalação do aplicativo...)

É muito fácil configurar a aparência deste controle , pois ele possui muitos atributos para cores :

Se você quiser pode exibir mais de um mês usando o controle. Para isto basta definir as propriedades MonthRows e MonthColumns com valores de forma que seu produto seja seja menor ou igual a 12. Assim definindo MonthRows=2  e   MonthColumns=2 teremos :

A propriedade Value do controle MonthView retorna a data atual selecionada. Assim para você capturar a data selecionada pelo usuário quando ele clicar no 'calendário' basta usar a propriedade Value . Ex: MonthView.Value retorna a data definida no formato aa/mm/yyyy. 

As propriedades day , month e year retorna respectivamente o dia , o mês e o ano selecionado pelo usuário ao clicar no controle MonthView. Ex: MonthView1.day  , MonthView1.Month ,  MonthView1.Year

Você pode permitir a seleção de uma faixa de dates contínuas definindo a propriedade MultiSelect como True e especificando o número de dias que podem ser selecionados através da propriedade MaxSelProperty. As propriedades SelStart e SelEnd retornam o dia inicial e o dia final da seleção.       Ex: MonthView1.Value = "31/10/97"   ,  MonthView1.MaxSelCount = 3  ,  MonthView1.SelStart = "25/10/97"
MonthView1.SelEnd = "31/10//97"

Além disto as propriedades MinDate , MaxDate definem a data mínima e a data máxima permitida. 

A propriedade StartOfWeek permite que você defina o dia que irá ser exibido na primeira coluna da esquerda do calendário. Os valores permitidos são: Ex: MonthView1.StartOfWeek = mvwSunday

Constante Valor

Descrição

mvwSunday 1 (Default) Sunday - Domingo
mvwMonday 2 Monday - Segunda
mvwTuesDay 3 Tuesday - Terça
mvwWednesday 4 Wednesday - Quarta
mvwThursday 5 Thursday - Quinta
mvwFriday 6 Friday - Sexta
mvwSaturday 7 Saturday - Sabado

O valor padrão da propriedade Value para o controle MonthView  é a data atual a qual é selecionada quando o controle é exibido pela primeira vez. Você pode alterar isto atribuindo um valor a propriedade Value quando da carga do controle.

Você pode usar os eventos DateClick e/ou DateDblClicked para retornar a data selecionada pelo usuário através do valor de DateClicked e DateDblClicked retornados respectivamente pelos citados eventos.

Um exemplo Prático

Vamos mostrar agora um exemplo prático usando o controle MonthView . Neste exemplo estaremos exibindo em um controle MSHFlexGrid os dados de um banco de dados - Pacientes.mdb - estes dados são as consultas marcadas dos pacientes que estão presentes na tabela Consultas.mdb.  O usuário irá selecionar as datas para as quais deseja ver se há consultas marcadas através de um controle MonthView . Imediatamente as consultas para a data selecionada será exibida no controle MSHFlexGrid.

A estrutura da tabela Consulta é a seguinte:

-Inicie um novo projeto no Visual Basic e no formulário padrão inclua os seguintes controles: MSHFlexGrid , MonthView , Label  e CommandButton , conforme figura abaixo:

Na seção General Declarations iremos definir as variáveis que devem ser visíveis em todo o formulário:

Dim cnPacientes As ADODB.Connection   
Dim rsConsultas As ADODB.Recordset 
Option Explicit

A seguir no evento Load do formulário, abrimos a conexão com o banco de dados e  estamos 'forçando' o controle a iniciar com a mês e o ano atual , e , a seguir chamamos a procedure - ExibeConsultas.

Private Sub Form_Load()
 Dim sConexao As String
 Set cnPacientes = New ADODB.Connection

 sConexao = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Pacientes.mdb"
 cnPacientes.Open (sConexao)

 With MonthView1
     .Year = Year(Now)
     .Month = Month(Now)
 End With
 ExibeConsultas
End Sub

A procedure ExibeConsultas cria o objeto recordset , a instrução SQL e abre o recordset. A seguir preenche o MSHFlexGrid com os dados do recordset.

Private Sub ExibeConsultas_Click()

Dim SQL As String
Dim icol As Integer

Set rsConsultas = New ADODB.Recordset
SQL = "SELECT * FROM Consultas ORDER BY ConsultaData, ConsultaHora "
Set rsConsultas.ActiveConnection = cnPacientes
rsConsultas.Open SQL

With MSHFlexGrid1

  ' aqui damos nome aos cabeçalhos das colunas
  .Rows = 1
  .Cols = rsConsultas.Fields.Count

   For icol = 0 To rsConsultas.Fields.Count - 1
     .Col = icol
     .Text = rsConsultas.Fields(icol).Name
  Next

  While Not rsConsultas.EOF  'atribuimos os valores dos campos as células do grid
     .Rows = .Rows + 1
     .Row = .Rows - 1
     For icol = 0 To rsConsultas.Fields.Count - 1
       .Col = icol
       .Text = rsConsultas(icol) & ""
     Next
     rsConsultas.MoveNext
  Wend

  .TextMatrix(0, 0) = "Código"
  .TextMatrix(0, 1) = "Paciente"
  .TextMatrix(0, 2) = "Data"
  .TextMatrix(0, 3) = "Hora"
  .TextMatrix(0, 4) = "Médico"
  .FixedRows = 1

  .RowHeight(0) = .RowHeight(1) * 1.5
  
End With

AjustaColunas MSHFlexGrid1
lbltitulo.Caption = "Todas as Consultas"

End Sub

O código do evento Click do controle MonthView irá ocorrer quando o usuário clica em um dia do calendário para selecionar uma data. O código abaixo seleciona através de uma instrução SQL as consultas referente ao dia selecionado e as exibe no grid.

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)

Dim SQL As String
Dim AppDate
Dim icol As Integer

Set rsConsultas = New ADODB.Recordset
SQL = "SELECT * From Consultas WHERE ConsultaData =#" & SQLData(DateClicked) & "#" & " ORDER BY ConsultaData, ConsultaHora" & ";"

Set rsConsultas.ActiveConnection = cnPacientes
rsConsultas.Open SQL

With MSHFlexGrid1
   .Rows = 1
   .Cols = rsConsultas.Fields.Count
    For icol = 0 To rsConsultas.Fields.Count - 1
      .Col = icol
      .Text = rsConsultas.Fields(icol).Name
    Next

   While Not rsConsultas.EOF    ' preenche o grid com os dados do recordset
     .Rows = .Rows + 1
     .Row = .Rows - 1

      For icol = 0 To rsConsultas.Fields.Count - 1
         .Col = icol
        .Text = rsConsultas(icol) & ""
      Next
      rsConsultas.MoveNext
   Wend

    .TextMatrix(0, 0) = "Código"
    .TextMatrix(0, 1) = "Paciente"
    .TextMatrix(0, 2) = "Data"
    .TextMatrix(0, 3) = "Hora"
    .TextMatrix(0, 4) = "Médico"
    .FixedRows = 1
    .RowHeight(0) = .RowHeight(1) * 1.5

End With

AjustaColunas MSHFlexGrid1
lbltitulo.Caption = "Consultas para " & DateClicked

rsConsultas.Close
Set rsConsultas = Nothing

End Sub

A procedure que ajusta as células do grid ao tamanho dos campos a serem exibidos é a seguinte:

Private Sub AjustaColunas(ByVal flx As MSHFlexGrid)
Dim max_wid As Single
Dim wid As Single
Dim max_row As Integer
Dim r As Integer
Dim c As Integer

max_row = flx.Rows - 1
For c = 0 To flx.Cols - 1
   max_wid = 0
   For r = 0 To max_row
       wid = TextWidth(flx.TextMatrix(r, c))
      If max_wid < wid Then max_wid = wid
  Next r
  flx.ColWidth(c) = max_wid + 400
Next c
End Sub

Finalmente a procedure SQLData - que ajusta as datas para o formato (mm/dd/aaaa) e a retorna a data  como uma string - é exibida a seguir:

Public Function SQLData(ConverteData As Date) As String
   SQLData = Format(ConverteData, "mm/dd/yyyy")
End Function

Ao executar a aplicação teremos:

Quando o usuário clicar numa data no calendário , por exemplo no dia 20, iremos obter:

Preciso falar mais alguma coisa ?  Tchau....