Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xanburzum

[Resolvido] Data Grid Genérico

Recommended Posts

Esta classe Generica de Data Grid inteiramente em VBScript e Javascript e fornece registro completo paginação em um controle totalmente pesquisável, classificáveis, editáveis e pesquisáveis.

 

<%
Class clsDataGrid

'-----------------------------------------------------------
'--- Declare all class variables to be used
'-----------------------------------------------------------
private m_strSQL				 	'--- O SQL utilizado para gerar o relatório
private m_strConn					'--- A seqüência de conexão para o banco de dados.
private m_strRowColor1		'--- Primeira row de cores alternadas no grid.
private m_strRowColor2		'--- Segunda row de cores alternadas no grid.
private m_strMode					'--- Indica se "Add Record" será exibido.
private m_strProcessPage	'--- Se modoEditar , esta é a página que será chamada
												' quando "Add Record" é clicado.
private m_strTitle					'--- Título que será exibido no topo do grid.
private m_strRSName			'--- Nome do recordset salvos.
private m_strFindFields			'--- nomes coluna para permitir encontrar
'-----------------------------------------------------------

'-----------------------------------------------------------
'--- Declarar e definir propriedades
'-----------------------------------------------------------
Public Property Get SQL
	SQL = m_strSQL
End Property
Public Property Let SQL(strSQL)
	m_strSQL = strSQL
End Property
Public Property Get Conn
	Conn = m_strConn
End Property
Public Property Let Conn(strConn)
	m_strConn = strConn
End Property
Public Property Get RowColor1
	If IsNull(m_strRowColor1) OR Len(m_strRowColor1) = 0 Then
		RowColor1 =  "#ffffff"
	Else
		RowColor1 = m_strRowColor1
	End If
End Property
Public Property Let RowColor1(strRowColor1)
	m_strRowColor1 = strRowColor1
End Property
Public Property Get RowColor2
	If IsNull(m_strRowColor2) OR Len(m_strRowColor2) = 0 Then
		RowColor2 =  "#00ffff"
	Else
		RowColor2 = m_strRowColor2
	End If
End Property
Public Property Let RowColor2(strRowColor2)
	m_strRowColor2 = strRowColor2
End Property
Public Property Get Mode
	If IsNull(m_strMode) OR Len(m_strMode) = 0 Then
		Mode =  "View"
	Else
		Mode = m_strMode
	End If
End Property
Public Property Let Mode(strMode)
	If strMode <> "View" AND strMode <> "Edit" Then
		Response.Write("Modo inválido - apenas ver ou editar permitido<br>")
		Response.End
	Else
		m_strMode = strMode
	End If
End Property
Public Property Get ProcessPage
	ProcessPage = m_strProcessPage
End Property
Public Property Let ProcessPage(strProcessPage)
	m_strProcessPage = strProcessPage
End Property
Public Property Get Title
	If IsNull(m_strTitle) OR Len(m_strTitle) = 0 Then
		Title =  "Data Grid"
	Else
		Title = m_strTitle
	End If
End Property
Public Property Let Title(strTitle)
	m_strTitle = strTitle
End Property
Public Property Get RSName
	If IsNull(m_strRSName) OR Len(m_strRSName) = 0 Then
		RSName =  "Grid"
	Else
		RSName = m_strRSName
	End If
End Property
Public Property Let RSName(strRSName)
	m_strRSName = strRSName
End Property
Public Property Get FindFields
	FindFields = m_strFindFields
End Property
Public Property Let FindFields(strFindFields)
	m_strFindFields = strFindFields
End Property

'-----------------------------------------------------------
'--- Declarar e definir métodos 
'-----------------------------------------------------------
Sub ShowDataGrid

Dim intPageNum		'--- Isto é usado quando a lista é retornada a partir							' de outra página e queremos voltar para a página do usuário 
Dim objConn				'--- Conexao ADO com o banco de dados.
Dim objRS					'--- Recordset que armazena os dados.
Dim intAbs					'--- Utilizado para guardar a posição absoluta no recordset.
Dim intCurrentPage	'--- pagina atual .
Dim intFindCol			'--- A coluna para fazer o encontrar.
Dim intPageSize		'--- a quantidade de páginas.
Dim intRow					'--- loop counter.
Dim intCol					'--- loop counter.
Dim i						'--- loop counter.
Dim intPos					'--- Posição dentro de uma string.
Dim intDisplayRows	        '--- Mostrar este linhas em uma página.
Dim strSort					'--- A coluna para classificar por.
Dim strSortDir				'--- A direção do sort.
Dim strLastSort			    '--- A coluna é ordenadas pela última vez.
Dim strLastSortDir		    '--- A direção do tipo utilizado nos últimos tempos.
Dim strColor				'--- Used to store the color of the report rows.
Dim strFind					'--- Utilizado para guardar a cor das linhas do relatório
Dim boolFind				'--- Valor Booleano indicando se encontrar um foi solicitada
Dim boolFound			    '--- Valor Booleano indicando se uma seqüência foi encontrada
Dim strFindFields		    '--- Array de nomes de domínio para permitir que considera
Dim strCurrentPage	        '--- page.Const adUseClient = 3

'--- Definir constante ADO
Const adUseClient = 3
Const adOpenDynamic = 2
Const adAsyncFetchNonBlocking = &H00000040
Const adSearchForward = 1
Const adChar = 129
Const adVarChar = 200

If IsArray(FindFields) Then
	strFindFields = FindFields
End If

'-----------------------------------------------------------
'Certifique-se de SQL e Conn propriedades têm 
'Sido definido se o recordset desconectado não 
'Existem.
'-----------------------------------------------------------
If NOT IsObject(Session(RSName)) AND _
(IsNull(SQL) OR Len(SQL) = 0) Then
	Response.Write("Você deve definir a propriedade SQL se não passar um recordset<br>")
	Response.End
End If
If NOT IsObject(Session(RSName)) AND _
(IsNull(Conn) OR Len(Conn) = 0) Then
	Response.Write("Você deve definir a propriedade Conn<br>")
	Response.End
End If

'-----------------------------------------------------------
If Mode = "Edit" AND (IsNull(ProcessPage) OR Len(ProcessPage) = 0) Then
	Response.Write("No modo Edit, você deve definir a propriedade ProcessPage<br>")
	Response.End
End If

'-----------------------------------------------------------
'--- Obter o nome da página atual.
'-----------------------------------------------------------
strCurrentPage = Request.ServerVariables("PATH_INFO")
If InStr(1, strCurrentPage, "/") > 0 Then _
	strCurrentPage = Right(strCurrentPage, Len(strCurrentPage) - InStrRev(strCurrentPage, "/"))

'-----------------------------------------------------------
'--- Crie o recordset desconectado, ou recuperá-la  
'--- da sessão.
'-----------------------------------------------------------
if IsObject(Session(RSName)) and Request.QueryString("Reload")<>"Y" then
	'--- Obter o recordset desconectado
	set objRS = Session(RSName)
else
	'--- Criar os objetos ADO
	Set objConn = Server.CreateObject("ADODB.Connection")
	Set objRS = Server.CreateObject("ADODB.Recordset")
	Set Session(RSName) = objRS

	'--- Conecta no database usando OLE DB
    Conn="DBQ=" & "D:\websites\www.seusite.com\database\northwind.mdb" & ";Driver={Microsoft Access Driver (*.mdb)};"
	objConn.Open Conn

	'--- Utilize um cursor lado cliente para que possamos classificar mais tarde 
	'--- E, por isso, pode criar um recordset desconectado.

	objRS.CursorLocation = adUseClient
	objRS.Source = SQL
	objRS.CursorType = adOpenDynamic
	objRS.Properties("Initial Fetch Size") = 11
	set objRS.ActiveConnection = objConn
	
	objRS.Open ,,,,adAsyncFetchNonBlocking
	
	'--- Disconnect o recordset.
	set objRS.ActiveConnection = nothing
	
	'--- fecha a conexao.
	' objConn.Close
end if
'-----------------------------------------------------------

'-----------------------------------------------------------
'--- Classificando secção
'-----------------------------------------------------------
'--- Se o usuário solicitou o recordset para ser re-ordenadas...
If Trim(Request("SortBy")) <> "" and Trim(Request("Resort")) <> "" Then
	'--- Obter o domínio que o usuário escolheu para classificar por.
	strSort = Request("SortBy")

	'--- Classificar os registros da última vez. 
	'--- A coluna dentro de parênteses,
	'--- No caso, tem várias palavras.
	intPos = Instr(2, objRS.Sort, "]")
	If intPos > 0 Then
		strLastSort = Left(objRS.Sort, intPos)
		strLastSortDir = Trim(Mid(objRS.Sort, intPos + 2))
	End If
	'--- Verifique se o campo mudou.
	If Trim(strSort) <> Trim(strLastSort) then
		'--- sorting field mudou, 
		'--- vamos classificar em ordem crescente.
		strSortDir = "asc"
	Else
		'--- sorting field é o mesmo.
		'--- Agora vamos determinar qual a ordem de classificação direção 
		'--- Usamos última hora (assim que nós podemos mudar isso).
		If strLastSortDir = "asc" Then
			strSortDir = "desc"
		Else
			strSortDir = "asc"
		End If		
	End If
	objRS.Sort = strSort & " " & strSortDir
End If
'-----------------------------------------------------------

'-----------------------------------------------------------
'--- Paging section
'-----------------------------------------------------------
'---Defina o tamanho página padrão
intPageSize = 10
'--- Determinar se o usuário digitou tamanho.
If Trim(request("txtPageSize")) <> "" then
	'--- Defina o tamanho da página para que o usuário escolheu.
	intPageSize = request("txtPageSize")
End If
'--- Veja se um número de página foi aprovada na URL.
intPageNum = Trim(Request.QueryString("PageNum"))
'--- Verifique se não estamos mostrando todos os registros (então estamos paginação).
If (Trim(Request("lstPages")) <> "" or intPageNum <> "") and Trim(Request("AllRecs")) = "" then
	'--Defina a página atual
	If intPageNum <> "" Then ' passada na URL
		intCurrentPage = intPageNum
	Else ' número de página selecionado pelo usuário
		intCurrentPage = Request("lstPages")
	End If
Else
'--- Uma vez que estamos mostrando todos os registros, 
'--- Definir a página actual para a primeira página.
	intCurrentPage = 1
End If


If Not (objRS.BOF and objRS.EOF) Then

	objRS.PageSize = intPageSize
	
	If CInt(intCurrentPage) > CInt(objRS.PageCount) Then
		intCurrentPage = objRS.PageCount
		'session("PageNum") = intCurrentPage
	End If
End If
session("PageNum") = intCurrentPage
'-----------------------------------------------------------

'-----------------------------------------------------------
'---  Find secção
'-----------------------------------------------------------
'--- Se o usuário solicitar para encontrar uma string...
boolFind = False

If Trim(Request("FindCol")) <> "" AND _
			Trim(Request("FindIt")) <> "" AND _
			Trim(Request("find" & Request("FindCol"))) <> "" AND _
			(objRS.RecordCount > objRS.PageSize) Then
	boolFind = True
	'--- Obter o domínio que o usuário.
	intFindCol = CInt(Request("FindCol"))
	'--- Construa a string para passar para o método Find recordset
	strFind = "[" & objRS(intFindCol).Name & "] LIKE '" & _
					Request("find" & intFindCol) & "%'"
    '--- Salvar o registro atual posição no caso a string não for encontrada
    intAbs = objRS.AbsolutePosition
	'--- Find string
    objRS.Find strFind, 1 , adSearchForward
  
    boolFound = False
    If objRS.AbsolutePosition < 1 Then
		objRS.AbsolutePosition = intAbs
	Else
		boolFound = True
		'--- Defina o número de página que o registro foi encontrado 

		intCurrentPage = Int(objRS.AbsolutePosition / objRS.PageSize)
		If objRS.AbsolutePosition MOD objRS.PageSize <> 0 Then
			intCurrentPage = intCurrentPage + 1
		End If
		'--- Salvar a posição do registro encontrado
		intAbs = objRS.AbsolutePosition
		session("PageNum") = intCurrentPage    
	End If
Else ' se não encontrar, reinicie recordset posição de primeiro registro da página
	If Not (objRS.BOF and objRS.EOF) Then _
		objRS.AbsolutePage = intCurrentPage
End If
'-----------------------------------------------------------
%>
<script language="javascript">
<% If boolFind AND NOT boolFound Then %>
window.status='** String Not Found **'
<% End If %>
function Refresh()
//Atualizar o recordset mediante apresentação do formulário.
{
	document.frmReport.submit();
}

function MoveToPage(PageNumber)
{
	if (PageNumber != -1)
		{document.frmReport.lstPages[PageNumber].selected = true;}
	else
		{document.frmReport.lstPages[0].selected = true;}
	Refresh();
}

function ShowAllRecs()
{
	/ / Mostrar todos os registros em 1 página, em seguida, apresentar a página.
	document.frmReport.txtPageSize.value = <%=objRS.RecordCount%>;
	document.frmReport.AllRecs.value = "yes"
	Refresh();
}

function ReSort(SortString)
{
	//Classificar o recordset e, em seguida, apresentar a página.
	document.frmReport.SortBy.value = SortString;
	document.frmReport.ReSort.value = "yes";
	Refresh();
}

function DoFind(ColNum)
{
	//Classificar o recordset e, em seguida, apresentar a página
	document.frmReport.FindCol.value = ColNum;
	document.frmReport.FindIt.value = "yes";
	Refresh();
}
</script>

<center>
<hr>
<table border="0" width="100%">
	<tr>
		<td align="left">
			<b><%=Now()%></b>
		</td>
		<td align="center">
			<%=Title%>
		</td>
		<td align="right">
			<%If Not (objRS.BOF and objRS.EOF) Then%>
				<b><%= objRS.RecordCount%> Records  
				(Page <%=intCurrentPage%> of <%=objRS.PageCount%>)</b>
			<%End If%>
		</td>
	</tr>
</table>
<hr>
<p><font style="COLOR:red; FONT-WEIGHT:bold"><%=Session("msg")%></font></p>
<%Session("msg") = ""%>
</center>

<form name="frmReport" method="post" action="<%=strCurrentPage%>">

<table cellspacing="2" cellpadding="2" border="0" width="100%">
	<tr>
		<!-- Display the menu options. -->
		<td align="center" nowrap>
			  
			<a href="javascript:Refresh()" title="Aplicar novas configurações para o relatório" onmouseover="window.status='Refresh Report'; return true" onmouseout="window.status=''; return true">
			Refresh Report</a>
			  
		</td>
		<td nowrap>
			   
		</td>
		<td align="center" nowrap>
			  
			<a href="javascript:ShowAllRecs()" title="Exibir todos os registros em uma tela." onmouseover="window.status='Show All Records'; return true" onmouseout="window.status=''; return true">
			Mostrar todos os registos</a>
			  
		</td>
		<% If Mode = "Edit" Then %>
		<td nowrap>
			   
		</td>
		<td align="center" nowrap>
			  
			<a href="<%=ProcessPage%>" title="Adicione um novo registro para a lista">
			Add A Record</a>
			  
		</td>
		<% End If %>
		<!-- Mostrar opções de menu de paginação. -->
		<td align="right" valign="top" width="100%" nowrap>
		<%If Not (objRS.BOF and objRS.EOF) Then%>
			<b>Records per page:</b>
   			 <input type="text" size="3" name="txtPageSize" value="<%=intPageSize%>">
			     
			<%If objRS.PageCount > 1 Then%>
				<b>Ir à página:</b>
   				 
				<select size="1" name="lstPages" onChange="Refresh();">
				<%For intRow=1 To objRS.PageCount%>
					<%If CInt(intCurrentPage) = CInt(intRow) Then%>
						<option selected value="<%=intRow%>"><%=intRow%>
					<%Else%>
						<option value="<%=intRow%>"><%=intRow%>
					<%End If%>
				<%Next%>
				</select>
			<%End If%>
		<%Else%>
			<input type="hidden" name="txtPageSize" value="<%=intPageSize%>">
		<%End If%>
		</td>
	</tr>
</table>

<!--  Apresentar o relatório . -->
<%If Not (objRS.BOF and objRS.EOF) Then%>
	<table border="1" cellpadding="0" width="100%">
	<tr>
	<td>
	<table border="0" cellpadding="2" cellspacing="0" width="100%">
		<!-- Mostrar as colunas. -->
		<tr>
		<%For intCol = 0 To objRS.Fields.Count - 1%>
			<th nowrap valign="top" align="left">
				<b>
				<%
				If IsArray(FindFields) Then
					boolFound = False
					For i = 0 to UBound(strFindFields)
						If UCase(objRS(intCol).Name) = UCase(strFindFields(i)) Then
						%>
							<!--<a href="javascript:DoFind('<%=intCol%>')" onmouseover="window.status='Localizar próximo registro contendo string especificada no
 <%=objRS(intCol).Name%>'" onmouseout="window.status='';" title="Find within <%=objRS(intCol).Name%>">-->
							<input type="button" value="Find" onclick="javascript:DoFind('<%=intCol%>')" onmouseover="window.status='Localizar próximo registro começando com string especificada no
 <%=objRS(intCol).Name%>'" onmouseout="window.status=''"><!--</a>-->
							<input type="text" name="find<%=intCol%>" size="5" maxlength="5" value="<%If boolFind Then Response.Write(Request("find" & intCol))%>"><br>
						<%
							boolFound = True
							Exit For
						End If
					Next
					If NOT boolFound Then
						Response.Write("<br>")
					End If
				End If 
				%>
				<a href="javascript:ReSort('[<%=objRS(intCol).Name%>]')" onmouseover="window.status='Sort by <%=objRS(intCol).Name%>'" onmouseout="window.status='';" title="Sort by <%=objRS(intCol).Name%>">
				<%=objRS(intCol).Name%></a></b>
			</th>
		<%Next%>
		</tr>
		<!-- Exibir os data rows. -->
		<%intDisplayRows = objRS.AbsolutePosition + objRS.PageSize - 1%>
		<%For intRow = objRS.AbsolutePosition to intDisplayRows%>
			<tr>
			<%If CBool( Instr(1, CStr(intRow / 2), ".") > 0) Then
				strColor = RowColor1
			else
				strColor = RowColor2
			End If%>
			<%For intCol = 0 To objRS.Fields.count - 1%>
				<td nowrap style="background:<%=strColor%>">
				<%=objRS.Fields(intCol).value%></td>
			<%Next%>
			</tr>
			<%objRS.MoveNext%>
			<%if objRS.EOF then exit for%>
		<%Next%>
		<%
			
			If objRS.RecordCount > objRS.PageSize Then
				If boolFind Then 
					objRS.AbsolutePosition = intAbs
				Else
					If objRS.EOF Then ' check fim-de-arquivo
						objRS.AbsolutePosition = objRS.RecordCount - objRS.PageSize
					Else
						objRS.AbsolutePosition = objRS.AbsolutePosition - objRS.PageSize
					End If
				End If
			End If
		%>
	</table>
	</td>
	</tr>
	</table>

	<!-- Mostrar "Next"  "Previous". -->
	<table border="0" cellspacing="2" cellpadding="2" align="left">
		<tr>
		<%'--- Determine se que deve exibir uma página anterior botão.
		If (intCurrentPage > 1)  Then%>
			<td align="center" width="55">
				<a href="javascript:MoveToPage(document.frmReport.lstPages.selectedIndex - 1)" onmouseover="window.status='Ir para a página anterior';" onmouseout="window.status='';" title="Go to Previous Page">
				Previous</a>
			</td>
		<%End If%>
		<%'---Determine se devíamos mostrar um botão Próxima página.
		If CInt(intCurrentPage) < CInt(objRS.PageCount) Then%>
			<td align="center" width="35">
				<a href="javascript:MoveToPage(document.frmReport.lstPages.selectedIndex + 1)" onmouseover="window.status='Ir para a proxima página';" onmouseout="window.status='';" title="Go to Next Page">
				Next</a>
			</td>
		<%End If%>
		</tr>
	</table>
<%Else%>
	<center>
	<!-- Exibe uma mensagem se não houve registros encontrados-->
	<table border="0" cellpadding="2">
		<tr>
			<td align="center">
				Sem registos correspondentes encontrados.
			</td>
		</tr>
	</table>
	</center>
<%End If%>

<!-- coluna para sort by -->
<input type="hidden" name="SortBy" value="<%Response.Write(strSort)%>">

<!-- Deve-se recorrer ao colunas ->
<input type="hidden" name="ReSort">


<input type="hidden" name="FindCol" value="<%Response.Write(intFindCol)%>">


<input type="hidden" name="FindIt">


<input type="hidden" name="AllRecs">

</form>

<%
Set objRS = Nothing

End Sub

End Class
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.