You are on page 1of 10

WinDev e MS SQL Server

Projeto exemplo para a utilizao de views e store


procedures

Jos Jorge Matos


Maio de 2015
Objetivo

O projeto DemoMSSQL_Views foi desenvolvido em WinDev 19 e visa demonstrar a


utilizao de views e store procedures num banco de dados MS SQL Server 2008 R2.

Utilizou-se um banco de dados instalado num servidor privado virtual na Cloud


pertencente nossa Empresa. O servio foi contratado empresa OVH e o servidor est
alojado no datacenter que essa empresa possui em Beauharnois no Canad.

http://www.ovh.pt/aproposito/datacenters.xml

Conexo com o banco de dados

Utilizou-se uma conexo atravs do provider OLEDB na funo HOpenConnection()

Na pasta EXE do projeto instalou-se o arquivo Parametros.ini com as variveis a utilizar


na conexo com o banco de dados.

Desta forma torna-se possvel testar o projeto noutro servidor e com outros parmetros
de conexo.

Chama-se a especial ateno para a seguinte propriedade:

..CursorOptions = hClientCursor+hForwardOnlyCursor

Sugere-se a sua incluso nos parmetros de conexo a fim de evitar uma anomalia que
ocorre em store procedures quando nestas existe o comando INSERT. Observaram-se
situaes em que foram inseridos mltiplas linhas (3 a 5) quando na realidade de
pretendia inserir apenas uma linha na tabela.

O banco de dados contm duas tabelas, onde foram inseridos dados referentes

identificao dos Estados Brasileiros, bem como valores de rea territorial em km2,

nmero de municpios e populao no censo de 2014.

Pgina 2
Breve explicao do cdigo

O projeto constitudo por apenas uma tela.

Nas opes 1 a 4 so demonstradas as possibilidades de leitura de uma view.

Recorreu-se funo HExecuteSQLQuery() com uma varivel do tipo Data Source.

Nas opes onde se pretende demonstrar a incluso de parmetros na execuo da view


utilizou-se tambm a funo StringBuild()p ara completar a string que contm o
script de SQL que permite a leitura da view.

Na opo 4 demonstra-se como ler o resultado de uma query invocando-se o nome da


coluna da view ou tabela que consta da varivel do tipo Data Source.

Desta forma possvel obter o resultando da query com a leitura de uma linha de cada
vez.

Nas opes 5 e 6 demonstram-se a utilizao de store procedures.

MS SQL Server Management Studio

Recorremos habitualmente o MSSQLMS para contruir scripts em T-SQL.

A vantagem deste metido consiste basicamente em testar a sintaxe da query no prprio


editor do banco de dados para depois utilizar esses scripts no editor de cdigo do
WinDev.

Recomendao sobre a utilizao de store procedures

No nosso trabalho de desenvolvimento de aplicao com WinDev e MSSQL utilizamos


sistematicamente store procedures.

As principais vantagens so as seguintes:

Melhor desempenho tendo em conta que o processamento da query efetuado


pelo servidor de banco de dados em modo pr-compilado;
Por estarem pr-compiladas pelo servidor as SPs beneficiam dos mecanismos de
otimizao do plano de execuo;
Diminuio muito significativa do trfego da rede porque so enviados para o
servidor apenas o comando EXEC, o nome da SP e os parmetros quando os
mesmos forem necessrios;

Pgina 3
Num cenrio oposto, quando se envia para o servidor de banco de dados um
script escrito na sua totalidade do lado do client, o servidor efetua sempre a
verificao da sintaxe e as permisses de execuo. Nunca so criadas estatsticas
de execuo da query, como sucede com as SPs tendo em vista a melhoria do
plano de execuo.

Pgina 4
Anexos

Scripts para criao das tabelas, view e store procedures

Observao: o nome do banco de dados utilizado WD19DemoMSSQL

-- Script de criao de tabelas

USE [WD19DemoMSSQL]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EstadosDados](
[EstadoDados_ID] [int] IDENTITY(1,1) NOT NULL,
[TStamp] [timestamp] NOT NULL,
[Estado_ID] [int] NOT NULL,
[Municipios] [smallint] NOT NULL,
[Area] [decimal](12, 1) NOT NULL,
[Populacao] [bigint] NOT NULL,
CONSTRAINT [PK_EstadosDados] PRIMARY KEY CLUSTERED
(
[EstadoDados_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_EstadosDados_Estado_ID] ON
[dbo].[EstadosDados]
(
[Estado_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Estado](
[Estado_ID] [int] IDENTITY(1,1) NOT NULL,
[TStamp] [timestamp] NOT NULL,
[UF] [char](2) NOT NULL,
[NomeEstado] [varchar](50) NOT NULL,
[Capital] [varchar](50) NOT NULL,
CONSTRAINT [PK_Estado] PRIMARY KEY CLUSTERED
(
[Estado_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

Pgina 5
--Script de criao da view

USE [WD19DemoMSSQL]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[v_EstadosDadosGerais]
AS
SELECT TOP (100) PERCENT dbo.Estado.UF, dbo.Estado.NomeEstado,
dbo.Estado.Capital, dbo.EstadosDados.Municipios,
dbo.EstadosDados.Area,
dbo.EstadosDados.Populacao
FROM dbo.Estado INNER JOIN
dbo.EstadosDados ON dbo.Estado.Estado_ID =
dbo.EstadosDados.Estado_ID
ORDER BY dbo.Estado.UF
GO

-- Script para criao das stores procedures

USE [WD19DemoMSSQL]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[EstadosDados_SelectCapital_PesquisaTipoLike]
@Capital VARCHAR(50)

AS
SET NOCOUNT ON

SELECT
E.UF,
E.NomeEstado,
E.Capital,
D.Municipios,
D.Area,
D.Populacao
FROM
dbo.Estado AS E
INNER JOIN
dbo.EstadosDados AS D
ON
E.Estado_ID = D.Estado_ID
WHERE
E.Capital LIKE @Capital + '%'
ORDER BY
E.Capital
GO

Pgina 6
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[EstadosDados_SelectCapital_PesquisaExata]
@Capital VARCHAR(50)

AS
SET NOCOUNT ON

SELECT
E.UF,
E.NomeEstado,
E.Capital,
D.Municipios,
D.Area,
D.Populacao
FROM
dbo.Estado AS E
INNER JOIN
dbo.EstadosDados AS D
ON
E.Estado_ID = D.Estado_ID
WHERE
E.Capital = @Capital
ORDER BY
E.Capital
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[EstadosDados_Listar]
AS
SET NOCOUNT ON

SELECT
E.UF,
E.NomeEstado,
E.Capital,
D.Municipios,
D.Area,
D.Populacao
FROM
dbo.Estado AS E
INNER JOIN
dbo.EstadosDados AS D
ON
E.Estado_ID = D.Estado_ID
ORDER BY
E.UF
GO

Pgina 7
-- Script para insero de dados nas tabelas EstadosDados e Estado

USE [WD19DemoMSSQL]
GO
SET IDENTITY_INSERT [dbo].[EstadosDados] ON
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (1, 1, 22, CAST(164122.2 AS
Decimal(12, 1)), 795145)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (2, 2, 102, CAST(27767.7 AS
Decimal(12, 1)), 3327551)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (3, 3, 62, CAST(142814.6 AS
Decimal(12, 1)), 756500)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (4, 4, 102, CAST(1570745.7
AS Decimal(12, 1)), 3893763)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (5, 5, 417, CAST(564692.7 AS
Decimal(12, 1)), 15150143)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (6, 6, 184, CAST(148825.6 AS
Decimal(12, 1)), 8867448)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (7, 7, 1, CAST(5822.1 AS
Decimal(12, 1)), 2867869)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (8, 8, 78, CAST(46077.5 AS
Decimal(12, 1)), 3894899)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (9, 9, 246, CAST(340086.7 AS
Decimal(12, 1)), 6551322)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (10, 10, 217, CAST(331983.3
AS Decimal(12, 1)), 6861924)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (11, 11, 853, CAST(586528.3
AS Decimal(12, 1)), 20777672)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (12, 12, 79, CAST(357125.0
AS Decimal(12, 1)), 2630098)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (13, 13, 141, CAST(903357.9
AS Decimal(12, 1)), 3236578)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (14, 14, 144, CAST(1247689.5
AS Decimal(12, 1)), 8101180)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (15, 15, 223, CAST(56439.8
AS Decimal(12, 1)), 3950359)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (16, 16, 185, CAST(98311.6
AS Decimal(12, 1)), 9297861)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (17, 17, 224, CAST(251529.2
AS Decimal(12, 1)), 3198185)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (18, 18, 399, CAST(199314.9
AS Decimal(12, 1)), 11112062)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (19, 19, 92, CAST(43696.1 AS
Decimal(12, 1)), 16497395)

Pgina 8
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (20, 20, 167, CAST(52796.8
AS Decimal(12, 1)), 3419550)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (21, 21, 52, CAST(237576.2
AS Decimal(12, 1)), 1755015)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (22, 22, 15, CAST(224299.0
AS Decimal(12, 1)), 500826)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (23, 23, 497, CAST(281748.5
AS Decimal(12, 1)), 11228091)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (24, 24, 295, CAST(95346.2
AS Decimal(12, 1)), 6734568)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (25, 25, 75, CAST(21910.3 AS
Decimal(12, 1)), 2227294)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (26, 26, 645, CAST(248209.4
AS Decimal(12, 1)), 44169350)
INSERT [dbo].[EstadosDados] ([EstadoDados_ID], [Estado_ID],
[Municipios], [Area], [Populacao]) VALUES (27, 27, 139, CAST(277620.9
AS Decimal(12, 1)), 1502759)
SET IDENTITY_INSERT [dbo].[EstadosDados] OFF
SET IDENTITY_INSERT [dbo].[Estado] ON
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (1, N'AC', N'Acre', N'Rio Branco')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (2, N'AL', N'Alagoas', N'Macei')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (3, N'AM', N'Amazonas', N'Manaus')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (4, N'AP', N'Amap', N'Macap')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (5, N'BA', N'Bahia', N'Salvador')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (6, N'CE', N'Cear', N'Fortaleza')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (7, N'DF', N'Distrito Federal', N'Braslia')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (8, N'ES', N'Esprito Santo', N'Vitria')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (9, N'GO', N'Gois', N'Goinia')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (10, N'MA', N'Maranho', N'So Lus')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (11, N'MG', N'Minas Gerais', N'Belo Horizonte')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (12, N'MS', N'Mato Grosso do Sul', N'Campo Grande ')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (13, N'MT', N'Mato Grosso', N'Cuiab')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (14, N'PA', N'Par', N'Belm')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (15, N'PB', N'Paraba', N'Joo Pessoa')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (16, N'PE', N'Pernambuco', N'Recife')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (17, N'PI', N'Piau', N'Teresina')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (18, N'PR', N'Paran', N'Curitiba')

Pgina 9
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (19, N'RJ', N'Rio de Janeiro', N'Rio de Janeiro')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (20, N'RN', N'Rio Grande do Norte ', N'Natal')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (21, N'RO', N'Rondnia', N'Porto Velho')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (22, N'RR', N'Roraima', N'Boa Vista')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (23, N'RS', N'Rio Grande do Sul', N'Porto Alegre')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (24, N'SC', N'Santa Catarina', N'Florianpolis')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (25, N'SE', N'Sergipe', N'Aracaju')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (26, N'SP', N'So Paulo', N'So Paulo')
INSERT [dbo].[Estado] ([Estado_ID], [UF], [NomeEstado], [Capital])
VALUES (27, N'TO', N'Tocantins', N'Palmas')
SET IDENTITY_INSERT [dbo].[Estado] OFF

Pgina 10

You might also like