/*12 de mayo de 2007*/
/* Programa _prgNumeracionRemitos
CONCEPTOS: CURSORES, CABECERA DETALLE, CONCATENACION, INSERT
SIMULTANEO entre tablas
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,
@Ano,
@nMes,
@nTotalHonorarios,
@nTotalGastos
/* Gracias a Daniel aprendi que 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
/* Consolido la Transaccion*/
commit transaction
ACEPTO TODO TIPO DE CRITICAS O CORRECCIONES ya que es mi primer programa.
Para quien necesite, presto humildemente mi colaboracion