 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
perry
註冊時間: 2014-07-20 文章: 203
第 1 樓
|
發表於: 星期一 五月 11, 2015 6:23 pm 文章主題: 報表輸出全丟Excel從來沒用過VFP報表檔的想法!! |
|
|
1.完全不用擔心印表機和軟體的問題.
2.報表設計彈性最高,甚至由需求者提供(省事)
3.表列式只寫一隻轉換至 Excel 的共用程式.
簡單來說就是 省事事省,包君滿意!!
PS.我是從頭到尾完全沒用過VFP的報表檔,
也沒用過 Do Form (.scx) 這種東東 |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 2 樓
|
發表於: 星期一 五月 11, 2015 9:52 pm 文章主題: |
|
|
10000000%支持
除了樓主所提的3個優點外 , 我再加一個
4.移轉程式語言及跨平台
用excel模式做報表,將來VFP不用,而改用其它程式語言時,已設計好的excel表可以沿用,而程式語法也差不多,若是使用vfp的 rpt , 就無此項優勢。 |
|
回頂端 |
|
 |
perry
註冊時間: 2014-07-20 文章: 203
第 3 樓
|
發表於: 星期三 五月 13, 2015 6:43 am 文章主題: |
|
|
讓各位大大看一下報表輸出是多輕鬆簡單!!
代碼: |
XLApp = CreateObject('Excel.Application')
IF TYPE('XLApp')#'O'
WAIT CLEAR
MESSAGEBOX('記憶體不足,無法啟動 Excel !!'+CHR(13)+;
'請再重按預覽列印!!',0+16+0,'警告')
RETU
ENDI
oMEXEPATH=SYS(5)+SYS(2003)
tmp_xls=oMEXEPATH+'\samp001.xls'
aa_xls=filetostr(path+filename)
=strtofile(aa_xls,tmp_xls)
XLApp.WORKBOOKS.OPEN(tmp_xls)
XLSheet=XLApp.SHEETS(1)
sele (pr_alia)
p_row=46 &&預覽列印一頁的列數範圍
p_rec=35 &&每頁輸出的記錄數
p_all=int((recc()-1)/p_rec)+1
if p_all>1
for i=2 to p_all &&產生相對各頁的空白表
XLSheet.RANGE("1:"+allt(str(p_row))).COPY
XLSheet.ROWS((I-1)*p_row+1).Insert
next
endi
go top
p_j=1
p_i=0
scan
p_i=int((p_j-1)/p_rec)
XLSheet.Cells(p_i*p_row+p_j+1,1).Value=field_1
XLSheet.Cells(p_i*p_row+p_j+1,3).Value=field_5
.
.
.
p_j=p_j+1
ends
|
寫程式最快的方式就是...Copy
若是統計數據,若客戶或類別不是很多,
個人倒是建議直接輸出資料即可,
讓使用人(需求者)選用個人喜好或需求的統計圖表,
只要點選資料即成,可免除報表輸出的複雜度!! |
|
回頂端 |
|
 |
perry
註冊時間: 2014-07-20 文章: 203
第 4 樓
|
發表於: 星期三 五月 13, 2015 9:20 am 文章主題: |
|
|
有時我會思考試著把印表相關數據寫入DBF管理@@
這樣報表變更,只要改DBF中的數據即可適用,
不需更新程式(懶人模式啟動中= =''')
安裝Excel版轉成PDF,
這樣印表機或轉印pdf通通是Excel的事@@ |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 5 樓
|
發表於: 星期三 五月 13, 2015 9:28 am 文章主題: |
|
|
perry 寫到: | 有時我會思考試著把印表相關數據寫入DBF管理@@
這樣報表設變更,只要改DBF中的數據即可適用,
不需更新程式(懶人模式啟動中= =''') |
這個我有做.
以前老闆在DOS CLIPPER 時代做了 DOS TXT 格式的報表產生器,
我看了之後,發現基本上把 XY 修改為 CELL(X,Y) 大多數可以適用,
所以有把 DOS 版改成 EXCEL 版.
例如可以訂 1,1, 產品代號;2,1,單價,3,1,數量,4,1,金額,
然後依序把資料填入CELL中.
但是要做成複雜的 GROUP, 多層統計 等等,
報表產生器得要做得很先進,
不然人為介入還是很高. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
perry
註冊時間: 2014-07-20 文章: 203
第 6 樓
|
發表於: 星期三 五月 13, 2015 9:46 am 文章主題: |
|
|
grou 倒是小事= ='''
利用 sele sql 就能達到
代碼: |
sele 0
sele ' ' as sk,' ' as sk1,ymeo,cust,cust as cust1,sum(amt) as amt from aa wher yemo>=y1 and yemo<=y2 grou by cust,yemo into curs t_1
sele 0
sele ' ' as sk,'1' as sk1,spac(7) as yemo,cust,'小 計' as cust1,sum(amt) as amt from t_1 grou by cust into curs t_2
sele 0
sele '1' as sk,' ' as sk1,spac(7) as yemo,spac(5) as cust,'合 計' as cust1,sum(amt) as amt from t_2 grou by sk into curs t_3
sele 0
sele * from t_1 union sele * from t_2 into curs t_4
sele 0
sele * from t_4 union sele * from t_3 into curs t_5
sele 0
sele * from t_5 orde by sk,cust,sk1,yemo into curs t_6
sele t_6
**cust1 顯示用
go top
brow
use in t_1
use in t_2
use in t_3
use in t_4
use in t_5
use in t_6
|
|
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 7 樓
|
|
回頂端 |
|
 |
perry
註冊時間: 2014-07-20 文章: 203
第 8 樓
|
發表於: 星期四 五月 14, 2015 11:09 am 文章主題: |
|
|
唉...能力尚淺,有待加強= ='''
並不是所有數值欄位都適用加總,如單價,不同類的數量 ...,
要自動加總仍需有所限定. |
|
回頂端 |
|
 |
ezpos
註冊時間: 2011-04-20 文章: 323
第 9 樓
|
發表於: 星期日 七月 19, 2015 12:04 pm 文章主題: |
|
|
perry 寫到: | 讓各位大大看一下報表輸出是多輕鬆簡單!!
代碼: |
XLApp = CreateObject('Excel.Application')
IF TYPE('XLApp')#'O'
WAIT CLEAR
MESSAGEBOX('記憶體不足,無法啟動 Excel !!'+CHR(13)+;
'請再重按預覽列印!!',0+16+0,'警告')
RETU
ENDI
oMEXEPATH=SYS(5)+SYS(2003)
tmp_xls=oMEXEPATH+'\samp001.xls'
aa_xls=filetostr(path+filename)
=strtofile(aa_xls,tmp_xls)
XLApp.WORKBOOKS.OPEN(tmp_xls)
XLSheet=XLApp.SHEETS(1)
sele (pr_alia)
p_row=46 &&預覽列印一頁的列數範圍
p_rec=35 &&每頁輸出的記錄數
p_all=int((recc()-1)/p_rec)+1
if p_all>1
for i=2 to p_all &&產生相對各頁的空白表
XLSheet.RANGE("1:"+allt(str(p_row))).COPY
XLSheet.ROWS((I-1)*p_row+1).Insert
next
endi
go top
p_j=1
p_i=0
scan
p_i=int((p_j-1)/p_rec)
XLSheet.Cells(p_i*p_row+p_j+1,1).Value=field_1
XLSheet.Cells(p_i*p_row+p_j+1,3).Value=field_5
.
.
.
p_j=p_j+1
ends
|
寫程式最快的方式就是...Copy
若是統計數據,若客戶或類別不是很多,
個人倒是建議直接輸出資料即可,
讓使用人(需求者)選用個人喜好或需求的統計圖表,
只要點選資料即成,可免除報表輸出的複雜度!! |
用你這方法...
使用者可以在出貨單上面
1.任意加入一個 變數的欄位(客戶電話) 之類 嗎???
2.出貨單 可以產生好幾頁嗎??? _________________ ezPos收銀機 簡單好用低成本 http://www.ezpos.info
全新美觀的POS收銀機.POS軟硬體耗材.
軟體客制化.網站規劃....能賺錢的都可以找我
http://www.twelife.com 台灣生活網 |
|
回頂端 |
|
 |
ezpos
註冊時間: 2011-04-20 文章: 323
第 10 樓
|
|
回頂端 |
|
 |
perry
註冊時間: 2014-07-20 文章: 203
第 11 樓
|
發表於: 星期日 七月 19, 2015 1:41 pm 文章主題: |
|
|
1.之前的是先設計好空白報表,直接套入資料連續列印.
2.若要隨時增加則要寫成讀取欄位結構長度,個人有土法煉鋼的一只專用程式
將資料產生到暫存檔(欄位全部是文字串,方便計算長度)
用到
XLSheet.PageSetup.PrintTitleRows="$1:$"+STR(3+IIF(EMPT(opr_header1),0,1)+IIF(EMPT(opr_header2),0,1),1)
XLSheet.PageSetup.PrintTitleColumns="$A:$"+rag_str |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 12 樓
|
發表於: 星期日 七月 19, 2015 6:15 pm 文章主題: |
|
|
出貨單、發票、傳票等等之類有單頭,單身,單尾等多頁輸出excel,我是把它寫成模組化,
代碼: |
$vBillno = $_GET['billno'] ;
/* 變數定義區�}始 */
$vTemplate = '出貨單.xlsx' ; //範本檔
$vOutputFileName = "出貨單"; //輸出excel之檔名
$vZoom = 85 ; //顯示比率
$vPaperSize = PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5 ; //紙張大小
$vPaperOrientation = PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE ; //紙張方向 ORIENTATION_PORTRAIT:直向 ORIENTATION_LANDSCAPE:横向
$MainKey = 'billno'; //主鍵值
$MainQuery = sprintf("SELECT
inventorymain.billno,
concat(inventorymain.custid,'<br>',comcustomer.cname) AS Header11,
inventorymain.defaultpaydate AS Header12,
inventorymain.billno AS Header13,
comcustomer.tel AS Header21,
inventorymain.unicode AS Header22,
inventorymain.billdate AS Header23,
comcustaddress.address AS Header31,
if(inventorymain.totalamount=func_取得發票金額(1,inventorymain.invoiceno),inventorymain.invoiceno,'') AS Header32,
inventorymain.totalamount AS Footer11,
if(inventorymain.totalamount=func_取得發票金額(1,inventorymain.invoiceno),func_稅別名稱(inventorymain.tax_type),'') AS Footer12,
if(inventorymain.totalamount=func_取得發票金額(1,inventorymain.invoiceno),func_取得發票稅額(inventorymain.invoiceno,inventorymain.billno,inventorymain.invoicedate),0) AS Footer13,
trim(inventorymain.memo) AS Footer21,
'%s' AS Footer31,
'%s' AS Footer32,
compersonA.cname AS Footer41,
compersonB.cname AS Footer42
FROM
inventorymain
Inner Join comcustomer ON inventorymain.custid = comcustomer.custid
Inner Join comcustaddress ON inventorymain.`交貨地點` = comcustaddress.autoinc_id
Inner Join comperson compersonA ON inventorymain.keyiner = compersonA.personid
Inner Join comperson compersonB ON inventorymain.personid = compersonB.personid
WHERE
FIND_IN_SET(inventorymain.billno ,'%s');",
$_SESSION['CompanycAddress'],$_SESSION['CompanyTel'] ,$vBillno); //單頭及單尾之SQL
$SubQuery = "SELECT
inventorysub.prodcname AS Field1,
inventorysub.brand AS Field2,
inventorysub.quantity AS Field3,
comproduct.calcunit AS Field4,
inventorysub.price AS Field5,
inventorysub.subamount AS Field6,
inventorysub.memo AS Field7
FROM
inventorysub
Inner Join comproduct ON inventorysub.productid = comproduct.productid
WHERE
inventorysub.billno = ?
ORDER BY
inventorysub.autoinc_id ASC"; //單身之SQL
$vEveryPageRowCount = 13 ; //每頁列數
$vSubRowCount = 5 ; // 每頁子單列數
$vSubBodyoffsetRow = 4 ; //單身起始列偏移列數(距離表頭列而言)
$vFooteroffsetRow = 9 ; // //單尾起始列偏移列數(距離表頭列而言)
$vHeaderAry = array(
array(array('B','F','H'),array('Header11','Header12','Header13')),
array(array('B','F','H'),array('Header21','Header22','Header23')),
array(array('B','H'),array('Header31','Header32'))
); //單頭
$vSubBodyAry = array(array('A','C','D','E','F','G','H'),array('Field1','Field2', 'Field3', 'Field4','Field5', 'Field6', 'Field7')); //單身
$vFooterAry = array(
array(array('B','D','F','H'),array('=SUM(G<<BrowNo>>:G<<LrowNo>>)','Footer12','Footer13','=B<<FooterRowNo>>+F<<FooterRowNo>>')),
array(array('B'),array('Footer21')),
array(array('B','H'),array('Footer31','Footer32')),
array(array('B','H'),array('Footer41','Footer42'))
); //單尾
$vFooter = ' '; //頁尾
$vPageTitleandFooter = array($_SESSION['CompanyName'],'出貨單','',$vFooter) ; // 每頁的頁頭及頁尾 頁頭為前三列 , 頁尾為最行一行
$vShowNextPageColumn = 'H' ; //秀續次頁的位置
$vPageLimit = 20 ; //頁數限制
/* 變數定義區結束 */
include('../../../../libraries/MakeExcelWithMainSub.php'); //產出 Excel
|
前面定義變數,
產出用最後一行include('../../../../libraries/MakeExcelWithMainSub.php'); //產出 Excel
以上是PHP的程式碼,不過,觀念是一樣的, |
|
回頂端 |
|
 |
wang0970
註冊時間: 2016-04-12 文章: 8
第 13 樓
|
發表於: 星期四 九月 08, 2016 11:00 am 文章主題: |
|
|
版主謝謝你無私的分享,小弟用你分享的程式測試一個DBF,所以把
aa_xls=filetostr(d:\vfp\stationery\stock.dbf)改成自己的DBF
,執行的時候出現『函數名稱遺漏了)。』這個錯誤訊息!懇請大大
幫我指正一下。(畢竟小弟已經20幾年沒碰VFP,現在功力像
小白還望見諒,謝謝!) _________________ 王希之 |
|
回頂端 |
|
 |
wang0970
註冊時間: 2016-04-12 文章: 8
第 14 樓
|
發表於: 星期四 九月 08, 2016 11:01 am 文章主題: |
|
|
版主謝謝你無私的分享,小弟用你分享的程式測試一個DBF,所以把
aa_xls=filetostr(d:\vfp\stationery\stock.dbf)改成自己的DBF
,執行的時候出現『函數名稱遺漏了)。』這個錯誤訊息!懇請大大
幫我指正一下。(畢竟小弟已經20幾年沒碰VFP,現在功力像
小白還望見諒,謝謝!) _________________ 王希之 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 15 樓
|
發表於: 星期四 九月 08, 2016 11:33 am 文章主題: |
|
|
aa_xls=filetostr(d:\vfp\stationery\stock.dbf)
還是
aa_xls=filetostr("d:\vfp\stationery\stock.dbf") _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|