Recno() en un SELECT

2,361 views
Skip to first unread message

PETACA

unread,
May 16, 2012, 6:58:18 PM5/16/12
to Comunidad de Visual Foxpro en Español
Hola a todos. Pregunto, necesito guardar el recno() de una tabla
cuando uso un SELECT, se puede.
Aqui esta el codigo que me da error.

SELECT Lista01.idlistapre, Lista01.idarticulo, Articulos.descarti,;
Lista01.precio1, Lista01.precio2, Lista01.precio3,
Lista01.precio4,Lista01.Recno();
FROM ;
lista01 ;
INNER JOIN articulos ;
ON Lista01.idarticulo = Articulos.idarticulo;
ORDER BY Articulos.descarti;
INTO CURSOR Query1 READWRITE

Saludos y gracias

Walter R. Ojeda Valiente

unread,
May 16, 2012, 7:03:00 PM5/16/12
to publice...@googlegroups.com
No, no puedes seleccionar el RecNo() porque SQL trabaja de forma distinta a los .DBF

No hay un número de registro.

Saludos.

Walter.




> Date: Wed, 16 May 2012 15:58:18 -0700
> Subject: [vfp] Recno() en un SELECT
> From: fabian...@arnet.com.ar
> To: publice...@googlegroups.com

Antonio.xt

unread,
May 16, 2012, 7:18:25 PM5/16/12
to publice...@googlegroups.com

Petaca, lo que pasa es que tienes que crear una columna para guardar el valor de RECNO(), ya que esa es una funcion, ponlo asi: RECNO() AS num_reg, donde num_reg es el nombre de la columna que tiene el numero de registro.

Luis Maria Guayan

unread,
May 16, 2012, 9:28:00 PM5/16/12
to publice...@googlegroups.com
No veo la necesidad de retornar el número de registro en un SELECT, para ello están las claves primarias o surrogadas.

¿Cual es tu necesidad? Seguramente lo podrás hacer sin referencia a RECNO()

 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Victor Espina

unread,
May 16, 2012, 10:35:10 PM5/16/12
to publice...@googlegroups.com
Luis, hay ciertos casos en que definitivamente es necesario.  Muchas veces tu haces un SELECT que lee datos de distintas tablas que, individualmente, tienes sus claves primarias; pero el resultado del SELECT puede no tener una clave primaria natural. 

Si el resultado de dicho SELECT va a ir a parar a un cursor o dataset sobre el cual luego yo quiero poder modificar ciertos datos de los resultados, es sumamente util contar con un valor "identity" en el conjunto de resultados, independientemente de las claves primarias de las tablas involucradas.

Cuestion de tecnicas de procesamiento de datos. Seguramente hay otras formas de lograr lo mismo sin necesidad de la columna "recno"; pero definitivamnete es muy util en ciertos casos.

Saludos

Victor Espina

Fabian Solari

unread,
May 17, 2012, 7:33:30 AM5/17/12
to publice...@googlegroups.com
Hola Luis María
Lo que necesito es modificar precio1, precio2, precio3, precio4, lo modofico aca en el cursor pero no me actualiza la lista01.dbf

Pablo Daniel Lissa

unread,
May 17, 2012, 7:57:35 AM5/17/12
to Comunidad de Visual Foxpro en Español
Hola:

Concuerdo con lo que te han dicho.

Supongo que idListaPre es clave primaria lista01. Luego de que cambies
los valores en tu cursor, podrías hacer:

SELECT Query1
SCAN
UPDATE lista01 SET precio1 = Query1.precio1, ;
precio2 = Query1.precio2, ;
precio3 = Query1.precio3, ;
precio4 = Query1.precio4 ;
WHERE lista01.idListaPre = Query1.idListaPre
ENDSCAN

Nota: Habría formas más eficientes de hacerlo, pero sería necesario
conocer más específicamente los datos y lo que se necesite hacer.

El cursor es una representación de los datos de la tabla que, si no
está definido como una vista actualizable, no va a poder reflejar los
cambios en la tabla original. Muchas especificaciones sobre vistas
actualizables no te podría dar porque no es una herramienta que yo use
demasiado. Prefiero el uso de los comandos INSERT, UPDATE y DELETE y
mantener la vista desconectada de la tabla.

Saludos.
------------------------------------------------------------------------------------------
On 17 mayo, 08:33, "Fabian Solari" <fabiansol...@arnet.com.ar> wrote:
> Hola Luis María
> Lo que necesito es modificar precio1, precio2, precio3, precio4, lo modofico aca en el cursor pero no me actualiza la lista01.dbf
>
>
>
>
>
>
>
>   ----- Original Message -----
>   From: Luis Maria Guayan
>   To: publice...@googlegroups.com
>   Sent: Wednesday, May 16, 2012 10:28 PM
>   Subject: Re: [vfp] Recno() en un SELECT
>
>   No veo la necesidad de retornar el número de registro en un SELECT, para ello están las claves primarias o surrogadas.
>
>   ¿Cual es tu necesidad? Seguramente lo podrás hacer sin referencia a RECNO()
>
>   Luis María Guayán
>   Tucumán, Argentina
>   _________________________
>  http://www.PortalFox.com
>   Nada corre como un zorro
>   _________________________
>

Luis Maria Guayan

unread,
May 17, 2012, 8:21:57 AM5/17/12
to publice...@googlegroups.com
En ese caso lo debes actualizar con respecto a tu clave primaria o surrogada. En tu caso yo trabajaría con vistas locales actualizables, ya que los cursores no son nativamente actualizables (no confundir con modificables).

Hay algunos trucos que yo personalmente no he usado pero funcionan

-- Hacer un cursor creado mediante SPT actualizable --
http://www.portalfox.com/article.php?sid=930

-- Convertir un cursor SPT en una vista remota --
http://www.portalfox.com/article.php?sid=2122



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


Antonio.xt

unread,
May 17, 2012, 10:45:57 AM5/17/12
to publice...@googlegroups.com

Es correcto Victor, esto solo en las DBF, aunque supongo que son tablas DBF ya que petaca no menciona que sean de SQL, y de hecho no se me hace una buen a practica incluir el resultado de RECNO() en un cursor, para esto estan las claves, y si como comenta el usuario petaca, lo que necesita es modificar precio1, precio 2 etc, pues ya esta incluyendo la clave del articulo (idarticulo) y con eso seria suficiente.

Petaca, otro detalle es que asi solo modificas los datos en el cursor, en la tabla permanecen sin cambios, tienes que modificarlos directamente en las tablas si eso es lo que necesitas.


El miércoles, 16 de mayo de 2012 18:56:11 UTC-5, Victor Espina escribió:
Antonio, eso solo si estas haciendo un SELECT sobre cursores o tablas DBF.  Aun asi, el uso de RECNO() denro de un SELECT no siempre da el resultado esperado, aunque para consultas sencillas funciona bien la mayoria de las veces.

Para el caso de SQL Server, se puede numerar las filas resultantes de esta forma:

SELECT IDENTITY(INT, 1, 1) AS rowID, * INTO #cursorTemporal FROM tabla WHERE filtro
SEL:ECT * FROM #cursorTemporal
DROP TABLE #cursorTemporal

Saludos

Victor Espina

Antonio Meza

unread,
May 17, 2012, 4:50:58 PM5/17/12
to publice...@googlegroups.com
SPT solo es para cursores de servidores de bases de datos.

Petaca lo esta haciendo con DBF, por lo tanto lo recomendable es crear una Vista Local, sin tanto problema para hacer los campos actualizables y poder guardar los cambios de los diferentes precios, y todo desde un solo cursor devuelto por la vista local, sin necesidad de incluir el recno() cosa rara que lo usen asi!!!

saludos
Antonio Meza

Mario Oviedo

unread,
May 29, 2012, 6:29:18 PM5/29/12
to publice...@googlegroups.com
como harian ustedes expetos perdon lo de expertos conocedores del leguaje

utilizo el recno() en consulta  sql, para poder identificar un registro

ejemplo
tengo una tabla dbf que tiene fecha como llave, factura
fecha          codigo
28/05/2012  1  recno()
28/05/2012  2  recno()
28/05/2012  3  recno()
28/05/2012  4  recno()

y quiero modificar en un grid estos datos
select fecha,codigo,recno() as nregiistro from into cursor tmp

y cuando modifico 
si la opcion es modficar
select factura
go nregistro
replace next 1 codigo with this.value
endif

aqui lo que hago es update

como lo haria si no utilizo el recno()
gracias

Guillermo MDQ

unread,
May 29, 2012, 6:57:12 PM5/29/12
to publice...@googlegroups.com
No tenes que usar el RECNO() para identificar los registros, tenes que usar una clave unica, ya sea con un campo autoincremental o con un campo que vos vayas numerando (aumentandolo)  para ese proposito.
Despues si podes hacer los SELECT, UPDATE o DELETE identificando dentro de un WHERE el campo clave:

SELECT * FROM MyTabla;
    WHERE MiCampoClave=500

Saludos
Guillermo

Luis Maria Guayan

unread,
May 29, 2012, 6:55:35 PM5/29/12
to publice...@googlegroups.com

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


Victor Espina

unread,
May 16, 2012, 7:56:11 PM5/16/12
to publice...@googlegroups.com
Antonio, eso solo si estas haciendo un SELECT sobre cursores o tablas DBF.  Aun asi, el uso de RECNO() denro de un SELECT no siempre da el resultado esperado, aunque para consultas sencillas funciona bien la mayoria de las veces.

Para el caso de SQL Server, se puede numerar las filas resultantes de esta forma:

SELECT IDENTITY(INT, 1, 1) AS rowID, * INTO #cursorTemporal FROM tabla WHERE filtro
SEL:ECT * FROM #cursorTemporal
DROP TABLE #cursorTemporal

Saludos

Victor Espina


On Wednesday, May 16, 2012 6:18:25 PM UTC-5, Antonio.xt wrote:
Reply all
Reply to author
Forward
0 new messages