Identificar código SQL
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:
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.
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
Curtidas 0
Respostas
Thiago Irrazabal
22/10/2013
Boa tarde,
Usando Copy e Pos não te ajuda?
Att,
Thiago Irrazabal de Oliveira.
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.
GOSTEI 0
Paulo Andrade
22/10/2013
Usando o POS deu certo até certo ponto. Eu fiz assim:
Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:
Com algumas linhas da certo, com outras não.
Com essa linha:
Ele retorna correto, a coluna produto_filialID.
Mas com essa linha:
Ele retorna errado: ig_pdv_TpMovID
O que será que estou informando errado?
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?
GOSTEI 0
Thiago Irrazabal
22/10/2013
Usando o POS deu certo até certo ponto. Eu fiz assim:
Mas na hora de identificar qual o nome da Coluna a ser criada não deu certo:
Com algumas linhas da certo, com outras não.
Com essa linha:
Ele retorna correto, a coluna produto_filialID.
Mas com essa linha:
Ele retorna errado: ig_pdv_TpMovID
O que será que estou informando errado?
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.
GOSTEI 0
Paulo Andrade
22/10/2013
Thiago, seguindo seu exemplo consegui e a função ficou assim:
Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?
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?
GOSTEI 0
Thiago Irrazabal
22/10/2013
Thiago, seguindo seu exemplo consegui e a função ficou assim:
Só gostaria de esclarecer 2 dúvidas, o número 7 e o 32?
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
GOSTEI 0
Thiago Irrazabal
22/10/2013
Deixei mais "dinâmico" o código...
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.
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.
GOSTEI 0
Deivison Melo
22/10/2013
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!
Veja se ele atenderá você!
Pelo que vi você está precisando de algo dessa natureza!
Abração e bons códigos!
GOSTEI 0
Paulo Andrade
22/10/2013
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.
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.
GOSTEI 0