壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: xiangzhao

Oracle EBS Form & Report 问题大全

    [复制链接]
 楼主| 发表于 2008/7/25 15:32:18 | 显示全部楼层
1
FORMS 4.5 实 现 的 列 表 查 询、多 行 录 入 中 的 实 现 行 累 计
----
PB VB 列, FORMS45 能, 便, FORM 现。 例:

   块:b1 项:l1,l2.l3,l4
   块:b2 项:l1,l2,l3,l4
   b2B1的求和块
   在块B1中的PRE_TEXT_ITEM中代码:

IF SUBSTR(:SYSTEM.CURRENT_ITEM,1,1) IN ('L') THEN


:GLOBAL.ITEM_PREVALUES:=NAME_IN


('B1.'||:SYSTEM.CURRENT_ITEM);


END IF;

   在块 B2中的POST_TEXT_ITEM中代码:

DECLARE


num_cz number;
--
数据项在录入或修改前后的差值


num_hz number;
--
数据项在修改后的求合


BEGIN


if substr(:system.current_item,1,1) in ('l') then


:global.item_nextvalues:=name_in


('b1.'||:system.current_item);


num_cz:=nvl(to_number(:global.item_nextvalues),0)-


nvl(to_number(:global.item_prevalues),0);

--新的和值
num_hz:=nvl(to_number(name_in('b_sum.'
||:system.current_item)),0)+num_cz;

copy(to_char(num_hz),'b2.'||:system.current_item);


end if;

END;
----
法, NAME_IN COPY 量。 量。

2
REPORT 2.5 中 实 现 的 动 态 报表( 一 张 表 利 用 多 个QUERY 语 句, 生 成 一 样 格 式 的 多 张 报 表
----
况, 量, 度, 表, 作。 REPORT 25 作。 REPORT " " 换。 例:

    两个表:tab_temp1 (a number,b number,c number)

tab_temp2 (d number,e number,f number)

----
表, 样, ,

1.
数(user parameters p_1 CHAR 200, SELECT ABC FROM TAB_TEMP
2.
(QUERIES) 入:&P_1
3.
局, 表。
----
&p_1 义, P_1 可, P_1

SELECT D A,E B,F C FROM TAB_TEMP2
----
表, REPROT 来, SQL 去。
 楼主| 发表于 2008/7/25 15:32:41 | 显示全部楼层
1
如何屏蔽系统提示信息?
在运行一个FORM时往往会弹出一些报警器,但提示的并非出错信息,屏蔽这些报警器的方法是将系统变量:SYSTEM.MESSAGE_LEVEL的值设置为’25’
2
在编写PL/SQL代码中使用SELECT语句时如何避免例外发生?
在使用SELECT语句为某变量赋值时,往往会出?quot;NO_DATA_FOUND""TOO_MANY_ROWS"等异常情况,使用SELECT语句分两种情况:第一种情况,判断某表中是否有符合某一条件的记录,这时使用聚组函数MAX就可以避免以上两个例外的发生。其格式:SELECTMAX(列1),MAX(列2......INTO变量1,变量2......FROM基表WHERE条件,当没有符合条件的数据时,该语句返回空,即变量1,变量2......的值均为空,而不会出现"NO_DATA_FOUND"例外,另外使用聚组函数MAX的同时也就避免了"TOO_MANY_ROWS"例外。第二种情况,SELECT语句中含聚组函数SUM,这时如果使用了GROUPBYHAVING子句,当没有符合条件的记录时将发生"NO_DATA_FOUND"例外,此时避免例外的办法是:去掉GROUPBYHAVING子句,将HAVING子句的条件加到WHERE子句中。这样在使用SELECT语句时就不必再额外增加一段处理例外的代码,从而简化的代码的编写。
3
当使用主从块时,如何使从块自动提交?
FORM设计时有时需要用到主从块,在主从块录入时每当鼠标从从块移到主块准备录入一条新记录时,总是弹出一报警器,问你是否保存数据,从而影响录入速度,将该报警器去掉的方法是:在过程"CLEAR_ALL_MASTER_DETAILS"中的"CLEAR_BLOCK(ASK_COMMIT)"即清除从块时是否提交改为"CLEAR_BLOCK(DO_COMMIT)",这样从块录完数据再导航到主块录入新记录时,系统将自动提交数据,而不再出现上述提示。
4
如何减少FORM所占磁盘空间?
(1)对于块中只用于查询并且无格式限制的项,设置为显示项。
(2)保存FORM时先断开与数据库的链接,然后在保存。以上两种方法均可减小FORM的大小,尤其是第二种方法更为明显。当硬盘空间较小,或将程序备份到软盘上时,这样作是很有意义的。
5
如何使定制菜单的主菜单中WINDOWS项不显示?
MAINMENU中建立一个为WINDOWS属性的菜单项,这样主菜单中WINDOWS项就不再显示。
6
如何使不同布局的报表显示在同一页上?
复杂的报表往往是由几部分组成,需建立多个查询,而每个查询都对应着一个布局,怎样才能使具有不同布局的报表数据显示在同一页上呢?其方法如下:第一步,首先根据实际报表格式建立第一个查询组的布局,称为布局1,然后依次再建立起其他查询组的布局,分别称为布局2,布局3......。注意:每个布局最外围的单选框不要去掉。第二步,分别为布局2,布局3......建立一个到布局1的定位(ANCHOR),即选中工具栏中的ANCHOR,鼠标单击布局2的单选框,然后按住鼠标左键并拖动鼠标到布局1的单选框上(可以选择上边﹑下边﹑左边或右边),松开鼠标按钮,按此方法再建立布局3,布局4......到布局1的定位。建立定位的作用是使布局2,布局3......相对与布局1的位置保持不变,这样就使具有不同布局的报表数据显示并打印在同一物理页上。
 楼主| 发表于 2008/7/25 15:32:59 | 显示全部楼层
1
怎样较快的生成FMX文件?
RUN命令,一次只能生成一个.FMX文件,如果想生成一批.FMX文件,这样做即麻烦又费时,一个生成.FMX较快的办法是:先打开要运行的.FMB文件,如何按住SHIFT键将这些文件全部选中,在从系统菜单"文件"中选择"ADMINISTRATION""GENERATE"即可。
2
如何在FORM中同时加入水平与垂直滚动条?
首先,必须将画布类型设置为“堆叠式”画布,其它类型的画布不能显示滚动条。将画布类型设置为“堆叠式”之后,该画布属性选项板的“物理属性”子类会出现“显示水平滚动条”与“显示垂直滚动条”两项内容,将其同时设置为“是”,则可以同时显示水平与垂直滚动条。
3
如何在告警框内显示message信息?
当使用系统缺省设置,不进行任何设定时,message信息将在FORM窗口的底部以小字显示。如果希望引起用户注意,可以将message信息显示在告警框中。例如,如果用户输入的数据类型错误,则弹出一个告警窗口,并在其中显示message信息:“输入数据类型不符”,这样,可以更加清晰地提醒用户输入有误,并允许用户及时地改正错误。
  在告警框中显示message信息,只需要创建一个警告(alert)与一个ON_ERROR触发器,由于引用的是系统错误信息,所以不需要程序员自己编写捕捉错误并弹出相关警告信息的程序,从而提供了极大的便利。

  在告警框内显示message信息的过程如下所述:

  1. 创建一个只具有一个按钮的警告“general_error_alert”。

  2. FORM一级创建ON_ERROR触发器,在出现错误时,将错误代码与信息显示在告警框中,程序如下:

  
declare

  
v_button number;

  
v_message varchar2(255);

  
begin

  --将不需要显示的mesage信息屏蔽掉

  
if error_code in (0,40100,40400,40401,41051,40350)

  
then null;

  
else

  --将错误代码与错误信息联系起来

  
v_message:=error_type || '-' || to_char(error_code) || ':' || error_text;

   --将错误信息显示为告警信息

  
set_alert_property('general_error_alert',alert_message_text,v_message);

  
v_button:=show_alert('general_error_alert');

  
end if;

  
raise form_trigger_failure;

  end;
 楼主| 发表于 2008/7/25 15:33:30 | 显示全部楼层
1
如何一次退出所有FORM
如果重复调用并打开了多个FORM,希望在点击任何一个FORM选单上的“退出”按钮时同时退出所有的FORM,需要在每一个FORM中设置一个全局变量global.quit_all,同时在选单条上加入一个“退出”按钮,并建立以下触发器:

  1.在每一个FORM上建立WHEN_NEW_FORM_INSTANCE触发器:


  
:global.quit_all := 'N';

  2.在每一个FORM上建立WHEN_WINDOW_ACTIVATED触发器:


  
if :global.quit_all = 'Y'

  
then exit_form;

  
end if;

  3.在选单条的“退出”按钮上建立WHEN_BUTTON_PRESSED触发器:


  
:global.quit_all := 'Y';

  
exit_form;

  注意,要么使用OPEN_FORM打开FORM,要么使用CALL_FORM打开FORM,不能两者混合使用,否则容易发生错误,无法一次退出所有的FORM


2
如何在FORM与REPORT之间传递参数?
由于FORMREPORT是两项独立的产品,不可能使用全局变量传递数据,所以它们之间的数据无法共享。如果希望REPORT继承FORM中的一些数据,可以将FORM中的有关数据作为参数,以参数列表的形式传递给REPORT
  例如,可以根据用户在FORM中的选择,在REPORT中动态生成符合查询条件的数据,方法是将FORM中的查询条件,作为参数传递给REPORT,从而在REPORT中动态生成查询结果。

  在FORMREPORT之间传递参数的程序如下所示:

  
declare

  
pl_id ParamList;

  
begin

  —获取tmpdep的参数列表值

  
pl_id := Get_Parameter_List( 'tmpdep' );

  —如果参数列表pl_id已存在,则删除它,然后重建。如果不删除当前pl_id,则无法创建参数列表,并在运行FORM时出现错误提示:参数列表已存在,无法重建

  
if Not Id_Null( pl_id )

  
then Destroy_Parameter_List(pl_id);

  
end if;

  --创建参数列表
tmpdep

  
pl_id:=Create_Parameter_List('tmpdep' );

  --在参数列表pl_id中加入参数w_clause,同时对w_clause赋值

  where deptno=:dept_deptno

  
Add_Parameter( pl_id,'w_clause', TEXT_Parameter, 'where deptno=:dept.deptno');

  --运行报表,并将现有参数列表pl_id与值传递给报表
report1

  
run_product(reports,'C:\report\report1',synchronous,runtime,filesystem,pl_id);

  end ;
 楼主| 发表于 2008/7/25 15:34:05 | 显示全部楼层
1
从FORM调用REPORT时,如何使REPORT以满屏方式显示?
当从FORM调用REPORT时,REPORT将按缺省窗口大小(420×360)显示,如果希望REPORT以满屏方式显示,需要加入如下代码:
  add_parameter(pl_id,maximize',TEXT_PARAMETER,'yes');

2
如何关闭REPORT运行时的参数窗口?

FORM调用REPORT时,首先会弹出一个参数窗口,显示所有FORM传递给REPORT的参数,待点击该窗口中的“运行”后,才运行REPORT。我们也可以不显示该参数窗口,方法是在FORM中加入如下代码:

  Add_Parameter(pl_id,'w_clause',TEXT_Parameter,'NO');

3
在Oracle中实现报表的定长输出
OracleReportsOracle的数据统计及图形化报表工具,它提供了六种风格的报表格式,而我们通常使用的只有其中的两种,即TabularMatrix,无论用哪种风格生成的报表,打印出的表格数都是动态变化的。其中Tabular风格的报表,列数固定,而行数不定;Matrix风格的报表,行数和列数均不定。那么在OracleReports中如何实现报表的定长与定宽输出呢?笔者在实际开发过程中对上述两种风格的报表各总结出一种行之有效的方法,供大家参考。
1.
对于Tabular风格的报表,可用报表触发子After Parameter FormAfter Report实现定长输出。其方法是:根据实际情况确定每页打印的行数,当最后一页的记录数少于每页打印的行数时,则用空记录补齐。在触发子After Parameter Form插入空记录,在触发子After Report中再将空记录删除,下面举例说明。
假设有一数据基表WZDM:存放物资代码信息,其数据结构为:
字段名
含义
长度
类型

wzdm
物资代码
9
c
wzmc
物资名称
20
c
xhgg
型号规格
20
c
jldw
计量单位
6
c

要求:按定长输出物资代码表,并且每页均输出x(x可根据实际情况而定)
1.
启动OracleReports,建立物资代码打印报表(),然后在报表触发子After Parameter Form中加入以下代码:
Declare
vjls number(2);
i number(2):=1;
Begin
Select Count() Into Vjls From Wzdm;
If Mod(Vjls,x)〈〉0 Then
  Loop
  Exit When i=(xmod(vjls,x))1;
  Insert Into Wzdm(Wzdm,Wzmc,Xhgg,Jldw)
  Values(′′,′′,′′,′′);
  i:=i1;
  End Loop;
  Commit;
End If;
End;
在报表触发子After Report中分别加入以下代码:
Begin
Delete From Wzdm Where Wzdm Is Null;
Commit;
End;
2.
运行报表后即可输出定长的物资代码表。
说明:对于其它Tabular风格的报表,在编写上述两个触发子时只需将基表名与列名根据实际情况修改一下,并确定x的值即可。
二、对于Matrix风格的报表,可利用视图实现定长与定宽输出,其思路是:当行记录数和列记录少于实际报表的行数和列数时,均以空记录补齐。下面举例说明。
假设有一物资资金消耗去向统计月报,该表横向显示本期消耗去向,纵向显示物资类别,由于每月物资消耗去向和消耗物资均不定,所以此类报表即为一矩阵报表。该报表的数据存放在基表TZJXHQX中,其数据结构如下:
字段名
含义
长度
类型

lbmc
类别名称
20
c
dwmc
单位名称
20
c
je
金额
142
n
要求:按定长定宽输出物资资金消耗去向统计月报,并且每页均输出xy(行数和列数可根据实际情况而定)
1.
首先建一基表Tkjl,用来存放空记录,其数据结构为:
字段名
含义
长度
类型

no
序号
2
n
建完该数据表后,再往其中插入记录,记录数可根据实际情况而定,一般为一页所能打印的最大行数,这里假设为z条,即No的值为123z
2.
建视图,其过程如下:
Create View V—TJBB As
 Select Dwmc,Lbmc,Je From T—zjxhqx
 Union
 Select Dwmc,Null,ToNumber(Null) From T—zjxhqx,T—kjl
 Where No(zx)(Select Mod(Count(Distinct Lbmc)1,x)1 From T—zjxhqx)
 Union
 Select Null,Lbmc,ToNumber(Null) From T—zjxhqx,T—kjl
 Where No(zy)(Select Mod(Count(Distinct Dwmc)1,y)1 From T—zjxhqx);
3. 启动OracleReports,建立矩阵报表查询时直接引用视图VTJBB即可。这样运行时输出的报表每页都是xy列,即实现了定长和定宽输出。
 楼主| 发表于 2008/7/25 15:35:02 | 显示全部楼层
1
Developer/2000 FROMS 4.5 中的" 宏" 代 换
----

FOXPRO




中,








能,

FORMS





能,
"&","*"








的,
FORMS









写,




FORMS





能,
NAME_IN()COPY()







能。Name_in()














值,
COPY()


















象。



例:

FORM
构:

B
L1L2L3L4L5L6








L1。。。L6


DELCATE
strItemName varchar2(20);
BEGIN
for I in 1 …6 loop
strItemName:=':b.l"||to_char(i);
copy(null,strItemNmae);
end loop;
END;
----
NAME_IN







些,








时,

















码。



















FORM结构:
养老:
块:YLYJ(养老应缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
块:YLSJ (养老实缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
工伤:
块:GSYJ(工伤应缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
块:GSSJ (工伤实缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
医疗:
块:YILYJ(医疗应缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
块:YILSJ (医疗实缴)
项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
----






同,






同,










样,









缴,

NAME_IN 时,






序,


NAME_IN














的。

下:

FUNCTION FUN_JF (PRE_BLOCK_NAME
IN VARCHAR) RETURN BOOLEAN IS
BEGIN
if name_in(pre_block_name||'sj.dwjtc')
>name_in(pre_block_name||'yj.dwjtc') or
name_in(pre_block_name||'sj.dwjzh')
>name_in(pre_block_name||'yj.dwjzh') or
name_in(pre_block_name||'sj.grjf')
>name_in(pre_block_name||'yj.grjf') then
message('




');

return false;
end if;
return true;
END;
----








NAME_IN COPY











" "


能,















用,












作。
 楼主| 发表于 2008/7/25 15:35:41 | 显示全部楼层
1
用FORMS 实 现ORACLE 数 据 库 与 其 它 数 据 源 数 据 的 交 换
---- Developer/2000













接,





















扣,




3GL ODBC
DLL



现,



















杂。


Developer/2000

TEXT_IO












法。



























作,























式。











用:(


d2kwfile.dll
用)


DECLARE
filename varchar2(128):=null;
filenum text_io.file_type;
linebuf varchar2(100);
r_temp temp%rowtype;
BEGIN
filename:=d2k_file_dialog.show
('
请选择缴费工资台帐原文件','c:\','源文件
(*.txt)|*.txt|');
if filename is null then
raise form_trigger_failure; end if;
filenum:=text_io.fopen(filename,'r');
loop
BEGIN
text_io.get_line(filenum,linebuf);
TEXT_IO.PUT(linebuf);TEXT_IO.NEW_LINE;
exception when no_data_found then
exit;
END;
BEGIN
v_temp.l1=substr(linebuf,1,9);
v_temp.l2:= to_number(substr(linebuf,10,5));
insert into temp(l1,l2) values (v_temp.l1,v_temp.l2);
exception when others then
END;
< < end_loop > >
null;
end loop;
END;
 楼主| 发表于 2008/7/25 15:36:25 | 显示全部楼层
1
FORMS 4.5 实 现 的 列 表 查 询、多 行 录 入 中 的 实 现 行 累 计



----
PB VB












列,




FORMS45




能,




















便,



FORM







现。


例:

块:b1 项:
l1,l2.l3,l4
块:b2 项:
l1,l2,l3,l4
b2B1的求和块

在块B1中的PRE_TEXT_ITEM中代码:

IF SUBSTR(:SYSTEM.CURRENT_ITEM,1,1) IN ('L') THEN
:GLOBAL.ITEM_PREVALUES:=NAME_IN
('B1.'||:SYSTEM.CURRENT_ITEM);
END IF;
在块 B2中的POST_TEXT_ITEM中代码:

DECLARE
num_cz number; --
数据项在录入或修改前后的差值

num_hz number; --
数据项在修改后的求合

BEGIN
if substr(:system.current_item,1,1) in ('l') then
:global.item_nextvalues:=name_in
('b1.'||:system.current_item);
num_cz:=nvl(to_number(:global.item_nextvalues),0)-
nvl(to_number(:global.item_prevalues),0);
--
新的和值

num_hz:=nvl(to_number(name_in('b_sum.'
||:system.current_item)),0)+num_cz;
copy(to_char(num_hz),'b2.'||:system.current_item);
end if;
END;
----
























法,






NAME_IN COPY





量。


















量。

2
REPORT 2.5 中 实 现 的 动 态 报表( 一 张 表 利 用 多 个QUERY 语 句, 生 成 一 样 格 式 的 多 张 报 表



----




















况,


















量,













度,











表,




















作。


REPORT 25















作。

REPORT " "
换。


例:

两个表:
tab_temp1 (a number,b number,c number)
tab_temp2 (d number,e number,f number)
----




表,



样,





,











数(user parameters p_1
CHAR
200,


SELECT AB
C FROM TAB_TEMP




(QUERIES)







入:
&P_1




局,







表。

----








&p_1
义,











P_1














可,








P_1

SELECT D A,E B,F C FROM TAB_TEMP2
----












表,


REPROT













来,









SQL





去。
 楼主| 发表于 2008/7/25 15:38:02 | 显示全部楼层
1
用ORACLE*Forms 和ORACLE*Graphics实现数据与图形动态显示

1 .


---- ORACLE





























一,Developer/2000 ORACLE















境。 ORACLE *Forms Developer/2000


分,







富,










品,
















据。







中,

















来。

如:

图,

线
图,



等,


使











然。Developer/2000



ORACLE *Graphics














法,












据,



Forms




来,







据。

----

















作,


Forms

Graphics




能,
使







观,



Forms












形,













析,








的。










中,



















会。

1.









----












SALES






间,



称,






(







)

















TIME
number(4)






NAME
char(10)




AMOUNT
number(10,2)



----

Graphics









件,



chart.ogd
Queries

SQL







形,










x
y






据。



x





称,y









量。

----

Forms





Forms


sale.fmb


CANVAS1



List Item
LIST1

LIST1












值。





Chart Item
chart_area1



chart_area1




小,




chart.ogd


----
Forms



形,


Graphics






递。



Graphics 中,
chart.ogd





构:


----
1



Parameters



数。








数,



m1











parameter m1
name m1
type number
initial value 1998
----
2








句。
Queries

"query0"
询,



示:

select product,amount
from sales
where time=:m1
----
3



程。
Program Unit

update_chart
程,













能。

PROCEDURE update_chart IS
BEGIN
og_execute_query(og_get_query('query0'));
END;
----






后,

Forms 中,



orawin95\forms45\plsqllib\og.pll
件,







构:

----
1
LIST1

List elements












值,



WHEN_LIST_CHANGED

器,







码,



pl ParamList;
pl := Get_Parameter_List('plist');
IF NOT Id_Null(pl) THEN
destroy_parameter_list(pl);
END IF;
pl := Create_Parameter_List('plist');
add_parameter(pl,'m1',text_parameter,:blk1.list1);
og.interpret('c:\chart.ogd','chart_area1','
update_chart;',true,pl);
----
2
Forms

WHEN_NEW_FORM_INSTANCE

器,






作,




下:

Set_Window_Property (Forms_MDI_Window,
Window_State,Maximize);
Show_Window ('sales');
set_window_property('sales',window_state,
maximize);
og.open('c:\chart.ogd','chart_area1');
----
3
Forms

POST_FORM

器,











形。

og.close('c:\chart.ogd','blk1.chart_area1');
----





程,









现。











时,











化,



















值。

3.


----






Developer/2000 Forms Graphics





使


巧。

Developer/2000














程,









索。
 楼主| 发表于 2008/7/25 15:38:49 | 显示全部楼层
1
数字分金额转成大写汉字元金额程序!

CREATE OR REPLACE FUNCTION CONVERT_MONEY(INPUT_NBR IN NUMBER DEFAULT 0)
/*
函数名称: CONVERT_MONEY

: 将以分为单位输入的数值转换为大写汉字形式


: 当转换后的汉字以分结尾时,不加“整”,当以角或元结尾时加“整”,这符合银行的规定。

数字金额凡是中间出现0,必须转为大写的“零”,连续多个0时只转为一个“零”字,
结尾出现0时要加“整”,结尾不是0时不加“整”,这与前面的规定是一致的。
由于圆是货币单位,所以在多于1元钱时,圆是必须出现的。但是,万佰等是数字单位,
时可能不出现。

代码:


*/

       RETURN
VARCHAR2 IS

INPUT_NBR_BAK     NUMBER
(20);      /*用于接收输入参数 INPUT_NBR */

NUM_CHARACTER     VARCHAR2(20) := '零壹贰叁肆伍陆柒捌玖';

UNIT_CHARACTER    VARCHAR2(40) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';

OUTPUT_STRING     VARCHAR2(100):= '';

REMAIN_NBR        NUMBER(20);

BIT_NUM           NUMBER(20);      /*每一位上的数字*/

BIT_UNIT          VARCHAR2(2);     /*每一位所对的单位*/

BIT_INDIC         NUMBER(1) :=0;   /*每一位的数字是否为0,0表示为0,1表示不为0*/

I                 NUMBER(2) :=0;   /*循环次数,索引变量从0开始*/

SPE_UNIT          VARCHAR2(2):='A';/*特殊位,包括万和亿,表示该亿汉字是否已写入结果字串*/

SIGN_INDIC        VARCHAR2(1);     /*用于标志数值符号:0为正,1为负*/

BEGIN

IF     INPUT_NBR=0 THEN RETURN '零圆整';

ELSIF  INPUT_NBR>0 THEN SIGN_INDIC:='0';

      
INPUT_NBR_BAK:=INPUT_NBR;

ELSIF  INPUT_NBR<0 THEN SIGN_INDIC:='1';

      
INPUT_NBR_BAK:=-INPUT_NBR;

END    IF;

LOOP

    REMAIN_NBR     
:= FLOOR(INPUT_NBR_BAK / 10);          /*取出除后的商*/

   
BIT_NUM        := INPUT_NBR_BAK - REMAIN_NBR * 10;    /*取出当前位的数值*/

   
INPUT_NBR_BAK  := REMAIN_NBR;                         /*保存商以做下一次循环*/

   
BIT_UNIT       := RTRIM(SUBSTR(UNIT_CHARACTER, I * 2+ 1, 2));/*取出当前位的单位汉字*/

   


   
IF    BIT_NUM > 0 THEN                                /*当前位的值不为0*/

         
BIT_INDIC :=1;

          IF   
I=6  OR I=14  THEN                        /*当前位是''位或'万亿'*/

               
SPE_UNIT:='';                           /*表示万已经写入OUTPUT_STRING,BIT_UNIT中会包含万字*/

         
ELSIF (I>=7 AND I<=9) OR (I>=15 AND I<=17) THEN /*当前位在万及千万之间或万亿及千万亿之间*/

               
IF   SPE_UNIT!='' THEN                  /*万还没写入OUTPUT_STRING,则要写入一次*/

                     
OUTPUT_STRING:=''||OUTPUT_STRING;

                     
SPE_UNIT:='';                      /*表示万已经写入OUTPUT_STRING*/

               
END  IF;

         
END   IF;                                       /*高于千万亿的数本程序不考虑了*/

         
OUTPUT_STRING := SUBSTR(NUM_CHARACTER, BIT_NUM * 2 + 1, 2)||BIT_UNIT||OUTPUT_STRING;

    ELSE                                                  
/*当前位等于0,走此分支*/

         
IF   BIT_INDIC = 1 THEN             /*当前位的前一位不为0时写 */

               
OUTPUT_STRING := ''||OUTPUT_STRING;

         
END  IF;

          IF   
BIT_UNIT IN ('','亿') THEN  /*若已达圆位,则圆是必须出现的,由于亿太大,不与万相同处理,所以就与圆一样处理*/

               
SPE_UNIT:=BIT_UNIT;           /*保存圆与亿,以与万相区别*/

               
OUTPUT_STRING := BIT_UNIT||OUTPUT_STRING;

         
END   IF;

         
BIT_INDIC  :=0;                     /*当前位的值为0*/

   
END   IF;

   
I := I + 1;

    EXIT
WHEN INPUT_NBR_BAK = 0;

END LOOP;




IF   
MOD(INPUT_NBR,10)=0 THEN             /*输入的数字没有分,最小的是角,则尾部串个整*/

      
OUTPUT_STRING:=OUTPUT_STRING||'';

END   IF;

IF   
SIGN_INDIC='1' THEN

      OUTPUT_STRING
:=''||OUTPUT_STRING;

END   IF;

RETURN
OUTPUT_STRING;

END;

/

发表于 2010/11/12 10:03:47 | 显示全部楼层
copy  也要 吧格式调好点啊
发表于 2010/11/22 19:20:53 | 显示全部楼层
这个必须顶,多谢分享!
发表于 2011/2/28 16:03:56 | 显示全部楼层
很有帮助呀~谢谢啦~~
发表于 2011/2/28 16:04:37 | 显示全部楼层
很有帮助呀~谢谢啦~
发表于 2011/6/21 16:53:28 | 显示全部楼层
正好需要,谢谢
发表于 2011/6/24 21:39:12 | 显示全部楼层
dddddddddddddddddddddd
发表于 2011/6/24 21:39:30 | 显示全部楼层
ddddddddddddddddddddddd
发表于 2011/6/24 21:48:49 | 显示全部楼层
dddddddddddddddddd
发表于 2011/7/22 10:00:36 | 显示全部楼层
这个资料得花点时间看看。
发表于 2012/2/13 14:22:52 | 显示全部楼层
受用,楼主辛苦啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 12:49 , Processed in 0.036955 second(s), 13 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表