VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

報表輸出全丟Excel從來沒用過VFP報表檔的想法!!
前往頁面 1, 2  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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 樓

發表發表於: 星期四 五月 14, 2015 9:55 am    文章主題: 引言回覆

網友對"人工介入"做了最好的示範.

最少要像這個物件一樣.做到自動生成合計SQL命令.
http://vfp.sunyear.com.tw/viewtopic.php?t=6408&highlight=GRIDFOOTER

但這也只是達到基本的合計而已,
對於有條件合計還是要人工介入寫合計命令.

所以完整的報表產生器可以賣錢.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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 樓

發表發表於: 星期日 七月 19, 2015 12:33 pm    文章主題: 引言回覆

比如這家 就是這麼做

http://www.taoreport.com/excelreport/text/tbjc/index.html

_________________
ezPos收銀機 簡單好用低成本 http://www.ezpos.info
全新美觀的POS收銀機.POS軟硬體耗材.
軟體客制化.網站規劃....能賺錢的都可以找我

http://www.twelife.com 台灣生活網
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2  下一頁
1頁(共2頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作