select com mais valores

21/01/2010

1

Fala Pessoal tenho uma duvida aqui que está tirando meu sono.   Eu queria fazer um select que selecionasse um campo com valores iguais a algumas variaveis que eu tenho no sistema.   eu tenho esse select :            select * from t_modelo where marca in ( ''' + vmarca1 + ''',''' + vmarca2+''',''' + vmarca3+''')';   Esse select funciona se caso minhas variaves estiverem com valores , mas o meu caso é que eu terei minhas variaves com valores algumas vezes e outras vezes não e eu sempre preciso selecionar as 3 variaves, como eu faria isso.   No aguardo    
Responder

Posts

há várias formas. uma delas:

var
  sInstrucao, sCondicao: string;
begin
  sInstrucao := 'select * from t_modelo';
  sCondicao := '';

  if trim(vmarca1) <> '' then
    sCondicao := sCondicao + QuotedStr(vmarca1);

  if trim(vmarca2) <> '' then
  begin
    if sCondicao <> '' then sCondicao := sCondicao + ', ';
    sCondicao := sCondicao + QuotedStr(vmarca2);
  end;

  if trim(vmarca3) <> '' then
  begin
    if sCondicao <> '' then sCondicao := sCondicao + ', ';
    sCondicao := sCondicao + QuotedStr(vmarca3);
  end;

  if sCondicao <> '' then
    sInstrucao := sInstrucao + ' where marca in (' + sCondicao + ')';

  [abra o dataset utilizando a instrucao contida na variável sInstrucao]
end;

se nenhuma variável tiver valor, tratá todo o conteúdo da tabela t_modelo, caso contrário trará somente os registros da tabela t_modelo que atendam aos valores da lista criada.
Responder

05/03/2010

Thiago Santana

Clei é só seguir as dicas do emerson aí que irá funcionar perfeitamente! Montagem de SQL dinamicamente ajuda bastante o desenvolvedor... Procure dá uma pesquisada sobre isso! AbraçoO
Responder

05/03/2010

Wilson Junior

De uma olhada no código abaixo.



function SQL_Monta_OR(NomeCampo: string; stlDados: TStringList;
  EhCampoString: Boolean = False): string;
var
  x: integer;
  strCampo: string;
begin
  Result := '';

  if  Trim(NomeCampo) <> '' then
    begin
      for x := 0 to stlDados.Count - 1 do
      begin
        if  Result <> '' then
            Result := Result + ', '
        ;

        strCampo := stlDados[x];
        if  EhCampoString then
            strCampo := QuotedStr( strCampo )
        ;

        Result := Result + strCampo;
      end;

      if  Result <> '' then
          Result := NomeCampo + ' IN (' + Result + ')'
      ;
    end
  ;
end;

function RetornaSQL: string
var
  strWhere: string;
  stlWhere: TStringList;
begin
  stlWhere := TStringList.Create;
  stlWhere.Add( vmarca1 );
  stlWhere.Add( vmarca2 );
  stlWhere.Add( vmarca3 );

  strWhere := SQL_Monta_OR( 'Marca', stlWhere, True );

  Result := 'SELECT * FROM T_MODELO';
  if  strWhere <> '' then
      Result := Result + ' WHERE ' + strWhere
  ;
end;


Espero ter colaborado.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira