Ayuda con migracion de firebird a sql server 2008 $$$

#1
Estoy migrando unos proc almacenados de firebird a sql server 2008 agradeceria ayuda...un ejemplo de tipos de procedimientos con los que me estoy enfrentando es:
CREATE PROCEDURE REPORTE_ENTRADAS_ALMACEN (
fecha1 date,
fecha2 date,
almacen integer,
sucursal integer)
returns (
codigo varchar(20),
id_presentacion integer,
id_caracteristica integer,
fecha date,
id_movto integer,
clasemovto varchar(1),
id_almacen_destino integer,
cantidad float,
costo float,
total float,
id_tipomovto integer,
referencia varchar(30),
snombreproducto varchar(81),
id_almacen integer,
alm integer,
snombrealmacendestino varchar(30),
snombrealmacen varchar(30),
impuestos float,
subtotal float,
id_grupo varchar(7),
snombregrupo varchar(80),
id_movtorel integer)
as
declare variable v_descuento integer;
BEGIN

/*ENTRADAS*/
FOR SELECT
MOVTOS1.FECHA,
MOVTOS1.ID_TIPOMOVTO,
MOVTOS1.ID_MOVTO,
MOVTOS1.REFERENCIA,
MOVTOS1.CLASEMOVTO,
MOVTOS2.COSTO,
MOVTOS2.CANTIDAD,
MOVTOS2.CODIGO as codigo,
MOVTOS1.id_almacendestino,
MOVTOS2.ID_PRESENTACION,
MOVTOS2.ID_CARACTERISTICA,
MOVTOS2.descuento,
MOVTOS1.id_almacen,
MOVTOS2.total,
MOVTOS2.impuestos,
MOVTOS1.id_movtorel
FROM
MOVTOS1
INNER JOIN MOVTOS2 ON (MOVTOS1.CLASEMOVTO = MOVTOS2.CLASEMOVTO) AND (MOVTOS1.ID_TIPOMOVTO = MOVTOS2.ID_TIPOMOVTO) AND (MOVTOS1.ID_MOVTO = MOVTOS2.ID_MOVTO) AND (MOVTOS1.SUCURSAL = MOVTOS2.SUCURSAL) AND (MOVTOS1.ID_ALMACEN = MOVTOS2.ID_ALMACEN)
INNER JOIN TIPOMOVTOS ON (MOVTOS1.ID_TIPOMOVTO = TIPOMOVTOS.ID_TIPOMOVTO) AND (MOVTOS1.CLASEMOVTO = TIPOMOVTOS.CLASEMOVTO)
WHERE
(MOVTOS1.SUCURSAL = :SUCURSAL) AND
((MOVTOS1.clasemovto = 'E') or (MOVTOS1.clasemovto = 'D')) AND
(MOVTOS1.ID_ALMACEN = :ALMACEN) AND
(MOVTOS1.STATUS<>99) AND
(TIPOMOVTOS.AFECTA_INVENTARIOS = 1) and
(MOVTOS1.fecha BETWEEN :FECHA1 AND :FECHA2)
INTO
:FECHA,
:ID_TIPOMOVTO,
:ID_MOVTO,
:REFERENCIA,
:CLASEMOVTO,
:COSTO,
:CANTIDAD,
:CODIGO,
:ID_ALMACEN_DESTINO,
:ID_PRESENTACION,
:ID_CARACTERISTICA,
:v_descuento,
:ID_ALMACEN,
:TOTAL,
:IMPUESTOS,
:ID_MOVTOREL
DO
BEGIN
if (v_descuento is null) then
v_descuento = 0;

if (v_descuento > 0) then
COSTO = COSTO - (COSTO * (v_descuento/100));

ALM = ID_ALMACEN;

SELECT
DESCRIPCION, ID_GRUPO
FROM
V_PRODUCTOS
WHERE (
(V_PRODUCTOS.CODIGO = :CODIGO) and
(V_PRODUCTOS.ID_PRESENTACION = :ID_PRESENTACION) and
(V_PRODUCTOS.ID_CARACTERISTICA = :ID_CARACTERISTICA)
)
INTO
:SNOMBREPRODUCTO, :ID_GRUPO;

SELECT DESCRIPCION
FROM GRUPOS
WHERE ID_GRUPO = :ID_GRUPO
INTO :SNOMBREGRUPO;

SELECT
DESCRIPCION
FROM
ALMACENES
WHERE ALMACENES.SUCURSAL = :SUCURSAL AND
ALMACENES.ID_ALMACEN = :ID_ALMACEN
INTO
:SNOMBREALMACENDESTINO;

SELECT
DESCRIPCION
FROM
ALMACENES
WHERE ALMACENES.SUCURSAL = :SUCURSAL AND
ALMACENES.ID_ALMACEN = :ALMACEN
INTO
:SNOMBREALMACEN;

SUBTOTAL = COSTO * CANTIDAD;
SUSPEND;
END

/*TRASPASOS Y DIRECTOS*/
FOR SELECT
MOVTOS1.FECHA,
MOVTOS1.ID_TIPOMOVTO,
MOVTOS1.ID_MOVTO,
MOVTOS1.REFERENCIA,
MOVTOS1.CLASEMOVTO,
MOVTOS2.COSTO,
MOVTOS2.CANTIDAD,
MOVTOS2.CODIGO as codigo,
MOVTOS1.id_almacendestino,
MOVTOS2.ID_PRESENTACION,
MOVTOS2.ID_CARACTERISTICA,
MOVTOS2.descuento,
MOVTOS1.id_almacen,
MOVTOS2.total,
MOVTOS2.impuestos,
MOVTOS1.id_movtorel
FROM
MOVTOS1
INNER JOIN MOVTOS2 ON (MOVTOS1.CLASEMOVTO = MOVTOS2.CLASEMOVTO) AND (MOVTOS1.ID_TIPOMOVTO = MOVTOS2.ID_TIPOMOVTO) AND (MOVTOS1.ID_MOVTO = MOVTOS2.ID_MOVTO) AND (MOVTOS1.SUCURSAL = MOVTOS2.SUCURSAL) AND (MOVTOS1.ID_ALMACEN = MOVTOS2.ID_ALMACEN)
INNER JOIN TIPOMOVTOS ON (MOVTOS1.ID_TIPOMOVTO = TIPOMOVTOS.ID_TIPOMOVTO) AND (MOVTOS1.CLASEMOVTO = TIPOMOVTOS.CLASEMOVTO)
WHERE
(MOVTOS1.SUCURSAL = :SUCURSAL) AND
((MOVTOS1.clasemovto = 'T') or (MOVTOS1.clasemovto = 'D'))AND
(MOVTOS1.id_almacendestino = :ALMACEN) AND
(MOVTOS1.STATUS<>99) AND
(TIPOMOVTOS.AFECTA_INVENTARIOS = 1) and
(MOVTOS1.fecha BETWEEN :FECHA1 AND :FECHA2)
INTO
:FECHA,
:ID_TIPOMOVTO,
:ID_MOVTO,
:REFERENCIA,
:CLASEMOVTO,
:COSTO,
:CANTIDAD,
:CODIGO,
:ID_ALMACEN_DESTINO,
:ID_PRESENTACION,
:ID_CARACTERISTICA,
:v_descuento,
:ID_ALMACEN,
:TOTAL,
:IMPUESTOS,
:ID_MOVTOREL
DO
BEGIN
if (v_descuento is null) then
v_descuento = 0;

if (v_descuento > 0) then
COSTO = COSTO - (COSTO * (v_descuento/100));

ALM = ID_ALMACEN_DESTINO;

SELECT DESCRIPCION, ID_GRUPO
FROM V_PRODUCTOS
WHERE (
(V_PRODUCTOS.CODIGO = :CODIGO) and
(V_PRODUCTOS.ID_PRESENTACION = :ID_PRESENTACION) and
(V_PRODUCTOS.ID_CARACTERISTICA = :ID_CARACTERISTICA)
)
INTO :SNOMBREPRODUCTO, :ID_GRUPO;

SELECT DESCRIPCION
FROM GRUPOS
WHERE ID_GRUPO = :ID_GRUPO
INTO :SNOMBREGRUPO;

SELECT
DESCRIPCION
FROM
ALMACENES
WHERE ALMACENES.SUCURSAL = :SUCURSAL AND
ALMACENES.ID_ALMACEN = :ID_ALMACEN_DESTINO
INTO
:SNOMBREALMACENDESTINO;

SELECT
DESCRIPCION
FROM
ALMACENES
WHERE ALMACENES.SUCURSAL = :SUCURSAL AND
ALMACENES.ID_ALMACEN = :ALMACEN
INTO
:SNOMBREALMACEN;

SUBTOTAL = COSTO * CANTIDAD;
SUSPEND;
END


END

agradeceria respuestas
 

kensou

Bovino maduro
#3
Yo solo se sql server, lo que te puedo decir es que es muy diferente el codigo, el primer procedimiento tiene sintaxis de procedimiento y funcion al mismo tiempo. Quiero pensar que ya pasaste todos los datos de firebird (no sabia que existita ese manejador de base de datos) a sql server y que los nombres de campos y tablas son iguales. No veo ninguna manera "facil" de lograr tu migracion, literalmente vas a tener que reescribirlos. A menos que encuentres una herramienta o algun asistente, cosa que veo dificil

¿sabes usar ambos manejadores?
 
#4
de hecho el problema que estoy teniendo es en los for select osea, for select selecciona cada registro y puedes hacer de manera individual las operaciones osea por linea...pero en sql server no puedo hacer eso...so conoces...algo asi pues...podrias decirme? ademas, ya lo se...las tablas ya las migre solo me faltan los sps :s
 
Arriba