|
|

楼主 |
发表于 2008/7/25 15:28:06
|
显示全部楼层
1
在DEVELOPER2000中利用DDE将数据倒入到EXCEL文件中的方法 在实际的工作中,经常遇到用户要将EXCEL文件中的数据倒入到ORACLE数据库中,也经常遇到用户要将ORCLE数据库中的数据倒入到EXCEL文件中,这方面的资料并不多见(PB6的这项功能很简单,只需在DATAWINDOW控件中加入dw_1.save()这一函数就可以了),通常的做法是利用DEVELOPER 2000自带的示例进行修改来完成任务,但效果也不好,尤其是对初学者,面对示例中的OLE示例可能如入雾里,我在实际工作中利用DDE将数据倒入到EXCEL文件中,效果也不错,在这里向大家作一介绍.
所谓DDE,就是动态数据交换,相信各位并不陌生.运用DDE倒数据的先提条件是先在本机安装微软office中的EXCEL,在C:盘上建立一空的EXCEL文件如EXCEL.xls,打开该文件,然后运行自己开发的FORM文件.
下面我就我工作中遇到的实际工作遵照原意逐步进行介绍:
先用form4.5(5.0当然更可以)建立一个新FORM,在canvas上的新blok中建一个button,然后在该button中的WHEN-BUTTON-PRESSED触发子中,输入以下代码:
DECLARE
CROW
varchar2(8);
CCOL1
varchar2(8);
CCOL2
varchar2(8);
CCOL3
varchar2(8);
CCOL4
varchar2(8);
CCOL5
varchar2(8);
CCOL6
varchar2(8);
CCOL7
varchar2(8);
CCOL8
varchar2(8);
CCOL9
varchar2(8);
TEMP
VARCHAR2(8);
ConvID
PLS_INTEGER;
/*该游标c1是用来从ORACLE提取数据,
并将数据倒入到EXCEL文件中的*/
CURSOR C1 IS SELECT
A.SHIPMENT_NO,A.ARRIVAL_DATE,
B.DELIVERY_REF_1,B.DELIVERY_REF_3,
B.DELIVERY_REF_2,C.CASE_NO,C.LRCM_CODE,
C.ANN_QUANTITY,C.QUANTITY_DESCRIPTION,
C.SPARE_PART,C.TRANSFER_NUMBER,
C.TRANSFER_DATE
FROM
ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,
ACMCASE_PL C
WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL
AND C.TRANSFER_DATE IS NOT NULL;
SHIPMENT_NO_TMP
ACM.SHIPMENT_NO%TYPE;
ARRIVAL_DATE_TMP
ACM.ARRIVAL_DATE%TYPE;
DELIVERY_REF_1_TMP
ACMCONTRACT.DELIVERY_REF_1%TYPE;
DELIVERY_REF_3_TMP
ACMCONTRACT.DELIVERY_REF_3%TYPE;
DELIVERY_REF_2_TMP
ACMCONTRACT.DELIVERY_REF_2%TYPE;
CASE_NO_TMP
ACMCASE_PL.CASE_NO%TYPE;
LRCM_CODE_TMP
ACMCASE_PL.LRCM_CODE%TYPE;
ANN_QUANTITY_TMP
ACMCASE_PL.ANN_QUANTITY%TYPE;
QUANTITY_DESCRIPTION_TMP
ACMCASE_PL.QUANTITY
_DESCRIPTION%TYPE;
SPARE_PART_TMP
ACMCASE_PL.SPARE_PART%TYPE;
TRANSFER_NUMBER_TMP
ACMCASE_PL.TRANSFER
_NUMBER%TYPE;
TRANSFER_DATE_TMP
ACMCASE_PL.TRANSFER
_DATE%TYPE;
NCOUNT
NUMBER;
BEGIN
/*NCOUNT为游标循环的总记数*/
SELECT COUNT(*) INTO NCOUNT
FROM
ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,
ACMCASE_PL C
WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL AND
C.TRANSFER_DATE IS NOT NULL;
/*
初始化DDE,同EXCEL及文件建立联系,
此时要确保EXCEL将EXCEL.XLS文件打开
*/
ConvID := DDE.Initiate('EXCEL', 'C:\excel.xls');
/*
先在EXCEL文件中第一行加入字段名称,
其中DDE.CF_TEXT为文本型数据,1000为1000毫秒
*/
DDE.Poke(ConvID, 'R1C1','船运号',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C2','到达日期',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C3','包装箱号',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C4','LRCM号',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C5','SO标识',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C6','移交单',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C7','移交日期',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C8','移交数量',
DDE.CF_TEXT, 1000);
DDE.Poke(ConvID, 'R1C9','设备材料描述',
DDE.CF_TEXT, 1000);
OPEN C1;
FOR i IN 1..NCOUNT LOOP
/*循环从此开始*/
FETCH C1 INTO SHIPMENT_NO_TMP,
ARRIVAL_DATE_TMP,DELIVERY_REF_1_TMP,
DELIVERY_REF_3_TMP,DELIVERY_
REF_2_TMP,CASE_NO_TMP,
LRCM_CODE_TMP,ANN_QUANTITY_TMP,
QUANTITY_DESCRIPTION_TMP,SPARE_PART_TMP,
TRANSFER_NUMBER_TMP,TRANSFER_DATE_TMP;
EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;
/*下面是EXCEL.XLS文件的CELL,
如'R2C2'就是第二行第二列*/
CROW:=I+1;
CCOL1:='R'||CROW||'C1';
CCOL2:='R'||CROW||'C2';
CCOL3:='R'||CROW||'C3';
CCOL4:='R'||CROW||'C4';
CCOL5:='R'||CROW||'C5';
CCOL6:='R'||CROW||'C6';
CCOL7:='R'||CROW||'C7';
CCOL8:='R'||CROW||'C8';
CCOL9:='R'||CROW||'C9';
TEMP:=ANN_QUANTITY_TMP;
/*NUMBER型数据要先转化为varchar型*/
DDE.Poke(ConvID, CCOL1, SHIPMENT_NO_TMP,
DDE.CF_TEXT, 2000000000);
/*日期型要用tochar()进行转换*/
DDE.Poke(ConvID, CCOL2, TO_CHAR(ARRIVAL_DATE_TMP),
DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID,CCOL3,DELIVERY_REF_1_TMP
||DELIVERY_REF_3_TMP||
DELIVERY_REF_2_TMP||
CASE_NO_TMP,
DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL4, LRCM_CODE_TMP, DDE.CF_TEXT,
2000000000);
DDE.Poke(ConvID, CCOL5, SPARE_PART_TMP, DDE.CF_TEXT,
2000000000);
DDE.Poke(ConvID, CCOL6, TRANSFER_NUMBER_TMP,
DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL7, TO_CHAR(TRANSFER_DATE_TMP),
DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL8, TEMP, DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL9, QUANTITY_DESCRIPTION_TMP,
DDE.CF_TEXT, 2000000000);
END LOOP;
CLOSE C1;
DDE.Terminate(ConvID);
/*结束DDE会话,此时数据已经全部倒入到EXCEL文件中了*/
END;
在做好以上工作后, 编译运行该fmx文件, 此时确保打开excel.xls文件,用鼠标点击按钮,然后将焦点移到excel.xls文件中,你就会发现一行行数据正在被倒入到EXCEL文件中,等完成后, 将EXCEL文件保存起来就可以了. |
|