ADS - recno() con query SQL SOLUCIONADO

ADS - recno() con query SQL SOLUCIONADO

Postby rolando » Mon Sep 20, 2010 9:17 pm

Buenas tardes,

Necesito saber si es posible usando ADS Server, implementar un query que me devuelva el recno() de cada registro que cumpla la condición de un select where.

Gracias.

Rolando :D
Last edited by rolando on Fri Sep 24, 2010 12:52 am, edited 1 time in total.
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL

Postby Marcelo Via Giglio » Tue Sep 21, 2010 2:57 am

Rolando,

de memoria de contesto, no lo he probado, pero si la consulta SQL no implica un JOIN, es decir que solo seria de una tabla,
no veo por que no el RECNO() no te devuelva el valor correcto, es decir el numero de registro fisico

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1058
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: ADS - recno() con query SQL

Postby rolando » Tue Sep 21, 2010 11:33 am

Marcelo,

Gracias por responder pero te pediría me pongas un ejemplo ya que no lo he podido lograr.

Obvio que el recno() del "Alias" resultante del query lo puedo visualizar pero lo que me interesa es tener en ese "Alias" resultante, el recno() original del registro de la DBF a la que se le hace el query.

Por favor publica un ejemplo de como puedo lograrlo.

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL

Postby Marcelo Via Giglio » Tue Sep 21, 2010 12:16 pm

Hola,

bueno si no estuvo claro, espero que este ejemplo si (el customer.dbf es el de siempre)

Code: Select all  Expand view

#include "fivewin.ch"
#include "ads.ch"


FUNCTION main()
LOCAL cAlias := "sql", cRec := ""

    rddRegister( "ADS", 1 )
    rddsetdefault( "ADS" )

    AdsSetFileType( ADS_CDX )
   
    SET SERVER LOCAL
    adsConnect(".")

    adsRightsCheck( .F. )
 
    //ADSSETDATEFORMAT("DD/MM/YYYY")

    SELECT 0
    ADSCreateSQLStatement( cAlias, 2 )
    ADSPREPARESQL( "select * from customer where state = 'NY'" )
    ADSEXECUTESQL()
 
    ? (cAlias) -> ( lastrec() )
    (cAlias) -> ( DBGOTOP() )
    DO WHILE ! (cALias) -> ( EOF() )
       cRec += STR( (cAlias)->(RECNO()) )    
       (cAlias) -> ( DBSKIP() )
    ENDDO

    ? cRec

    BROWSE()

    DBCLOSEALL()


return NIL

 
Marcelo Via Giglio
 
Posts: 1058
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: ADS - recno() con query SQL

Postby rolando » Tue Sep 21, 2010 2:34 pm

Marcelo,

Lo que propones entrega el recno() del cAlias que es la DBF "virtual" que crea el query, es decir que si hago una consulta a una DBF con 40000 registros y encuentra dos coincidencias solamente, el cAlias->recno() va a dar valores 1 ó 2 y eso no me sirve.

Como expliqué antes, lo que necesito son los recno() que tenían esos registros en los que se encontró lo buscado pero en la DBF de los 40000 registros.

Por ej. busco "TALLER" y lo encontró en el registro 4000 y 35000. Esos recno() son los que quiero guardar en la consulta.

Saludos

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL

Postby Marcelo Via Giglio » Tue Sep 21, 2010 3:08 pm

Rolando,

no se si hiciste correr o no el ejemplo que publique con el DBF customer.dbf, este DBF tiene cientos de registros y la consulta solo devuelve 13 y los recno de estos trece se imprimen, y si tu tuvieras razon (no la tienes), lo que se deberia ver son los registros 1,2,3...13, pero no es asi, corre el ejemplo.

Ahora como dije en el primer post, si la consulta SQL solo es sobre una tabla (DBF,ADT) el resultado lo dara en un cursor dinamico, que es simplemente la misma tabla pero con un filtro aplicado, es decir no hay una DBF virtual, por lo que el recno() alli, devolvera el numero de registro fisico. Otra cosa importante, al ser un cursor dinamico, inclusive podrias cambiar informacion sobre este y este cambio se reflejara en la tabla, ya que es un subconjunto de la misma con un filtro aplicado.

Ahora si la consulta implica mas de una tabla, alli si, el cursor es estatico y obviamente lo descrito anteriormente no pasara.

Espero ser mas claro ahora, por favor corre el ejemplo y avisanos si funciono como se prevee, o realmente no estoy entendiendo lo que necesitas.

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1058
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: ADS - recno() con query SQL

Postby rolando » Tue Sep 21, 2010 5:56 pm

Marcelo,

Probé tu ejemplo y efectivamente funciona.

La única diferencia es que yo lo uso ADS en modo remote y tu ejemplo es en modo local y ahí me parece que está la cuestión.

Gracias.

Rolando
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL

Postby Marcelo Via Giglio » Tue Sep 21, 2010 6:01 pm

Rolando,

prueba en modo remoto, deberia ser exactamente igual, no lo probe,

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1058
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: ADS - recno() con query SQL

Postby rolando » Tue Sep 21, 2010 6:16 pm

MArcelo,

Parece ser que funcionara diferente en modo SERVER, ya probé tu ejemplo y no funciona igual en modo SERVER, no entrega los recno() de la DBF original sino como comenté al comienzo de este post.

Saludos

Rolando
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL

Postby Marcelo Via Giglio » Tue Sep 21, 2010 7:56 pm

Rolando,

que te puedo decir, el siguiente ejemplo funciona, incluso arme un diccionario, lo probe con ADS 7.1 que es con el que trabajo aqui

Code: Select all  Expand view


#include "fivewin.ch"
#include "ads.ch"

//#pragma /b+

FUNCTION main()
LOCAL cAlias := "sql", cRec := ""

    rddRegister( "ADS", 1 )
    rddsetdefault( "ADS" )

    AdsSetFileType( ADS_CDX )
   
    SET SERVER REMOTE

    adsConnect60( "//192.168.1.20:3000/ADS/test.add", 2, "ADSSYS","" )

    adsRightsCheck( .F. )
 
    //ADSSETDATEFORMAT("DD/MM/YYYY")

    SELECT 0
    ADSCreateSQLStatement( cAlias, 2 )
    ADSPREPARESQL( "select * from customer where state = 'NY'" )
    ADSEXECUTESQL()
 
    ? (cAlias) -> ( lastrec() )
    (cAlias) -> ( DBGOTOP() )
    DO WHILE ! (cALias) -> ( EOF() )
       cRec += STR( (cAlias)->(RECNO()) )    
       (cAlias) -> ( DBSKIP() )
    ENDDO

    ? cRec

    BROWSE()

    DBCLOSEALL()


return NIL
 
Marcelo Via Giglio
 
Posts: 1058
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: ADS - recno() con query SQL

Postby rolando » Tue Sep 21, 2010 10:34 pm

MArcelo,

Efectivamente tu código funciona en modo server. Creo que dscubrí el motivo que a mi me falla esto d obtener los recno().

Si el query lo hago como vos funciona bién, ( = 'NY').

Prueba a cambiar la línea

Code: Select all  Expand view
ADSPREPARESQL( "select * from customer where state = 'NY'" )


con
Code: Select all  Expand view
ADSPREPARESQL( "select * from customer where state like '%NY%' " )


Ahí verás que no se obtiene el recno(). Es esto raro porque buscar con "like" lo hace perfectamente pero no retorna los recno() originales, sino como comente al iniciar este post.

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: ADS - recno() con query SQL (SOLUCIONADO)

Postby rolando » Fri Sep 24, 2010 12:50 am

Marcelo,

Encontré la solución. Gracias a tu ayuda y el link al foro que me recomendaste leer.

Además estuve leyendo el help del ADS y ahí se indica que cuando se use "LIKE", el query devolverá un cursor tipo STATIC.

Lo que hice fue cambiar el query:

Code: Select all  Expand view
ADSPREPARESQL( "select * from customer where state like '%NY%' " )


Por:
Code: Select all  Expand view
ADSPREPARESQL( "select * from customer where CONTAINS( state, '%NY%' ) " )


Estuve leyendo, también en el help, que la función "CONTAINS" se puede usar también en el query, así que en lugar de aplicar un filtro AOF, lo uso así (que en forma indirecta aplica un filtro, pero en el query es más rápido)

Saludos

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 134 guests