Ejemplo PVISTASSP con varios temas a debatir

24/10/2007 - 14:15 por Pablo Roca | Informe spam
Hola,

A ver, pongo un caso:

En una aplicación de gestion, queremos obtener tanto las ventas totales,
como las ventas de un centro de coste.

Requerimientos:

Arquitectura WebServices,
PC cliente
PC servidor con SQL server e IIS


Tablas, datos, vistas y SPs adjuntos a este mensaje
(y no me discutais de momento los nombres de los campos, pks o indices :))
para este ejemplo el como se calcula el total de ventas en las cabeceras de
albaranes es irrelevante


Ejecuciones posibles:

A. ventas totales, ordenadas por descripcion del centro de coste y nombre
del cliente

A1. con vistas:

SELECT * FROM [dbo].[v_ventas] ORDER BY ccodesc, clinom

A2. con SPs:

USE [pvistassp]
GO
EXEC [dbo].[usp_ventas]
GO


B. ventas de la central (la central siempre es AST, por definición)

B1. con vistas:

SELECT * FROM [dbo].[v_ventas] WHERE pk_ccocod = 'AST' ORDER BY ccodesc,
clinom

B2. con SPs:

USE [pvistassp]
GO
EXEC [dbo].[usp_ventas] @iccoste = N'AST'
GO

********************************
el cliente webservice se autentifica, etc .. y llama a la funcion ventas.
nuestro programa solo tiene que llanmar a ver las ventas, el como se hace es
cuestion de la capa de negocio.

Metalenguaje (capa de negocio), puesta por ejemplo con vistas, en el lado
del servidor (no me pidais que ponga un ejemplo detallado en C#)

public ventas (string tccentro)
if tccentro = ''
SELECT * FROM [dbo].[v_ventas] ORDER BY ccodesc, clinom
else
SELECT * FROM [dbo].[v_ventas] WHERE pk_ccocod = 'AST' ORDER BY ccodesc,
clinom
endif
return el dataset .. etc ...
********************************

Cuestiones a debatir:

1. ¿Porque esa capa de negocio? (esta no es cuestion, sino reflexión)

En Webservices es necesaria, llevarse la lógica de la consulta al winform
del cliente, lo único que hace es dispersar y difuminar la lógica de la
aplicación.

Soy de la opinión que en el lado de la capa de presentación debe haber el
mínimo código posible. Que debemos tener un sitio centralizado (webservice o
servidor o clase independiente implementada en el lado cliente) que tenga
los objetos y sus métodos bien identificados.

Si ponemos este codigo (o similar), por ejemplo directamente en el evento
clic de un boton consultar ventas. En caso de que fuera necesario consultar
las ventas en mas de un formulario, tendriamos que copiar y pegar dicho
codigo, de cada vez. El mantenimiento de esto empezaria a complicarse. Y
pienso que es una muy mala práctica de reutilización de codigo.

Este método facilita el poder intercambir el desarrollo entre WinForms,
WebForms, WebServices, aplicaciones de terceros desarrolladas en en lenguaje
Java, o x

2. ¿Con vistas o con SPs?

En este caso me dá que con vistas estaría mas optimizado. Fijaros en las
cuatro ejecuciones posibles y mirar el plan de ejecución dse cada una de
ellas.

No son iguales!

La ejecución B1 difiere de los otros planes de ejecución, que si son iguales
entre si. Por tanto se me ocurre pensar que las vistas no funcionan igual
que los SPs a nivel de rendimiento

3. Vistas con indices? Fijaros que en este ejemplo las vistas no tienen
indices (ya estan puestos en las tablas). Se gana algo poniendo indices
adicionales en las vistas?

4. La ejecución B1 ... ¿No está realmente haciendo dos SELECT?

5. ¿Manera de mejorar esta vista?



De momento no se me ocurre ninguna cuestión mas, pero bueno se agradecen
cualquier comentario que pueda plantear nuevas cuestiones.

Venga .. que empiece el debate amistoso. :)

Agradeceria que respondieras citando la cuestion (1,2,3 ...) .. y el ejemplo
de ejecución (B1, A1, ...)


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com


begin 666 pvistassp.zip
M4$L#!!0``@`(`-QF6#c[<EO0```"0!```.````=7-P7W9E;G1A<RYS<6QU
MC;$*PC 41><$\@]O4Q<71Q%:VZ<$2J)-`H*44FO!@C3%Q'Z_J6(7<7G#N_>>
M8Q3"N1]:YROG^H+1O624484:8J%X*4R6*9#B$XSOHY$:TY*G*#3?<<RGE-$D
MQU@C''*98&KR@+Y>;+$\/UU?#DT7',% HK:NK?,-=/6M>LQ7"]C ;,9HK!CMXIX''!E-0B;2"!WXZQ%.^ ZFZ6=!")XP^;5XZZM[XXJP(Y@I_-^LPWW8`J*)
M^U6\G2A21E]02P,$% `"``@`_6)8-S9A:<,\`@``% D``! ```!C<F5A<E]T
M86)L87,N<W%LU5;-;YLP%#\/B?_A'1.IG=I-/>[@@DFM$)MAHS9"R'((T]!8
MB +*WS_SE03(DDK+83UP\'O/]N_#SR;@&,+M/BU*513;R#1FS#0X%H H)Y(&
MKLN!T6/X>\ $MB6Q,17$(=CO9>M)'K)M0F>'A&G<WT.I5IF".-F4N[R =0)Q
M7I2):5@^1@*#0,^N!K)>Y='G,*YST<0T/H7;7U(/XWPC_5+MH\G4*E FH
MH-U5%3J]3HI8Y_=JUY1\>9AV>; 8Y<)'A H(O;ELUP;/)POD+V&.EV"Y`1?8
MQS:8QG!3Q"W3F+X2\0(334P2:N,W@&_ '.<.N$""<$$L+BGSL<467J#9=&DR
MJZ+2#CQ9[=-&D>NR5^GKSV76G-?5M M[:(9/XU/]:> -6FW/<#R6.$NUR$GQ
M%VG;[%'<+$TK;=--&4'CJEA.'N\>ARIG:6/"II'X:9S?Y+]/37AZZ)6,C.B0
M7+>B@?CAG%#92NW4)JF/^UZ35><]T77[4AT<4?OX78Y<[XRAO;VDWB9?%2/#
M3M)E7JI,%_S(<M6?/?2R97#5R9;:1W&R-8LR>B338 W)B?K5Y)Z3M[Y&./.%
MGB$%7GCV\V4A;)]Y$K]5J^DKN TRZA**;Z+5V:$W!LT]/^E27->D*O5
M.-O;`#5-ZP5;<]#/(_0ZR.DZZ/ Z.9J%YE(UTN3D&$U-P\>.5IQ:F ]>2Q@4
M5I N`&J@7$1Q=8WWDCK<]"-:]4$XS^HPJ5_Y+[2Z)3N_QG\LCE/%_P!02P,$
M% `"``@`BV58-VF%Y_5Y`0``%P4```D```!D871O<RYS<6R]4LMN@S 0O"/Q
M#[Z12"3*HU4//6V)A9!X1#9PB5!E# KJ. ^/ZN(6G:`Z>2^N)E/<S,/E8K
M(B^ED)5J2%&20G2J-0W32#@EY[YJ.]&V9]-P(YU<K4: 1G8BKP619=-=QH14
M;5=JE!=RRF+BA7%$3D6NLO5)#H^9:9#[69S.'^_X(%61$5M#BK*5V?(*2L%/
M*/_]AP4\MFRBKX1YP*WE@_4".&@]O)AW&-4F.U%7V(NRG7)T?1X\+?2G]F'K
MH%&?VL5H8&%M\&PMVSK28\3!6K[.PKA#1I=!X,U'N4=*8!2(0\.817/1/B&M
M#X3RF%'?G\WM,](ZP$+/`4Z.\.;?#-\&^F.B.,YQJ*+.Q44TY9#M44U,>$%@
MWXFKD_N>V4-<5Y4.12]5WHY!ISI1_[0X;/86*_=I"HPX$(,?N1'Fú^O=E,
MMN'/TL.2[W'AF!=0!B3%<0(*/UIW*'EG6VGDIY013@,(47?_+[K8:D[=)#Q\
MU_MR5W6C+U!+`P04``(`" #'95@WD3UN<*L#```2$0``# ```'9?õN=&%S
M+G-Q;-58;6_B.!#^7JG_P>H76HFBV$F ?JBT`9)\3I$NC>*:J02US6NI!$
MB<,=__[LO)0$0G>3574Z2X1H9CS/S.,Q]K"T=>"$.QHS',?A\^7%9^ORXO+"
MUA= ,^WIRES.9C:PS$PAQ-^6UD*?K*83W5Q,C:D^?]..Y[JVT,'35/\.'/<E
M>.XYN]6.^-PU=ZS98OY,'R^ &%S?P][+CN%>^-=JO0[6@=M-I?P]9D1\N21>
MYS*/<C\D%B\'PY+0#[9=8"\?KDM^\6[-`H:]&Z#9((OC\L*86P^@& =C,#5-
MGLI7:\J3`;7C$!O/N#9^<%].X"#^1=]Y.C7>/4K?G!=)%W+._=Q:/H+1GQ_
MJ:@%L;3Z'_H8Q/NX%X<K[+KD'T9\E[AA%(0D8GOPR<=;<F]V'NS5A.)-A+>/
MV">PTP6?=MA+A,J1="0CPY!N1TJ_?POA^O560XIQ*TF:QC^R;AA&%\">)/%J
M&9$-]<&$Q'3C/V8HE%-S#U(&,ZV & ?^*]TD$68T\-_TYTVXA51:!#-)`Q43
ME9+X>,K5]1=P#1U%>@:*@_@3I4_Y!MQ<%=-TW_TY-JS'EG^*#1Q5@ ,'J0*W
M(2SZ/5C4$E9N"<O3E#-816H!J]3#HE_)MM\"3VV)Q_/KM\'KM\13LM5LC#>H
MQX/OXCV!Z\9 P[9EFJZ;XL A+YK&>_*N?;D,^*Y0FF8)I;: :;DT3Q#"]@73
M%_NP<8:H3<6(#)OG)K<LSN;+IK1$.D.?MF9T1PY(;R89,?@8?C].1TLR(J
MO@YB/A9!>'3&S<@K*XM.LEW@%X_$53<EC<@CNU5<5:\OF8TN[@*L.KL<"E).
M%'E$LC(\48T"QH)MNK#H1#FGFQ]BHBH/JKI22MF8T#CT\-[P\":M]*%4U?/0
MQH&7;(_O`U5'1R1DEZA6) S0.1+Z2'Z'!%4Z2\(0HO^$A/R"V(J&N[,T#*1W
M6!BJ9UE ZMW'LU"\5G>F_6U6WI5'VQ8S7+MG'S'?S821:$)><>(Q$=/5^5^B
M++3OU&4_XJ.S*A6F&2DU4EXZTO]&7$_P.**<)UK/XQ$QL'J8Y>LI([5<.II'
M<<IB):"BM"&L%*&5L#!AZ7G=KS@)0][[I ="Q8U)_GX2K<ZI)SN(V&(?IAI9
M/˜D4NBU%WE8O Y"I)PM#^=8U"/91.J<JNMK$)^^N@`WK=Y9$<\B?&X>?-F
MC[_H#UJGFTOS;H\WC)W"$N:6HOLO[&!N5_P+T/F=9G(<)#X[-)3PHV+\%U!+
M`P04``(`" "#9E@W-H+C-PT!``!?`@``%0```'5S<%]V96YT87-T;W1A;&5S
M+G-Q;+60O6Z#,!1&YUKR.]RQE2)>H.I P$&.B)WZ9ZBB"#G @$H#DBG/WVM"
M$H94G>K%UF?[?,>VFL&A'QL_.._[(R69I(02S0S$0O-"V#S7(,5E(\3O5AJ6
M%CQEPO -9^JV2TFB6&P8[)5,6&H5HJM3=XP.W[XOQOJ,'4,WN+;V6!1K2M8L
MXWCY*7"%3*05!FFO`859SA(#"(A<>QH'%_6?15EV95>MIA37?JC#5-6^G+.V
MP9K:A\7]X"(\=U\KT';WO."ZL9RT7B#6<-'$_HV2.X!%/W A\+5;.2F'`0L/
M]'[H"F]+V7O\&VQV?8!KF^9&N[[HFB,C4]+N8?WQ#S^&=*E2U)WI?W&F*TRD
ME/P`4$L#!!0``@`(`,1F6#=Z.493, $``*$"```4````=7-P7W9E;G1A<V-E
M;G1R;RYS<6RUD5]KPC 4Q9\-Y#O<-Q7$ESV.P6H;74=-7/XPAI12T\+*.EM,
MU\^_6ZW:!V5/RT,23I+?.??&* ;;NBU<DSI7QY2L!"64**;!XRI,N(DB!8*?
M#CKYS0C-@B0,&-?A,F3R<DJ)+YFG&6RD\%E@)**S717/MS^N3MI\CQX6YT,5
M`R6C9VLKU^2PMY_I8?(PA2<8>TJ/*?$4)0NV"I$[ZBRY\(7A&HT>.Q?4(N9K
M0/8\+7=MD\[KKP1IMLIF1_5$[I8L=[;7R@*]<]=MKA<'XK[ZGH$RZ\F F[:V
MJ9JTG(*GX%0!^B^E6 ,,_"'D'!OQ*HZ1NP&#')C[9E8L>!#V*M^#]5EOX,JB
MN-#.%9UU9+R_,/R+.Q'Z;\!K*RG,!A8?_]!8I L98%4]_2_.\0GC`26_4$L!
M`A0`% `"``@`W&98-U9/MR6]````) $```X``````````0`@`````````'5S
M<%]V96YT87,N<W%L4$L!`A0`% `"``@`_6)8-S9A:<,\`@``% D``! `````
M`````0`@````Z0```&-R96%R7W1A8FQA<RYS<6Q02P$"% `4``(`" "+95@W
M:87G]7D!```7!0``"0`````````!`" ```!3`P``9&%T;W,N<W%L4$L!`A0`
M% `"``@`QV58-Y$];G"K`P``$A$```P``````````0`@````\P0``'9?õN
M=&%S+G-Q;%!+`0(4`!0``@`(`(-F6#<V@N,W#0$``%\"```5``````````$`
M( ```,@(``!U<W!?õN=&%S=&]T86QE<RYS<6Q02P$"% `4``(`" #$9E@W
M>CE&4S !``"A`@``% `````````!`" ````("@``=7-P7W9E;G1A<V-E;G1R
;;RYS<6Q02P4&``````8`!@!P`0``:@L`````
`
end

Preguntas similare

Leer las respuestas

#6 Alfredo Novoa
24/10/2007 - 23:34 | Informe spam
Hola Pablo,

On Wed, 24 Oct 2007 21:54:59 +0200, "Pablo Roca"
wrote:

Esto lo puedes encapsular en un componente y configurarlo en tiempo de
diseño.



Si, claro, en un componente en la capa de negocio :)



No, un componente genérico que sirva para cualquier aplicación y que
puedas pinchar y arrastrar al formulario.

Las clases de las capas de negocio son poco reutilizables, solo sirven
para un Sistema de Información :-).

En esto ultimo te doy la razón .. pero claro todo depende de como se vaya a
utilizar, creo que apilar y apilar vistas una detrás de otra tampoco tiene
mucho sentido



Divide y vencerás.

Apilar vistas unas detrás de otras es una forma super productiva de
trabajar.

Lo malo es que no haya una forma fácil de organizar las vistas.

public ventas (string tccentro)
if tccentro = ''
SELECT * FROM [dbo].[v_ventas] ORDER BY ccodesc, clinom
else
SELECT * FROM [dbo].[v_ventas] WHERE pk_ccocod = 'AST' ORDER BY
ccodesc,
clinom
endif
return el dataset .. etc ...





Vamos a lo que importa, lo meterias en controles visuales? bien .. antes de
contestar añado otra respuesta tuya



No, lo ELIMINARÍA gracias a controles visuales, que es una cosa muy
distinta.

Este método facilita el poder intercambir el desarrollo entre WinForms,
WebForms, WebServices, aplicaciones de terceros desarrolladas en en
lenguaje
Java, o x



Hay formas mejores como usar un proveedor ADO.NET que funcione a
través de un Web Service.



Hay un gran problema en trabajar como tu dices. Pero que muy grande.

Te pongo un posible escenario a donde llegarias con esta filosofia.

ya que tu trabajas mayoritariamente con vistas ...

Tienes la capa de presentacion de tu aplicación con los controles visuales
que filtran tablas y negeran el SQL automaticamente.
Como tu aplicación necesita interoperabilidad con empresas externas les das
un acceso ADO.NET a tu WebService, y ellos acceden desde Java por ejemplo.



Si acceden desde JAVA claro que no les voy a dar un acceso ADO.NET por
que no les serviría para nada. Que lo usen como un Web Service normal
y corriente mandando cadenas SQL a través de él.

En la pagina web de tu compañia los directivos pueden consultar información
de ventas

Ok, ahora te vienen los directivos de la empresa con un requerimiento que
surge con el método empírico, que tu sabes que se utiliza mucho en las
empresas, y te dicen "las ventas deben estar ordenadas por codigo de centro
y no por la descripción del centro"

¿Que haces?



Cambiar la clausula "order by" de la vista con el Management Studio y
seguir perdiendo el tiempo en los grupos de noticias :-)

Ahora me pregunto como lo harías tu.

No me digas que tienes que recompilar algo o mandar que cierren las
aplicaciones :-)

Sin contar con los posibles riesgos de seguridad que estamos introduciendo
al dejar a un tercero acceder nuestra base de datos a traves de un puente
que hagamos con ADO.NET.



Riesgo solo si está mal la configuración de la seguridad. También es
arriesgado darle acceso a los SP si no se hace con cuidado. Le podrías
dar acceso accidentalmete a un procedimiento que borra un documento y
entonces haciendo un bucle te podría borrar todos.

Ya, ya .. me dirás que pondrias permisos en las
vistas y que solo podrian acceder a ellas etc .



Claro, lo que ponen los libros de texto, que para algo los escriben
:-)

. pero yo quiero tener el
control de lo que pueda hacer esa empresa externa,



Pues macho, para eso están los permisos :-)

y si por definición
empresarial las ventas se calculan de una manera (que hace la capa de
negocios)



¡No me digas que ahora quieres calcular las ventas en la aplicación a
base de bucles en lugar de dejar que te las calcule SQL Server!

:-(

la empresa externa no tienen porque andar investigando que tenemos
en nuestra BBDD.



Permisos.

1. ¿Porque esa capa de negocio? (esta no es cuestion, sino reflexión)

En Webservices es necesaria, llevarse la lógica de la consulta al winform
del cliente, lo único que hace es dispersar y difuminar la lógica de la
aplicación.



No es cierto. Si te lo curras un poco puedes hacer que el uso de
WebServices sea transparente y creo que lo deberías de hacer.




Piensa que un Web Service lo puede consumir alguien externo a tu
organización. Pare ellos no necesito ser trasnparente sino dar exactamente y
nada mas que la información que se necesita.



¿Y?

El que sea transparente para mi no perjudica a los otros.

Yo ya tengo mis tablas y mis SP en SQL Server bien organizados.



Ya, pero el acceso a datos parece que no lo tienes, ya que confias en
controles dispersos a lo largo de formularios. Mal método a mi parecer.



Pues va de maravilla. No es peor que confiar en llamadas a objetos de
negocio dispersas a lo largo de los formularios.

Parece que no hay forma de hacer entender que las tablas ya son una
magnífica forma de encapsular los datos y que no hace falta volver a
encapsularlas con algo muy inferior como las clases de la capa de
negocio.

Creo que no tienes muy claro lo que es la Independencia Lógica (la
regla nº9 de Codd) de los datos y la forma de conseguirla usando un
SGBD.

Si puedo hacer dos EXEC, que no penaliza en absoluto (mirate el articulo que
te dije antes), eso es mejor que tener planes de ejecución variables que se
construyen al vuelo.



OK, gracias, no lo sabía.



Saludos
Respuesta Responder a este mensaje
#7 Gux (MVP)
25/10/2007 - 17:30 | Informe spam
Hola Alfredo, Pablo y demás colegas:

"Alfredo Novoa" wrote:
De todas formas estos SP son de los menos malos que puede haber por
que lo único que hacen es ejecutar a una consulta. En realidado son
parecidos a las vistas pero con la gran desventaja de que no pueden
usarse en otras vistas o consultas como si fuesen tablas.



Denle un vistazo a las funciones definidas por el usuario.

Utilizar funciones que retornen datos de tipo TABLE: Tienen alguna de las
ventajas de los procedimientos (e.g. puede usar argumentos) y alguna de las
ventajas de las vistas (e.g. pueden usarse en cualquier contexto donde
normalmente va una tabla, como en el FROM de una SELECT).


saludos
~gux
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida