select com mais valores
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
Clei Martins
Curtidas 0
Respostas
Emerson Nascimento
21/01/2010
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.
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.
GOSTEI 0
Thiago Santana
21/01/2010
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
GOSTEI 0
Wilson Junior
21/01/2010
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.
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.
GOSTEI 0