5

この質問をできるだけ明確にしようとしています。

基本的に、私はレポートを作成しました。レポートはフォームから実行できるようにメニュー項目ボタンとして存在します。

私がやりたいことは、レコードを複数選択できるようにすることです。次に、ボタンをクリックしてレポートを実行すると、現在選択されているレコードが表示されるダイアログフォーム (フィルター画面) に渡されます。

SaleLinesEdit フォームと同じ方法を使用してこれを実行しようとしましたが、成功しませんでした。

誰かが私を正しい方向に向けることができれば、私はそれを大いに感謝します.

4

3 に答える 3

3

フォーム間で値を渡すAxaptapediaを見てください。これはあなたを助けるはずです。レポートの基本ダイアログメソッドを使用するのではなく、ダイアログのフォームを使用するようにレポートを変更する必要があるでしょう。ここから始めるのがよいでしょう。

于 2012-04-04T18:16:56.120 に答える
3

これを追加したかっただけです

MuliSelectionHelper クラスを使用して、これを非常に簡単に行うことができます。

MultiSelectionHelper selection = MultiSelectionHelper::createFromCaller(_args.caller());
MyTable myTable = selection.getFirst();
while (myTable)
{
    //do something
    myTable = selection.getNext();
} 
于 2013-01-30T20:03:37.080 に答える
2

この問題に使用した解決策は次のとおりです。

フォームでフィールドが複数選択されている場合に値がフィルター ダイアログに渡されるように、レポートに 2 つのメソッドを追加します。

private void setQueryRange(Common _common)
    {
    FormDataSource              fds;

    LogisticsControlTable       logisticsTable;

    QueryBuildDataSource        qbdsLogisticsTable;
    QueryBuildRange             qbrLogisticsId;
    str                         rangeLogId;

    set                         logIdSet    = new Set(Types::String);

    str addRange(str _range, str _value, QueryBuildDataSource _qbds, int _fieldNum, Set _set    =       null)
    {
        str             ret = _range;
        QueryBuildRange qbr;
        ;

        if(_set && _set.in(_Value))
        {
            return ret;
        }

        if(strLen(ret) + strLen(_value) + 1 > 255)
        {
            qbr = _qbds.addRange(_fieldNum);
            qbr.value(ret);
            ret = '';
        }

        if(ret)
        {
            ret += ',';
        }

        if(_set)
        {
            _set.add(_value);
        }

        ret += _value;
        return ret;
    }
    ;

    switch(_common.TableId)
    {
        case tableNum(LogisticsControlTable):

            qbdsLogisticsTable = element.query().dataSourceTable(tableNum(LogisticsControlTable));
            qbrLogisticsId     = qbdsLogisticsTable.addRange(fieldNum(LogisticsControlTable, LogisticsId));

            fds = _common.dataSource();

            for(logisticsTable = fds.getFirst(true) ? fds.getFirst(true) : _common;
                logisticsTable;
                logisticsTable = fds.getNext())
            {
                rangeLogId = addrange(rangeLogId, logisticsTable.LogisticsId, qbdsLogisticsTable, fieldNum(LogisticsControlTable, LogisticsId),logIdSet);
            }

            qbrLogisticsId.value(rangeLogId);
            break;
    }
}

// これにより、クエリが設定され、値が範囲に渡されて取得されます。つまり、"SO0001, SO0002, SO000£...

2 番目の方法は次のとおりです。

private void setQueryEnableDS()
{
    Query           queryLocal = element.query();
    ;
}

init メソッドでもこれが必要です。

public void init()
{
    ;
    super();

    if(element.args() && element.args().dataset())
    {
        this.setQueryRange(element.args().record());
    }
}

これが、私が抱えていた問題を抱えている他の人の将来に役立つことを願っています.

于 2012-04-10T12:38:43.920 に答える