Fórum Identificar código SQL #459142

22/10/2013

0

Pessoal estou desenvolvendo uma ferramente de atualização on-line para meu sistema e estou com dificuldades para identificar parte do código.

Preciso identificar se o código é inclusão de tabelas ou colunas para então realizar os tratamentos adequados.

Tenho as seguintes linhas de código SQL:
ALTER TABLE tblContaCorrente ADD COLUMN ccorrente_tpinscricao integer;
CREATE TABLE tblFinCCusto (finccustoID AutoIncrement,  finccusto_contaspagarID integer, finccusto_filialID integer, finccusto_CenCustoID integer, finccusto_CenResultadoID integer, finccusto_valor Currency, finccusto_tipo VarChar(2), finccusto_userID integer, finccusto_alt DateTime, finccusto_cad DateTime, finccusto_status YESNO, PRIMARY KEY (finccustoID));


Ao executar cada linha, preciso identificar se é ALTER TABLE ou CREATE TABLE para que eu possa fazer a validação;

Caso seja CREATE TABLE, preciso capturar o nome da tabela.

Caso seja ALTER TABLE, preciso capturar o nome da coluna.
Paulo Andrade

Paulo Andrade

Responder

Posts

22/10/2013

Thiago Irrazabal

Boa tarde,
Usando Copy e Pos não te ajuda?

if Pos('ALTER', S) > 0 then
        begin
          S := Copy(S, Pos('COLUMN', S) + 7, 32);
          S := Copy(S, 1, Pos(' ', S) - 1);
        end
      else if Pos('CREATE', S) > 0 then
        begin
          S := Copy(S, Pos('TABLE', S) + 6, 32);
          S := Copy(S, 1, Pos(' ', S) -1);
        end;





Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

22/10/2013

Paulo Andrade

Usando o POS deu certo até certo ponto. Eu fiz assim:

function CreateOuAlter(Instrucao: String): String;
var
  resultou,texto: string;
  i,j,x: integer;
begin
  result := '';
  if POS('CREATE TABLE',instrucao)>0 then
    result := 'CREATE TABLE'
  else
    if POS('ALTER TABLE',instrucao)>0 then
      result := 'ALTER TABLE'
    else
      result := 'ERRO';
end;


Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:

function IdentificaColuna(Instrucao: String): String;
var
  texto,texto2: string;
  i,j,x: integer;
begin   
  result := '';
  if POS('ALTER TABLE ',instrucao)>0 then
  begin
    i := Length(instrucao);
    j := POS(' ADD COLUMN ',instrucao);
    texto := COPY(instrucao,i-j,j);
    x := POS(' ',texto);
    texto2 := COPY(texto,1,x-1);
    result := texto2;
  end;
end;


Com algumas linhas da certo, com outras não.

Com essa linha:
ALTER TABLE tblProdutos ADD COLUMN produto_filialID Integer

Ele retorna correto, a coluna produto_filialID.

Mas com essa linha:
ALTER TABLE tblConfig ADD COLUMN config_pdv_TpMovID Integer;

Ele retorna errado: ig_pdv_TpMovID

O que será que estou informando errado?
Responder

Gostei + 0

22/10/2013

Thiago Irrazabal

Usando o POS deu certo até certo ponto. Eu fiz assim:

function CreateOuAlter(Instrucao: String): String;
var
  resultou,texto: string;
  i,j,x: integer;
begin
  result := '';
  if POS('CREATE TABLE',instrucao)>0 then
    result := 'CREATE TABLE'
  else
    if POS('ALTER TABLE',instrucao)>0 then
      result := 'ALTER TABLE'
    else
      result := 'ERRO';
end;


Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:

function IdentificaColuna(Instrucao: String): String;
var
  texto,texto2: string;
  i,j,x: integer;
begin   
  result := '';
  if POS('ALTER TABLE ',instrucao)>0 then
  begin
    i := Length(instrucao);
    j := POS(' ADD COLUMN ',instrucao);
    texto := COPY(instrucao,i-j,j);
    x := POS(' ',texto);
    texto2 := COPY(texto,1,x-1);
    result := texto2;
  end;
end;


Com algumas linhas da certo, com outras não.

Com essa linha:
ALTER TABLE tblProdutos ADD COLUMN produto_filialID Integer

Ele retorna correto, a coluna produto_filialID.

Mas com essa linha:
ALTER TABLE tblConfig ADD COLUMN config_pdv_TpMovID Integer;

Ele retorna errado: ig_pdv_TpMovID

O que será que estou informando errado?


function IdentificaColuna(Instrucao: String): String;
var
  texto,texto2: string;
  i,j,x: integer;
begin   
  result := '''';
  if POS(''ALTER TABLE '',instrucao)>0 then
  begin
    i := Length(instrucao);
    j := POS('' ADD COLUMN '',instrucao);
    texto := COPY(instrucao,i-j,j);
    x := POS('' '',texto);
    texto2 := COPY(texto,1,x-1);
    result := texto2;
  end;
end;




Tenta trocar essa tua linha
texto := COPY(instrucao,i-j,j);
por esta
texto := COPY(instrucao,j - 12,j);

não testei nem nada, mas acho que funciona, to sem tempo agora de testar, mas testa aí, abraço.


Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

23/10/2013

Paulo Andrade

Thiago, seguindo seu exemplo consegui e a função ficou assim:

function IdentificaColuna(Instrucao: String): String;
var
  s: string;
begin   
  result := '';
  if POS('ALTER TABLE ',instrucao)>0 then
  begin
    S := instrucao;
    S := Copy(S, Pos('COLUMN', S) + 7, 32);
    S := Copy(S, 1, Pos(' ', S) - 1);
    result := S;
  end;
end;


Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?
Responder

Gostei + 0

23/10/2013

Thiago Irrazabal

Thiago, seguindo seu exemplo consegui e a função ficou assim:

function IdentificaColuna(Instrucao: String): String;
var
  s: string;
begin   
  result := '';
  if POS('ALTER TABLE ',instrucao)>0 then
  begin
    S := instrucao;
    S := Copy(S, Pos('COLUMN', S) + 7, 32);
    S := Copy(S, 1, Pos(' ', S) - 1);
    result := S;
  end;
end;


Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?



Bom dia,
o numero 7 seria o numero de caracteres depois do "COLUMN"... COLUMN tem 6 caracteres + o espaço que vem depois dele... o 32 eu me baseei no numero de caracteres que pode ter uma coluna no FIREBIRD, não sei qual banco tu ta usando mas, no firebird as colunas podem ter no máximo 32 então, sabendo que depois dos 7 caracteres que o POS acha com a palavra COLUMN, ele pega os 32 caracteres depois disso... o segundo Copy com o POS(' ',S) - 1 eu fiz porque não necessariamente tua coluna terá 32 caracteres.

Abraço, qualquer dúvida só chamar.


Att,
Thiago Irrazabal de Oliveira
Responder

Gostei + 0

23/10/2013

Thiago Irrazabal

Deixei mais "dinâmico" o código...

if Pos('ALTER', S) > 0 then
  begin
    S := Copy(S, Pos('COLUMN', S) + 6, 32);
    while Pos(' ', S[1]) <> 0 do
      S := Copy(S, Pos(' ', S) + 1, 32);
    S := Copy(S, 1, Pos(' ', S) - 1);
  end;


Pq eu fiz assim? pq antes com aquele Pos('COLUMN', S) + 7 eu pega o COLUMN mais o espaço que tinha depois mas, pode ser que na tua condição tenha mais de 1 espaço depois do COLUMN.

Explicando:
O + 6 ali é para tirar fora a palavra "COLUMN", o WHILE ele testa se o primeiro carácter é espaço se for ele tira fora, depois que tirou todos os espaços ele pega o nome da coluna até o próximo espaço...


Abraço.


Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

23/10/2013

Deivison Melo

Existe um componente chamado: "SynEdit" que faz o reconhecimento de várias sintaxes!

Veja se ele atenderá você!

Pelo que vi você está precisando de algo dessa natureza!

Abração e bons códigos!
Responder

Gostei + 0

24/10/2013

Paulo Andrade

Resolvido.

Não Deivison, é exatamente como o Thiago Irrazabal explicou. A solução ficou perfeita com o banco Access que estou usando, muito obrigado.

Se alguém precisar dos códigos que fiz para atualizar meu banco Access, posso disponibilizar as funções.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar