He aquí un compilado de sitios útiles donde se pueden encontrar plantillas de diseño para ASP.NET y algunas cosas más:

Design Templates (MSDN): http://msdn.microsoft.com/en-us/asp.net/aa336613.aspx

Otros sitios con recursos para ASP.NET, WordPress, etc.:

Free Design Templates: http://www.smashingmagazine.com/2007/02/14/free-design-templates/

TemplateMonster: http://www.templatemonster.com/

Open Design Community: http://www.opendesigns.org/

Virtual Promote: http://www.freesitetemplates.com/

TemplatesBox: http://www.templatesbox.com/

Más orientados al diseñador gráfico:

Cool Home Pages: http://www.coolhomepages.com/

Dealer Templates: http://www.dealertemplates.com/

Bancos de imágenes:

Gettyimages: http://www.gettyimages.com/

ImageBank: http://imagebank.org.uk/

Algo para recordar. Para acceder al SQL Server de una PC Host desde una máquina virtual hay que:

  • Deshabilitar el firewall de Windows XP (o cualquier otro que sea) en el HOST.
  • Deshabilitar el cliente del ISA Server de la máquina virtual.

Lo primero que debemos hacer para poder imprimir reportes de CR12 desde VB5/6 es tener bien referenciado el producto. Para esto debemos agregar en las Referencias (ProyectàReferences) las siguientes referencias:

·          Crystal Reports ActiveX Designer Design and Runtime Library 12.0  (si no esta en la lista, se puede agregar desde “C:\Program Files\Business Objects\BusinessObjects Enterprise 12.0\win32_x86\craxddrt.dll”

·         Crystal ActiveX Reports Viewer Library 12.0

Y también agregar el componente:

·         Crystal ActiveX Report Viewer Library 12.0

Para poder mostrar el reporte por pantalla.

Luego, procedemos de la siguiente manera:

Private Sub Imprimir()

‘ Objetos CR 2008
Dim crApp           As New CRAXDDRT.Application
Dim crReport        As New CRAXDDRT.Report
Dim crParamDefs     As New CRAXDDRT.ParameterValueInfos
Dim crParamDef      As New CRAXDDRT.ParameterValueInfo

 Dim crParamDefs     As CRAXDDRT.ParameterFieldDefinitions
 Dim crParamDef      As CRAXDDRT.ParameterFieldDefinition
 Dim x               As Integer
 Dim intPosicion     As Integer
 Dim strNombreParam  As String
 Dim resultado       As String

On Error GoTo Imprimir_EH
x = 0
  ‘Abrir el reporte
Screen.MousePointer = vbHourglass
mflgContinuar = True
Set crReport = crApp.OpenReport(Me.ReportFileName, 1)

‘ Pasa Parametros del reporte
Set crParamDefs = crReport.ParameterFields
For Each crParamDef In crParamDefs
intPosicion = buscarValor(crParamDef.ParameterFieldName)
Select Case crParamDef.ValueType
    Case 7
         crParamDef.AddCurrentValue (CInt(ParametroValor(intPosicion)))
    Case 12
         crParamDef.AddCurrentValue (CStr(ParametroValor(intPosicion)))
    Case 16
         crParamDef.AddCurrentValue (CDate(ParametroValor(intPosicion)))
End Select
 Next

‘ Valida si muestra vista previa o imprime directamente
If UCase(strShowPreview) = “S” Then
     ‘ Setea variables del Viewer
     Me.Caption = strWindowTitle
     CRViewer.ReportSource = crReport
     CRViewer.DisplayGroupTree = False
     CRViewer.ViewReport
     Me.Show
Else
     crReport.ReadRecords
     crReport.PrintOut
End If

Screen.MousePointer = vbDefault
Set crParamDefs = Nothing
Set crParamDef = Nothing

Exit Sub

Imprimir_EH:
If
Err.Number = -2147206461 Then
      MsgBox “El archivo de reporte no se encuentra, restáurelo de los discos de instalación”, vbCritical, vbOKOnly
Else
      MsgBox
“Error inesperado: ” & Err.Description, vbCritical + vbOKOnly
End If
mflgContinuar = False
Screen.MousePointer = vbDefault
Set
crParamDefs = Nothing
Set
crParamDef = Nothing

End Sub

Tarde o temprano, quienes hemos desarrollado soluciones con paquetes de DTS, sobre versiones de SQL Server 2000 o anteriores, debemos considerar la conveniencia de “convertir” los paquetes DTS a los servicios de integración de datos (ETL) que vienen incluidos en las nuevas versiones de SQL Server.

Las opciones son las siguientes:
- Seguir trabajando con paquetes DTS, para esto se debe instalar el DTS runtime para SQL Server 2008 que sólo funciona en la versión de 32 bits.
- Convertir los paquetes DTS a Integration Services, obteniendo mejoras de performance considerables.

Para ver más detalle de cómo implementar estas opciones en SQL Server 2008 les recomiendo ingresar a Migrating DTS Packages to Integration Services.

Para emitir reportes de Crystal Reports con XML primero hay que poder llevar la info que necesitamos a un archivo XML preferentemente con su esquema incluído en el mismo XML.
Eso lo hacemos del siguiente modo:

StringWriter sw = new StringWriter();
DataTable dt = SQLHelper.getDataTableFromInformix(“execute procedure sp_cons_imppag_cta(“ + nro_cuenta + “,” + cantidad + “)”, “Informix”);
dt.TableName =
“DetallePagos”;
dt.WriteXml(sw,
XmlWriteMode.WriteSchema);
//dt.WriteXml(@”C:\xml\detallepagos.xml”, XmlWriteMode.WriteSchema);
return sw.ToString();

La línea comentada sirve para grabar el XML en disco y poder usarlo para diseñar el reporte con Crystal.

Ahora que tenemos el XML y la forma de crearlo dinámicamente, faltaría ver cómo consumir ese XML, es decir, cómo pasárselo a Crystal para que procese la salida impresa:

CrystalReportSource1.Report.FileName = ConfigurationManager.AppSettings["PathCommons"] + “\\Reportes\\Socios\\ResumenCtaDetalle.rpt”;    
ReportDocument
CR = CrystalReportSource1.ReportDocument;
DataSet ds = new DataSet();
string resultado = AppResumenCuenta.getXMLByNroDoc(nroCuenta, vencimiento);
StringReader sr = new StringReader (resultado);
ds.ReadXml(sr);

CR.Database.Tables[0].SetDataSource(ds);

Para completar este ejemplo, mostramos cómo hacer para que la salida de Crystal Report se muestre del lado del cliente directamente en formato pdf:

 

MemoryStream oStream; // using System.IO
oStream = (MemoryStream)CrystalReportSource1.ReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);
Response.Clear();
Response.Buffer =
true;
Response.ContentType =
“application/pdf”;
Response.BinaryWrite(oStream.ToArray());
Response.End();

 

Si bien parece fácil y hay mucha info sobre el tema, para encriptar secciones del web.config se deben tener en cuenta unas cuantas cosas como ser: tiene que existir un repositorio de certificados en el servidor, el usuario que encripta tiene que ser el mismo que luego ejecuta la aplicación. Para no agregar más teoría e ir directametne al grano aquí va una secuencia de pasos que está probado que funciona, con algunos comentarios intercalados.

IMPERSONAR!
———–
runas /user:WSComercios cmd
REPARAR INSTALACION!
——————–
Para reparar el IIS:

aspnet_regiis.exe /i

 

PERMITIR AL USUARIO ACCESO A LA BASE DE DATOS DEL IIS!
——————————————————
Garantizo el acceso a cada usuario (definido en el AppPool de cada web)

aspnet_regiis.exe -ga WSSocios
aspnet_regiis.exe -ga WSComercios
aspnet_regiis.exe -ga WSEstudios
CREAR UN CONTENEDOR DE CLAVES
—————————–
El nombre “NetFrameworkConfigurationKey” se define en el machine.config. Es el nombre por default.
Se recomienda cambiar el nombre del contenedor de claves para poner en producción.
Si ya existe el contenedor no pasa nada.

aspnet_regiis -pc “NetFrameworkConfigurationKey” -exp

CONFIGURAR EL web.config DE CADA APLICACIÓN
——————————————-
En el web.config de cada aplicación debe tener la siguiente sección (copiar y pegar).
Ojo que el NAME lo voy a usar más abajo para encriptar.

 <configProtectedData>
  <providers>
   <add name=”WSSociosRSAProtectedConfigurationprovider” keyContainerName=”NetFrameworkConfigurationKey” useMachineContainer=”false” description=”Uses RsaCryptoServiceProvider to encrypt and decrypt” type=”System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”/>
  </providers>
 </configProtectedData>
DAR ACCESO AL CONTENEDOR DE CLAVES (Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
———————————-
OJO: hay que ejecutar cada comando impersonando al usuario al que quiero otorgar acceso.

runas /user:WSSocios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSSocios”

runas /user:WSComercios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSComercios”

runas /user:WSEstudios cmd
aspnet_regiis -pa “NetFrameworkConfigurationKey” “WSEstudios”
Los pasos de arriba se hacen solo una vez.
Luego se procede a solamente encriptar o desencriptar. :)

ENCRIPTAR!(Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
———-
OJO: hay que ejecutar cada comando impersonando al usuario del  App Pool de cada web.

runas /user:WSSocios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSSocios” -prov “WSSociosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSSocios” -prov “WSSociosRSAProtectedConfigurationprovider”

runas /user:WSComercios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSComercios” -prov “WSComerciosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSComercios” -prov “WSComerciosRSAProtectedConfigurationprovider”

runas /user:WSEstudios cmd
aspnet_regiis.exe -pe “connectionStrings” -app “/WSEstudios” -prov “WSEstudiosRSAProtectedConfigurationprovider”
aspnet_regiis.exe -pe “appSettings” -app “/WSEstudios ” -prov “WSEstudiosRSAProtectedConfigurationprovider”
DESENCRIPTAR!(Debe ser con el comando RUNAS, si se encripta comercio entonces runas /user:WSComercios cmd)
————-
runas /user:WSSocios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSSocios”
aspnet_regiis.exe -pd “appSettings” -app “/WSSocios”
runas /user:WSComercios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSComercios”
aspnet_regiis.exe -pd “appSettings” -app “/WSComercios”
runas /user:WSEstudios cmd
aspnet_regiis.exe -pd “connectionStrings” -app “/WSEstudios”
aspnet_regiis.exe -pd “appSettings” -app “/WSEstudios”

Hay ocasiones en donde conviene enviar la salida de un reporte directamente a PDF, del lado del cliente en una aplicación web. De esta manera nos evitamos tener que instalar componentes del lado del cliente, por ejemplo, el CrystalViewer o fonts para la impresión de códigos de barras.

Aquí transcribo como ejemplo un fragmento de programa escrito en C#:

using  CrystalDecisions.CrystalReports.Engine;
using  CrystalDecisions.Shared;
using System.Configuration;
using  System.IO;

int nroCuenta = Convert.ToInt32(Request.QueryString["cuenta"]);
string vencimiento = Request.QueryString["vencimiento"];

CrystalReportSource1.Report.FileName = ConfigurationManager.AppSettings["PathCommons"] + “\\Reportes\\Socios\\ResumenCtaDetalle.rpt”; 
ReportDocument
CR = CrystalReportSource1.ReportDocument;
DataSet ds = new DataSet();
string resultado = AppResumenCuenta.getXMLByNroDoc(nroCuenta, vencimiento);
StringReader sr = new StringReader(resultado);
ds.ReadXml(sr);

CR.Database.Tables[0].SetDataSource(ds);

MemoryStream oStream; // using System.IO
oStream = (MemoryStream)CrystalReportSource1.ReportDocument.ExportToStream(ExportFormatType.PortableDocFormat);
Response.Clear();
Response.Buffer =
true;
Response.ContentType =
“application/pdf”;

El siguiente error ocurre en algunas instalaciones de Windows XP SP2.
El Visor de Sucesos muestra:
El servicio Servicio de transferencia inteligente en segundo plano terminó con el error específico de servicio 2147500053 (0×80004015).

 

Se solucionó ejecutando lo siguiente desde la línea de comandos:
sc.exe config bits start= auto sc.exe sdset bits D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU) sc.exe start bits

Hay ocasiones en que debemos mantener una página constantemente refrescándose, para actualizar los datos de la misma o por diferentes motivos.
Para esto, solo tenemos que insertar el siguiente código en la página web:
<meta http-equiv=’refresh’ content=’40′ />
donde content es el tiempo en segundos que demorara en refrescar.
En cambio, si queremos que luego de un tiempo abra otra página, debemos agregarle el parámetro url, de la siguiente manera:
<meta http-equiv=’refresh’ content=’40′ URL=http://www.nombredelapagina.com/>.

Si lo que queremos es crear un botón que refresque la pagina, solo debemos escribir en el OnClick “location.refresh()”.

Al momento de utilizar estas dos variables del lenguaje al mismo tiempo, nos pasa que una “pisa” a la otra. Es decir, si ejecuto un UPDATE y quiero saber la cantidad de filas modificadas con @@RowCount y más abajo quiero capturar el error (si lo hubiera), el @@Error tomaria el error de la asignacion del @@RowCount a una variable. Ej.:

Declare @NumeroError int
Declare @Modif int

UPDATE  Clientes
SET 
      Codigo = TMP.Cod_Cte,
      Descripcion = TMP.Nom_Ent

FROM T_NvosCtes TMP
INNER  JOIN Clientes Cte ON  Cte.Codigo = TMP.Cod_Cte

SET @Modif = @@RowCount
SET @NumeroError = @@Error

Al hacer el primer select (el de filas modoficadas) ya el @@Error captura esta asignación y debolvera siempre 0 ya que no hubo error en la asignación.

Para resolver esto cambiamos la forma de asignar los valores a las variables, utilizando un SELECT:

Select @Altas = @@RowCount
@NumeroError = @@Error

Entradas siguientes »