terça-feira, 4 de novembro de 2008

VB6 & Oracle - Inserindo Dados

O Modelo Cliente/Servidor caracteriza-se por centralizar grande parte dos processos de um sistema de informação no SGBD. Esses processos são programados em forma de UDFs, Procedures e Triggers.
Neste artigo veremos como criar um procedure no Oracle, para em seguida desenvolvermos um aplicativo em VB6 o qual ira chamar a execução da mesma.

Iniciaremos então pelo banco de dados, veja abaixo o código da procedure:



Back-End Script de Banco de Dados

-- Criando a tabela para testar insert apartir de um front-end vb6
CREATE TABLE TESTEGM (
COD VARCHAR(3),
DESCRICAO VARCHAR(10)

);

-- Procedimento para insert - exemplo de arquitetura cliente/servidor
CREATE OR REPLACE PROCEDURE PROC_TESTE_GM (
PCOD IN VARCHAR,
PDESCRICAO IN VARCHAR,
PAUX_RETORNO OUT VARCHAR)
AS
BEGIN
INSERT INTO TESTEGM
(COD, DESCRICAO) VALUES (PCOD, PDESCRICAO);
COMMIT;
PAUX_retorno := 'OPERAÇÃO REALIZADA COM SUCESSO!';
EXCEPTION
WHEN OTHERS THEN
PAUX_retorno := SQLERRM || ' INSERT DISTRATO ERRO.' ; -- RETORNA A MENSAGEM COM CÓDIGO E DESCRIÇÃO DO ERRO ORACLE
ROLLBACK;

END;


Front-end Código do lado Cliente

Neste exemplo, aproveito para demostrar um pouco de modularização. Criei duas funcionalidades, uma que se preocupa com a conexão com o banco, "GetConnectionCRUD". Essa "Sub" retorna um "ADO Command" conectado e configurado como "procedure". Uma segunda rotina, "BuildParams", monta os parâmetros do "ADO Command" (o qual recebe como parâmetro) dinamicamente e atribui valor para os mesmos.


Private Sub BuildParams(ByRef obj As ADODB.Command)
'Cria o parâmetro de saida no commad
objInsertCommandAux.Parameters.Append objInsertCommandAux.CreateParameter("PAUX_RETORNO", adBSTR, adParamOutput)
'Cria os parâmetros de entrada nos commads já passando o valor para eles
obj.Parameters.Append objInsertCommandAux.CreateParameter("PCOD", adBSTR, adParamInput, , Text1.Text)
obj.Parameters.Append objInsertCommandAux.CreateParameter("PDESCRICAO", adBSTR, adParamInput, , Text2.Text)

End Sub

Private Function GetConnectionCRUD() As ADODB.Command
' Retorna um objeto (um activeX) ja conectado ao banco
' Dessa forma podemos de forma coesa, isolada definir uma conexão com o banco
Dim objCommandAux As New ADODB.Command
Dim MyConn As New ADODB.Connection

MyConn.Open "Provider=MSDAORA;Data Source=desvbancoteste;User ID=sistema;Password=landjah;"
objCommandAux.ActiveConnection = MyConn
objCommandAux.CommandType = adCmdStoredProc
Set GetConnectionCRUD = objCommandAux

End Function


Em seguinda codificaremos no evento OnClick de um botão a execução dos procedimentos, "Caixa Preta", descritos acima.


Dim objInsertCommandAux As New ADODB.Command
Dim AuxRetorno As String
' Para trabalar desconectado do banco ...
Dim rsZN As New ADODB.Recordset

Private Sub Command1_Click()

Set objInsertCommandAux = GetConnectionCRUD()
' Define que o command criado executará proc de Insert
objInsertCommandAux.CommandText = "PROC_TESTE_GM"


BuildParams objInsertCommandAux

'*** Executando a stored procedure
objInsertCommandAux.Execute

MsgBox (objInsertCommandAux("PAUX_RETORNO"))

'Destroi o objeto
Set objInsertCommandAux = Nothing

End Sub


Artigo completo (View Full Post)

segunda-feira, 3 de novembro de 2008

Banco de Dados ou Bando de Dados?

O fato de se gastar na ordem dos milhares por uma tecnologia de banco de dados relacional, tipo Oracle, MS SQL Server, IBM DB2, etc, não garante por si só que você terá informações consistentes.
Se você deseja algum dia extrair informações que agreguem valor ao seu negócio, trate de garantir que o que entra no seu banco de dados não seja lixo.
Supondo que, no que tange a modelagem de dados seu banco seja impecável. Suponhamos ainda, que você comprou o que existe de mais poderoso em termos de hardware, ainda assim existe a possibilidade desses dois fatores serem totalmente irrelevantes caso não exista mecanismos de checagem, neste suposto data base, a fim de garantir que o dado que é “inputado” não possui qualidade.
Para isso existem as constraints, checks e domains. Através deles programamos regras no banco de dados que trabalharão para que tudo que for inserido nele seja consistente, compreensível, relevante (Leia mais sobre ... ).

Veja um exemplo desse tipo de controle:

-- Criando a tabela de Tipo de Contato
CREATE TABLE ZnTipo_Contato(
TIPO_ContatoID NUMBER (8,0) PRIMARY KEY,
DESCRICAO VARCHAR2(20) NOT NULL,
DT_CADASTRO TIMESTAMP NOT NULL,
UpdateDate TIMESTAMP NOT NULL,
USERUPDATE NUMBER (8,0) NOT NULL,
CONSTRAINT chk_DESCRICAO CHECK (LENGTH(DESCRICAO) > 4)
);


No trecho de código acima criei uma tabela que possui nela duas constraints, ou seja, duas checagens de controle. Uma que não permitirá valores repetidos (Primary Key) na coluna “Tipo_ContatoID” (linha 3). A outra, não vai permitir valores com menos de 4 caracteres na coluna “DESCRICAO” (linha 8).

Comentários nos Objetos de Banco de Dados

Outro ponto importante que vai ser de extrema relevância para que seu banco de dados passe longe de ser o “bando de dados” mais high tech do mundo é o cuidado em comentar cada objeto construído no banco. Isso deve ser considerado uma cultura a ser desenvolvida, tanto pela equipe, num âmbito gerencial, quanto individualmente (Ou seja, aonde quer que você vá leve esse bom hábito).

Pense, com que cara você vai ficar quando daqui a três meses alguém lhe perguntar qual o significado da coluna “ValPerJurosPgto” e você não lembrar? Todavia, para a mesma situação, se houver um comentário na coluna sua orelha vai ser eternamente grata por continuar cinco palmos menor (hehehhe), além disso seu bolso irá lhe agradecer o salário continuar entrando.

COMMENT ON TABLE ZnTipo_Contato IS 'Tabela de referência. Armazena os possíveis Tipos de Contato. Exemplo: Email, Telefone, Celular';
COMMENT ON COLUMN ZnTipo_Contato.TIPO_ContatoID IS 'Primary key da tabela ZnTipo_Contato.';
COMMENT ON COLUMN ZnTipo_Contato.DESCRICAO IS 'Descrição do Tipo de Contato.';
COMMENT ON COLUMN ZnTipo_Contato.DT_CADASTRO IS 'Data de Cadastro do registro na tabela ZnTipo_Contato.';
COMMENT ON COLUMN ZnTipo_Contato.UpdateDate IS 'Data em que o usuário do sistema que atualizou um registro de Tipo de Contato.';
COMMENT ON COLUMN ZnTipo_Contato.USERUPDATE IS 'Usuário do sistema que atualizou um registro de Tipo de Contato.';


Agora vamos fazer alguns testes ...

-- Criando a Sequence para geração de Uk para a tabela ZnTipo_Contato
CREATE SEQUENCE SQ_ZnTipo_Contato
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
NOCYCLE
NOORDER
CACHE 20;



A seguir, vou inserir alguns registros na nova tabela. Pretento, em dado momento testar a constraint "chk_DESCRICAO".



-- Inserindo registros de Tipo de Contato em ZnTipo_Contato

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Email'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Telefone Residencial'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Telefone Comercial'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Telefone Celuar'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Gtalk'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Skype'
, SYSDATE
, SYSDATE
, 1
);

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Orkut Profile'
, SYSDATE
, SYSDATE
, 1
);

COMMIT;


Ok, agora vamos provocar a validação. Vou inserir um tipo de contato cujo tamanho será menor que 4 caracteres.

---- Testanto a constraint, inserindo um contato cujo o tamanho é menor que 4

INSERT INTO ZnTipo_Contato(
TIPO_CONTATOID
, DESCRICAO
, DT_CADASTRO
, UPDATEDATE
, USERUPDATE
) VALUES
(
SQ_ZnTipo_Contato.NEXTVAL
, 'Msn'
, SYSDATE
, SYSDATE
, 1
);




Verificando os registros inseridos


SELECT * FROM ZnTipo_Contato;



Como posso ver os comentários que colocamos nas colunas da tabela?

SELECT * FROM ALL_COL_COMMENTS WHERE table_name = 'ZNTIPO_CONTATO'



Artigo completo (View Full Post)

 
BlogBlogs.Com.Br