domingo, 29 de junho de 2008

BOOTMGR is compressed

Este erro ocorre na inicialização do windows por motivos até o presente momento desconhecidos. No meu caso eu fui compactar a unidade para liberar espaço e logo após efetuar a compactação e reiniciar a máquina fui surpreendido com a mesma. Bem, após muitas horas de pesquisa na net onde encontrei farto material de outras pessoas reportando este erro mais nada de solução, encontrei uma dica a qual me livrou de ter que perder mais tempo ainda formatando e reinstalando todos os programas. Como é uma experiência nada agradável, aqui irei descrever quais os passos a serem seguidos nesta situação:

1 - Coloque o DVD do windows vista no drive e dê boot na máquina atráves do mesmo;

2 - Na primeira tela click em avançar;

3 - Na tela seguinte click na opção Reparar o Computador;

4 - Será detectada a instalação do vista, sendo exibida uma caixa de dialogo com as informações da mesma. Click em avançar;

5 - Na próxima tela click na opção Prompt de Comando;

6 - Na janela que se abrirá (prompt do DOS) digite:

Bootrec/Fixboot - tecle <enter> e aguarde a confirmação da operação bem sucedida;

Bootrec/fixmbr - tecle <enter> e aguarde novamente a confirmação.

Pronto! Se tudo correu bem até aqui agora é só reiniciar seu computador e seu sistema iniciará normalmente.

segunda-feira, 9 de junho de 2008

VIEW - Tabela Virtual

VIEW é uma tabela única derivada de outras tabelas. Essas outras tabelas podem ser tabelas de base ou outras VIEWS existentes. Uma VIEW não existe na forma física; ela pode ser considerada uma tabela virtual, em contraste com tabelas de base, cujos registros são efetivamente armazenados no banco de dados. Podemos imaginar uma VIEW como um modo de especificar uma consulta à qual precisamos com frequência.

O comando para criação de uma VIEW é CREATE VIEW. Uma VIEW é composta do nome de uma tabela, uma lista de nomes de atributos e uma consulta para especificar seu conteúdo. Se um atributo for uma função do banco de dados como SUM, AVG, COUNT, MAX, etc. ou uma operação aritmética você deve especificar um nome para identificar os atributos, senão é opcional.

Exemplo - tabelas de base:

Create Table COLABORADOR (

id_colaborador integer not null,

id_supervisor integer,

id_depto integer,

nomer varchar(50),

sexo varchar(1),

data_nascimento date,

salario numeric(15,4),

constraint pk_colaborador primary key (id_colaborador),

constraint fk_colab_supervisor foreign key (id_supervisor) references colaborador (id_colaborador),

constraint fk_colab_departamento foreign key (id_depto) references departamento (id_depto) on update cascade)

);

Create Table DEPARTAMENTO (

id_depto integer not null,

id_gerente integer not null,

nome_depto varchar(30),

constraint pk_departamento primary key (id_depto),

constraint fk_depto_gerente foreign key (id_gerente) references colaborador (id_colaborador) on update cascade)

);

Create Table PROJETO (

id_projeto integer not null,

id_depto integer not null,

nome_projeto varchar(30),

constraint pk_projeto primary key (id_projeto),

constraint fk_projeto_depto foreign key (id_depto) references departamento (id_depto) on update cascade)

);

Create Table COLABORADOR_PROJETO (

id_colaborador integer not null,

id_projeto integer not null,

horas float not null default 0.00,

constraint pk_colab_projeto primary key (id_colaborador, id_projeto),

constraint fk_cp_colaborador foreign key (id_colaborador) references colaborador (id_colaborador) on update cascade,

constraint fk_cp_projeto foreign key (id_projeto) references projeto (id_projeto) on update cascade)

);

E a partir delas criar a seguinte view:

Create View PROJETOS_COLABORADOR

as Select c.id_colaborador,

c.nome,

p.nome_projeto,

d.nome_depto,

cp.horas

From Colaborador_Projeto cp

Join Colaborador c on (c.id_colaborador = cp_id_coladorador)

Join Projeto p on (p.id_projeto = cp.id_projeto)

Join Departamento d on (d.id_depto = p.id_projeto)

Uma VIEW está sempre atualizada, já que quando alterarmos os registros nas tabelas de base das quais a VIEW é definida, a VIEW deve automaticamente refletir essas alterações. Desta forma, uma VIEW não efetua nenhuma ação na hora de sua criação, e sim na hora que especificamos uma consulta. Sendo de responsabilidade do SGDB e não do usuário assegurar que a VIEW esteja sempre atualizada.

  • Uma VIEW com uma única tabela definidora é atualizável se os atributos contiverem a chave primária da relação de base, porque mapeará cada registro resultante para um único registro da tabela de base;
  • VIEWS definidas em múltiplas tabelas utilizando junções geralmente não são atualizáveis;
  • VIEWS definidas com o uso de funções de agregação e de agrupamento não são atualizáveis.

Amigos, este artigo é uma pequena mostra do poder das VIEWS e para aqueles que queiram ter um maior conhecimento, aconselho a leitura de uma bibliografia específica para o SGDB utilizado - para o nosso bom Firebird recomendo os livros "Firebird Essencial" (capítulo 14) e "Firebird - O Banco de Dados do Novo Milênio" (capítulo 13), ambos de autoria de Carlos Cantu.

Referência:

Navathe, Elmasri, Sistemas de Banco de Dados - Fundamentos e Aplicações, Rio de Janeiro, 2000, Ed. LTC, 3ª Ed., 837p.

terça-feira, 3 de junho de 2008

Utilizando Stored Procedure (SP) no Firebird

O uso de Stored Procedures é muito útil em um ambiente cliente/servidor em função de fatores como desempenho, redução do tráfego de informações pela rede, agilidade e segurança. Neste artigo vamos explorar o poder das SPs, inicialmente definirei Stored Procedure, os tipos suportados pelo Firebird, sua estrutura e por fim criaremos uma SP e analisaremos a mesma linha a linha.

Stored Procedure (SP) é, na sua essência, um programa PSQL, que é armazenada em um banco de dados Firebird. A stored procedure é composta pelos comandos SQL, variáveis1 e comandos de fluxo lógico. As SPs podem receber (caso existam) e retornar (caso a SP retorne valores) valores através de parâmetros de entrada e saída.

O Firebird suporta dois tipos de SPs: executáveis que retornam no máximo um registro e as selecionáveis que podem retornar vários registros. As SPs selecionáveis se comportam como “tabelas virtuais - views“ do banco, já que podem ser utilizadas como fonte de dados em selects. As SPs selecionáveis são um extraordinário recurso nos fornecido pelo Firebird e que eu em particular uso e abuso das mesmas para me auxiliar na confecção de relatórios.

As SPs são executas em um determinado momento, através de chamadas de execução específica, acionada pelo desenvolvedor ou pela aplicação no momento desejado.

Estrutura e criação de uma SP – O comando para criação de uma SP é o Create Procedure. Uma SP tem duas partes: cabeçalho e corpo. No cabeçalho, temos a definição do nome da SP, parâmetros de entrada (caso existam) e parâmetros de saída (caso a SP retorne valores). O corpo contém declarações de variáveis e comandos a serem executados.

Create Procedure Minha_Primeira_SP (

Param1 tipo, --- lista de parâmetros de entrada -----

Param2 tipo)

Returns (

Valor1 tipo, --- lista de valores de saída -----

Valor2 tipo)

As

Declare variable var1 tipo; ---- lista de variáveis -----

Declare variable var2 tipo;

Begin

(Corpo da SP – comandos)

End

Vamos agora ver na prática a criação de uma SP que funciona como um gerador de códigos para tabelas – (tipo um generetor);

1 CREATE PROCEDURE NOVO_CODIGO (

2 tabela varchar(30))

3 returns (

4 proximo_codigo integer)

5 as

6 declare variable codigo_atual integer;

7 begin

8 --Recupera o valor atual do código

9 select id_atual from controle_id c

10 where (c.tabela = :tabela)

11 into :codigo_atual;

12 --Verifica se o valor do código é nulo

13 if (:codigo_atual is null) then

14 begin

15 proximo_codigo = 1;

16 insert into controle_id (tabela, id_atual)

17 values (:tabela, :proximo_codigo);

18 end

19 else

20 begin

21 proximo_codigo = codigo_atual + 1;

22 update controle_id set id_atual = :proximo_codigo

23 where (tabela = :tabela);

24 end

25 suspend;

26 end

Agora vamos analisar nossa SP, linha a linha.

Linha 1 – Criamos a SP com o nome Novo_Codigo, bastante sugestivo -:) para a finalidade da mesma;

Linha 2 – Definimos o parâmetro de entrada com seu respectivo tipo, que deverá ser informado para sua execução;

Linha 3 – Returns( ) – define que os valores ali contidos serão retornados pela SP;

Linha 4 – A variável com o seu respectivo tipo, que será o nosso valor de retorno;

Linha 6 – Declaração de uma variável com seu respectivo tipo que será utilizada no processamento da SP;

Linhas 7 e 26 – Begin/End (bastante conhecidos nosso -:) - um bloco que limita uma seqüência de comandos e instruções) - define o inicio e fim de nossa SP;

Linhas 8 e 12 – Comentários;

Linhas 9 a 11 – Fazemos uso de um select para recuperarmos da tabela que será passada por parâmetro para SP o valor do campo id_atual da tabela controle_id e inserimos o valor retornado na variável codigo_atual;

Linhas 13 a 24 – Verificamos se o valor retornado é nulo e caso verdadeiro atribuímos a nossa variável de retorno (proximo_codigo) o valor 1 e inserimos um novo registro na tabela Controle_Id senão atribuímos a nossa variável de retorno (proximo_codigo) o valor do código_atual + 1 e atualizamos o registro da tabela Controle_Id;

Linha 25 – Instrução SUSPEND, suspenderá a execução da procedure e retornará o valor de saída.

Bem amigos, neste artigo tivemos uma breve introdução a este extraordinário recurso que o Firebird nos disponibiliza as Stored Procedures, porém ainda temos muito, mais muito mesmo o que explorar. Num próximo artigo demonstrarei um pouco mais do que podemos fazer utilizando SP, onde iremos usar um loop para podermos resgatar n-registros, tratar valores enfim... usar um pouco mais do poder das SPs.

Referências:

  1. Cantu, Carlos Henrique, Firebird Essencial, Rio de Janeiro, Ed. Ciência Moderna, 2005, 308p.
  2. Cantu, Carlos Henrique, Firebird 2.0 – O Banco de Dados do Novo Milênio, Ed. Ciência Moderna, 2006, 304p.
1 - Os tipos dessas variáveis podem ser qualquer tipo nativo suportado pelo Firebird, exceto array e blob.

domingo, 1 de junho de 2008

Diversas versões do Firebird em uma máquina - 2ª Parte

Em um artigo anterior (Instalando duas versões do Firebird em uma mesma máquina) eu demonstrei passo a passo como instalar as versões 1.0 e 1.5 ou 2.0 na mesma máquina e utilizar as mesmas como serviço sem problemas. Agora demonstrarei como podemos instalar junto a essas duas versões, mais a versão 2.1 – isto graças à possibilidade que o FB 2.1 nos dá de renomear o serviço durante o processo de instanciar o mesmo.

Os passos iniciais são os mesmo descritos no artigo anterior – motrarei o que devemos modificar a partir da instalação da versão 2.1 isto caso as duas versões anteriores já estejam instaladas... Conforme demonstro abaixo:

clip_image002

Obs: Instaladas as versões 1.0 e 1.5;

clip_image004

Ambas em execução como serviço:

Durante o processo de instalação do FB 2.1 será exibido um alerta informado que se encontra em execução um servidor Firebird 1.5 ou posterior em execução e que o serviço/aplicação deve ser finalizado.

clip_image006

Após clicar em Ok a instalação será abortada. Para que consigamos prosseguir é necessário que seja parado o serviço do FB 1.5 ou 2.0 (Vá a Ferramentas Administrativas/Serviços e pare o mesmo). Pronto feito isto, execute novamente o processo de instalação do FB 2.1.

Concluída a instalação da versão 2.1 – partiremos agora para instanciar o serviço e iniciar o mesmo, isto será feito manualmente através da aplicação de linha de comando instsvc que faz parte do pacote de instalação e encontra-se na pasta bin.

clip_image008

Abra um prompt de comando (Iniciar/Executar – cmd ou Iniciar/Programas/Promp de Comando). Na tela que se abre digite: cd\Arquivos de Programas\Firebird\Firebird_2_1 <Enter>

Estando neste diretório digite: Edit firebird.conf será aberta a tela do editor de texto Edit com o conteúdo do referido arquivo carregado, localize a linha:

clip_image010

#RemoteServicePort=3050 e faça as seguintes alterações:

– remova ( # ) da frente do nome e depois altere o número da porta 3050 para qualquer outro número de porta permitida. Salve as alterações feitas no documento e saia do editor de textos.

Pronto agora vamos iniciar o processo de criação da instância do serviço e a inicialização do mesmo.

Vamos agora para o diretório onde esta localizado o instsvc...

clip_image012

Digite cd bin <Enter>, digite instsvc i –s –a –g –n Firebird_2_1 <Enter> (observe o parâmetro –n e logo em seguida o nome Firebird_2_1 – este será o nome do meu serviço para o FB 2.1), será mostrada duas linhas de mensagens informando-lhe que foram criados com sucesso as instâncias do Server e Guardian. Agora digite instsvc sta <Enter>, será mostrada uma nova linha de mensagem lhe informado que o serviço foi iniciado com sucesso.

clip_image014

Bem se tudo ocorreu nos conformes, agora você terá as versões 1.0, 1.5 ou 2.0 e 2.1 instaladas e em execução como serviço em uma mesma máquina... show.

Bom trabalho e até uma próxima oportunidade.

Diversas versões do Firebird em uma máquina - 1ª Parte

Atualmente eu trabalho dando manutenção a um sistema desenvolvido utilizando a versão 1.0 do Firebird, devido a problemas de compatibilidade ainda não pude migrar o mesmo para uma versão mais recente, porém algum tempo atrás necessitei iniciar um novo projeto utilizando a versão 1.5 e daí me surgiu o problema, como ter as 2 versões instaladas em uma mesma máquina. Após algumas pesquisas e consulta a alguns colegas cheguei a uma solução que acabei tornando em um tutorial passo a passo de como fazer isto.

INSTALANDO DUAS VERSÕES DE FIREBIRD EM UMA MESMA MÁQUINA

1 – Instale o Firebird 1.0;

2 – Instale o Firebird 1.5 ou superior;

Obs-1.: Durante o processo de instalação da segunda versão, o instalador detectará que já existe uma versão do banco de dados instalada na máquina e será exibida uma mensagem perguntando se você realmente deseja instalar outra versão (click em NÃO), pois ele lhe perguntará se quer cancelar a instalação. A segunda versão será instalada, porém a mesma não será configurada o que deverá ser feito manualmente.

Obs-2.: Não é possível ter instalada em uma mesma máquina a versão 1.5 e a versão 2.0, pois o serviço criado pelos mesmos durante o processo de instalação tem o mesmo nome e não pode ser modificado, o que não permite-nos ter as duas versões em execução ao mesmo tempo.

Obs-3.: A pasta padrão de instalação do Firebird é:

C:\Arquivos de Programas\Firebird\Firebird_1_5 recomendo que está seja alterada para:

C:\Arquivos de Programas\Firebird_1_5;

2.1 – Após a conclusão da instalação do Firebird 1.5 ou 2.0 vá para o prompt do MS-DOS (iniciar executar cmd );

2.1.1 – Estando no prompt do MS-DOS digite cd\Arquivos de Programas\Firebird_1_5 ;

2.1.2 – Digite edit firebird.conf ; sera aberta a tela do editor de texto com o conteúdo do arquivo de configurações do Firebird – localize a linha:

#RemoteServicePort=3050 – remova ( # ) e depois altere o numero da porta para 3051 ou qualquer outro número de porta. Salve o documento e saia do editor.

Obs – Caso seja necessário coloque a porta que você definiu no arquivo de configuração do Firebird nas exceções do Firewall do windows, pois o mesmo poderá bloquear a mesma por motivos de segurança.

2.1.3 – Agora digite cd bin

2.1.3 – Estando no diretório bin do Firebird, devemos instanciar o serviço e depois coloca-lo em execução, conforme os procedimentos a seguir:

Digite instsvc i –s –a –g

Digite instsvc sta

Se tudo correu normalmente após a execução deste último comando será exibida uma mensagem informando que o serviço foi iniciado com sucesso.

Pronto, bom trabalho – as duas versões do Firebird encontram-se instaladas e em execução.

Começando a blogar...

Boa tarde caros colegas!

A partir de hoje procurarei sempre escrever artigos e publica-los aqui e espero que de alguma forma eles possam ajuda-los.

Sds,

Hélio Oliveira