
| Function | Description |
|---|---|
| CDate | Converts a valid date and time expression to the variant of subtype Date |
| Date | Returns the current system date |
| DateAdd | Returns a date to which a specified time interval has been added |
| DateDiff | Returns the number of intervals between two dates |
| DatePart | Returns the specified part of a given date |
| DateSerial | Returns the date for a specified year, month, and day |
| DateValue | Returns a date |
| Day | Returns a number that represents the day of the month (between 1 and 31, inclusive) |
| FormatDateTime | Returns an expression formatted as a date or time |
| Hour | Returns a number that represents the hour of the day (between 0 and 23, inclusive) |
| IsDate | Returns a Boolean value that indicates if the evaluated expression can be converted to a date |
| Minute | Returns a number that represents the minute of the hour (between 0 and 59, inclusive) |
| Month | Returns a number that represents the month of the year (between 1 and 12, inclusive) |
| MonthName | Returns the name of a specified month |
| Now | Returns the current system date and time |
| Second | Returns a number that represents the second of the minute (between 0 and 59, inclusive) |
| Time | Returns the current system time |
| Timer | Returns the number of seconds since 12:00 AM |
| TimeSerial | Returns the time for a specific hour, minute, and second |
| TimeValue | Returns a time |
| Weekday | Returns a number that represents the day of the week (between 1 and 7, inclusive) |
| WeekdayName | Returns the weekday name of a specified day of the week |
| Year | Returns a number that represents the year |
Conversion Functions
| Function | Description |
|---|---|
| Asc | Converts the first letter in a string to ANSI code |
| CBool | Converts an expression to a variant of subtype Boolean |
| CByte | Converts an expression to a variant of subtype Byte |
| CCur | Converts an expression to a variant of subtype Currency |
| CDate | Converts a valid date and time expression to the variant of subtype Date |
| CDbl | Converts an expression to a variant of subtype Double |
| Chr | Converts the specified ANSI code to a character |
| CInt | Converts an expression to a variant of subtype Integer |
| CLng | Converts an expression to a variant of subtype Long |
| CSng | Converts an expression to a variant of subtype Single |
| CStr | Converts an expression to a variant of subtype String |
| Hex | Returns the hexadecimal value of a specified number |
| Oct | Returns the octal value of a specified number |
Format Functions
| Function | Description |
|---|---|
| FormatCurrency | Returns an expression formatted as a currency value |
| FormatDateTime | Returns an expression formatted as a date or time |
| FormatNumber | Returns an expression formatted as a number |
| FormatPercent | Returns an expression formatted as a percentage |
Math Functions
| Function | Description |
|---|---|
| Abs | Returns the absolute value of a specified number |
| Atn | Returns the arctangent of a specified number |
| Cos | Returns the cosine of a specified number (angle) |
| Exp | Returns e raised to a power |
| Hex | Returns the hexadecimal value of a specified number |
| Int | Returns the integer part of a specified number |
| Fix | Returns the integer part of a specified number |
| Log | Returns the natural logarithm of a specified number |
| Oct | Returns the octal value of a specified number |
| Rnd | Returns a random number less than 1 but greater or equal to 0 |
| Sgn | Returns an integer that indicates the sign of a specified number |
| Sin | Returns the sine of a specified number (angle) |
| Sqr | Returns the square root of a specified number |
| Tan | Returns the tangent of a specified number (angle) |
Array Functions
| Function | Description |
|---|---|
| Array | Returns a variant containing an array |
| Filter | Returns a zero-based array that contains a subset of a string array based on a filter criteria |
| IsArray | Returns a Boolean value that indicates whether a specified variable is an array |
| Join | Returns a string that consists of a number of substrings in an array |
| LBound | Returns the smallest subscript for the indicated dimension of an array |
| Split | Returns a zero-based, one-dimensional array that contains a specified number of substrings |
| UBound | Returns the largest subscript for the indicated dimension of an array |
String Functions
| Function | Description |
|---|---|
| InStr | Returns the position of the first occurrence of one string within another. The search begins at the first character of the string |
| InStrRev | Returns the position of the first occurrence of one string within another. The search begins at the last character of the string |
| LCase | Converts a specified string to lowercase |
| Left | Returns a specified number of characters from the left side of a string |
| Len | Returns the number of characters in a string |
| LTrim | Removes spaces on the left side of a string |
| RTrim | Removes spaces on the right side of a string |
| Trim | Removes spaces on both the left and the right side of a string |
| Mid | Returns a specified number of characters from a string |
| Replace | Replaces a specified part of a string with another string a specified number of times |
| Right | Returns a specified number of characters from the right side of a string |
| Space | Returns a string that consists of a specified number of spaces |
| StrComp | Compares two strings and returns a value that represents the result of the comparison |
| String | Returns a string that contains a repeating character of a specified length |
| StrReverse | Reverses a string |
| UCase | Converts a specified string to uppercase |
Other Functions
| Function | Description |
|---|---|
| CreateObject | Creates an object of a specified type |
| Eval | Evaluates an expression and returns the result |
| GetLocale | Returns the current locale ID |
| GetObject | Returns a reference to an automation object from a file |
| GetRef | Allows you to connect a VBScript procedure to a DHTML event on your pages |
| InputBox | Displays a dialog box, where the user can write some input and/or click on a button, and returns the contents |
| IsEmpty | Returns a Boolean value that indicates whether a specified variable has been initialized or not |
| IsNull | Returns a Boolean value that indicates whether a specified expression contains no valid data (Null) |
| IsNumeric | Returns a Boolean value that indicates whether a specified expression can be evaluated as a number |
| IsObject | Returns a Boolean value that indicates whether the specified expression is an automation object |
| LoadPicture | Returns a picture object. Available only on 32-bit platforms |
| MsgBox | Displays a message box, waits for the user to click a button, and returns a value that indicates which button the user clicked |
| RGB | Returns a number that represents an RGB color value |
| Round | Rounds a number |
| ScriptEngine | Returns the scripting language in use |
| ScriptEngineBuildVersion | Returns the build version number of the scripting engine in use |
| ScriptEngineMajorVersion | Returns the major version number of the scripting engine in use |
| ScriptEngineMinorVersion | Returns the minor version number of the scripting engine in use |
| SetLocale | Sets the locale ID and returns the previous locale ID |
| TypeName | Returns the subtype of a specified variable |
| VarType | Returns a value that indicates the subtype of a specified variable |
Para solucioanr el problema siga los pasos que se explican a continuación:
1.Logo Office
2.Opciones de Excel
3.Avanzadas
4.Mostrar Opciones para este libro:
5.Para objetos mostrar:"
6.MARCAR "Todo"
¿Por qué aparece "No se puede desplazar objetos fuera de la hoja" cuando oculta columnas o filas?
Por qué aparece No se puede desplazar objetos fuera de la hoja cuando oculta columnas o filas_ppalEste mensaje se produce debido a 2 cosas:
1. Se insertan objetos o comentarios al final de la cuadrícula de las hojas.
2. La opción “No mover ni cambiar tamaño con celdas” está seleccionada en la ventana del formato del objeto. Esta opción está activa de forma predeterminada.
Por qué aparece No se puede desplazar objetos fuera de la hoja cuando oculta columnas o filas_image1
Por ejemplo, si ha incluido un comentario en la celda XFC1 y la opción No mover ni cambiar tamaño con celdas está seleccionada, el mensaje aparece al intentar ocultar tres o más columnas en algún lugar de la hoja entre la primera columna y la columna que contiene el borde izquierdo del comentario de celda.
Cómo solucionarlo?
1. Para cualquier tipo de objeto, selecciónelo y haga clic derecho en “Tamaño y Propiedades”
Por qué aparece No se puede desplazar objetos fuera de la hoja cuando oculta columnas o filas_image2
2. En la ficha Propiedades, en Posicionamiento del objeto, haga clic en Mover y cambiar tamaño con celdas.
Por qué aparece No se puede desplazar objetos fuera de la hoja cuando oculta columnas o filas_image3
Nota: Tenga presente que estos 2 pasos funcionarán para cualquier tipo de objeto, desde un comentario, una forma y un SmartArt.
Enseguida generamos el código javascript para manejar los eventos:
Uno de los datos por los cuales podemos identificar a un usuario es mediante su ID de sesión. Una sesión se establece por el usuario cada vez que este utiliza un navegador nuevo para acceder a nuestra web. El valor del ID de sesión es asignado automáticamente por el servidor web.
Si queremos acceder al ID de sesión dentro de nuestro programa ASP tenemos que utilizar el objeto Session, en concreto el campo SessionID. Lo podemos visualizar de la siguiente forma:
Hay que tener especial cuidado con este identificativo, que aunque nos puede servir para muchas cosas, podría repetirse en el tiempo. Ya que ante una eventual caída o reinicio del servidor web, este, puede volver a generar ID repetidos. Si bien, tiene una gran utilidad a la hora de saber como el usuario ha ido navegando por nuestro website.
Lo siguiente será el pasar esa fecha a una rutina Javascript. Para ello lo que hacemos es montar la rutina Javascript "al vuelo". Es decir, el código de la rutina Javascript que se ejecutará en el cliente llevará parte de código de servidor. El servidor antes de devolver la página al cliente tendrá ya una rutina pura y dura Javascript.
Veamos como quedaría:
<script type="text/javascript">
// Recogemos la fecha del servidor.var fecha = "<%=Now()%>";// Pasamos la fecha a javascriptvar fecha_js = new Date(fecha);script>
El ejemplo de crear un reloj en javascript lo que hacía era poner un Timer que lanzaba cada segundo una función, la cual, solicitaba la fecha actualizada. Si hicieramos eso volveríamos a tener la fecha del cliente y no la del servidor. Es por ello que lo que tendremos que hacer es el control manual de la fecha, es decir, incrementar nosotros mismos la fecha, segundo a segundo.
Para incrementar la fecha lo primero que tenemos que hacer es obtener los segundos con getSeconds(), minutos con getMinutes() y hora del servidor con getHours().
var segundos = fecha_js.getSeconds();var hora = fecha_js.getHours();var minutos = fecha_js.getMinutes();
Y en la función que se ejecute cada segundo (mejor dicho, cada 1000 milésimas) deberemos de seguir el siguiente algoritmo:
segundos++;
if (segundos == 60) {segundos = 0;minutos++;if (minutos == 60) {minutos = 0;hora++;if (hora == 24) {hora = 0;}}}
Es sencillo. Si llegamos a 60 segundos es que ha pasado un minuto. Incrementamos el minuto y ponemos el segundero a 0. Cuando lleguemos a 60 minutos es que ha pasado una hora. Incrementamos la hora y ponemos el minutero a 0. Y por último, cuando lleguemos a 24 horas, ponemos estas a 0.
Lo último del script será poner los datos en un campo input de un formulario. Como siempre, con getElementById()
document.getElementById("hora").value = " " + hora + ":" + minutos + ":" + segundos;
Y volver a ejecutar la función de paso de un segundo:
window.setTimeout("mostrar()",1000);
Ya tenemos el reloj de nuestro servidor.
Incluir SET NOCOUNT ON:
Con cada sentencia SELECT y DML, el servidor SQL devuelve un mensaje que indica el número de filas afectadas por esa declaración. Esta información es sobre todo útil para depurar el código, pero es inútil después de eso. Mediante el establecimiento de SET NOCOUNT ON, se puede desactivar la función de devolución de esta información adicional. Para los procedimientos almacenados que contienen varias declaraciones o contener Transact-SQL lazos, establecer SET NOCOUNT en ON puede proporcionar un aumento de rendimiento significativo, porque el tráfico de red se reduce considerablemente.
CREATE PROC dbo.ProcName
AS
SET NOCOUNT ON;
--Procedure code here
SELECT column1 FROM dbo.TblTable1
-- Reset SET NOCOUNT to OFF
SET NOCOUNT OFF;
GO
El nombre del objeto está calificado si se utiliza con el nombre de esquema. Nombre de esquema debe ser utilizado con el nombre del procedimiento almacenado y con todos los objetos de referencia dentro del procedimiento almacenado. Esta ayuda directa en encontrar el plan de cumplimiento en lugar de buscar los objetos en el esquema de otras posibles antes de decidirse a utilizar un plan almacenado en caché, si está disponible. Este proceso de búsqueda y decidir un esquema de un objeto conduce a compilar el procedimiento almacenado de bloqueo y disminuye el rendimiento del procedimiento almacenado. Por lo tanto, siempre se refieren los objetos con nombre completo en el procedimiento almacenado como
SELECT * FROM dbo.MyTable -- Preferred method
-- Instead of
SELECT * FROM MyTable -- Avoid this method
--And finally call the stored procedure with qualified name like:
EXEC dbo.MyProc -- Preferred method
--Instead of
EXEC MyProc -- Avoid this method
No utilice el prefijo "sp_" en el nombre del procedimiento almacenado:
Si un nombre de procedimiento almacenado comienza con "sp_", a continuación, busca el servidor SQL por primera vez en la base de datos maestra y luego en la base de datos actual período de sesiones. Búsqueda en la base de datos principal causa sobrecarga adicional e incluso un mal resultado si otro procedimiento almacenado con el mismo nombre se encuentra en la base de datos maestra.
Use IF EXISTS (SELECT 1) en lugar de (SELECT *):
Para comprobar la existencia de un registro de otra tabla, se utiliza la cláusula IF EXISTS. La cláusula IF EXISTS devuelve verdadero si se devuelve el valor de una declaración interna, ya sea un único valor "1" o todas las columnas de un registro o registros completos. La salida del comando interno no se utiliza. Por lo tanto, para reducir al mínimo los datos para el procesamiento y transferencia de la red, debemos utilizar "1" en la cláusula SELECT de una declaración interna, como se muestra a continuación:
IF EXISTS (SELECT 1 FROM sysobjects
WHERE name = 'MyTable' AND type = 'U')
Utilice el procedimiento almacenado sp_executesql en lugar de la instrucción EXECUTE:El procedimiento almacenado sp_executesql admite parámetros. Por lo tanto, utilizando el procedimiento almacenado sp_executesql en lugar de la instrucción EXECUTE mejorar la reutilización de código. El plan de ejecución de una instrucción dinámica puede ser reutilizado sólo si todos y cada personaje, incluido el caso, el espacio, los comentarios y los parámetros, es el mismo para dos estados. Por ejemplo, si ejecuta el lote a continuación:
DECLARE @Query VARCHAR(100)
DECLARE @Age INT
SET @Age = 25
SET @Query = 'SELECT * FROM dbo.tblPerson WHERE Age = ' + CONVERT(VARCHAR(3),@Age)
EXEC (@Query)
DECLARE @Query NVARCHAR(100)
SET @Query = N'SELECT * FROM dbo.tblPerson WHERE Age = @Age'
EXECUTE sp_executesql @Query, N'@Age int', @Age = 25
Trate de evitar el uso de cursores de SQL Server siempre que sea posible:
El cursor utiliza una gran cantidad de recursos para la carga de procesamiento para mantener la posición del registro actual en un conjunto de registros y esto disminuye el rendimiento. Si tenemos que procesar los registros uno por uno en un bucle, entonces debemos utilizar la cláusula WHILE. Siempre que sea posible, se debe reemplazar el enfoque basado en cursor con SET enfoque. Debido a que el motor de SQL Server está diseñada y optimizada para llevar a cabo basado en conjuntos operación muy rápida. Una vez más, por favor, tenga en cuenta el cursor es también una especie de bucle while.
Mantenga la transacción lo más corta posible:
La duración de la transacción afecta el bloqueo y los interbloqueos. Bloqueo exclusivo no se libera hasta el final de la transacción. En el nivel superior de aislamiento, los bloqueos compartidos también son mayores con la transacción. Por lo tanto, las transacciones largas medios seguros durante más tiempo y cerraduras para las vueltas más tiempo en el bloqueo. En algunos casos, el bloqueo también se convierte en callejones sin salida. Por lo tanto, para una ejecución más rápida y menos bloqueo, la transacción debe ser lo más corto posible.
Utilice try-catch para el manejo de errores:
Antes de códigos de SQL Server versión 2005 para el tratamiento de errores, hubo una gran porción de código en sí, porque una declaración de comprobación de errores fue escrito después de cada sentencia T-SQL. Más código siempre consume más recursos y tiempo. En SQL Server 2005, una manera sencilla se introduce una nueva con el mismo propósito. La sintaxis es la siguiente:
BEGIN TRY
--Your t-sql code goes here
END TRY
BEGIN CATCH
--Your error handling code goes here
END CATCH
he visto muchas formas de arreglarlo, por ejemplo separando dia-mes-año, pero hasta hace poco no había encontrado ninguna que funcionara SIEMPRE en CUALQUIER servidor, con cualquier versión de access.
el problema es al ingresar la fecha en access.
Access configura las fechas según la configuración regional de donde esta instalado.
ejemplo : access en español.
si le introduces la fecha 3/15/2003. esta fecha en español no existe, por lo tanto lo más logico sería que devuelva un error. Pero el access al ver que esta fecha no existe deduce que no hemos equivocado y la corige sin avisar en 15/03/2003.
por lo tanto funciona a veces bien (2 numero<12) pero a veces mal.
la solución a eso es usar un formato de fecha UNICO que el access no puede interpretar.
ese formato es AAAA/MM/DD.
si pasamos la fecha en ese formato nunca la podrá modificar.. si es correcta la ingresa en la base, y sino sale error.
para hacer eso aqui teneís un función en VBscript.
<%
Function FechaGenerica(fecha)
If IsDate(fecha) = True Then
DIM dteDay, dteMonth, dteYear
dia = Day(fecha)
mes = Month(fecha)
ano = Year(fecha)
FechaGenerica = ano & "/" & Right(Cstr(mes + 100),2) & "/" & Right(Cstr(dia + 100),2)
Else
FechaGenerica = Null
End If
End Function
%>
Una última cosa. En sentencias SQL que actualizan bases Access, las fechas se pasan entre # #.
Por ejemplo: INSERT INTO tabla(fecha) VALUE(#"& var_fecha &"#)
El siguiente ejemplo sirve para realizar una paginación de resultados extraídos de una base de datos a través de una consulta con ASP 3.0. La paginación brinda un aspecto diferente al mostrar un listado, mucho más profesional y cómodo para el usuario, seguramente les ha pasado de tener muchos registros y al mostrarlos tenian una página demasiado larga y lenta en cargar.
paginar.asp
<%
Dim mostrar 'cantidad de registros a mostrar por página
Dim cant_paginas 'cantidad de páginas que recibimos
Dim pagina_actual 'La página que mostramos
Dim registro_mostrado 'Contador utilizado para mostrar las páginas
Dim I 'Variable Loop
mostrar = 10 ' Pueden modificar este número para cambiar la cantidad de registros por página
' IF para saber que página mostrar
If Request.QueryString("page") = "" Then
pagina_actual = 1
Else
pagina_actual = CInt(Request.QueryString("page"))
End If
strsql = "SELECT * FROM tabla"
' Creamos la conexion a la base de datos
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open StrConn
' Creamos el RecordSet y definimos la cantidad de registros a mostrar
Set RS = Server.CreateObject("ADODB.Recordset")
RS.PageSize = mostrar
RS.CacheSize = mostrar
' Abrimos la tabla...
RS.Open strSQL, oConn,3,1
'contamos las páginas que se formaron con la variable mostrar.
cant_paginas = RS.PageCount
' Si el pedido de página cae afuera del rango,
' lo modificamos para que caiga adentro
If pagina_actual > cant_paginas Then pagina_actual = cant_paginas
If pagina_actual < 1 Then pagina_actual = 1
' Si la cantidad de páginas da 0 es que no hay registros... por eso este IF
If cant_paginas = 0 Then
Response.Write "No hay registros..."
Else
' Nos movemos a la página elegida
RS.AbsolutePage = pagina_actual
' Mostramos el dato de que página estamos...
%>
<FONT SIZE="+1">Page <B><%= pagina_actual %></B> of <B><%= cant_paginas %></B></FONT>
<%
' Espacios
Response.Write "<BR><BR>" & vbCrLf
'iniciamos la tabla donde mostraremos todo
Response.Write "<TABLE BORDER=""1"">" & vbCrLf
' Mostramos los titulos de las columnas... (pueden sacar ese FOR para eliminar eso)
Response.Write vbTab & "<TR>" & vbCrLf
For I = 0 To RS.Fields.Count - 1
Response.Write vbTab & vbTab & "<TD><B>"
Response.Write RS.Fields(I).Name
Response.Write "<B></TD>" & vbCrLf
Next 'I
Response.Write vbTab & "</TR>" & vbCrLf
' Hacemos el bucle mostrando los datos del registro
registro_mostrado = 0
Do While registro_mostrado < mostrar And Not RS.EOF
Response.Write vbTab & "<TR>" & vbCrLf
For I = 0 To RS.Fields.Count - 1
Response.Write vbTab & vbTab & "<TD>"
Response.Write RS.Fields(I)
Response.Write "</TD>" & vbCrLf
Next 'I
Response.Write vbTab & "</TR>" & vbCrLf
' Sumamos 1 a los mostrados
registro_mostrado = registro_mostrado + 1
' Nos movemos al próximo registro...
RS.MoveNext
Loop
'listo...
Response.Write "</TABLE>" & vbCrLf
End If
' Cerramos y limpiamos...
RS.Close
Set RS = Nothing
oConn.Close
Set oConn = Nothing
' Ahora mostramos los enlaces a las otras páginas con el resto de los registros...
If pagina_actual > 1 Then
%>
<a href="./paginar.asp?eje=30&page=<%= pagina_actual - 1 %>">[<< Anterior]</a>
<%
End If
' mostramos la paginacion por numeros de página
For I = 1 To cant_paginas
If I = pagina_actual Then
%>
<%= I %>
<%
Else
%>
<a href="./paginar.asp?eje=30&page=<%= I %>"><%= I %></a>
<%
End If
Next 'I
If pagina_actual < cant_paginas Then
%>
<a href="./paginar.asp?eje=30&page=<%= pagina_actual + 1 %>">[Próximo >>]</a>
<%
End If
'Fin...
%>
Otro ejemplo es el siguiente:
Acceso a la base de datos<%
'----- conectar
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "dsnedit",,"ODBC;DATABASE=Editorial;UID=;PWD=;DSN=dsnedit"
'----- definir cadena sql
sql = "SELECT * FROM libros"
%>
Definiendo la paginación
Ahora si vamos a dar los primeros pasos en la paginación. El proceso consiste básicamente en establecer las propiedades que determinarán la cantidad de registros a mostrar y la página actual.
Definimos una variable con la cantidad de registros por página
<%
cantidadregistros=5
%>
A continuación vamos a determinar que página hay que mostrar y asignamos ese valor a una variable. Aquí aparece el primer parámetro que debemos pasar entre páginas, "paginaactual". Más adelante veremos como se pasa este parámetro.
<%
if request.querystring("paginaactual")<>"" then
mostrarpagina=request.querystring("paginaactual")
else
mostrarpagina=1
end if
%>
... y es el momento de abrir el recordset
<%
set rs=Server.CreateObject("ADODB.Recordset")
rs.cachesize=60
rs.open sql, conn, 3, 3
%>
Ya estamos en condiciones de realizar la paginación,
<%
rs.pagesize=cantidadregistros
maxpagina=cint(rs.pagecount)
maxregistros=cint(rs.pagesize)
rs.absolutepage=mostrarpagina
contreg=0
%>
Veamos en detalle que hemos hecho. Hemos establecido la propiedad pagesize del objeto recordset en 5 ("cantidadregistro"). Guardamos la cantidad de paginas y su tamaño en dos variables. Con absolutepage indicamos que página debe mostrarse. Por último inicializamos un contador que vamos a usar al mostrar los registros.
Mostrando las páginas
Llegó el momento de mostrar el resultado. En primer lugar vamos a determinar los valores "desde" y "hasta".
<%
if int(mostrarpagina)<>int(maxpagina) then '-- Si no es la última página.
hasta=mostrarpagina*5
desde=hasta-4
else
hasta=rs.recordcount
desde=(maxpagina*5)-4
end if
%>
Si en lugar de cinco registros quiere mostrar diez, sólo cambie los "5" por "10" y los "4" por "9".
Mostramos los valores recién calculados...
<%
response.write "Resultados : "
response.write desde & " a " & hasta & " de " & rs.recordcount & " encontrados."
%>
Y construimos el ciclo que muestra los registros,
<%
do while not rs.eof and contreg < maxregistros
response.write rs.fields("campo") & "
"
rs.movenext
contreg=contreg+1
loop
%>
Observe que ademas de controlar la propiedad eof, como se hace habitualmente, debemos verificar la cantidad de registros mostrados.
Construir los hipervínculos para moverse entre las páginas
Para terminar, sólo resta construir la lista de páginas y opcionalmente los hipervínculos "Anterior" y "Siguiente". Al terminar debemos tener algo como,
[<
Los hipervínculos de esta lista llaman, obviamente, a la misma pagina en la que estamos trabajando, por lo que podemos referirnos a la misma con una variable (lo que facilita la reutilización del código)
La variable "cero" se la agregaremos a las páginas 1 a 9. Si hay mas páginas asignamos a "cero" una cadena vacía.
A continuación, armamos la lista de hipervínculos. En primer lugar, si no estamos en la primer página guardamos en una variable el link "Anterior". En segundo lugar, guardamos en la variable la lista de páginas con un ciclo For...Next. Finalmente, si no estamos en la última página agregamos a la variable el link "Siguiente".
Paginación
<%
cero="0"
nombrescript=request.servervariables("script_name")
if int(mostrarpagina)<>1 then '--si no es la primer página mostrar botón atrás
ref="[<< Anterior] "
end if
for contador=1 to maxpagina
If contador>9 then
cero=""
end if
ref=ref & " ref=ref & "'>" & cero & contador & ""
else
ref=ref & "'>" & cero & contador & ""
end if
next
if int(mostrarpagina)<>int(maxpagina) then '-- si no es la última página
' mostrar botón siguiente
ref=ref & " [Siguiente >>]"
end if
response.write ref
%>
Si observa detenidamente el código, se dará cuenta de que he incluido un parámetro "buscar". Al principio, cuando construí la consulta sql, simplemente accedí a una tabla entera, por lo que en este ejemplo no haría falta ese parámetro. No obstante, es muy probable que Ud. quiera paginar los resultados de una búsqueda. En ese caso, es importante que recuerde pasar entre las distintas páginas de resultados todos los parámetros necesarios.
Aplicaciones y sesiones
Una aplicación se puede entender como más o menos lo que es un sitio web. Los dominios de la aplicación son el directorio raíz y los subdirectorios de esta. En un servidor web como PWS tenemos una aplicación en la raíz del servidor, y por cada directorio virtual que creemos tendremos otra aplicación.
El funcionamiento de las aplicaciones está ligado al de las sesiones. Las aplicaciones son globales a todo el sitio y las sesiones son particulares de cada usuario. Concretamente funcionan con este proceso:
- La aplicación está parada, así como las sesiones, porque no hay ningún usuario dentro.
- La aplicación se pone en marcha cuando entra el primer usuario.
- El primer usuario pone en marcha una sesión
- Los siguientes usuarios ya tienen en marcha la aplicación, con lo que solo desatan la creación de una sesión cada uno.
- Con cada usuario que abandona la página (para ello se pasa 20 minutos o más sin consultar ninguna otra página), se cierra su sesión.
- Con el último usuario que sale se cierra la aplicación.
Para crear variables de aplicación
Application("nombreDeVariable") = valor
Para asegurarse exclusión mutua al acceder a una variable de aplication se utilizan los métodos lock y unlock, de esta manera:
Application.lock
Application("nombreDeVariable") = valor
Application.unlock
Crear variables de sesión
Session("nombreDeVariable") = valor
Qué es el global.asa
Global.ASA nos va a servir para controlar los eventos principales asociados con el inicio y fin de la aplicación, así como con el inicio y fin de sesión. Dicho de otro modo, con global.asa podemos hacer cosas cuando se inicien y acaben las aplicaciones y las sesiones.
El global.asa se coloca en el directorio raíz de la aplicación y tiene la siguiente sintaxis
<SCRIPT LANGUAGE=VBScript RUNAT=server>
sub application_onStart()
'sentencias que se ejecutan al entrar el primer usuario
end sub
sub application_onEnd()
'sentencias a ejecutar al irse el último usuario
end sub
sub session_onStart()
'sentencias que se ejecutan cada vez que entra un usuario
end sub
sub session_onEnd()
'sentencias a ejecutar al irse el cada usuario
end sub
</SCRIPT>
Un detalle a destacar por su utilidad práctica es que si queremos sustituir nuestro global.asa por otro se tendrá que apagar el servicio y volver a encender, o incluso volver a arrancar el ordenador si lo anterior no funciona. Si no hacemos esto siempre tomará la versión antigua del global.asa, aunque se haya cambiado. Por esta misma razón, hay que tener cuidado que no tenga errores el archivo global.asa, pues nuestra página dará errores hasta que reiniciemos el servicio, con el consiguiente espacio de tiempo en el que estará el dominio caído.
Diseño (3)
Excel (1)
HTML (1)
Programación ASP 3.0 (11)
Programación ASP.NET (2)
Programación Javascript (2)
Redes sociales (1)
Servidores (1)
Soporte técnico (3)
SQL Server (2)
Ejecutado en 397 ms
(Votar)
Comentario
Historico
Imprimir
Feed RSS 0.91
Feed Atom 0.3