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 ![]()
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 ![]()
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
#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 NILMarcelo,
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 ![]()
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,
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
Rolando,
prueba en modo remoto, deberia ser exactamente igual, no lo probe,
saludos
Marcelo
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
#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 NILADSPREPARESQL( "select * from customer where state = 'NY'" )ADSPREPARESQL( "select * from customer where state like '%NY%' " )ADSPREPARESQL( "select * from customer where state like '%NY%' " )ADSPREPARESQL( "select * from customer where CONTAINS( state, '%NY%' ) " )