GL接口导入

来源:互联网 发布:如何使用阿里云服务器 编辑:程序博客网 时间:2024/05/17 06:21

这周学习了一下GL导入总账方面的知识,今天下面做一个简短的总结。

GL导入主要是用来生成日记账及其分录。

1.导入接口表

GL总账接口表为  gl.gl_interface  关于其各个字段意义可以参考 《gl_interface的详细说明》。

需要补充说明:

gl_interface的attribute1到attribute10 对应gl_je_lines表的attribute1到attribute10字段

              attribute11到attribute20 对应GL_CAPTURED_INFO表的attribute11到attribute20字段

在启用接口表的时候需要注意。

PROCEDURE import_data(p_batch_id      IN NUMBER,                        x_return_status OUT NOCOPY VARCHAR2) IS      --获取需要导入的数据    CURSOR get_data IS      SELECT *        FROM cux_forex_transfer_bills_v ftb       WHERE ftb.attribute1 = p_batch_id -- 本次要导入的批       ORDER BY ftb.forex_bill_num;      l_request_id       NUMBER;    l_conc_program_id  NUMBER;    l_prog_appl_id     NUMBER;    l_user_id          NUMBER;    l_login_id         NUMBER;    l_count            NUMBER;    l_sysdate          DATE;    l_batch_name       VARCHAR2(100);    l_je_name          VARCHAR2(100);    l_je_source_name   VARCHAR2(100);    l_je_category_name VARCHAR2(100);    l_period_name      VARCHAR2(100);    l_ccid_to          NUMBER; -- 转入银行账户的现金账户    l_ccid_fm          NUMBER; -- 转出银行账户的现金账户    l_ledger_id        NUMBER;    l_gl_interface_rec gl_interface%ROWTYPE;    l_clear            gl_interface%ROWTYPE;    l_bill_num         VARCHAR2(1000);    l_je_desc          VARCHAR2(1000);  BEGIN    -- init    l_request_id      := fnd_global.conc_request_id;    l_conc_program_id := fnd_global.conc_program_id;    l_prog_appl_id    := fnd_global.prog_appl_id;    l_user_id         := fnd_global.user_id;    l_login_id        := fnd_global.login_id;    l_count           := 0;    l_sysdate         := SYSDATE;    g_sob_id          := fnd_profile.value('GL_SET_OF_BKS_ID');      BEGIN      SELECT sob.chart_of_accounts_id        INTO g_chart_of_accounts_id        FROM gl_sets_of_books sob       WHERE sob.set_of_books_id = g_sob_id;    EXCEPTION      WHEN OTHERS THEN        g_chart_of_accounts_id := NULL;    END;      --批名    l_batch_name := cux_doc_sequences_utl.next_seq_number(p_doc_type   => 'FOREX_TRANSFER_BILLS_BATCH' ||                                                                          g_sob_id,                                                          p_doc_prefix => l_sysdate || '购汇',                                                          p_seq_length => 3,                                                          p_pk1_value  => l_sysdate || '购汇');    --日记账名    l_je_name := cux_doc_sequences_utl.next_seq_number(p_doc_type   => 'FOREX_TRANSFER_BILLS_JE' ||                                                                       g_sob_id,                                                       p_doc_prefix => '',                                                       p_seq_length => '',                                                       p_pk1_value  => '');    cux_conc_utl.log_msg('l_batch_name= ' || l_batch_name);    cux_conc_utl.log_msg('l_je_name= ' || l_je_name);      g_batch_name := l_batch_name;    g_je_name    := l_je_name;     FOR r IN get_data    LOOP          SELECT l_bill_num || nvl2(l_bill_num, '&', NULL) || r.forex_bill_num        INTO l_bill_num        FROM dual;        END LOOP;      l_je_desc := l_bill_num;    cux_conc_utl.log_msg('l_je_desc= ' || l_je_desc);      -- 来源      BEGIN      SELECT gs.user_je_source_name        INTO l_je_source_name        FROM gl_je_sources_vl gs       WHERE gs.je_source_key = 'EXCHANGE';      EXCEPTION      WHEN OTHERS THEN        l_je_source_name := NULL;    END;      BEGIN      SELECT gs.je_source_name        INTO g_je_source_name        FROM gl_je_sources_vl gs       WHERE gs.je_source_key = 'EXCHANGE';      EXCEPTION      WHEN OTHERS THEN        g_je_source_name := NULL;    END;      -- 类别      BEGIN      SELECT gjc.user_je_category_name        INTO l_je_category_name        FROM gl_je_categories_vl gjc       WHERE gjc.je_category_key = 'EXCHANGE';      EXCEPTION      WHEN OTHERS THEN        l_je_category_name := NULL;    END;    cux_conc_utl.log_msg('l_je_source_name= ' || l_je_source_name);    cux_conc_utl.log_msg('g_je_source_name= ' || g_je_source_name);    cux_conc_utl.log_msg('l_je_category_name= ' || l_je_category_name);      SELECT gl.gl_interface_control_s.nextval INTO g_group_id FROM dual;      FOR rec_data IN get_data    LOOP          l_gl_interface_rec := l_clear;          -- 日历      BEGIN        SELECT gp.period_name          INTO l_period_name          FROM gl_periods_v gp         WHERE gp.period_set_name = 'ZJG_CALENDAR'           AND gp.adjustment_period_flag = 'N'           AND rec_data.accounting_date BETWEEN gp.start_date AND               gp.end_date;      EXCEPTION        WHEN OTHERS THEN          l_period_name := NULL;      END;          -- 转入银行   中转科目      BEGIN        SELECT cba.asset_code_combination_id          INTO l_ccid_to          FROM ce_bank_accounts cba         WHERE cba.bank_account_id =               get_transfer_account(rec_data.org_id,                                    rec_data.transfer_in_currency_code,                                    rec_data.transfer_out_currency_code);      EXCEPTION        WHEN OTHERS THEN          l_ccid_to := NULL;      END;          -- 转出银行      BEGIN        SELECT cba.asset_code_combination_id          INTO l_ccid_fm          FROM ce_bank_accounts cba         WHERE cba.bank_account_name = rec_data.transfer_out_bank_account;      EXCEPTION        WHEN OTHERS THEN          l_ccid_fm := NULL;      END;          BEGIN        SELECT gl.ledger_id          INTO l_ledger_id          FROM gl_ledgers gl, gl_sets_of_books sob         WHERE gl.name = sob.name           AND sob.set_of_books_id = g_sob_id;      EXCEPTION        WHEN OTHERS THEN          l_ledger_id := NULL;      END;      cux_conc_utl.log_msg('l_ledger_id= ' || l_ledger_id);      --1. debit      l_gl_interface_rec.status          := 'NEW';      l_gl_interface_rec.set_of_books_id := g_sob_id;      l_gl_interface_rec.ledger_id       := l_ledger_id;      l_gl_interface_rec.date_created    := l_sysdate;      l_gl_interface_rec.created_by      := l_user_id;      l_gl_interface_rec.actual_flag     := 'A';      l_gl_interface_rec.reference1      := l_batch_name; -- 凭证批名      l_gl_interface_rec.reference2      := l_je_desc; -- 批说明      l_gl_interface_rec.reference4      := l_je_name; -- 日记帐名称       l_gl_interface_rec.reference10     := rec_data.forex_bill_num ||                                            rec_data.memo; -- 日记帐行摘要          l_gl_interface_rec.user_je_source_name   := l_je_source_name;      l_gl_interface_rec.user_je_category_name := l_je_category_name;      l_gl_interface_rec.accounting_date       := rec_data.accounting_date;      l_gl_interface_rec.period_name           := l_period_name;      l_gl_interface_rec.currency_code         := rec_data.transfer_out_currency_code;          l_gl_interface_rec.code_combination_id := l_ccid_to; --借方 : 取转入银行账户的现金账户      l_gl_interface_rec.entered_dr          := rec_data.transfer_out_amount;      l_gl_interface_rec.entered_cr          := NULL;      l_gl_interface_rec.accounted_dr        := rec_data.transfer_out_rate_amount;      l_gl_interface_rec.accounted_cr        := NULL;          l_gl_interface_rec.group_id                      := g_group_id;      l_gl_interface_rec.user_currency_conversion_type := rec_data.transfer_out_type_code;      l_gl_interface_rec.currency_conversion_date      := rec_data.accounting_date;      l_gl_interface_rec.currency_conversion_rate      := rec_data.transfer_out_rate;          -- 现金流量标识      l_gl_interface_rec.context3    := get_segment(l_ccid_to, 2);      l_gl_interface_rec.attribute10 := rec_data.forex_bill_id; --购汇单ID      l_gl_interface_rec.attribute11 := 500;          -- 插入接口表      INSERT INTO gl_interface VALUES l_gl_interface_rec;          --2. credit      l_gl_interface_rec.code_combination_id := l_ccid_fm; --贷方 : 取转出银行账户的现金账户      l_gl_interface_rec.entered_dr          := NULL;      l_gl_interface_rec.entered_cr          := rec_data.transfer_out_amount;      l_gl_interface_rec.accounted_dr        := NULL;      l_gl_interface_rec.accounted_cr        := rec_data.transfer_out_rate_amount;          l_gl_interface_rec.context3 := get_segment(l_ccid_fm, 2);          -- 插入接口表      INSERT INTO gl_interface VALUES l_gl_interface_rec;          l_count := l_count + 1;          --插入第二张凭证          BEGIN        SELECT cba.asset_code_combination_id          INTO l_ccid_fm          FROM ce_bank_accounts cba         WHERE cba.bank_account_id =               get_transfer_account(rec_data.org_id,                                    rec_data.transfer_in_currency_code,                                    rec_data.transfer_out_currency_code);      EXCEPTION        WHEN OTHERS THEN          l_ccid_fm := NULL;      END;          BEGIN        SELECT cba.asset_code_combination_id          INTO l_ccid_to          FROM ce_bank_accounts cba         WHERE cba.bank_account_name = rec_data.transfer_in_bank_account;      EXCEPTION        WHEN OTHERS THEN          l_ccid_to := NULL;      END;          --1. debit           l_gl_interface_rec.currency_code            := rec_data.transfer_in_currency_code;      l_gl_interface_rec.currency_conversion_rate := rec_data.transfer_in_rate;          l_gl_interface_rec.code_combination_id := l_ccid_to; --借方 : 取转入银行账户的现金账户      l_gl_interface_rec.entered_dr          := rec_data.transfer_in_amount;      l_gl_interface_rec.entered_cr          := NULL;      l_gl_interface_rec.accounted_dr        := rec_data.transfer_in_rate_amount;      l_gl_interface_rec.accounted_cr        := NULL;          l_gl_interface_rec.user_currency_conversion_type := rec_data.transfer_in_type_code;      l_gl_interface_rec.context3                      := get_segment(l_ccid_to,                                                                      2);      INSERT INTO gl_interface VALUES l_gl_interface_rec;          --2. credit      l_gl_interface_rec.code_combination_id := l_ccid_fm; --贷方 : 取转出银行账户的现金账户      l_gl_interface_rec.entered_dr          := NULL;      l_gl_interface_rec.entered_cr          := rec_data.transfer_in_amount;      l_gl_interface_rec.accounted_dr        := NULL;      l_gl_interface_rec.accounted_cr        := rec_data.transfer_in_rate_amount;          l_gl_interface_rec.context3 := get_segment(l_ccid_fm, 2);      INSERT INTO gl_interface VALUES l_gl_interface_rec;      l_count := l_count + 1;        END LOOP; -- FOR rec_data IN get_data LOOP      cux_agm_public_pkg.output('已成功进入接口表记录数:' || l_count);    EXCEPTION    WHEN OTHERS THEN      cux_agm_public_pkg.output('import_data错误结束:' || SQLERRM);      x_return_status := 'E';  END import_data;

2.运行导入总账请求和客户化过账请求

PROCEDURE submmit_request(p_batch_id      IN NUMBER,                          x_return_status OUT NOCOPY VARCHAR2) IS  l_wait_req     BOOLEAN;  l_child_phase  VARCHAR2(100);  l_child_status VARCHAR2(100);  l_dev_phase    VARCHAR2(100);  l_dev_status   VARCHAR2(100);  l_message      VARCHAR2(100);  l_error EXCEPTION;  v_req_id     NUMBER;  l_request_id NUMBER;  l_import_sec NUMBER;  l_batch_id   NUMBER;  l_batch_name VARCHAR2(500);BEGIN  l_request_id := fnd_global.conc_request_id;  l_import_sec := gl_interface_control_pkg.get_unique_run_id;  gl_interface_control_pkg.insert_row(xinterface_run_id => l_import_sec,                                      xje_source_name   => g_je_source_name,                                      xledger_id        => g_sob_id,                                      xgroup_id         => g_group_id,                                      xpacket_id        => NULL);  cux_agm_public_pkg.output('submmit_request开始运行' || l_request_id);  --提交标准请求  v_req_id := fnd_request.submit_request('SQLGL',                                         'GLLEZL',                                         '',                                         to_char(SYSDATE,                                                 'YYYY/MM/DD HH24:MI:SS'),                                         FALSE,                                         to_char(l_import_sec), -- Argument1                                         to_char(g_sob_id), --帐簿                                         'N',                                         NULL,                                         NULL,                                         'N',                                         'O', --是否导入弹性域字段,三种方式 N(不导入),W(验证导入WITH VALIDATE),O(不验证WITHOUT VALIDATE)                                         chr(0));  IF v_req_id <= 0 OR v_req_id IS NULL THEN    cux_agm_public_pkg.output('提交 程序 - 导入日记帐 时发生错误');    RAISE l_error;  ELSE    COMMIT;    cux_agm_public_pkg.output('已成功提交请求,request_id=' || v_req_id);  END IF;  --等待请求完成    cux_agm_public_pkg.output('等待请求' || l_request_id);  l_wait_req := fnd_concurrent.wait_for_request(v_req_id,                                                1,                                                0,                                                l_child_phase,                                                l_child_status,                                                l_dev_phase,                                                l_dev_status,                                                l_message);  IF l_child_status <> '正常' THEN    cux_agm_public_pkg.output('并发请求' || v_req_id || '错误结束:' || l_message);    x_return_status := 'E';    --这里不抛出例外是因为需要进行正常的错误处理,错了就错了  ELSE    x_return_status := 'S';    cux_agm_public_pkg.output('并发请求' || v_req_id || '正常结束!');      -- 自动过账    BEGIN      BEGIN        SELECT gb.je_batch_id, gb.name          INTO l_batch_id, l_batch_name          FROM gl_je_batches gb         WHERE gb.name LIKE l_batch_name || '%'           AND gb.group_id = g_group_id           AND rownum = 1;      EXCEPTION        WHEN OTHERS THEN          l_batch_id   := NULL;          l_batch_name := NULL;      END;      g_batch_id := l_batch_id;      --IF l_debug = 'Y' THEN --LOG MESSAGE      cux_conc_utl.out_msg('system gl batch name:' || l_batch_name);      --END IF;            l_request_id := fnd_request.submit_request(application => 'CUX',                                                 program     => 'CUXPOSTBH',                                                 description => NULL,                                                 start_time  => NULL,                                                 sub_request => FALSE,                                                 argument1   => l_batch_name);      IF (l_request_id <= 0 OR l_request_id IS NULL) THEN        fnd_message.set_name('SQLGL', 'GL_API_CONC_REQ_SUBMIT_FAIL');        fnd_msg_pub.add;        x_return_status := fnd_api.g_ret_sts_error;        RAISE fnd_api.g_exc_error;      ELSE        update_je_header(p_batch_id);        COMMIT;      END IF;    EXCEPTION      WHEN OTHERS THEN        cux_conc_utl.out_msg('凭证没有自动过帐,请检查更正后重新提交。');        RAISE fnd_api.g_exc_error;    END;  END IF;  cux_agm_public_pkg.output('submmit_request正常结束');EXCEPTION  WHEN OTHERS THEN    cux_agm_public_pkg.output('submmit_request错误结束:' || SQLERRM);    x_return_status := 'E';END submmit_request;

其中自动过账请求CUXPOSTBH程序包如下:

CREATE OR REPLACE PACKAGE BODY cux_post_batch_pkg IS  g_pkg_name VARCHAR2(100) := 'cux_post_batch_pkg';  PROCEDURE main(errbuf       OUT VARCHAR2,                 retcode      OUT VARCHAR2,                 p_batch_name VARCHAR2) IS    l_request_id     NUMBER;    l_return_status  VARCHAR2(1) := fnd_api.g_ret_sts_success;    l_msg_count      NUMBER;    l_msg_data       VARCHAR2(2000);    l_ledger_id      NUMBER;    l_posting_run_id NUMBER;    l_access_set_id  NUMBER := fnd_profile.value('GL_ACCESS_SET_ID');    CURSOR cur IS      SELECT a.rowid, a.* FROM gl_je_batches a WHERE a.name = p_batch_name;  BEGIN    retcode := '0';    -- concurrent header log    hand_conc_utl.log_header;    FOR a IN cur LOOP      SELECT gl_je_batches_post_pkg.get_unique_id        INTO l_posting_run_id        FROM dual;      BEGIN        SELECT MAX(jeh.ledger_id)          INTO l_ledger_id          FROM gl_je_headers jeh         WHERE jeh.je_batch_id = a.je_batch_id         GROUP BY jeh.je_batch_id        HAVING COUNT(DISTINCT jeh.ledger_id) = 1;      EXCEPTION        WHEN OTHERS THEN          l_ledger_id := NULL;      END;      --更新批的状态和posting_run_id      gl_je_batches_post_pkg.update_row(x_rowid                    => a.rowid,                                        x_je_batch_id              => a.je_batch_id,                                        x_last_update_date         => a.last_update_date,                                        x_last_updated_by          => a.last_updated_by,                                        x_chart_of_accounts_id     => a.chart_of_accounts_id,                                        x_name                     => a.name,                                        x_status                   => 'S',                                        x_status_verified          => a.status_verified,                                        x_actual_flag              => a.actual_flag,                                        x_budgetary_control_status => a.budgetary_control_status,                                        x_last_update_login        => a.last_update_login,                                        x_default_period_name      => a.default_period_name,                                        x_control_total            => a.control_total,                                        x_running_total_dr         => a.running_total_dr,                                        x_running_total_cr         => a.running_total_cr,                                        x_posting_run_id           => l_posting_run_id,                                        x_request_id               => a.request_id);      --运行请求      l_request_id := fnd_request.submit_request(application => 'SQLGL',                                                 program     => 'GLPPOSS',                                                 description => NULL,                                                 start_time  => NULL,                                                 sub_request => FALSE,                                                 argument1   => l_ledger_id,                                                 argument2   => l_access_set_id, --'1000', --默认  --add by tsg for mantis 0004375                                                 argument3   => a.chart_of_accounts_id,                                                 argument4   => l_posting_run_id);      IF l_request_id > 0 THEN        COMMIT;      END IF;    END LOOP;    IF (l_return_status = fnd_api.g_ret_sts_error) THEN      RAISE fnd_api.g_exc_error;    ELSIF (l_return_status = fnd_api.g_ret_sts_unexp_error) THEN      RAISE fnd_api.g_exc_unexpected_error;    END IF;    -- conc end body    -- concurrent footer log    hand_conc_utl.log_footer;  EXCEPTION    WHEN fnd_api.g_exc_error THEN      hand_conc_utl.log_message_list;      retcode := '1';      fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,                                p_count   => l_msg_count,                                p_data    => l_msg_data);      IF l_msg_count > 1 THEN        l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,                                             p_encoded   => fnd_api.g_false);      END IF;      errbuf := l_msg_data;    WHEN fnd_api.g_exc_unexpected_error THEN      hand_conc_utl.log_message_list;      retcode := '2';      fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,                                p_count   => l_msg_count,                                p_data    => l_msg_data);      IF l_msg_count > 1 THEN        l_msg_data := fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,                                             p_encoded   => fnd_api.g_false);      END IF;      errbuf := l_msg_data;    WHEN OTHERS THEN      fnd_msg_pub.add_exc_msg(p_pkg_name       => g_pkg_name,                              p_procedure_name => 'MAIN',                              p_error_text     => substrb(SQLERRM, 1, 240));      hand_conc_utl.log_message_list;      retcode := '2';      errbuf  := SQLERRM;  END;  function get_gl_doc(p_group_id number, p_batch_name varchar2) return number is  l_doc_seq number;begin  select h.doc_sequence_value    into l_doc_seq    from gl_je_batches b, gl_je_headers h   WHERE h.je_batch_id + 0 = b.je_batch_id + 0     AND (h.display_alc_journal_flag = 'Y' or         h.display_alc_journal_flag is null)     and b.group_id = p_group_id     and b.name like p_batch_name || '%'     and h.doc_sequence_value is not null     and rownum = 1;  return l_doc_seq;exception  when others then    return null;end;function get_extra_fee(p_DOC_BILLS_ID number,p_Extra_Fee number ) return number is  l_sum number;begin   select nvl(sum(CDOC.Extra_Fee),0)     into l_sum     from CUX_DOC_OUT_CST CDOC    where  cdoc.extra_impflag = 'Y'     and cdoc.doc_bills_id =  p_DOC_BILLS_ID ;     if l_sum =0 and p_Extra_Fee is   null then       return null;     else       return (l_sum+nvl(p_Extra_Fee,0));    end if;exception  when others then    return null;end;END cux_post_batch_pkg;

至此,可以查看总账模块。看是否总账和分录是否生成。




原创粉丝点击