Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/05/2007, 09:06
Avatar de marceloSQL
marceloSQL
 
Fecha de Ingreso: mayo-2007
Ubicación: Buenos Aires, San Isidro
Mensajes: 4
Antigüedad: 17 años
Puntos: 0
Re: Registrar Varios Registros A La Vez En Una Tabla


/*12 de mayo de 2007*/
/* Programa _prgNumeracionRemitos

Autor: Marcelo Di Deo - [email protected]

Fecha de Creacion: Sabado 12 de Mayo de 2007
Tiempo estimado de aprendizaje teorico: 12 horas
Tiempo para implementacion: 2 horas
Me he basado en el ejemplo que dio Daniel donde explica como moverse en un cursor,
y he agregado un recurso que ayudara a quienes deban trabajar con tablas CABECERA DETALLE
reemplazando el viejo metodo COBOL, Pascal o clipper de Corte de Control.

Si alguien cree que es un ejemplo muy burdo, por favor sepan disculpar. Creanme,
es mi primer programa estructurado de SQL. Solo sabia hacer las operaciones basicas
de SP para ABM , o traer un select y pasarlo via XML

Proposito: Generar la cabecera a partir de un conjunto de registros detalle
Si se quiere llamar Tablas Padre-HIJO/HIJA, CABECERA-DETALLE.
Estos registros detalle estan el la tabla PrestacionesGrabadas
La Cabecera esta en la tabla Remitos.
Para preparar los datos del registro CABECERA se genera un cursor
que pretende realizar un calculo que en DOS lo doy con cortes de control
previamente a preparar los datos con un indice al efecto.

En lo que respecta exclusivamente al proposito particular, para el caso de facturacion
por cuenta y orden en un circulo medico, se logra Numerar Remitos en un rango
conocido de prestaciones grabadas.
Comentarios: A diferencia de otros

CONCLUSION: Si no lo valoro, otro se estara aprovechandose de mi esfuerzo.
VALORO MI ESFUERZO
Esto es lo que el foro tiene en consecuencia de un conjunto de buenas acciones
Ojala podamos continuar aportando

Doy garantia que funciona eficientemente. Las pruebas las estoy haciendo sobre una tabla de
mas de 4.000.000 de registros y procesa en menos de 5 segundos.

Leer por favor el PROPOSITO para entender todos los pasos siguientes

*/

Begin Transaction
DECLARE
@nidEstado Int,
@nIdObraSocial Int,
@nAno Int,
@nMes Int,
@nTotalHonorarios Dec(9,3),
@nTotalGastos Dec(9,3),
@i Int,
@nTope Int,
@nNuevoId Int,
@cDescripcion VarChar(80)

Declare
CurRemitos CURSOR FOR
SELECT idObraSocial idObraSocial,
Year(FechaPrestacion) Ano,
Month(FechaPrestacion) MES,
Sum (ImporteHonorarios) TotalHonorarios,
Sum (ImporteGastos) TotalGastos
from
Nexus7.dbo.PrestacionesGrabadas
Group By idObraSocial,
Month(FechaPrestacion),
Year(FechaPrestacion)


/* "USA" el cursor, y coloca el puntero al tope (No en el primer registro sino en el "TOP" */
OPEN curRemitos

/* Lee siguiente registro (SKIP), asignando cada campo a variables previamente declaradas*/
FETCH NEXT FROM curRemitos INTO
@nidObraSocial,
@nAno,
@nMes,
@nTotalHonorarios,
@nTotalGastos

/* La funcion @@FETCH_SATUS es comparable a FIN DE ARCHIVO "EOF"
Para CLIPPEROS-FOXEROS como yo viene a ser "EOF()"
Proposito: Mientras recorro el Cursor, con los datos calculados del mismo voy
haciendo un Insert en otra tabla de la base de datos donde trabajo o
bien en otra, de acuerdo al prefijo que corresponda en "DBO"
*/
WHILE @@FETCH_STATUS = 0
BEGIN
print 'hola'+str(@nidObraSocial)
/*Hago el Insert del proposito declarado arriba en una tabla cualquiera
Leyendo los calculos que ya hizo el cursor*/
Insert into nexus7.dbo.Remitos (
idObraSocial,
ImporteHonorarios,
ImporteGastos,
PeriodoProceso
)
Values
(
@nIdObraSocial,
@nTotalHonorarios,
@nTotalGastos,
@nAno+@nMes
)
/* Tomo el id que me dio este insert, ya que ese ID lo debo grabar en la tabla hija
Entonces se muestra otro ejemplo con tablas Cabecera-Detalle o bien Padres-Hijas*/
set @nNuevoId = @@identity

/* Con dicho ID reemplazo en la tabla hija de */
update nexus7.dbo.PrestacionesGrabadas
set idRemito = @nNuevoID
where idObraSocial = @nNuevoId and
year(FechaPrestacion) = @nAno and
Month(FechaPrestacion) = @nMes

/* Leo proximo registro del cursor */
FETCH NEXT FROM curRemitos INTO
@nidObraSocial,
@nAno,
@nMes,
@nTotalHonorarios,
@nTotalGastos
End

/*Cierro y limpio cursor*/
CLOSE curRemitos
DEALLOCATE curRemitos

/* Consilido la Transaccion*/
commit transaction