Jump to content
Fivewin Brasil

Modificar a Estrutura da Tabela(Mysql) Via Código


marcio1361303176

Recommended Posts

Olá,

Segue função para tal. Lembrando que o array da estrutura tem que vir no formato SQL e não DBF. Ex:

aEstrutura := {}

aadd(aEstrutura, {"usuario", "char(3)", "NO", ""} )

aadd(aEstrutura, {"opcao", "char(10)", "NO", ""} )

VerificaEstrutura('acesso', aEstrutura )

.....

////////////////////////////DADOS DA FUNCAO////////////////////////////////////////////

// NOME : VerificaEstrutura //

// SINTESE : Verifica a Estrutura de uma tabela e corrige se necessário //

// PARAMETROS : <1> cTabela //

// <2> aEstrutura Correta //

// RETORNO : lOk (se tudo ok) //

///////////////////////////////////////////////////////////////////////////////////////

Function VerificaEstrutura( cTabela, aEstrutura )

local aEstruturaOld := {}

local cCmdSql := ''

local lRetorno := .t.

local x, y

cCmdSql := 'show columns from '+cTabela

aEstruturaOld := SqlArray( cCmdSql )

for x = 1 to len( aEstrutura )

nEncontrado := Ascan( aEstruturaOld, {| y | upper(y[1]) = upper(aEstrutura[x,1]) } )

if nEncontrado <> 0 // Existe o campo, agora vai verificar se o campo está correto

if aEstrutura[x,2] <> aEstruturaOld[nEncontrado,2] .or. aEstrutura[x,3] <> aEstruturaOld[nEncontrado,3] .or. ( aEstrutura[x,4] <> 'NULL' .and. aEstrutura[x,4] <> aEstruturaOld[nEncontrado,5] )

cCmdSql := 'alter table '+cTabela+' modify column '+aEstrutura[x,1]+' '+aEstrutura[x,2]+' '+if(aEstrutura[x,3]="NO","NOT NULL","NULL")+if( aEstrutura[x,4] <> 'NULL' ,' default "'+aEstrutura[x,4]+'"','')

if !SqlExecute( cCmdSql )

lRetorno := .f.

exit

endif

endif

else

cCmdSql := 'alter table '+cTabela+' add '+aEstrutura[x,1]+' '+aEstrutura[x,2]+' '+if(aEstrutura[x,3]="NO","NOT NULL","NULL")+if( aEstrutura[x,4] <> 'NULL',' default "'+aEstrutura[x,4]+'"','')+' after '+aEstruturaOld[len(aEstruturaOld)-2,1]

if !SqlExecute( cCmdSql )

lRetorno := .f.

exit

endif

endif

next

return lRetorno

ps. Perdeu a IDENTAÇÃO

Um abraço,

Alexandre Pereira

fwh 2.6, xharbour, .99.6, MyMake

msn: alexpdasilva6@hotmail.com

atualmente em Rondônia

* ps 2 (não é playstation não)

Editado pq a linha estava errada

cCmdSql := 'alter table '+cTabela+' add '+aEstrutura[x,1]+' '+aEstrutura[x,2]+' '+if(aEstrutura[x,3]="NO","NOT NULL","NULL")+if( aEstrutura[x,4] <> 'NULL',' default "'+aEstrutura[x,4]+'"','')+' after '+aEstruturaOldid=red>[len(aEstruturaOld)-2,1]

Tinha esquecido do OLD

Editado por - alex2002 on 17/03/2008 21:33:27

Link to comment
Share on other sites

Caro amigo alex2002

Obrigado pela ajuda, mas não deu certo, veja se Estou passando alguma coisa errado. Obrigado

aEstrutura := {}

aadd(aEstrutura, {"acesso", "char(03)", "NO", ""} )

aadd(aEstrutura, {"usuario", "int(06)" , "NO", ""} )

VerificaEstrutura('niveis', aEstrutura )

Será que está algo errado....

Obrigado

masterservicevrb@gmail.com

FWHX2.6+SQLLIB+xDev+rpv+ MYSQL

Link to comment
Share on other sites

olá.

Veja bem, esta função é apenas para tabelas já existentes. Se a tabela não existir, primeiro vc tem que criá-la (dbcreate). Veja se é isso.

Um abraço,

Alexandre Pereira

fwh 2.6, xharbour, .99.6, MyMake

msn: alexpdasilva6@hotmail.com

atualmente em Rondônia

Link to comment
Share on other sites

Eu uso o dbcreate normal, com única diferença: Vc não pode incluir um campo que não seja na última posição, pois o SQLLIB mantem os campos SQL_ROWID e SQL_DELETED como os últimos da tabela.. nesse caso, vc não pode incluir um campo em uma tabela já existente, entre os campos que já existem.

Alexandre (Polirep)

Belo Horizonte / MG

alexandrepolirep@hotmail.com

Link to comment
Share on other sites

Olá,

Márcio, verifique se após a execução da rotina não gerou um arquivo SQLLOG.TXT. Se tiver algum problema na execução da query este arquivo registra.

[]s,

Evandro G. de Paula

Curvelo - MG

evandro@skillnet.com.br (Escr. - na Cidade)

imortal@skillnet.com.br (Res. - na Roça)

FWH 2.6+PellesC+MyMake+xHarbour.org 0.99.5+SqlLib

I PREPARATÓRIO PARA O VI ENCONTRO FIVEWIN - JULHO/2008 - CURVELO - MG

Link to comment
Share on other sites

Desta forma funcionou

local cCmdSql := ''

cCmdSql :='CREATE TABLE IPTU (tempo2 CHAR(18) )' Serve pra criar uma Tabela

cCmdSql := 'alter table acesso add tempo2 CHAR(18)' coloca um novo campo na tabela

cCmdSql := 'alter table '+'acesso'+' modify column '+ 'tempo2 CHAR(58)' modifica um campo já existente

*===========================

SqlExecute( cCmdSql ) executa o comando conforme descrito acima

masterservicevrb@gmail.com

FWHX2.6+SQLLIB+xDev+rpv+ MYSQL

Link to comment
Share on other sites

Olá,

Conforme citei anteriormente, esta função serve apenas para tabelas criadas pelo DBCREATE(). Pq todas as tabelas criadas pelo DBCREATE com a SqlLib possui os campos Sql_RowId e Sql_deleted. Sendo assim, esta função está preparada apenas para trabalhar com este tipo de tabela. Se vc quiser que ela trabalhe com tabelas que não possui estes campos, basta tirar o -2 que eu coloquei após o "after".

Um abraço,

Alexandre Pereira

fwh 2.6, xharbour, .99.6, MyMake

msn: alexpdasilva6@hotmail.com

atualmente em Rondônia

Link to comment
Share on other sites

Amigos, e se eu Antes de Iniciar a Modificação, deletar os campos +- assim

cCmdSql := 'ALTER TABLE `acesso` DROP COLUMN `sql_rowid`'

SqlExecute( cCmdSql )

cCmdSql := 'ALTER TABLE `acesso` DROP COLUMN `sql_deleted`'

SqlExecute( cCmdSql )

Depois Crio os campos

masterservicevrb@gmail.com

FWHX2.6+SQLLIB+xDev+rpv+ MYSQL

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...