Farseer

MRPII学习中......

导航

2006年10月24日 #

Excel数据导入Axapta中

Axapta提供了一些类用于操作Excel,这些类实际上是对Excel.Application这个COM对象的封装,由于Axapta不支持Unicode,对于含有汉字的Excel文件,可就惨了下列代码,如果Excel中是汉字的话,只能输出一半.

void GetDataFromExcel()
{
      SysExcelApplication app;
      SysExcelWorkSheets wss;
      SysExcelWorkSheet ws;
      SysExcelWorkbooks      wbs;
      SysExcelWorkBook       wb;
      Container c;
      str strValue;
      
int rowLine;
      
int colLine;
      ;

      app 
= SysExcelApplication::construct();
      wbs 
= app.workbooks();
      wbs.open(strFilePath,
0,true);
      wb 
= wbs.item(1);
      wss 
= wb.worksheets();
      ws  
= wss.itemFromName("ItemData");

      print ws.cells().item(
1,1).value().bStr();

      app.quit();
      pause;
}

不想花力气在COM和Excel文件之间做转换,想到Excel其实就是数据库,于是通过ODBCConnection来读取数据也不失为一个好办法.
static void readDataFromExcel(Args _args)
{
    LoginProperty lp;
    ODBCConnection od;
    Statement st;
    ResultSet rs;
    ;
    lp 
= new LoginProperty();
    lp.setDSN(
"ItemData");

    od 
= new ODBCConnection(lp);
    st 
= od.createStatement();
    rs  
= st.executeQuery("Select * from [ItemData$]");
    
while(rs.next())
    
{
        print rs.getString(
1);
    }

     pause;

}
这样就可以全读出来了.

posted @ 2006-10-24 19:01 佛西亚 阅读(284) 评论(0) 编辑

Container的使用

在Axapta中有一个基础类型Container,在某些场合下确实比较好用,axapta现有系统中用的也比较多,比如Runbase的pack()和unpack()方法就是用Container结合宏来实现的.
container可以看作是无类型的动态增长的数组,功能基本上等效于C#中的ArrayList.只不过container不能存放对象(Table对象还是可以存的),另外container可以作为数据库字段类型,在数据库中转化成img类型,可以看出container把数据序列化了.
另外由于Container存放的元素可以是Container,所以可以实现类似于二维数组的功能.今天遇到一个需求,做一张客户(供应商)对帐单,由于国内的财务需要按月汇总,而用户输入的查询时间可能是跨月的,并且不一定是从一号开始到月底结束的,比如用户输入如下时间段做查询 
2006-03-13~~~2006-05-27
这样按照国内的财务需求,需要分解成如下的时间段:
1.2006-03-13~~~2006-03-31
2.2006-04-01~~~2006-04-40
3.2006-05-01~~~2006-05-27
分别统计上述三段时间的交易信息并分别汇总,这样就要求把任意一段时间,按月分解,当然这个有很多种做法,不过感觉用container实现这个小功能还是挺方便的,代码如下:
static Container GetDatePeriod(TransDate fromDate,TransDate toDate)
{
    Container cPeriod,cPeriodForOneMonth;
    
int i;
    
int day;
    TransDate transDate;
    
int gYearPart,gMonthPart;

    
//得到某一个月的天数
    int GetDay(int yearPart,int monthPart)
    
{
         
switch(monthPart)
        
{
            
case 1:
            
case 3:
            
case 5:
            
case 7:
            
case 8:
            
case 10:
            
case 12:
            
{
                day 
= 31;
                
break;
            }

            
case 4:
            
case 6:
            
case 9:
            
case 11:
            
{
                day 
= 30;
                
break;
            }

            
case 2:
            
{
               
if(!(yearPart mod 4))
                    day 
= 29;
                
else
                    day 
= 28;
                
break;
            }

            
default:
                
throw error("Error input month!");
                
break;
        }

    }

        
//得到一个完整月的开始和结束日期
    Container GetPeriodForOneMonth(int yearPart,int monthPart)
    
{
        ;
        GetDay(yearPart,monthPart);
        
return [str2Date(int2str(yearPart)+"-"+int2Str(monthPart)+"-01",321),
                str2Date(int2str(yearPart)
+"-"+int2Str(monthPart)+"-"+int2Str(day),321)];
    }
 ;



        
//插入开始和结束日期中间完整的月
    for(i = mthofyr(fromDate)+1;i<mthofyr(toDate);i++)
    
{
        cPeriod 
= conins(cPeriod,conlen(cPeriod)+1,GetPeriodForOneMonth(year(toDate),i));
    }

    
//插入开始月
    GetDay(year(fromDate),mthofYr(fromDate));
    gYearPart 
= year(fromDate);
    gMonthPart 
= mthofYr(fromDate);

    transDate 
= str2Date(int2Str(gYearPart)+"-"+int2Str(gMonthPart)+"-"+int2Str(day),321);
    cPeriod 
= conins(cPeriod,1,[fromDate,transDate]);

    
//插入结束月
    if(mthofYr(fromDate)!=mthofYr(toDate))
    
{
        gYearPart 
= year(toDate);
        gMonthPart 
= mthofYr(toDate);

        transDate 
= str2Date(int2Str(gYearPart)+"-"+int2Str(gMonthPart)+"-01",321);
        cPeriod 
= conins(cPeriod,conlen(cPeriod)+1,[transDate,toDate]);
    }

    
return cPeriod;

}

调用的代码如下:
static void Main(Args arg)
{
    Container c,cPeriod;
    TransDate fromDate;
    TransDate toDate;
    
int i;
    ;
    fromDate 
=  str2Date("2006-02-06",321);
    toDate 
= str2Date("2006-09-30",321);
    c 
= Class2::GetDatePeriod(fromDate,toDate);
    
for(i = 1 ;i<=conlen(c);i++)
    
{
        cPeriod 
= conpeek(c,i);
        fromDate 
= conpeek(cPeriod,1);
        toDate 
= conpeek(cPeriod,2);
        print date2StrXpp(fromDate)
+"---"+Date2StrXpp(toDate);
    }

    pause;

}
当然由于对帐表要统计年结余额,所以用户输入的查询日期一般不允许跨年度,所以这个程序也就没有处理跨年度的情况了.

posted @ 2006-10-24 17:44 佛西亚 阅读(317) 评论(0) 编辑