Erp100论坛's Archiver

herome 发表于 2007-11-24 00:00

compiere如何调用AD_PROCESS中的view信息,请高人帮忙指点。。多谢。

今天看了AD_PROCESS的,对于直接调用CLASSNAME的比较好理解,好说,但是在看了那个调用视图的(CLASSNAME IS NULL部分的记录),确死活找不到相应的代码和如何执行的。

pshen 发表于 2007-11-27 14:17

视图? 存储过程吧?

pshen 发表于 2007-11-27 14:24

给个例子

CREATE OR REPLACE PROCEDURE XXXXXXX
(
        PInstance_ID                        IN NUMBER
)

AS
        --        Logistice
        v_ResultStr                                                VARCHAR2(2000);
        v_Message                                                VARCHAR2(2000);
        v_Record_ID                                                NUMBER;
        --        Parameter -- 获取参数
        CURSOR Cur_Parameter (PInstance NUMBER) IS
                SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
                FROM AD_PInstance i, AD_PInstance_Para p
                WHERE i.AD_PInstance_ID=PInstance
                AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
                ORDER BY p.SeqNo;
        --        Parameter Variables
        v_AD_Tab_ID                                                NUMBER;
        v_NoOfFields                                        NUMBER := 0;
        v_NextNo                                                NUMBER;
        v_EntityType                                        CHAR(1);
        --        Copy
       
BEGIN
        --  Update AD_PInstance
        DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
        v_ResultStr := 'PInstanceNotFound';
----------------------------------- 这里表示正在执行,以屏蔽掉点一个按钮几次
        UPDATE AD_PInstance
        SET Created = SysDate,
                IsProcessing = 'Y'
        WHERE AD_PInstance_ID=PInstance_ID;
        COMMIT;

        --        获取参数,这里是你定义Process的时候的Parameter, 也就是用户点了Process,探出窗口要求输入的参数,当然也包括一些内置的参数,比如Record_ID, 就是窗口里,点按钮的时候,的那条记录的Record_ID
        v_ResultStr := 'ReadingParameters';
        FOR p IN Cur_Parameter (PInstance_ID) LOOP
                v_Record_ID := p.Record_ID;
                IF (p.ParameterName = 'AD_Tab_ID') THEN
                        XXXX := p.P_Number;
                       
                ELSE
                        DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
                END IF;
        END LOOP;        --        Get Parameter
        DBMS_OUTPUT.PUT_LINE('  Record_ID=' || v_Record_ID);

        后面是具体你要做的事情。。。。。

<<FINISH_PROCESS>>
        --  Update AD_PInstance
        DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
        UPDATE        AD_PInstance
        SET Updated = SysDate,
                IsProcessing = 'N',
                Result = 1,                                        -- 1表示成功,0表示失败
                ErrorMsg = v_Message
        WHERE        AD_PInstance_ID=PInstance_ID;
        COMMIT;
        RETURN;

EXCEPTION
        WHEN  OTHERS THEN
                v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
                DBMS_OUTPUT.PUT_LINE(v_ResultStr);
                UPDATE        AD_PInstance
                SET Updated = SysDate,
                        IsProcessing = 'N',
                        Result = 0,                                -- 0表示失败
                        ErrorMsg = v_ResultStr    -- 错误信息,会在界面上显示
                WHERE        AD_PInstance_ID=PInstance_ID;
                COMMIT;
                RETURN;

END XXXXX;

pshen 发表于 2007-11-27 14:28

是报表?
理解错你的问题了。

herome 发表于 2007-11-27 21:50

多谢pshen,今天在公司弄个WEB的,就没有上来看回复。

是那个VIEW,我看了AD_PROCESS中IS_REPORT字段是Y,AD_PROCESS_ID=270的那个,但是实际找没有找到相应代码,不过后来跟踪看了那个ADEMPIERE,好像是用那个reportutil的报表引擎处理这个,具体细节我再调试看看。
另外,后边还有好多问题,以后要多咨询你了,多谢先。

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.