如何在dbgrid delphi中显示只有相关信息

时间:2011-04-04 13:19:38

标签: delphi

信息: 我有一张订单。 http://img695.imageshack.us/i/delhi.png/

有了“keuze”和“aantal”,它就会换一条新线。 Orderline获得OrderID。 但是用户可能只能从他的OrderID中看到订单行。

我如何让它只显示它的工作,例如OrderID“47”?

procedure TfmOrder.btInvoerenClick(Sender: TObject);
begin
    dm.atOrder.open;
    dm.atOrder.Append;
    dm.atOrder ['OrderStatus']             := ('Aangemeld');
    dm.atOrder ['klantID']                 := fminloggen.userid;
    dm.atOrder ['OrderDatum']              := Kalender.date;
    dm.atOrder ['Opmerkingen']             := leOpmerkingen.text;
    dm.atOrder.post;
    cbkeuze.Visible  := true;
    dbRegel.Visible  := true;
    leAantal.visible := true;
    btOpslaan.Visible:= true;
end;

这是制作新订单的代码

procedure TfmOrder.btOpslaanClick(Sender: TObject);
var orderid:string;
  begin
    dm.atOrderregel.Open;
    dm.atDier.open;
    dm.atorderregel.Append;
    dm.atOrderregel ['AantalDieren'] := leAantal.text;
    dm.atOrderregel ['OrderID']      := dm.atOrder ['OrderID'];
    dm.atOrderregel ['Diernaam']     := cbKeuze.Text;
    dm.atOrderregel.Post;
    leaantal.clear;
    cbkeuze.ClearSelection;
  end;

这是一个新的订单线

提前致谢

我知道使用此代码时出现了不同的错误:

 begin
      dm.atorder.Open;
      dm.atorder.filter   := 'KlantID = '  + (fminloggen.userid);
      dm.atorder.filtered := true;
      while not dm.atorder.Eof do
      begin
         cbOrder.Items.Add (dm.atorder['OrderID']);
         dm.atOrder.Next;

      end;
      dm.atOrder.Close;
   end;

它给出了一个错误:参数来自错误的类型,或者没有正确的范围或相互冲突。

这里是userid声明。

var Gevonden: boolean;
    userid : string;
begin
  dm.atInlog.open;
  Gevonden := false;
  while (not Gevonden) and (not dm.atInlog.eof) do
  begin
      if dm.atInlog['email'] = leUser.Text
    then
      begin
        Gevonden := true ;
        inlognaam := dm.atInlog['email'];
        userid    := dm.atInlog['KlantID'];
      end
    else
      dm.atInlog.Next
      end;

这显然是另一种形式

4 个答案:

答案 0 :(得分:1)

您可以在对象检查器中静态添加网格的属性,仅显示您需要的字段。如果列列表为空(默认),则会填充所有可用字段。

只需添加所需数量的列,并将每列链接到相应的字段。您可以对列重新排序并分别设置宽度和标题。还有一些属性值得探讨。

答案 1 :(得分:1)

您可以使用数据集的Filter属性:

atOrderregel.Filter := 'OrderID = 47';
atOrderregel.Filtered := True;

答案 2 :(得分:0)

我假设您的网格绑定到数据源组件。然后将此数据源与TDataset后代链接。有几种方法可以实现对数据集的所需过滤,以仅显示orderid 47。

首先,您可以将数据集SQL属性设置为包含(服务器端)SQL查询,例如:

SELECT * from table WHERE OrderID = @OrderID

您还需要在数据集中创建一个参数,以传递所需OrderID的(更改)值。因此,在数据集(@OrderID)中添加一个新参数,然后在运行时,您可以在代码中设置此参数值,如:

DataSet.Parameters['@OrderID'].Value := ParameterValue;

或者,您也可以过滤数据集(客户端)以显示正确的数据: 设置数据集的SQL属性以检索整个表,如:

SELECT * FROM table

然后在运行时,您可以将数据集的Filter属性设置为仅获取OrderID 47:

Dataset.Filter := 'OrderID = '+InttoStr(ParameterValue);

根据您的需要,一种方法可能更适合(性能/记忆)。

正如Najem评论的那样,还有第三种方法 - 使用Master-Detail数据集关系。此方法使用两个数据集,一个是另一个的主数据集。更改主表记录后,将使用M-D关系的KeyMasterFields属性中定义的值过滤详细数据集。

答案 3 :(得分:-1)

如果连接到某个数据源,则始终可以创建SQL查询。类似的东西:

SELECT * FROM YourDBTable WHERE OrderID = 47