SQL Server - Obtener la última fila por articulo en SQL 2000

 
Vista:
sin imagen de perfil

Obtener la última fila por articulo en SQL 2000

Publicado por Linney (8 intervenciones) el 26/11/2010 18:39:49
Buenos días tengo un detalle, necesito el último movimiento por articulo para obtener la existencia actual, lo realize de la siguiente manera
Declare @Alm Table (consecutivo char(8),alm char(3),salm char(4),cve_art char(15),Descripcion char(60))
Insert Into @Alm
select max(consec_orig) as consecutivo, alm,salm,cve_art,des_art as Descripción
From invmdt
where alm='A01' and fec_tra between '20101015' and '20101015'
Group by alm,salm,cve_art,des_art
order by cve_art Desc

Con esto obtengo el mayor consecutivo, que es el que necesito, pero me tope con algo mas, que revisando el resultado, se puede dar el caso en el que el mismo consecutivo tenga dos movimientos en el almacen. Una venta normal y otra sin cargo.

En el kárdex aparece de la siguiente manera:
Fecha Consecutivo Existencia NumPar
20101015 2728206 464 2
20101015 2728206 504 3

Lo único que las diferencia es el NumPar, el mayor de NumPar es el que necesito, pero no se como obtener que me de el Mayor consecutivo con su mayor NumPar, de manera que quede de la siguiente manera:

Fecha Consecutivo Existencia NumPar
20101015 2728206 504 3

Esto es en SQL 2000, de antemano muchas gracias por su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Obtener la última fila por articulo en SQL 2000

Publicado por Loría (56 intervenciones) el 26/11/2010 21:45:33
Buenas tardes Linney.

Esto que estás necesitando lo puedes realizar de diferentes maneras, por ejemplo subqueries. Por el momento se me ocurre esta opción, francamente no estoy seguro si SQL Server 2000 acepta esta funcionalidad, pero lo he probado en 2005 y me ha servido:

select top 1 max(consec_orig) as consecutivo, alm,salm,cve_art,des_art as Descripción
From invmdt
where alm='A01' and fec_tra between '20101015' and '20101015'
Group by alm,salm,cve_art,des_art
order by cve_art,par Desc

Lo que he hecho es agregar dos cuestiones diferentes. Primero la palabra reservada TOP 1 para que el SQL devuelva un único registro, el primero que iría a devolver el SQL original. Segundo,con la intención de que el primero registro que devuelva sea el que tenga el par mayor, lo ordenamos de manera DESC para que te quede el 3 de primero en lugar del 2.

Básicamenta eso te debería servir, sino haz los cambos pertinentes.

Saludos.

Loría.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Obtener la última fila por articulo en SQL 2000

Publicado por Linney (8 intervenciones) el 27/11/2010 00:47:23
Hola, muchas gracias ya probe y no me sale, te explico mas detalladamente, no me supe explicar de lo que me esta pasando: El reporte debe mostrar la existencia del movimiento de acuerdo a la fecha que filtre el usuario, ellos revisan que el reporte este bien de acuerdo al kárdex de articulo. El kárdex de artículo tiene un consecutivo de almacén de que no se repite por cada artículo.

FECHA CONCEP Consec Existencia VALOR CTO.PROM NumPar
20101015 VENTAS 272680 3861 276 27.6 7
20101015 VENTAS 272684 3859 55.2 27.6 1
20101015 VENTAS 272688 3855 110.4 27.6 12
20101015 VENTAS 272729 3845 276 27.6 3

Yo Necesito mostrar la existencia del consecutivo 272729, por que ese es mi ultimo consecutivo.

20101015 VENTAS 272729 3845 276 27.6 3

Pero me tope con lo siguiente:
FECHA CONCEP Consec Existencia VALOR CTO.PROM NumPar
20101015 Compras 272806 464 29307 63.16 2
20101015 Compras 272806 504 2526 63.16 3

Pero como tomo el mayor consecutivo me trae los dos movimientos y yo necesito solo el último, lo que encontre es que cuando se repite el consecutivo lo enumera.

No importa si sea compra, venta, etc. Debe mostrar el saldo del último movimiento de cada articulo.

Ojala puedas ayudarde, de todas formas agradezco tu apoyo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Obtener la última fila por articulo en SQL 2000

Publicado por Loría (56 intervenciones) el 29/11/2010 05:55:20
Creo que he comprendido bien tu problema y lo que necesitas. Indícame si aún estoy mal con lo que entiendo.

Tienes una consulta que te devuelve un último consecutivo que tu necesitas mostrar ya que es tu último consecutivo. Pero puede suceder que se haga un movimiento con un mismo consecutivo en dos lugares distintos. Tu necesitas el que tenga el valor en la columna par más alto (en el ejemplo: 3).

Como te dije en el comentario anterior, debes hacer uso de dos clausulas:

1) TOP: Esta función te devuelve el primer valor de la consulta (solo uno). De esta manera si acomodas la consulta que devuelve esto:

20101015 Compras 272806 464 29307 63.16 2
20101015 Compras 272806 504 2526 63.16 3

para que el PAR quede en el TOP:

20101015 Compras 272806 504 2526 63.16 3
20101015 Compras 272806 464 29307 63.16 2

obtendrás solo la primera fila con la columna PAR más alta:

20101015 Compras 272806 504 2526 63.16 3

2) Para que el par más alto te quede de primero debes ordenarlo. Por esto te sugerí que en la clausula ORDER BY introduzcas la columna PAR con un DESC. De esta manera, el query acomodará los valores de arriba para abajo a partir de la columna PAR y obtendrás el valor más alto de primero para que puedas obtenerlo con el TOP.

Ahora aparte de esto debés hacer 2 acciones más:

1) Asegurarte que la función TOP existe en SQL Server 2000. Como te dije no estoy completamente seguro si esta función esta vigente en 2000, por eso debes comprobarlo. Si no la posee, habrá que buscar algún otro método, que si los hay pero se deben realizar más esfuerzos. Con la clausula TOP sería lo ideal porque no hay que hacer mucho cambio en el SQL.

2) Mi ayuda es para guiarte como debes hacerlo. Yo no se con profundidad como funciona tu modelado de base de datos por ende no puedo construir el SQL por vos. Por eso te puse que debes tratar con estas dos acciones que te estoy diciendo debes agregar en tu SQL (el TOP y el ORDER BY DESC). Yo no puedo darte una respuesta y que funcione a la primera porque en el SQL pueden intervenir más factores.Tu conoces tu modelado más que nadie y debes aplicarlo para que funcione.

Espero haberte ayudado.

Saludos.

Loría.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Obtener la última fila por articulo en SQL 2000

Publicado por Linney (2 intervenciones) el 29/11/2010 15:29:42
Muchas gracias, me salio a como me indicastes, solo era cuestión de buscarle, creo que ya estaba ciclada en lo mismo, Gracias por tu ayuda para solucionar mi problema.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Obtener la última fila por articulo en SQL 2000

Publicado por Linney Pérez Cornelio (8 intervenciones) el 04/12/2010 17:29:34
Te dejo como quedo al final mi procedimiento, por si alguien mas tiene dudas y en algo les puede servir:

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

ALTER PROCEDURE Nuevamente
@FecIni char(8),@FecFin char(8)

AS
Declare @Cve_Art varchar(15),@Descripcion Char(60), @Consecutivo varchar(8),
@Alm varchar(3),@Salm varchar(4),@Existencia money ,@Empaque char(3),
@CostoPromedio money, @ValorInventario money

delete FinalArticulos

Declare Articulos CURSOR FOR
select c.Cve_art
from inviar a, invart b,invars c
where c.cia='ASA'and a.art=b.art and b.art=c.cve_art and b.alm=c.alm and (b.status !='10' and A.STATUS !='10')
and b.alm='A01' and c.sub_alm='A01A' and a.tipo_articulo !='02'
order by b.alm,c.sub_alm, c.Cve_art

OPEN articulos
FETCH articulos
Into @Cve_Art
WHILE @@FETCH_STATUS = 0
BEGIN

Insert Into FinalArticulos

select top 1
@Cve_Art,mdt.Des_Art,mdt.alm,mdt.salm,mdt.consec_orig,(mdt.saldo/varst.Fac_Minimo)as Existencia,varst.uds_Sal as Empaque,
(mdt.costo_prom*varst.Fac_Minimo) as CostoPromedio,((mdt.saldo/varst.Fac_Minimo)*(mdt.costo_prom*varst.Fac_Minimo))as ValorInventario
from invmdt mdt (index=invmdt3),invars varst (index=invars2,NoLock)
where mdt.alm=varst.alm and mdt.salm=varst.sub_alm and mdt.cve_art=varst.cve_art and
mdt.cia='ASA'and mdt.alm='A01' and mdt.salm='A01A' and mdt.cve_art=@Cve_Art and fec_tra between @FecIni and @FecFin
Order by fec_tra DESC,consec_orig DESC, num_par DESC
FETCH Articulos
Into @Cve_Art
END
CLOSE Articulos
DEALLOCATE Articulos


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Este procedimiento me da como resultado:
Cve_Art Des_Art Alm Salm Consec_orig Existencia
1000 Jugo Jumex Tetra Brick Manzana 1LT A01 A01A 272816 272
1001 Jugo Jumex Lata Manzana 335M A01 A01A 272584 573
1002 Jugo Jumex Lata Durazno 335M A01 A01A 272766 787

Y todos los demas campos, el caso era obtener el ultimo movimiento por cada articulo, tomando en cuenta que hay consecutivos iguales el mismo dia y el mismo articulo.

Muchas gracias por tu ayuda, agradezco tu tiempo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar