发新话题
打印

用VC开发进销存是我的一大错误吗?

//库存数量,金额,库存帐本

bool CFormJHRK:utKC()
{
//------------在库存中增加相应的库存数量,和金额(库存总价)----------------
  double m_dOldCount=0;//库存余量
  double m_dOldMoney=0;//库存金额
  double m_dTotalOldCount=0;//总库存余量
  double m_dTotalOldMoney=0;//总库存金额
  double m_dCBPrice=0;//成本均价
  double m_dprice=0;//
  double m_dmoney=0;//

   if(m_list.m_iDataColumn[10]==0)//无折扣
        {
        m_dprice=m_dPrice;
                m_dmoney=m_dMoney;
         }
        else//有折扣
        {
        m_dprice=m_dZKPrice;
                m_dmoney=m_dZKMoney;
        }

//库存帐本
  sql.Format("select * from 库存 where 商品ID=%d and 仓库ID=%d",m_lSPID,m_lCKID);
    if(m_DataRun.CheckSQLResult1(sql))//判断库存是否有这种商品
          {//如果有就更新记录
//更新--数量,价格,金额(库存总价)
                 m_DataRun.get1("数量",m_dOldCount);
         m_DataRun.get1("金额",m_dOldMoney);
         m_dOldMoney+=m_dmoney;
         m_dOldCount+=m_dNumber;
         m_dCBPrice=m_dOldMoney/m_dOldCount;
         m_DataRun.put1("数量",m_dOldCount);
         m_DataRun.put1("成本均价",m_dCBPrice);
         m_DataRun.put1("金额",m_dOldMoney);
         if(!m_DataRun.up1())
                  {
            m_DataRun.RollbackTrans();//回滚事务
            MessageBox("数据录入出错!","警告",MB_ICONSTOP);
            return 0;
                  }

           }
        else//如果没有就插入记录
          {
         m_dOldMoney=m_dmoney;
         m_dOldCount=m_dNumber;
         m_dCBPrice=m_dOldMoney/m_dOldCount;
         m_DataRun.add1("库存");
         m_DataRun.put1("商品ID",m_lSPID);
         m_DataRun.put1("仓库ID",m_lCKID);
         m_DataRun.put1("数量",m_dOldCount);
         m_DataRun.put1("成本均价",m_dCBPrice);
         m_DataRun.put1("金额",m_dOldMoney);
          if(!m_DataRun.up1())
                  {
            m_DataRun.RollbackTrans();//回滚事务
            MessageBox("数据录入出错!","警告",MB_ICONSTOP);
            return 0;
                  }
           }
//库存帐本
       m_DataRun.add1("库存帐本");
       m_DataRun.put1("引索",m_lIndex);
       m_DataRun.put1("单据类型",m_Kinds);
       m_DataRun.put1("商品ID",m_lSPID);
       m_DataRun.put1("仓库ID",m_lCKID);
           m_DataRun.put1("日期",m_Date);
       m_DataRun.put1("入库量",m_dNumber);
       m_DataRun.put1("价格",m_dprice);
       m_DataRun.put1("库存余量",m_dOldCount);
       m_DataRun.put1("库存金额",m_dOldMoney);

       sql.Format("select sum(数量) as 总库存余量,sum(金额) as 总库存金额 from 库存 where 商品ID=%d",m_lSPID);
       if(m_DataRun.CheckSQLResult2(sql))
           {
         m_DataRun.get2("总库存余量",m_dTotalOldCount);
         m_DataRun.get2("总库存金额",m_dTotalOldMoney);
           }

       m_DataRun.put1("总库存余量",m_dTotalOldCount);
       m_DataRun.put1("总库存金额",m_dTotalOldMoney);

        if(!m_DataRun.up1())
                  {
            m_DataRun.RollbackTrans();//回滚事务
            MessageBox("数据录入出错!","警告",MB_ICONSTOP);
            return 0;
                  }
                else
                        return 1;
//-------------------库存增加结束-------------------------

}

TOP

//添加往来单位成交价

bool CFormJHRK:utDWPrice()
{
//--在往来单位交价中更新相应的记录包括:相应商品的价格,折扣-
        double m_dprice=0;
     m_dprice=m_dPrice;

       sql.Format("select * from 单位成交价 where 商品ID=%d and \
        单位ID=%d",m_lSPID,m_lGYSID);
         if(m_DataRun.CheckSQLResult1(sql))//判断是否有记录
                 {//如果有就更新记录
           m_DataRun.put1("价格",m_dprice);
           m_DataRun.put1("折扣",m_dZK);
                   if(!m_DataRun.up1())
                   {
            m_DataRun.RollbackTrans();//回滚事务
            MessageBox("数据录入出错!","警告",MB_ICONSTOP);
            return 0;
                   }
                   else
                        return 1;
                 }
             else//如果没有就插入记录
                 {
            m_DataRun.add1("单位成交价");
            m_DataRun.put1("商品ID",m_lSPID);
            m_DataRun.put1("单位ID",m_lGYSID);
                    m_DataRun.put1("价格",m_dprice);
            m_DataRun.put1("折扣",m_dZK);
            if(!m_DataRun.up1())
                        {
              m_DataRun.RollbackTrans();//回滚事务
              MessageBox("数据录入出错!","警告",MB_ICONSTOP);
              return 0;
                        }
                   else
                        return 1;
                 }
//---------------在供应商成交价中更新相应的记录结束-----------------------
}

TOP

//商品成交价

bool CFormJHRK:utGoodPrice()
{
             double m_dprice=0;
         m_dprice=m_dPrice;


//---------------商品价格中更新相应的记录(包括:最后一次进价,最后一次销价)
sql.Format("select * from 商品成交价 where 商品ID=%d",m_lSPID);
        if(m_DataRun.CheckSQLResult1(sql))//判断是否有记录
                {//如果有就更新记录
           m_DataRun.put1("最进一次进价",m_dprice);
           m_DataRun.put1("折扣",m_dZK);
            if(!m_DataRun.up1())
                        {
              m_DataRun.RollbackTrans();//回滚事务
              MessageBox("数据录入出错!","警告",MB_ICONSTOP);
              return 0;
                        }
                        else
                           return 1;
                }
                else
                {
            m_DataRun.add1("商品成交价");
            m_DataRun.put1("商品ID",m_lSPID);
            m_DataRun.put1("最进一次进价",m_dprice);
             if(!m_DataRun.up1())
                         {
              m_DataRun.RollbackTrans();//回滚事务
              MessageBox("数据录入出错!","警告",MB_ICONSTOP);
              return 0;
                         }
                 else
                           return 1;
                }
}

TOP

添加单据类容!

bool CFormJHRK:utContent()
{
   
   int n=m_list.GetItemCount();
        for(int i=0;i<n;i++)
        {
      if(m_list.GetItemText(i,0)!="")//判断次行是否为空--假如为空跳出下面的循环
          {   

         for(int ii=0;ii<m_list.m_nNumberOfCols;ii++)
                 {
            int m_iSubColumn=0;
            m_iSubColumn=m_list.m_iColumn[ii];
            switch(m_iSubColumn)
                        {
              case 0://商品编码
                                 // m_list.get(i,ii,m_SPID);
                  break;

                          
                  case 6://数量
                         m_list.get(i,ii,m_dNumber);
                     break;

              case 7://单价
                                    m_list.get(i,ii,m_dPrice);
                                break;

             case 8://金额
                    m_list.get(i,ii,m_dMoney);
                                break;

                      case 9://折扣%
                   m_list.get(i,ii,m_dZK);
                               break;

                      case 10://折后单价
                    m_list.get(i,ii,m_dZKPrice);
                                break;

                      case 11://折后金额
                    m_list.get(i,ii,m_dZKMoney);
                    break;

                      case 12://税率%
                    m_list.get(i,ii,m_dTaxrate);
                                break;

              case 13://税额
                    m_list.get(i,ii,m_dTax);
                          break;

              case 14://含税单价
                    m_list.get(i,ii,m_dTaxPrice);
                          break;

                      case 15://含税金额
                    m_list.get(i,ii,m_dTaxMoney);
                          break;

                      case 16://备注
                   m_list.get(i,ii,m_Remark);
                          break;

                        }//switch(m_iSubColumn)
                 }//for(int ii=0;ii<m_list.m_nNumberOfCols;ii++)

      m_lSPID=m_list.GetItemData(i);
          if(m_lSPID<1)
          {
                  MessageBox("无效商品");
          return 0;
          }

//最后统计是按含税单价,含税金额,折后单价统计的
     if(m_dZK==1)//折扣为1
     {
       m_dZKPrice=m_dPrice;//单价等于折后单价
       m_dZKMoney=m_dMoney;//金额等于折后金额
         }

     if(m_dTaxrate==0)//税率为零
         {
         m_dTaxPrice=m_dZKPrice;//折后单价等于含税单价
         m_dTaxMoney=m_dZKMoney;//折后金额等于含税金额
         }

//添加单据
     m_DataRun.add1("单据");
     m_DataRun.put1("引索",m_lIndex);
     m_DataRun.put1("单据类型",m_Kinds);
     m_DataRun.put1("单据编号",m_DJID);
     m_DataRun.put1("日期",m_Date);
     m_DataRun.put1("商品ID",m_lSPID);
     m_DataRun.put1("数量",m_dNumber);
     m_DataRun.put1("单价",m_dPrice);
     m_DataRun.put1("金额",m_dMoney);
     m_DataRun.put1("折扣",m_dZK);
     m_DataRun.put1("折后单价",m_dZKPrice);
         m_DataRun.put1("折后金额",m_dZKMoney);
     m_DataRun.put1("税率",m_dTaxrate);
     m_DataRun.put1("税额",m_dTax);
     m_DataRun.put1("含税单价",m_dTaxPrice);
     m_DataRun.put1("含税金额",m_dTaxMoney);
     m_DataRun.put1("备注",m_Remark2);

         if(!m_DataRun.up1())
                 {
            m_DataRun.RollbackTrans();//回滚事务
            MessageBox("数据录入出错!","警告",MB_ICONSTOP);
            return 0;
                 }

         if(!PutKC())//添加库存,库存帐本
          return 0;

         if(!PutDWPrice())//添加往来单位成交价
          return 0;

         if(!PutGoodPrice())//添加商品成交价
          return 0;

    }//if(m_list.GetItemText(i,0)!="")
  }//for(int i=0;i<n;i++)
//------------------商品价格中更新结束----------------------

return 1;
}

TOP

做什么事情用什么工具这还用说。难道你吃饭要用斧头?

TOP

不知道delphi对操作数据库是如何实现的!

要比我上面的代码简单吗?
哪个老大能用delphi实现上面代码,也让小第见识一下delphi开发数据库的威力!

TOP

引用:
原帖由 x_uy_u_n 于 2007-12-3 11:42 发表
很好,很强大啊,你的竟然这么方便,为什么要萌生换DELPHI的念头呢?忽悠大家?
我没用过DELPHI,我估计DELPHI应该比我的代码要简单。所以我想转DELPHI,害!那我的那十几万行代码。。。。

TOP

我给你演示一下用orm时候的代码。
public class 单据{
           public string 客户单位名称{get;set;}//为方便,get,set的实现就不写了,都可以自动生成的。
public string 合计价格{get;set;}
public Ilist<单据项> 单据明细{get;set;}
}
public class 单据项{
public string 品种{get;set;}
public decimal 价格{get;set;}
}
public class 单据管理界面{
   public void 保存单据(单据 invoice1){
       invoice1.客户单位名称=“某公司";
       单据项 item1=new item();
item1.品种=”鼠标";
item1.价格=20;
单据项 item2=new item();
item2.品种="键盘";
item2.价格=23;
invoice1.单据明细.Add(item1);
invoice1.单据明细.Add(item2);
orm.Save(invoice1);
        
}
}

}
大致的样子就是这样的。够简单吧?
本帖最近评分记录
  • w1984721 活力 +5 原创内容 2007-12-3 17:52

TOP

可怕!可怕!

TOP

你的代码风格,很有问题。代码的规模无法控制。业务逻辑和数据操作混在一起。结构极其丑陋。
我想你的程序肯定经常出问题的时候,找不到问题出在哪里。然后你会大发脾气,埋怨微软的系统不稳定,到处都是bug。。。。。。
代码的规模,应该小,依赖应该简单。小而简单的代码,才能够测试,能够测试的代码,才会稳定。编程的诀窍,就是把复杂的逻辑变得很简单。复杂的设计,简单的实现。具体说来,有这样几个问题。
第一大问题就是,单个方法中的代码行数过多。这是很大的问题。不合格的程序员才这样写代码。一个库存有多个属性,这多个属性放到一个方法无可厚非,但是在一个方法里面又是多重循环又是switch case就不可容忍了。不要说别人太笨,看不懂你的代码,代码烂的标志,就是不容易看懂。不仅别人看不懂,很有可能自己都看不懂。特别是写过了以后。
很高兴看到你记得在代码里加上注释。但不要以为加上注释就是好的代码了。好的代码,就是没有注释,也能够看懂。代码本身就是文档。
少,应该把它拆成多个方法,每个方法只包含一层逻辑控制。并且每个方法都不访问类中的成员变量,把需要访问的成员变量,放到方法参数里面,象这个样子。
public class BusinessLogicManager{
private Invoice mInvoice;
public static bool CheckInvoice(Invoice myInvoice){
......(不超过15行代码)
}
}
这里面的CheckInvoice(Invoice myInvoice)就是一个独立的部分。它可以单独拿出来进行测试。
你可以另外写一段程序叫做TestCheckInvoice来测试这个方法。
这就是最基础的质量控制方法。任何语言都可以用。
从高级语言java,c#到中级语言c++/delphi以及低级语言c和汇编都可以。呵呵,这种划分方法似乎不错。肯定有人不同意了。。。。
回头肯定有人抬出python和ruby,说是超高级语言。。。。
控制代码规模啊。。。。每次提到这个问题,我都会痛心疾首。我曾经维护过一个方法上万行的代码,不是人干的活,改任何一行,都可能引起程序崩溃。
能够把代码写到每个方法不超过15行,就是一种基本功,也是一种职业素质。(当然,每个方法都要独立。如果一个类有10000个方法,每次检查一个方法的时候,都要考虑类里面的其他方法是否正确,那根没有拆分方法差不多。)
15行的代码,任何人都能看懂。这样就可以维护了。这是最基本的。象一些水平比较高的开源项目,每个方法都只有不到10行。
这好像叫什么方法对象,意思大概就是,每个方法都是一个独立的对象。我没有看过那本书。
呵呵,很受打击吧。不过,我可没有说一句假话哦。。。。。
隔离错误的影响范围,就是封装。oo,不仅仅封装,继承多态三个词说说而已。

[ 本帖最后由 yongweisun 于 2007-12-3 18:41 编辑 ]
本帖最近评分记录
  • w1984721 活力 +5 精品文章 2007-12-3 19:43

TOP

发新话题