Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 05 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
64 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Alterando estrutura de tabelas paradox via código
Publicado por gsoft : Sexta, Abril 01, 2005 - 12:05 GMT-3 (4915 leituras)
Comentários 3 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Olá amigos, esta é minha primeira tentativa de escrever um artigo sobre esta fantástica ferramenta de programação chamada Delphi, sou desenvolvedor de sistemas à 5 anos, recebi gentilmente uma edição da revista Active Delphi para minha avaliação, cedida pela equipe da ActiveDelphi, eu não tinha idéia que esta revista pudesse ser tão clara e objetiva, fiquei impressionado...

A edição 003 possui o brilhante artigo "Alterando estrutura de tabelas paradox via código" na página 6, escrito pelo colega Ivan José de Mecenas Silva.

 

Este artigo ensina como construir uma aplicação que pode ser utilizada por usuários, a fim dos mesmos selecionarem tabelas com estruturas diferentes e igualá-las.

 

Acredito que muitos desenvolvedores distribuem suas aplicações à distância para seus clientes e precisam atualizar seus programas, inclusive as tabelas.

 

No final do artigo apresentado, a autor expõe suas considerações finais explicando que:

 

"Os desenvolvedores poderão adaptar o código às suas próprias necessidades, preferencialmente inserindo-os em seus aplicativos, com objetivo de que as alterações na estrutura da base de dados possam ser feitas sem que o usuário precise atuar diretamente no processo."

 

Eu distribuo minhas aplicações via internet para meus clientes e por isso preciso efetuar as atualizações das estruturas dos bancos de dados sem que o usuário precise atuar diretamente no processo, resolvi então alterar o código do que foi ensinado a fim de criar uma Unit padrão e uma rotina que pode ser utilizada por qualquer aplicação que use banco de dados Paradox.

 

A Unit criada chama-se Estruturas.pas, pode ser adicionada ao seu projeto e declarada na cláusula Uses do DataModule da aplicação.

Clique aqui para fazer o download.

 

Insira na Unit do DataModule a função abaixo:

 

Function TDM.AliasToPath(Alias: String): String;

Var

  Desc : dbDesc;

  szAlias : Array[0..255] Of Char;

Begin

  StrPCopy(szAlias,Alias);

  DbiGetDatabaseDesc(szAlias,@Desc);

  Result := StrPas(Desc.szPhyName);

End;

 

A função acima tem como objetivo retornar o path do Alias usado pela aplicação.

 

Em seguida, o evento Create do DataModule deverá ficar assim:

 

procedure TDataModule1.DataModuleCreate(Sender: TObject);

Var ArquivoEncontrado: Integer;

begin

  For ArquivoEncontrado := 0 To DataModule1.ComponentCount - 1 Do

  If (DataModule1.Components[ArquivoEncontrado] Is TTable) Then

    If FileExists(ExtractFilePath(Application.ExeName) + (DataModule1.Components[ArquivoEncontrado] As TTable).TableName) Then

    Begin

      EstruturaDesejada(ExtractFilePath(Application.ExeName) + (DataModule1.Components[ArquivoEncontrado] As TTable).TableName);

      EstruturaAtual(AliasToPath('NomeDoAlias') + '\' + (DataModule1.Components[ArquivoEncontrado] As TTable).TableName);

      VerificaEstruturas;

      IgualaEstruturas;

      DeleteFile(ExtractFilePath(Application.ExeName) + ExtractFileName((DataModule1.Components[ArquivoEncontrado] As TTable).TableName));

    End;

End;

 

Feito isso, basta reestruturar as tabelas pelo Database Desktop e distribuir as mesmas, vazias e com suas novas estruturas no mesmo diretório onde se encontra o arquivo executável de sua aplicação.

 

E importante dizer que o Alias não poderá estar sendo apontado para este mesmo diretório, ou seja, as tabelas a serem atualizadas tem que estar em um diretório qualquer diferente de onde esta o arquivo executável de sua aplicação.

 

Automaticamente, como num passe de mágica todas as tabelas serão reestruturas e atualizadas.

 

Sou André Luiz de Souza Fernandes, Técnico em Processamento de Dados, dono do site GSoftWares.COM e responsável pelo projeto OpenSource de Portais PHP CPGNUKE no Brasil.

Contato suporte@gsoftwares.com

 

Um forte abraço a todos!

 

PS: Eu escrevi tudo muito rápido, qualquer erro, por favor me avisem.



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: gsoft : Jan 14, 2006 - 12:18
(Informações sobre o membro | Enviar uma mensagem)
Em alguns caso o comando

DeleteFile(ExtractFilePath(Application.ExeName) + ExtractFileName((DataModule1.Components[ArquivoEncontrado] As TTable).TableName));

Deve ser trocado por

DeleteFile(PChar(ExtractFilePath(Application.ExeName) + ExtractFileName((DataModule1.Components[ArquivoEncontrado] As TTable).TableName)));


por: gsoft : Jun 19, 2006 - 03:27
(Informações sobre o membro | Enviar uma mensagem)
Algum irresponsável tirou o link do ar, vou postar a unit aqui!

unit Estruturas;

interface

uses
SysUtils, Classes, Forms, TypInfo, Db, DBTables, BDE;

procedure EstruturaDesejada(FileName: TFileName);
procedure EstruturaAtual(FileName: TFileName);
procedure VerificaEstruturas;
procedure IgualaEstruturas;

type
TmcFieldType = (ftString, ftInteger, ftBoolean, ftFloat, ftCurrency,
ftDate, ftTime, ftMemo, ftFmtMemo, ftAutoInc);

mc_FieldDef = packed record
szName : DBINAME;
iType : Word;
iSubType : Word;
iLength : Word;
iPrecision: Byte;
end;

function mc_GetPiece(pValue: string; pNumPiece: Integer; pDelimiter: string): string;
function mc_AddField(Table: TTable; Rec: mc_FieldDef): Boolean;
function mc_DropField(Table: TTable; Field: TField): Boolean;
function mc_ModifyField(Table: TTable; Field: TField; Rec: mc_FieldDef): Boolean;

var
TabelaDesejada: TTable;
TabelaAtual: TTable;
listDiferencas: TStringList;

implementation

const
AmcFieldType: array[0..9] of Word = (257, 267, 270, 258, 259, 260, 268, 262, 264, 271);

procedure EstruturaDesejada(FileName: TFileName);
begin
If Not FileExists(FileName) then Exit;
If Application.FindComponent('TabelaDesejada') = Nil Then TabelaDesejada := TTable.Create(Application);
with TabelaDesejada do begin
Active := False;
TableName := FileName;
Active := True;
FieldDefs.Update;
end;
end;

procedure EstruturaAtual(FileName: TFileName);
begin
If Not FileExists(FileName) then Exit;
If Application.FindComponent('TabelaAtual') = Nil Then TabelaAtual := TTable.Create(Application);
TabelaAtual := TTable.Create(Application);
with TabelaAtual do begin
Active := False;
TableName := FileName;
Active := True;
FieldDefs.Update;
end;
end;

procedure VerificaEstruturas;
var
i, n: Integer;
nomeN, tipoN, tamanhoN: string;
nome, tipo, tamanho: string;
achou: Boolean;
begin
If Not FileExists(ExtractFilePath(TabelaDesejada.TableName) + ExtractFileName(TabelaDesejada.TableName)) Or
Not FileExists(ExtractFilePath(TabelaAtual.TableName) + ExtractFileName(TabelaAtual.TableName)) Then Exit;

If Application.FindComponent('listDiferencas') = Nil Then listDiferencas := TStringList.Create;

listDiferencas.Clear;

TabelaDesejada.Active := True;
TabelaDesejada.FieldDefs.Update;

TabelaAtual.Active := True;
TabelaAtual.FieldDefs.Update;

{ Compara a estrutura desejada com a estrutura atual para determinar
os campos que devem ser alterados ou inseridos }
for i := 0 to TabelaDesejada.FieldDefs.Count - 1 do begin
nomeN := TabelaDesejada.FieldDefs.Items[i].Name;
tipoN := GetEnumName(TypeInfo(TFieldType), Integer(TabelaDesejada.FieldDefs.Items[i].DataType));
tamanhoN := IntToStr(TabelaDesejada.FieldDefs.Items[i].Size);
achou := False;

for n := 0 to TabelaAtual.FieldDefs.Count - 1 do begin
nome := TabelaAtual.FieldDefs.Items[n].Name;
tipo := GetEnumName(TypeInfo(TFieldType), Integer(TabelaAtual.FieldDefs.Items[n].DataType));
tamanho := IntToStr(TabelaAtual.FieldDefs.Items[n].Size);

if nome = nomeN then
begin
achou := True;
if (tipoN <> tipo) or (tamanhoN <> tamanho) then
begin
// Campo a ser alterado...
listDiferencas.Add('* ; ' + nomeN + ' ; '

Ler a continuação deste comentário...


por: carlosamaral : Nov 02, 2006 - 09:29
(Informações sobre o membro | Enviar uma mensagem) http://http://
Encontrei algumas dificuldades, o AliasToPath não esta mostrando o caminho, dando erro na hora de localizar o arquivo, mas o maior problema e que na hora de excluir o campo, só exclui se ele for o ultimo e não muda o indice nem a ordem dos campos. As outras funções funcionam muito bem. Excelente.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados