  | 
				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 文章: 4252 來自: 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 文章: 4252 來自: 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 文章: 4252 來自: 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. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |