GARANTIR DESCONTO

Fórum Impletemtação de função de procura única #48026

12/11/2004

0

Olá a todos,

Estou com um pequeno problema pra implementar uma função padrão pra procura em bancos de dados... estou usando o Fb 1.5 com dbExpress, pra essas consultas eu utilizo somente a SQLQuery criada em tempo de execução ligada ao SQLConnection.

Estou tentando usar esse cabeçalho pra função:

function Procura(Tabela, SQLExec: String; Campos, ResSet: TStringList): Boolean;


Sendo:
Tabela: Só pra no caso de erro eu dar a msg em qual tabela o BD deu erro.
SQLExec: string de sql a ser executada na procura.
Campos: Lista de campos para serem pesquizados, uso como parametro no FieldByName() pra nao trabalhar com a posição ordinal do campo na tabela.

Aqui o meu problema:
ResSet: Seria uma lista dos valores encontrados, mas essa variavel estaria declarana na função que chama a função Procura, seria passada como parâmetro e vazia, para ser preenchida pela função procura e retornada vazia ou com os resultados encontrados pela pesquiza,
isto é, tb só seria acessada no caso do retorno da função for True.

Não sei se esse é o melhor jeito de se fazer isso, gostaria de padronizar todas as consultas que retornam soh alguns campos pra conferencia ou somente pra verificar se tal id, cpf, codigo existe no banco...

Se alguem puder me ajudar, obrigao

Julio :)


Tuskinhu

Tuskinhu

Responder

Posts

13/11/2004

Afarias

bom,

se TABELA é uma resposta da função, então devia ser declarada como VAR.

Não entendi como vc pretende retornar o resultado da consulta em um StringList.


T+


Responder

Gostei + 0

13/11/2004

Tuskinhu

bom, se TABELA é uma resposta da função, então devia ser declarada como VAR. Não entendi como vc pretende retornar o resultado da consulta em um StringList. T+


Eu gostaria de que a função me retornasse 1 ou 2 resultados:
1 - Se um determinado registro existe na tabela
2 - Se existe e mais alguma informação


digamos: Uma tabela Pedidos e Itens
na parte do item a pessoa deve digitar um codigo de Item e o sistema deve verificar se ele existe ou não, e se caso existir, pode-se exibir o nome do item...

Eu em meu sistema tenho varias consultas deste tipo... eu queria era centralizar essas consultas em apenas uma função padrão, a Procura...
não sei se vc entendeu...

digamos a função retorna True ou False se existir, e se existir e eu ainda quero pegar algum dado eu pegaria pelo ResSet, a Tabela é apenas um parametro que eu passo pro caso de eu precisar apresentar um erro eu tenho a tabela ou qq info sobre onde ocorreu o erro.

Aqui vai o codigo:
1- Chamada da Função:

Res := TStringList.Create;
Campo := TStringList.Create;
Campo.Add(´NOVO_CODIGO´);
if Procura( ´SP_GET_CODIGO_CLIENTE´,
            ´Select NOVO_CODIGO From SP_GET_CODIGO_CLIENTE´,
             Campo, Res) then
  Result := PoeZeros(StrToIntDef(Res[0], 0), 6);


2- Função:

function Procura(Tabela, SQLExec: String; Campos: TStringList;
                 var ResSet: TStringList): Boolean;
var
  Query: TSQLQuery;
  TmpItem: String;
  Conta: Integer;
  Lista: TStringList;
begin
Result := True;
try
  Lista := TStringList.Create;
  Lista.Clear;
  Lista.Add(´´);
  if (Campos.Count > 0) and (Tabela = ´´) and (SQLExec = ´´) then
  begin
    Result := False;
    ShowMessage(´Erro na passagem dos parâmetros para a função.´);
    Exit;
  end;
  Query := TSQLQuery.Create(nil);
  Query.Close;
  if Tabela = ´CEP´ then
    Query.SQLConnection := BdCep.BdCep
  else
    Query.SQLConnection := BD.BD;
  Query.SQL.Clear;
  Query.SQL.Text := SQLExec;
  Query.Open;
  if not Query.IsEmpty() then
  begin
    Lista.Clear;
    while not Query.Eof do
    begin
      for Conta := 0 to Campos.Count - 1 do
      begin
        ResSet.Add(Query.FieldByName(Campos[Conta]).AsString);
      end; // For
      Query.Next;
    end;  // while
  end
  else
  begin
    Result := False;
    Exit;
  end;  // if
except
  on E:Exception do
  begin
    ShowMessage(´Erro ao tentar recuperar registros da tabela: ´ + 
                          Tabela + 13 + 13 +
                          ´SQL: ´ + SQLExec + 13 + 13 +
                          ´Mensagem: ´ + E.Message);
    Result := False;
  end;
end;  // try
Query.Close;
Query.Free;
Lista.Free;
end;  // Proc



eu acho que essa função ainda está ´feia´ acho que eu poderia melhorá-la
principalmente na chamada... gostaria de ter opinioes...


Responder

Gostei + 0

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

Aceitar