sábado, 29 de noviembre de 2008

GridView no carga los datos desde un IList

 
Posted by Picasa


Estoy trantando de mostrar un resultado en un GridView obtenidos con Nhibernate desde una Base SQL 2005 Express y solo me aparecen las columnas como: Lenght, LongLength, Rank, IsReadOnly, IsFixedSize, IsSynchronized. Cuando hago la consulta a una sola tabla me funciona pero cuando trato de hacer un Inner Join o consultar las dos tablas me muestra las columnas antes mencionadas.

La consulta que hago es la siguiente:

public IList getContactos()
{
ISession session =
NHibernateSessionFactory.GetCurrentSession();

IQuery query = session.CreateQuery("from Contacto as c , Persona as p where c.Id_Per=p.Id_Per");
return query.List();

}

Para luego mostrar los datos en el GridView de la siguiente manera:

private void setContactos() {
Contacto cCon = new Contacto();

gdvContactos.DataSource=cCon.getContactos();
gdvContactos.DataBind();
}

Los mapeos son:

Contacto

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id_Con" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Per" type="Int32">
<column name="Id_Per" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="property" >
<column name="Fecha_Con" sql-type="datetime" />
</property>
<property name="Observacion_Con" type="String" access="property">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="property">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="property">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>

<many-to-one name="Persona" class="crmos.Bo.Persona, crmos.Bo">
<column name="Id_Per" length="4" sql-type="int" not-null="false"/>
</many-to-one>

<bag name="Contactos" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="Id_Per"/>
<one-to-many class="crmos.Bo.Persona, crmos.Bo"/>
</bag>

</class>
</hibernate-mapping>

Persona

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

<class name="crmos.Bo.Persona, crmos.Bo" table="Persona">
<id name="Id_Per" type="Int32" unsaved-value="null">
<column name="Id_Per" length="4" sql-type="int" not-null="true" unique="true" index="PK_Persona"/>
<generator class="native" />
</id>
<property name="Nombres_Per" type="String">
<column name="Nombres_Per" length="50" sql-type="varchar" not-null="false"/>
</property>
<property name="ApellidoPaterno_Per" type="String">
<column name="ApellidoPaterno_Per" length="15" sql-type="varchar" not-null="false"/>
</property>
<property name="ApellidoMaterno_Per" type="String">
<column name="ApellidoMaterno_Per" length="15" sql-type="varchar" not-null="false"/>
</property>
<property name="Email_Per" type="String">
<column name="Email_Per" length="100" sql-type="varchar" not-null="false"/>
</property>


<bag name="Contactos" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="Id_Per"/>
<one-to-many class="crmos.Bo.Contacto, crmos.Bo"/>
</bag>
</class>
</hibernate-mapping>

Ya me estoy dando por vencido, asi que solicitaré ayuda en los foros de NHibernate y postearé la solución. O si alguien ya ha pasado por esta ....

El código completo del proyecto se puede descargar desde:
http://code.google.com/p/crmos/downloads/list

viernes, 21 de noviembre de 2008

Compiler Error CS0542

Como si fuera poco (el inicio en NHibernate ha sido empinado) me aparecio este error en la clase Contacto del CRMOS. Por un lado NHibernate dice lo siguiente:

Could not find a getter for property 'Contacto' in class 'crmos.Bo.Contacto

Lo cual significa que tengo que agregar las siguientes lineas de código a Contacto.cs:

protected Contacto _contacto;
public virtual Contacto Contacto
{
get { return _contacto; }
set { _contacto = value; }
}

Por otro lado al compilar las clases el compilador de .Net dice:

'Contacto': los nombres de los miembros no pueden coincidir con sus tipos envolventes (CS0542) - C:\Inetpub\wwwroot\crmos.Bo\Contacto.cs:52,26

En los foros mientras unos dicen que las herramientas de Microsoft tienen errores otros dicen que se debe saber trabajar con Indexers. OK manos a la obra ¿Como se trabaja con Indexers?

Nota: Este post queda abierto hasta que lo solucione y lo postee la solución si alguien quiere ayudar, bienvenido....

jueves, 13 de noviembre de 2008

Intersquash - Optimiza tu blog para el IPhone

Si bien es cierto puedes navegar gran cantidad de sitios en relativa comodidad desde el IPhone, creo que lo ideal es navegar sitios adaptados especificamente para el dispositivo. Navegar es mas comodo en estos casos.

Ya hay iniciativas para crear sitios adaptados como librerias y este sitio Intersquash que genera a partir de el rss de tu sitio o blog una versión para el iphone. Probé ingresando los rss de mi otro sitio hecho con Wordpress y la página principal se creo sin problemas pero al hacer click e ir al enlace este aparecia cortado y los enlaces como texto plano. Lógico, porque el rss esta cortado y los enlaces como texto plano. Lo que me hace pensar que generar una versión para el IPhone desde el rss no es viable. Y hacerlo con un css desde la fuente original de datos es lo mas aconsejable.

Otra iniciativa que va un poco en esta dirección es iUI que es una librería que entre otras cosas sirve para crear menus de navegación. He realizado pruebas con esta librería las cuales posteare con un poco mas de tiempo.

martes, 11 de noviembre de 2008

QR Codes en IPhone

Los QR Codes son super conocidos y utilizados en Japón. Se trata de un sistema para almacenar información en una matriz de puntos o un código de barras bidimensional.

Los usos practicos son por ejemplo, la administración de inventarios.

Lo que es revolucionario es que estos codigos se pueden leer desde dispositivos moviles. Y debido a esto se han integrado nuevos usos como son, una tarjeta de presentación con QR de forma que no sea necesario estar digitando uno a uno los datos de la persona, entre otros.

Mas información en Wikipedia.

Estos codigos se pueden leer desde el IPhone con programas como DataMatrix (Free) y 2D Sense (Free).

Tambien quisiera dejar un link a una red social en torno a esta tecnología:
http://2dcode.ning.com/

En la práctica

Instale el programa 2d Sense en mi iphone.
Luego genere un código que contiene un link al sitio www.marcosdonoso.cl en la página: http://omarabid.com/barcode/index.php
luego desde el programa 2D Sense le saque una foto al código (en la pantalla del notebook). Y el Safari lanzo una solicitud de conexión a www.marcosdonoso.cl, lo cual acepte.

El codigo generado es este:

lunes, 10 de noviembre de 2008

Nueva entrega de CRMOS

Este blog por si se habran dado cuenta es medio desordenado. La finalidad es que es como un taller, donde voy colocando rapidamente mi experiencia en los desarrollos que estoy realizando. Por eso no me aplico mucho a que la redacción quede perfecta. Lo que me importa es que si coloco un tip o la solución de un error esto pueda ser fácilmente ententido y aplicado por ustedes quienes me visitan. Sino, pueden dejar un comentario para mejorar el post, cosa que haré.

El motivo de este post es comunicar que he dejado una nueva versión del código fuente de CRMOS, en http://code.google.com/p/crmos/downloads/list el archivo a descargar tiene que ser crmos_20081110.rar, el numero indica la fecha 10/11/2008.

Esta entrega le falta mucho,  por lo que si tienes ganas de participar en un proyecto Open Soure te dejo extendida la invitación  a participar. Solo tienes que enviar un e-mail, o registrarte en www.elforo.cl y hacer tus consultas y sugerencias sobre el proyecto. 

domingo, 9 de noviembre de 2008

could not resolve property: Id_Per

En NHibernate lo que manda a grandes rasgos es el maping y si ocurre este error es probable que la propiedad por la que ocurre el error no esta en el mapping, por ejemplo:

En el archivo con error falta la propiedad Id_Per.

Archivo con error:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id_Con" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="property" >
<column name="Fecha_Con" sql-type="datetime" />
</property>
<property name="Observacion_Con" type="String" access="property">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="property">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="property">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>

</class>
</hibernate-mapping>

Archivo correcto
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id_Con" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Per" type="Int32">
<column name="Id_Per" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="property" >
<column name="Fecha_Con" sql-type="datetime" />
</property>
<property name="Observacion_Con" type="String" access="property">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="property">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="property">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>

</class>
</hibernate-mapping>

Could not find field 'Fecha_Con' in class 'crmos.Bo.Contacto'

Tube este error en el proyecto CRMOS y solucione cambiando  la propiedad access de field a property.

Código con error:
&lt:property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" sql-type="datetime" />
</property>

Corregido
&lt:property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" sql-type="datetime" />
</property>

Could not find a getter for property

Estube con este error n días hasta que descubrí cual era la razón. ¿De que estamos hablando? Del proyecto CRMOS con NHibernate. Tengo una clase que es Contacto:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="crmos.Bo.Contacto, crmos.Bo" table="Contacto">
<id name="Id" type="Int32" unsaved-value="null">
<column name="Id_Con" length="4" sql-type="int" not-null="true" unique="true" index="PK_Contacto"/>
<generator class="native" />
</id>
<property name="Id_Cti" type="Int32">
<column name="Id_Cti" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Fecha_Con" type="DateTime" access="field" >
<column name="Fecha_Con" length="8" sql-type="datetime" not-null="false"/>
</property>
<property name="Observacion_Con" type="String" access="field">
<column name="Observacion_Con" length="16" sql-type="text" not-null="false"/>
</property>
<property name="Estado_Est" type="Int32" access="field">
<column name="Estado_Est" length="4" sql-type="int" not-null="false"/>
</property>
<property name="Id_Ven" type="Int32" access="field">
<column name="Id_Ven" length="4" sql-type="int" not-null="false"/>
</property>
    
</class>
</hibernate-mapping>

y la clase que estaba implementando tenia campos como:
xId_Con, xId_Cti, etc. Ejemplo:

public virtual int xId_Con{ 
 get {return Id_Con;} set {Id_Con=value;}}

 public virtual int xId_Per{ 
 get {return xId_Per;} set {xId_Per=value;}}
 public virtual int Id_Cti{ 
 get {return Id_Cti;} set {Id_Cti=value;}}
 public virtual DateTime xFecha_Con{ 
 get {return Fecha_Con;} set {Fecha_Con=value;}}
 public virtual string xObservacion_Con{ 
 get {return Observacion_Con;} set {Observacion_Con=value;}}
 public virtual int xEstado_Est{ 
 get {return Estado_Est;} set {Estado_Est=value;}}
 public virtual int xId_Ven{ 
 get {return Id_Ven;} set {Id_Ven=value;}} 


La solución es que si tengo mapeada una propieda Id_Con, Id_Per, etc. Esos es lo que tiene que estar en la clase. Ejemplo (el siguiente código es correcto)

public virtual int Id_Con{ 
 get {return xId_Con;} set {xId_Con=value;}}

 public virtual int Id_Per{ 
 get {return xId_Per;} set {xId_Per=value;}}
 public virtual int Id_Cti{ 
 get {return xId_Cti;} set {xId_Cti=value;}}
 public virtual DateTime Fecha_Con{ 
 get {return xFecha_Con;} set {xFecha_Con=value;}}
 public virtual string Observacion_Con{ 
 get {return xObservacion_Con;} set {xObservacion_Con=value;}}
 public virtual int Estado_Est{ 
 get {return xEstado_Est;} set {xEstado_Est=value;}}
 public virtual int Id_Ven{ 
 get {return xId_Ven;} set {xId_Ven=value;}}

sábado, 8 de noviembre de 2008

de MS SQL 2005 a MS SQL 2000

Probablemente mas de alguno ha intentado migrar una base de datos de SQL 2005 a la versión 2000 a travez de un script del asistente para secuencia de comandos del Magament Studio. Bueno,  lo siguiente es que cuando intentas correr el script en SQL 2000 te da errores.

Para exportar correctamente es posible indicar al asistente de SQL 2005 la versión.
El flujo es:
Seleccionar Base de datos -> 
Elegir opciones de secuencia de comandos, en esta ventana debes buscar la linea Secuencia de comando para versión del servidor y elijes SQL Server 2000.

Error '3622' en tiempo de ejecución:

Siguiendo con el proyectito retro de migrar una aplicación VB6 y Access a SQL. Intente conectarme  a la misma base pero en SQL 2005 Express y me aparecio el siguiente error:

Error '3622' en tiempo de ejecución:

Debe usar la opción dbSeeChanges con OpenRecordset al tener 
acceso a una tabla de SQLServer que tenga una columna IDENTITY.

El cual solucione agregando lo siguiente cuando abro el recordset:

Set rsTmp=gdbCurrentDB.OpenRecordset(rName,dbOpenDynaset, dbSeeChanges)

funciono perfectamente.
La solución la obtuve en el siguiente link: