AX 2009 报表替换Excel显示

报表替换Excel显示

报表还是不够灵活,不够好用。特别是当项目内容过多,显示的数值过长时候都会用##替代,而打印不出来。

而且定宽,定高,不方便调整。我们开发的辛苦,客户用的也不舒服。

双方都不爽,最后弄了个Excel,算是解决了这个问题。

先要弄个Excel模板文件,然后把数据内容逐个填充到单元格即可,客户爱拖爱调,那就是他的事了。

续上篇,调用接收参数报表类

public class ReportRun extends ObjectRun
{
    
int                         g_Year;
    PurchYearCollectTable       g_PurchYCTable;
    Array                       g_Arr;
    SysExcelApplication         excel;
    SysExcelWorkbooks           books;
    SysExcelWorkbook            book;
    SysExcelWorksheets          sheets;
    SysExcelWorksheet           sheet;
    SysExcelCells               cells;
    SysExcelCell                cell;
    SysExcelRange               columns;
    SysExcelRange               column;
    COM                         range,row;
    FileName                    fileName;
    
int                         rowNum;
    real                        pricesCount;

    
private void excelHead()
    {
      container       m_Title;
      ;
      cell 
= cells.item(1,5);

      m_Title 
= this.read(cell);

      cell.value(strfmt(conpeek (m_Title,
1),g_Year));
    }

    
private void excelTable()
    {
      PurchYearCollect                m_PurchYearC;
    
int                                 i,arrLeng,rowN,rowR;
    ;

    rowN 
= 4;

    arrLeng 
= g_Arr.lastIndex() + 1;

    
for(i = 1;i<arrLeng;i++)
    {
        m_PurchYearC 
= g_Arr.value(i);

        
if(rowN > 5)
        {
            range 
= sheet.range(strfmt("A%1:N%1",rowN-1)).comObject();
            row 
= range.EntireRow();
            row.copy();
            row.insert();
        }

        cell 
= cells.item(rowN,1);
        cell.value(m_PurchYearC.getItemName());

        cell 
= cells.item(rowN,2);
        cell.value(m_PurchYearC.getPrice(
1));

        cell 
= cells.item(rowN,3);
        cell.value(m_PurchYearC.getPrice(
2));

        cell 
= cells.item(rowN,4);
        cell.value(m_PurchYearC.getPrice(
3));

        cell 
= cells.item(rowN,5);
        cell.value(m_PurchYearC.getPrice(
4));

        cell 
= cells.item(rowN,6);
        cell.value(m_PurchYearC.getPrice(
5));

        cell 
= cells.item(rowN,7);
        cell.value(m_PurchYearC.getPrice(
6));

        cell 
= cells.item(rowN,8);
        cell.value(m_PurchYearC.getPrice(
7));

        cell 
= cells.item(rowN,9);
        cell.value(m_PurchYearC.getPrice(
8));

        cell 
= cells.item(rowN,10);
        cell.value(m_PurchYearC.getPrice(
9));

        cell 
= cells.item(rowN,11);
        cell.value(m_PurchYearC.getPrice(
10));

        cell 
= cells.item(rowN,12);
        cell.value(m_PurchYearC.getPrice(
11));

        cell 
= cells.item(rowN,13);
        cell.value(m_PurchYearC.getPrice(
12));

        rowN
++;
    }

    rowN 
+= 3;
    rowR 
= rowN + 1;

    
for(i = 1;i<arrLeng;i++)
    {
        m_PurchYearC 
= g_Arr.value(i);

        
if(rowN > rowR)
        {
            range 
= sheet.range(strfmt("A%1:M%1",rowN-1)).comObject();
            row 
= range.EntireRow();
            row.copy();
            row.insert();
        }

        cell 
= cells.item(rowN,1);
        cell.value(m_PurchYearC.getItemName());

        cell 
= cells.item(rowN,2);
        cell.value(m_PurchYearC.getRate(
1));

        cell 
= cells.item(rowN,3);
        cell.value(m_PurchYearC.getRate(
2));

        cell 
= cells.item(rowN,4);
        cell.value(m_PurchYearC.getRate(
3));

        cell 
= cells.item(rowN,5);
        cell.value(m_PurchYearC.getRate(
4));

        cell 
= cells.item(rowN,6);
        cell.value(m_PurchYearC.getRate(
5));

        cell 
= cells.item(rowN,7);
        cell.value(m_PurchYearC.getRate(
6));

        cell 
= cells.item(rowN,8);
        cell.value(m_PurchYearC.getRate(
7));

        cell 
= cells.item(rowN,9);
        cell.value(m_PurchYearC.getRate(
8));

        cell 
= cells.item(rowN,10);
        cell.value(m_PurchYearC.getRate(
9));

        cell 
= cells.item(rowN,11);
        cell.value(m_PurchYearC.getRate(
10));

        cell 
= cells.item(rowN,12);
        cell.value(m_PurchYearC.getRate(
11));

        cell 
= cells.item(rowN,13);
        cell.value(m_PurchYearC.getRate(
12));

        rowN
++;
    }

    excel.visible(
true);
    }

    Container read(SysExcelCell sysExcelCell)
    {
    container       line;
    
int             intvalue;
    real            realvalue;
    ;
    
switch (sysExcelCell.value().variantType())
    {
        
case COMVariantType::VT_EMPTY:
            line 
+= 0;
            
break;

        
case COMVariantType::VT_I1:
            line 
+= sysExcelCell.value().char();
            
break;

        
case COMVariantType::VT_I2:
            line 
+= sysExcelCell.value().short();
            
break;

        
case COMVariantType::VT_I4:
            intValue 
= sysExcelCell.value().int();
            
if (intValue == 0)
            {
                intValue 
= sysExcelCell.value().long();
            }
            line 
+= intValue;
            
break;

        
case COMVariantType::VT_UI1:
            line 
+= sysExcelCell.value().byte();
            
break;

        
case COMVariantType::VT_UI2:
            line 
+= sysExcelCell.value().uShort();
            
break;

        
case COMVariantType::VT_UI4:
            intValue 
= sysExceLCell.value().uInt();
            
if (intValue == 0)
            {
                intValue 
= sysExcelCell.value().uLong();
            }
            line 
+= intValue;
            
break;

        
case COMVariantType::VT_R4 :
            realValue 
= sysExcelCell.value().float();
            line 
+= realValue;
            
break;

        
case COMVariantType::VT_R8 :
            realValue 
= sysExcelCell.value().double();
            line 
+= realValue;
            
break;

        
case COMVariantType::VT_DECIMAL :
            realValue 
= sysExcelCell.value().decimal();
            line 
+= realValue;
            
break;

        
case COMVariantType::VT_BSTR :
            line 
+= SysExcelCell.value().bstr();
            
break;
        
default:
            
throw error(strfmt("@SYS26908", sysExcelCell.value().variantType()));
    }

    
return  line;
    }

    
private void excelImport()
    {
    FilenameOpen                m_file;
    VendParameters              m_parameter;
    ;

    select firstonly m_parameter;
    m_file 
= m_parameter.PurchYearPrintModel;

    excel 
= SysExcelApplication::construct();

    books 
= excel.workbooks();

    
if(!books.open(m_file))
        
return;

    
if(!books.count())
    {
        info(
"no content!");
        
return;
    }

    book 
= books.item(1);
    sheets 
= book.worksheets();
    sheet 
= sheets.itemFromNum(1);
    cells 
= sheet.cells();

    }

    
private void PriceRedution()
    {
    PurchLineView           m_PurchLineView;
    utcDateTime                 m_BeginTime,m_EndTime,m_BeginYear;
    Date                        m_BeginDate,m_EndDate;
    
int                         i,r;
    real                        downPrice,total,lastPrice;
    str                         m_ItemName;
    MainTypeTable           m_MainType;
    PurchYearCollect        m_PurchYear;
    PurchLine                   m_PurchLine,t_PurchLine;
    real                        tmpPrice,tmpQty;
    ;

    g_Arr 
= new Array(Types::Class);

    r 
= 1;

    m_BeginYear 
= DateTimeUtil::newDateTime(mkdate(1,1,g_Year),0);

    
while select m_MainType
    {
        m_PurchYear 
= new PurchYearCollect();

        m_PurchYear.setItemName(m_MainType.Name);

        m_BeginDate 
= mkdate(1,1,g_Year);
        m_EndDate 
= mkdate(31,1,g_Year);

        
for(i = 1;i<13;i++)
        {
            m_BeginTime 
= DateTimeUtil::newDateTime(m_BeginDate,0);
            m_EndTime 
= DateTimeUtil::newDateTime(m_EndDate,3600*24-1);

            total 
= 0;
            downPrice 
= 0;

            
//while select sum(PurchQty) from m_PurchLineView
            
//group by m_PurchLineView.MainTypeId
            
//where m_PurchLineView.createdDateTime1 > m_BeginTime && m_PurchLineView.createdDateTime1 < m_EndTime
            
//&& m_PurchLineView.MainTypeId == m_MainType.MainTypeId
            
//{
                while select m_PurchLineView
                
where m_PurchLineView.createdDateTime > m_BeginTime && m_PurchLineView.createdDateTime < m_EndTime
                
&& m_PurchLineView.MainTypeId == m_MainType.MainTypeId
                {
                    lastPrice 
= 0;

                    
while select firstonly t_PurchLine order by t_PurchLine.createdDateTime desc where t_PurchLine.ItemId == m_PurchLineView.ItemId
                    
&& t_PurchLine.createdDateTime < m_BeginYear
                    {
                        lastPrice 
= t_PurchLine.PurchPrice;
                    }

                    
if(!t_PurchLine)
                    {
                        
while select firstonly t_PurchLine order by t_PurchLine.createdDateTime asc
                        
where t_PurchLine.ItemId == m_PurchLineView.ItemId
                        {
                            lastPrice 
= t_PurchLine.PurchPrice;
                        }
                    }

                    tmpPrice 
= m_PurchLineView.PurchPrice;
                    tmpQty 
= m_PurchLineView.PurchQty;

                    downPrice 
+= (tmpPrice - lastPrice) * tmpQty;
                    total 
+= tmpPrice * tmpQty;
                }
            
//}

            m_BeginDate 
= nextmth(m_BeginDate);
            m_EndDate 
= endmth(nextmth(m_EndDate));

            m_PurchYear.setPrice(i,downPrice);
            m_PurchYear.setTotal(i,total);
        }

        g_Arr.value(r,m_PurchYear);

        
++r;
     }
    }

    
public boolean fetch()
    {
    ;
    
this.excelImport();
    
this.excelHead();
    
this.excelTable();

    
throw "";  //出处抛出空异常,报表最后就不显示

    
return false;
    }

    
public void init()
    {
     PurYearClass        m_PurYear;
    ;

    super();

    m_PurYear 
= element.args().caller();

    g_Year 
= m_PurYear.getYear();

    Title.text(strfmt(
"@SYS1303",g_Year));

      
this.PriceRedution();  //技术月降价汇总的方法
    }
}

 

 

posted @ 2011-08-15 18:40  Kurodo  阅读(436)  评论(0编辑  收藏  举报