2006. január 8., vasárnap

Params in a Web-Query at run time


Problem/Question/Abstract:

Property editors are fine, but code is more readable and maintainable if we put the data out from TQuery's ressource direct in the implementation section. So the serialisation is important.

Answer:

1. It's important to assign the query first (SQL:= aQuery) and second assign the Params including definition of dataType:

procedure TModWebBroker.execWebQuerySQL;
var
  aQuery: TStringList;
begin
  try
    aQuery := TStringList.Create;
    aQuery.clear;
    Build_kontoSQLString(aQuery);
    with qryWebCust do
    begin
      SQL.Clear;
      SQL := aQuery;
      params[0].name := 'clientname';
      params[0].dataType := ftstring;
      OPEN;
    end; //with
  finally
    aQuery.Free;
  end; //try
end;

2. We build the query in a own procedure, so it's open for change (programming for change ;)):

procedure TModWebBroker.Build_kontoSQLString(var aQuery: TStringList);
begin
  with aQuery do
  begin
    Add('SELECT cust_no, customer, descript, amount');
    Add('FROM account, customer, acctype');
    Add('WHERE account.cust_no = customer.cust_no');
    Add('AND account.acc_type = acctype.acc_id');
    Add('AND UPPER(customer) LIKE UPPER(:clientname)||'#39'%'#39);
    Add('ORDER BY amount');
  end;
end;

3. We get the parameter from a browser through a request-object in a ISAPI-DLL:
(The example "webqueries" is available on the net,now)

procedure TModWebBroker.kontoStand1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  paraField: string;
begin
  with qrywebAccount do
  begin
    paraField := (Request.QueryFields.Values['clientname']);
    if Pos(uppercase(paraField), uppercase(Content)) > 1 then
      Response.Content := Content
    else
      Response.Content := Format('Client"%s" not found!'
        + '',
        [Request.QueryFields.Values['clientname']]);
  end; //qrywebAccount
end;

Nincsenek megjegyzések:

Megjegyzés küldése