Con lo fácil que sería que cada TabPage tuviese una propiedad "visible". Pues no.
Para ocultar un TabPage:
TabPage.Parent = nothing
Para volverlo a mostrar:
TabPage.Parent = TabControl
Hale!
ASP.NET, VB.NET, SQLServer, Oracle y otras guarreridas
Con lo fácil que sería que cada TabPage tuviese una propiedad "visible". Pues no.
Para ocultar un TabPage:
TabPage.Parent = nothing
TabPage.Parent = TabControl
Poner el zoom en ancho de página:
CrystalReportViewerX.Zoom(1)
CrystalReportViewerX.Zoom(2)
Una de winforms.
Ante la inexistencia de una propiedad ReadOnly en el ComboBox, análoga al del TextBox, la única solución para bloquear la entrada de un usuario en un combo es usar el enabled=false, lo que provoca efectivamente que el control no admita entradas pero que tampoco admita ser leído con claridad. Que al ponerse gris no se ve una mierda, vaya.
Pues nada, a montarse una pajilla mental de cómo simular el ReadOnly del TextBox en un ComboBox:
Private Sub proteger()
ComboBox1.DropDownStyle = ComboBoxStyle.Simple
AddHandler ComboBox1.KeyDown, AddressOf Me.DesactivarTeclas
End Sub
Private Sub desproteger()
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
RemoveHandler ComboBox1.KeyDown, AddressOf Me.DesactivarTeclas
End Sub
Private Sub DesactivarTeclas(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)
e.SuppressKeyPress = True
End Sub
Típico listado de campos en columna, con una cabecera para cada columna y una línea de detalle por cada registro. También tenemos un ReportFooter con una firma. Queremos que si el detalle ocupa varias páginas la cabecera se repita en todas ellas. Sin problemas: creamos un PageHeader con nuestra cabecera de columnas.
El problema con este diseño viene cuando el reportFooter salta de página pero las líneas de detalle se quedan en la página anterior: tendremos una última página con el ReportFooter coronado con una bonita cabecera de columnas (el contenido del PageHeader) pero sin lineas de detalle.
Para solucionarlo hay que montarse una buena pajilla mental:
En el reportHeader poner esta fórmula oculta:
NumberVar x := 9999; //poner un número tan grande como el máx número de páginas previsto
NumberVar x;
If OnLastRecord and PageNumber < TotalPageCount Then x := PageNumber
NumberVar x;
PageNumber > x
Si queremos tener una imagen con enlace en una columna de un gridview y que el enlace dependa de un dato de nuestra base de datos, tenemos que añadir una columna TemplateField al gridview. Este TemplateField deberá contener un objeto HyperLink en el que definimos el enlace mediante una cadena de formato y en el que referenciamos el campo de la tabla (mediante {0}).
En la vista código veríamos algo parecido a lo siguiente :
<Columns>
...
<asp:TemplateField HeaderText="ImagenConEnlace">
<ItemTemplate>
<asp:HyperLink ID="HL_ImagenConEnlace" runat="server"
ImageUrl="~/carpeta1/imagenMostradaEnGridview.gif"
Text='texto_mostrado_cuando_el_raton_esta_sobre_la_imagen'
Target="_blank"
NavigateUrl='<%# Eval("nombre_campo_tabla", "~/carpeta2/{0}") %>'>
</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
(Análogamente, podemos hacer que la imágen mostrada dependa de un campo de la tabla empleando también una cadena de formato)
Para ello se utiliza una claúsula nueva de SQL SERVER 2005 para numerar las filas : ROW_NUMBER() OVER (ORDER BY campo)
Si queremos filtrar por el número de fila es necesario crear una tabla temporal mediante la instrucción : WITH tabla_temporal AS (sentencia SQL)
En el ejemplo siguiente creamos un procedimiento almacenado que tiene dos parámetros para indicar el rango de filas que queremos devolver.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[prueba]
@inicio INT,
@fin INT
AS
BEGIN
SET NOCOUNT ON;
WITH consultaTMP AS
(SELECT pro_id, ROW_NUMBER() OVER (ORDER BY pro_id) AS posicion
FROM dbo.provincias)
SELECT pro_id, posicion
FROM consultaTMP
WHERE posicion BETWEEN @inicio AND @fin
END
Cuando en una base de datos SQL Server se inserta un campo en un tabla de tipo int y se le especifica la propiedad indentidad a Sí, en ocasiones es necesario averiguar cuál fue el último valor.
Para ello, un ejemplo vale más que mil palabras.
Dim CadenaConexion As String
Dim cmd As SqlCommand
Dim x As Integer
Dim
cnn As SqlConnection = New SqlConnection()
Dim sqlStr As
String
CadenaConexion =
ConfigurationManager.ConnectionStrings("micadenilladeconexion").ConnectionString
cnn.ConnectionString
= CadenaConexion
sqlStr = "INSERT INTO PERSONA (Nombre) VALUES (@nombre);"
& _
"SELECT @UltimoId=SCOPE_IDENTITY() FROM PERSONA"
cmd = New
SqlCommand(sqlStr, cnn)
cmd.Parameters.Add("@nombre",
SqlDbType.NVarChar).Value = "Diego"
cmd.Parameters.Add("@UltimoId",
SqlDbType.Int).Direction =
ParameterDirection.Output
cnn.Open()
Try
cmd.ExecuteScalar()
x =
CType(cmd.Parameters("@UltimoId").Value, Integer)
Response.Write("VALOR
ULTIMO ID: " & x & " <==") Catch Excepcion As Exception Throw New Exception("Error al insertar datos", Excepcion) Finally cnn.Close() End Try
El escenario es el siguiente: tenemos una tabla t con un campo codOpe que es un código de operación y un campo infoOpe que es información sobre la operación. Ambos son varchar, pero sabemos que para un determinado valor de codOpe ('PR') el contenido de infoOpe siempre es numérico, sin excepciones, aunque para otros valores de codOpe no tiene porqué serlo.
Creamos una vista para explotar las operaciones de tipo 'PR':
create view opePR as
select to_number(infoOpe) as infoOpeNum from t
where codOpe='PR'
select * from opePR where infoOpeNum>100
ORA-01722: invalid number
select /*+ NO_MERGE(t) */
from opePR t where infoOpeNum>100
Si se te ocurre instalarte el VS2005 teniendo el Delphi 2005 instalado, la próxima vez que arranques tu Delphi te dará un bonito error diciendo que no puede cargar htmlhelp290.bpl. Pues bueno, que se quede sin cargar. Luego comprobarás que la consecuencia de este mensajito es que te deja de funcionar la ayuda. Vaya, pues había que cargarla.
La solución está en meterse en el registro de windows y:
En HKEY_CLASSES_ROOT\AppID\DExplore.exe, machacar el valor de la clave "AppId" poniendo
{4A79114D-19E4-11d3-B86B-00C04F79F802}
Lo que se pretende es poder llegar a dar formato a información usando una clase, que no instanciaremos.
Para ello se necesita que nos creemos en la carpeta App_Code de nuestro proyecto un archivo de clase que llamaremos Funciones.vb o lo que nos parezca.
El código de dicha clase:
Imports Microsoft.VisualBasic
Public Class Funciones
Public Shared Function FormatoCadena(ByVal Valor
As String, ByVal Formato As String) As String
Dim ValorFormato As
Double
Dim Cadena As String
ValorFormato = Valor
Cadena =
ValorFormato.ToString(Formato)
Return Cadena
End Function
End
Class
Funciones.FormatoCadena(Eval("Telefono1"), "### ## ## ##")
Como sabemos una de las maneras de que un procedimiento almacenado de SqlServer nos devuelva un valor (entero) es usando el RETURN:
CREATE PROCEDURE nombreProc
@Parametro nvarchar(50)
AS
BEGIN
IF EXISTS (SELECT Id from Tabla where campo=@Parametro)
begin
RETURN 1
end
else begin
RETURN 0
end
END
cmd.CommandType = Data.CommandType.StoredProcedure
cmd.CommandText = "nombreProc"
cmd.Parameters.Clear()
cmd.Parameters.Add(New SqlParameter("@Parametro", "valor"))
Dim retValue As New SqlParameter("@RETURN_VALUE", Data.SqlDbType.Int)
retValue.Direction = Data.ParameterDirection.ReturnValue
cmd.Parameters.Add(retValue)
cmd.ExecuteScalar()
Dim resultado As Integer = Convert.ToInt32(retValue.Value)
If resultado = 1 Then
...
...
Else
...
...
End If
Caso práctico: para cada fila de un GridView quieres poner un enlace/botón que realice cierta operación (llamémosle "pitufar") con el registro de esa fila. Sin problemas: editas las columnas del GridView y le metes un ButtonField con:
text="Pitufar"
CommandName="Pitufar"
If e.CommandName = "Pitufar" Then
GridView1.SelectedIndex = Convert.ToInt32(e.CommandArgument)
pitufeame(GridView1.SelectedValue)
GridView1.DataBind()
End If

Ejemplillo de cómo implementar un procedimiento almacenado con operaciones dentro de una transacción y controlar la excepción para tirar un rollback:
CREATE PROCEDURE nombreProcedimiento
@parametro1 bla, bla...
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
INSERT ...
UPDATE ...
(etc...)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
END
Lo que se pretende es poder tener un GridView pero que uno de los campos se comporte como un enlace, con la peculiaridad de que el valor que se mostrará será de un campo, y el valor al que enlazará será de otro.
Esto que en ASP 3.0 parecía sencillo en ASP.NET no es complejo, sólo es necesario conocer las propiedades que se han de tocar para esta acción. Aunque a mí me he llevado mi tiempo.
Primeramente se deberá disponer de un sqlDataSource u otro origen de datos similar y que esté correctamente configurado.
A continuación agregaremos un GridView y lo enlazaremos con el control sqlDataSource a través de la propiedad DataSourceId o usando la etiqueta inteligente del control GridView.
Una vez lo tengamos, deben de aparecer los campos en el GridView, y es momento de acceder a "Editar columnas ..." a través de la etiqueta inteligente del control GridView.
En la caja campos disponibles, agregaremos uno denominado "Campo HyperLink", y los valores que tocaremos serán:
-DataNavigateUrlFields: Será el campo que contiene el valor con el que pretendemos enlazar.
-DataTextField: Será el campo que contiene el valor que deseamos sea visto en el GridView.
-DataNavigateUrlFormatString: Será la que contenga el formato de cómo deberá se referenciará al campo contenido en DataNavigateUrlFields. Sería el caso de establecer la ruta relativa, o componer una dirección. Ejemplo: ../../Repositorio/{0}
{0}, sustituirá al valor del campo por cada registro de DataNavigateUrlFields.
Otros valores opcionales:
-SortExpresion: Se establecerá el campo por el que se ordenará la columna.
-Target: El modo en que se abrirá la ventana, en la misma ventana, una nueva, etc.
Nada más.
El control UploadFile nos permite subir ficheros del cliente al servidor de una manera pasmosamente fácil. Tan pasmosamente que si no se limita dicha subida las consecuencias, en forma de consumo de ancho de banda y de posibles problemas de seguridad, no tardarán en llegar.
En el artículo del FileUpload del MSDN se citan estrategias para asegurar tu subida de ficheros: de parte del cliente poner validadores sobre la extensión del fichero, y de parte del servidor comprobar el tamaño del archivo subido y su ContentType. El problema, como ellos mismos dicen, es que lo primero es demasiado vulnerable y lo segundo no te evita que el archivo viaje al servidor, en donde será rechazado si no cumple tu validación pero nadie te devolverá el ancho de banda consumido. Para evitar esta última situación, podemos limitar el tamaño máximo de transferencia de las páginas estableciendo el maxRequestLength en el web.config.
httpRuntime maxRequestLength="512"
Una bonita utilidad online que te genera y te permite descargar el favicon.ico partiendo de un gif, jpg, png, o bmp que pese menos de 150 kb.
Se puede use la Google Chart API para generar gráficas.
Más informacion en ...
http://www.tufuncion.com/graficas-php
Encriptar sección indicando la ruta física del web.config:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
aspnet_regiis -pef "Seccion" "RutaFisica"
aspnet_regiis -pe "Seccion" -app "RutaVirtual"