[firebase-br] Como Capturar SQL de um Campo ??

Luciano franca luapfirebird em yahoo.com.br
Qui Out 27 09:57:23 -03 2016


  Sua ideia é boa e resolveria se não fosse o seguinte problema,   Eu preciso fazer isso para todos as querys já prontas no ERP que são muitas,   então eu teria que pensar numa função para manipular um TStrings com o comando SQL.
  Eu ainda não contei mais devo ter mais de 1000 SQLs  no sistema todo.
  Se o Firebird retornasse isso através de tabelas de sistema seria tranquilo.
  Porém acredito que deve ter uma forma de fazer isso até porque Internamente o próprio Firebird faz isso para poder entender que aquele comando SQL retorna determinado campo, acredito que o Firebird deva ter uma analisador de "Parse SQL" de TStrings bem inteligente.
 

    Em Quinta-feira, 27 de Outubro de 2016 9:44, Gladiston Santana <gladiston em vidy.com.br> escreveu:
 

 Ao inves dum select, experimente um execute block com parametros de saida de que precisa.dentro do execute block você pode estudar cada linha que será retornada com fluxo de if, declaração de variavel e só dá suspend (retorna a linha) quando todas as variaveis de saida foram preenchidasUm execute block é similar a uma procedure, mas voce pode colocar direto num SQL de componente.Seu fluxo ficará bem inteligivel e de fácil manutibilidade. Veja esse exemplo que retorna 0 ou 1 se dados foram apagados de uma tabela:
  FBTO_Temp.SQL.Clear;  FBTO_Temp.SQL.Add('EXECUTE BLOCK RETURNS (result_value int) AS');  FBTO_Temp.SQL.Add('declare variable lid_cliente bigint;');  FBTO_Temp.SQL.Add('declare variable lpode_apagar integer;');  FBTO_Temp.SQL.Add('BEGIN');  FBTO_Temp.SQL.Add('  result_value=0;');  FBTO_Temp.SQL.Add('  for SELECT id_cliente from CLIENTES into :lid_cliente do');  FBTO_Temp.SQL.Add('  begin');  FBTO_Temp.SQL.Add('    lpode_apagar=1;');  FBTO_Temp.SQL.Add('    if ((lpode_apagar=1) and (exists(select * from CV where id_cliente=:lid_cliente))) then lpode_apagar=0;');  FBTO_Temp.SQL.Add('    if ((lpode_apagar=1) and (exists(select * from PROCESSOS where id_cliente=:lid_cliente))) then lpode_apagar=0;');  FBTO_Temp.SQL.Add('    if (lpode_apagar=1) then');  FBTO_Temp.SQL.Add('    begin');  FBTO_Temp.SQL.Add('      delete from CLIENTES_CONTATOS');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from CLIENTES_ASSUNTOS');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from CLIENTES_CARACTERISTICAS');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from CLIENTES_RAMOS_ATIVIDADE');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from TELEFONES');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from INTERNET_EMAILS');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from INTERNET_SITES');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from PENDENCIAS');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      delete from CLIENTES');  FBTO_Temp.SQL.Add('        where id_cliente=:lid_cliente;');  FBTO_Temp.SQL.Add('      result_value=1;');
  FBTO_Temp.SQL.Add('    end');  FBTO_Temp.SQL.Add('  end');  FBTO_Temp.SQL.Add('  suspend;');
  FBTO_Temp.SQL.Add('END');
Seu execute block só teria que ser um for/select analisando linha a linha o que deverá retornar(suspend).

   


Mais detalhes sobre a lista de discussão lista