Pregunta!!

20/08/2004 - 16:30 por Roberto Sandro | Informe spam
Hay alguna manera en sql de recorrer una tabla de la siguiente manera ?
For i=0 To CantidadDeRegistros
hacer algo aca con ese registro
Next

Preguntas similare

Leer las respuestas

#1 Javier Loria
20/08/2004 - 17:23 | Informe spam
Hola Roberto:
Si, si la hay. Se llaman CURSORES y puedes revisar la documentacion en
Linea de como hacerlos.
Mi recomendacion es que NO LOS USES, y que cambies de forma de pensar .
En SQL es muy eficiente trabajar con conjuntos de datos y hacer las
transformaciones directamente y no por medio de estos ciclos. Es frecuente
encontrar diferencias de 10/1000 veces mas lento un cursor que una sentencia
de SQL natural.
Es mi opinion que mas del 50% de los problemas de rendimientos de SQL se
deben a los cursores. Si nos cuentas un poco que quieres hacer con gusto te
ayudamos y te sirve de ejemplo para otros casos.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Roberto Sandro" wrote in message
news:OA8$
Hay alguna manera en sql de recorrer una tabla de la siguiente manera ?
For i=0 To CantidadDeRegistros
hacer algo aca con ese registro
Next


Respuesta Responder a este mensaje
#2 Roberto Sandro
20/08/2004 - 19:23 | Informe spam
Es lo siguiente

Tablas

tabla_facturas tabla_cobros
nro_factura nro_factura
monto monto
moneda moneda
cotizacion_factura cotizacion_cobro
estado fecha_acreditacion
... .
..
etc. etc.
-

Tegno una VISTA armada que me muestra lo siguiente
nro_factura monto_factura moneda_factura monto_cobro
moneda_cobro fecha_acreditacion
-

de esta vista filtro por fecha_acreditacion <= FECHA_ACTUAL
Una vez que ya tengo los registros que quiero comprovar, tengo que hacer lo
siguiente

Necesito saber en dolares, si tengo alguna diferencia entre lo que FACTURE y
COBRE

EN CODIGO VISUAL BASIC LO SOLUCIONE ASI
Ciclo que recorre los registros seleccionados
If moneda_factura = "U$S" Then
valorA = monto_factura
If moneda_cobro = "U$S" Then
valorB = monto_cobro
Else
valorB = monto_cobro / cotizacion_cobro
End If
Else
valorA = monto_factura / cotizacion_factura
End If
If valorA - valorB > 1 Then
UPDATE tabla_facturas SET estado=1 WHERE factura = nro_factura
Else
UPDATE tabla_facturas SET estado=2 WHERE factura = nro_factura
End If
Fin del ciclo

PERO EN SQL, HAY MANERA DE HACERLO ?

"Javier Loria" escribió en el mensaje
news:
Hola Roberto:
Si, si la hay. Se llaman CURSORES y puedes revisar la documentacion en
Linea de como hacerlos.
Mi recomendacion es que NO LOS USES, y que cambies de forma de pensar


.
En SQL es muy eficiente trabajar con conjuntos de datos y hacer las
transformaciones directamente y no por medio de estos ciclos. Es frecuente
encontrar diferencias de 10/1000 veces mas lento un cursor que una


sentencia
de SQL natural.
Es mi opinion que mas del 50% de los problemas de rendimientos de SQL


se
deben a los cursores. Si nos cuentas un poco que quieres hacer con gusto


te
ayudamos y te sirve de ejemplo para otros casos.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Roberto Sandro" wrote in message
news:OA8$
> Hay alguna manera en sql de recorrer una tabla de la siguiente manera ?
> For i=0 To CantidadDeRegistros
> hacer algo aca con ese registro
> Next
>
>


Respuesta Responder a este mensaje
#3 Javier Loria
20/08/2004 - 20:12 | Informe spam
Hola Roberto:
Excelente caso.
Prueba con esto:
SELECT Nro_Factura
, CASE
WHEN Moneda_Factura='US$'
AND Monto_Cobro='US$'
AND Monto_Factura-Monto_Cobro>1
THEN 1
WHEN Moneda_Factura<>'US$'
AND Monto_Cobro='US$'
AND (Monto_Factura/Cotizacion_Factura) - Monto_Cobro>1
THEN 1
WHEN Moneda_Factura='US$'
AND Monto_Cobro<>'US$'
AND Monto_Factura - (Monto_Cobro/Cotizacion_Cobro)>1
THEN 1
WHEN Moneda_Factura<>'US$'
AND Monto_Cobro<>'US$'
AND
(Monto_Factura/Cotizacion_Factura)-(Monto_Cobro/Cotizacion_Cobro)>1
THEN 1
ELSE 2
END AS NuevoEstado
FROM NombreeVista -- Reemplazar por el Nombre de la Vista
Esto lo puedes usar directamente en un UPDATE.
UPDATE tabla_facturas
SET estado=NuevoEstado
FROM Tabla_Facturas
JOIN (..) AS NuevoEstadoFacturas
ON Tabla_Factura.NroFactura=NuevoEstadoFacturas.NroFactura
= El "truco" esta en usar la funcion CASE que se parece un poco a la
funcion IIF de Visual Basic. Esta funcion es muy poderosa para "matar" la
necesidad de cursores, ya que reemplaza al IF.
Espero se entienda,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Roberto Sandro" wrote in message
news:#
Es lo siguiente

Tablas

tabla_facturas tabla_cobros
nro_factura nro_factura
monto monto
moneda moneda
cotizacion_factura cotizacion_cobro
estado fecha_acreditacion
... .
..
etc. etc.

Tegno una VISTA armada que me muestra lo siguiente
nro_factura monto_factura moneda_factura monto_cobro
moneda_cobro fecha_acreditacion

de esta vista filtro por fecha_acreditacion <= FECHA_ACTUAL
Una vez que ya tengo los registros que quiero comprovar, tengo que hacer


lo
siguiente

Necesito saber en dolares, si tengo alguna diferencia entre lo que FACTURE


y
COBRE

EN CODIGO VISUAL BASIC LO SOLUCIONE ASI
Ciclo que recorre los registros seleccionados
If moneda_factura = "U$S" Then
valorA = monto_factura
If moneda_cobro = "U$S" Then
valorB = monto_cobro
Else
valorB = monto_cobro / cotizacion_cobro
End If
Else
valorA = monto_factura / cotizacion_factura
End If
If valorA - valorB > 1 Then
UPDATE tabla_facturas SET estado=1 WHERE factura = nro_factura
Else
UPDATE tabla_facturas SET estado=2 WHERE factura = nro_factura
End If
Fin del ciclo

PERO EN SQL, HAY MANERA DE HACERLO ?

"Javier Loria" escribió en el mensaje
news:
> Hola Roberto:
> Si, si la hay. Se llaman CURSORES y puedes revisar la documentacion


en
> Linea de como hacerlos.
> Mi recomendacion es que NO LOS USES, y que cambies de forma de


pensar
.
> En SQL es muy eficiente trabajar con conjuntos de datos y hacer las
> transformaciones directamente y no por medio de estos ciclos. Es


frecuente
> encontrar diferencias de 10/1000 veces mas lento un cursor que una
sentencia
> de SQL natural.
> Es mi opinion que mas del 50% de los problemas de rendimientos de SQL
se
> deben a los cursores. Si nos cuentas un poco que quieres hacer con gusto
te
> ayudamos y te sirve de ejemplo para otros casos.
> Saludos,
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda
>
> "Roberto Sandro" wrote in message
> news:OA8$
> > Hay alguna manera en sql de recorrer una tabla de la siguiente manera


?
> > For i=0 To CantidadDeRegistros
> > hacer algo aca con ese registro
> > Next
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Roberto Sandro
20/08/2004 - 21:03 | Informe spam
gracias lo provare
"Javier Loria" escribió en el mensaje
news:
Hola Roberto:
Excelente caso.
Prueba con esto:
> SELECT Nro_Factura
, CASE
WHEN Moneda_Factura='US$'
AND Monto_Cobro='US$'
AND Monto_Factura-Monto_Cobro>1
THEN 1
WHEN Moneda_Factura<>'US$'
AND Monto_Cobro='US$'
AND (Monto_Factura/Cotizacion_Factura) - Monto_Cobro>1
THEN 1
WHEN Moneda_Factura='US$'
AND Monto_Cobro<>'US$'
AND Monto_Factura - (Monto_Cobro/Cotizacion_Cobro)>1
THEN 1
WHEN Moneda_Factura<>'US$'
AND Monto_Cobro<>'US$'
AND
(Monto_Factura/Cotizacion_Factura)-(Monto_Cobro/Cotizacion_Cobro)>1
THEN 1
ELSE 2
END AS NuevoEstado
FROM NombreeVista -- Reemplazar por el Nombre de la Vista
> Esto lo puedes usar directamente en un UPDATE.
> UPDATE tabla_facturas
SET estado=NuevoEstado
FROM Tabla_Facturas
JOIN (..) AS NuevoEstadoFacturas
ON Tabla_Factura.NroFactura=NuevoEstadoFacturas.NroFactura
=> El "truco" esta en usar la funcion CASE que se parece un poco a la
funcion IIF de Visual Basic. Esta funcion es muy poderosa para "matar" la
necesidad de cursores, ya que reemplaza al IF.
Espero se entienda,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Roberto Sandro" wrote in message
news:#
> Es lo siguiente
>
> Tablas
>
> tabla_facturas tabla_cobros
> nro_factura nro_factura
> monto monto
> moneda moneda
> cotizacion_factura cotizacion_cobro
> estado fecha_acreditacion
> ... .
> ..
> etc. etc.

>
> Tegno una VISTA armada que me muestra lo siguiente
> nro_factura monto_factura moneda_factura monto_cobro
> moneda_cobro fecha_acreditacion

>
> de esta vista filtro por fecha_acreditacion <= FECHA_ACTUAL
> Una vez que ya tengo los registros que quiero comprovar, tengo que hacer
lo
> siguiente
>
> Necesito saber en dolares, si tengo alguna diferencia entre lo que


FACTURE
y
> COBRE
>
> EN CODIGO VISUAL BASIC LO SOLUCIONE ASI
> Ciclo que recorre los registros seleccionados
> If moneda_factura = "U$S" Then
> valorA = monto_factura
> If moneda_cobro = "U$S" Then
> valorB = monto_cobro
> Else
> valorB = monto_cobro / cotizacion_cobro
> End If
> Else
> valorA = monto_factura / cotizacion_factura
> End If
> If valorA - valorB > 1 Then
> UPDATE tabla_facturas SET estado=1 WHERE factura nro_factura
> Else
> UPDATE tabla_facturas SET estado=2 WHERE factura nro_factura
> End If
> Fin del ciclo
>
> PERO EN SQL, HAY MANERA DE HACERLO ?
>
> "Javier Loria" escribió en el mensaje
> news:
> > Hola Roberto:
> > Si, si la hay. Se llaman CURSORES y puedes revisar la


documentacion
en
> > Linea de como hacerlos.
> > Mi recomendacion es que NO LOS USES, y que cambies de forma de
pensar
> .
> > En SQL es muy eficiente trabajar con conjuntos de datos y hacer las
> > transformaciones directamente y no por medio de estos ciclos. Es
frecuente
> > encontrar diferencias de 10/1000 veces mas lento un cursor que una
> sentencia
> > de SQL natural.
> > Es mi opinion que mas del 50% de los problemas de rendimientos de


SQL
> se
> > deben a los cursores. Si nos cuentas un poco que quieres hacer con


gusto
> te
> > ayudamos y te sirve de ejemplo para otros casos.
> > Saludos,
> >
> > Javier Loria
> > Costa Rica
> > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > que pueda ser copiado y pegado al Query Analizer.
> > La version de SQL y Service Pack tambien ayuda
> >
> > "Roberto Sandro" wrote in message
> > news:OA8$
> > > Hay alguna manera en sql de recorrer una tabla de la siguiente


manera
?
> > > For i=0 To CantidadDeRegistros
> > > hacer algo aca con ese registro
> > > Next
> > >
> > >
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida