MyMsg( "No hay registros que cumplan con las condiciones de la seleción de datos" )
endif
ELSE...
----- Original Message -----From: ManuSent: Tuesday, May 22, 2007 7:03 PMSubject: Re: [eagle1] RE: [ query ] - No encuentra metodo RecCountMira la parte final...
He comentado los cambios. Si no lo entiendes me lo dices y ya dirás si
ya funciona ;-)
GoosFancito escribió:
>
> ok.
>
> Aca envio el metodo que utilizo para que me devuelve ese "select"
>
> Gracias.
>
>
> ----- Original Message -----
> *From:* Manu <mailto:manuexposito@terra.es >
> *To:* eagle1@yahoogroups.com <mailto:eagle1@yahoogroups.com >
> *Sent:* Tuesday, May 22, 2007 3:08 PM
> *Subject:* Re: [eagle1] RE: [ query ] - No encuentra metodo RecCount
>
> Ya sé Gustavo, pero aún así insisto que pongas un PRG donde se
> demuestre
> ese comportamiento ya que el objeto se debería crear siempre y co él
> todas sus datas y sus métodos...
>
> Si puedes adjuntas la sentencia para crear la tabla.
>
> GoosFancito escribió:
> >
> > Es muy sencillo.
> >
> > Crear la conexion.
> > Crear el select y cuando no devuelve nada ahi esta el error.
> >
> > En ese caso tube que hacer asi:
> >
> > Sabiendo que oQuery es el objeto:
> >
> > if oQuery == nil
> > ? "no devolvio datos"
> > endif
> >
> > ya que esto no funciona:
> >
> > if oQuery:RecCount() > 0
> > ? "No devolvio datos"
> > endif
> >
> >
> >
> >
> > ----- Original Message -----
> > *From:* loloexpo <mailto:manuexposito@terra.es
> <mailto:manuexposito%40terra. es>>
> > *To:* eagle1@yahoogroups.com <mailto:eagle1%40yahoogroups. com>
> <mailto:eagle1@yahoogroups.com <mailto:eagle1%40yahoogroups. com>>
> > *Sent:* Monday, May 21, 2007 6:48 PM
> > *Subject:* [eagle1] RE: [ query ] - No encuentra metodo RecCount
> >
> > Hola Gustavo... puedes enviar un PRG donde se vea el problema?
> >
> > --- En eagle1@yahoogroups.com <mailto:eagle1%40yahoogroups. com>
> <mailto:eagle1@yahoogroups.com <mailto:eagle1%40yahoogroups. com>>,
> > "GoosFancito" <goosfancito@...> escribió:
> > >
> > > Gente.
> > >
> > > De vuelta por estos pagos. Estoy teniendo un problema.
> > >
> > > Cuando realizo un query y no encuentra registros, el eagle "no me
> > crea el objeto"
> > > por ende cuando quiero llamar al metodo RecCount() no lo
> encuentra.
> > >
> > > Como lo soluciono?
> > >
> > > Gracias,.
> > >
> >
> >
> >
> > __________ Información de NOD32, revisión 2284 (20070522) __________
> >
> > Este mensaje ha sido analizado con NOD32 antivirus system
> > http://www.nod32.com <http://www.nod32.com >
>
>
>
> __________ Información de NOD32, revisión 2285 (20070522) __________
>
> Este mensaje ha sido analizado con NOD32 antivirus system
> http://www.nod32.com
METHOD LeerTabla( aSelect, aJoin, aWhere, uOrden, nLimit, lAND, lContieneCadena ) CLASS TConexion
LOCAL cTabla := "", ;
cSelect := "", ;
cJoin := "", ;
cWhere := "", ;
cQuery := "", ;
cParte := "", ;
cNuevaRelacion := "", ;
cConectorLogico := "", ;
xElemento
LOCAL oQueryLocal, ;
nItem := 0, ;
lResultado := .T.
DEFAULT lAND := .T., ;
lContieneCadena := .F.
::nError:= 0
//----------( CREA EL SELECT )----------
AEval( aSelect, { | xElemento | cSelect += Lower( xElemento ) + ", " } )
cSelect:= Left( cSelect, Len( cSelect ) - 2 )
cTabla := " FROM " + Left( cSelect, At( ".", cSelect ) - 1 ) + " "
cSelect := "SELECT " + cSelect
//----------( Crea el Join )----------
IF aJoin != NIL
FOR EACH xElemento IN aJoin
// Tomo la parte despues del =
// para en el proximo paso tomar lo que esta antes del punto
// y obtener en nombre de la tabla con que se va a relacionar
cParte:= Lower( SubStr( xElemento, At( "=", xElemento ) + 1 ) )
// ahora necesito tener lo que está antes del punto asi
// lo tomo como "tabla que va a relacionarse"
cParte:= AllTrim( SubStr( cParte, 1, At( ".", cParte ) - 1 ) )
IF Empty( cNuevaRelacion )
cNuevaRelacion:= cParte
// Armo el join Hasta aca
cJoin += "LEFT JOIN " + cParte + " ON " + xElemento + " "
ELSE
IF cNuevaRelacion == cParte
cJoin += " and " + xElemento
ELSE
// Armo el join Hasta aca
cJoin += " LEFT JOIN " + cParte + " ON " + xElemento + " "
cNuevaRelacion:= cParte
ENDIF
ENDIF
NEXT
#ifdef __CQUERY__
VIEW cJoin
#endif
ENDIF
//----------( Crea el WHERE )----------
IF aWhere != NIL
cWhere:= " WHERE "
FOR EACH xElemento IN aWhere
IF lContieneCadena = .F.
IF ValType( xElemento[2] ) = "N"
cWhere += xElemento[1] + "= '" + AllTrim( Str( xElemento[2] ) ) + cConectorLogico
ELSE
cWhere += xElemento[1] + "= '" + xElemento[2] + cConectorLogico
ENDIF
ELSE
IF ValType( xElemento[2] ) = "N"
cWhere += xElemento[1] + " LIKE '" + AllTrim( Str( xElemento[2] ) ) + "%'" + cConectorLogico
ELSE
cWhere += xElemento[1] + " LIKE '"+ xElemento[2] + "%'" + cConectorLogico
ENDIF
ENDIF
NEXT
cWhere:= Left( cWhere, Len( cWhere ) - Len( cConectorLogico ) + 1 )
#ifdef __CQUERY__
VIEW cWhere
#endif
ENDIF
//----------( se crea la cadena QUERY )----------
cQuery:= cSelect + cTabla + cJoin + cWhere
IF nLimit == NIL
oQueryLocal:= TMSQuery():New( ::oConexion )
oQueryLocal:SetReadPADAll( .T. )
IF lContieneCadena
cQuery:= Left( cQuery, Len( cQuery ) - 1 )
ENDIF
IF !( oQueryLocal:Open( cQuery + ' ORDER BY 1 DESC ' ) )
::nError:= 4 // El select esta bien, pero no devolvio datos
RETURN ( NIL )
ELSE
IF oQueryLocal:RecCount() == 0
::uUltimoCampoClave:= NIL
ELSE
::uUltimoCampoClave:= oQueryLocal:FieldGet( 1 )
ENDIF
// oQueryLocal:close() // <---------------------------- Para reciclar el objeto
ENDIF
ENDIF
IF uOrden != NIL
IF ValType( uOrden ) $ "CN"
cQuery += ' ORDER BY '
IF ValType( uOrden )== "N"
uOrden := StrNum( uOrden ) // StrNum es -> AllTrim( Str( n ) )
ENDIF
cQuery += uOrden
ENDIF
ENDIF
IF nLimit != NIL
cQuery += " LIMIT " + StrNum( nLimit )
ENDIF
IF ValType( oQueryLocal ) != "O"
// Si existe porque lo reciclamos no hace falta volverlo a crear
oQueryLocal:= TMSQuery():New( ::oConexion )
oQueryLocal:SetReadPADAll( .T. )
ENDIF
// Quito esto porque no sé exactamente qué hace esta función por dentro :-)
// msgrun( "Accediendo a los datos...", ".:::. Espere .::.", { || lResultado:= oQueryLocal:Open( cQuery ) } )
lResultado:= oQueryLocal:Open( cQuery )
IF lResultado
// Esta comprobación la haría yo en la funcion que llame a este método "LeerTabla"
IF oQuerylocal:RecCount() < 1
MyMsg( "No hay registros que cumplan con las condiciones de la seleción de datos" )
endif
ELSE
MyMsg( "Error al abrir el conjunto de resultados" )
oQueryLocal:Close() // <----------------- Yo quitarí esto
RETURN ( nil ) // <----------------- Lo dejo por coherencia con tu método
ENDIF
/*
// Aca es donde deberia de crear igual el objeto, asi no encuentre datos el select
::nError:= 4 // No hay datos para devolver
RETURN ( nil )
ENDIF
*/
RETURN ( oQueryLocal ) // Me imagino que tendrás en cuenta que este método pude devolver NIL o un objeto TMSQuery