form->action->po

博客主要围绕Hibernate的使用展开讨论。涉及在更新数据库时,字段为空值的处理问题,如手工拼SQL未判断空值会出错,可先判空再填值,也可用封装类传输参数。还介绍了Hibernate更新记录的代码模式及缓存机制等。

Sarah--Conquering 说:
  日本一家公司6日对外宣布,该公司已开发研制出一款新型DVD光盘,制成该光盘的主要材料是从由玉米中提炼出的淀粉合成的塑料。虽然还未确定何时投入批量生产并上市销售,但该产品在生产时所消耗的石油以及排出的二氧化碳的量均少于同类产品,因此公司将打出“保护环境的绿色DVD”的宣传口号,向各相关企业进行推广。   

  据日本共同社报道,制作该DVD光盘的主要成分为从植物原料中提取并进行合成的塑料。此项技术已逐渐在制造电脑的主机箱等领域得到应用,但因其不耐高温而很难用于DVD光盘的制作。   

  日本这家公司在此次成功研制出了一种能在室内使用、且最高能耐55度的新型材料。虽然这种材料成本价相当于目前市场上同类产品的约3倍,对于产品的推广不利,但该公司则自信地表示:“该产品可以应用于CD及新一代的DVD。”

NovRain--Sth In the Way 说:
玉米提炼的啊,应该能吃吧
Sarah--Conquering 说:
dvd不想看了,仍到锅里,煮助吃掉,呵呵……
NovRain--Sth In the Way 说:
对啊,扔到烤箱里烤着吃也很香的
Sarah--Conquering 说:
ft
NovRain--Sth In the Way 说:
有个问题啊,hibernate不是有自动更新马,如果那个字段为空他更新到db吗
Sarah--Conquering 说:
你可以设置不让更新到null
NovRain--Sth In the Way 说:
这儿的persistance是手工拼sql,要命的是没有判断过空值
Sarah--Conquering 说:
会出错的
Sarah--Conquering 说:
为什么不用prepared statement?
NovRain--Sth In the Way 说:
天晓得,preparedStat能判断空值吗
Sarah--Conquering 说:
先判空,再填值
NovRain--Sth In the Way 说:
为空的话怎么填
Sarah--Conquering 说:
不填
NovRain--Sth In the Way 说:
那不是跟手工一样的
NovRain--Sth In the Way 说:
   sb.append("update tnp_trackable ");
   sb.append("set tnp_group_id=");
   sb.append(group_id);

   sb.append(", carr_type_id=");
   sb.append(carr_type_id);
   sb.append(", auto_shutdown_hour=");
   sb.append(auto_shutdown_hour);
   sb.append(", phone_model_id=");
   sb.append(DbUtil.toValue(phone_model_id));

Sarah--Conquering 说:
这叫用hibernate啊?
NovRain--Sth In the Way 说:
不是阿,没有用
Sarah--Conquering 说:
那就
先判空,再填值
NovRain--Sth In the Way 说:
if(...!=null){
NovRain--Sth In the Way 说:
再append?
Sarah--Conquering 说:
恩,不然执行sql会报错
NovRain--Sth In the Way 说:
有没有什么更好的办法了,一劳永逸的
NovRain--Sth In the Way 说:
值都是基本型,还没法判空,烤
Sarah--Conquering 说:
用hibernate
Sarah--Conquering 说:
基本型的好啊
Sarah--Conquering 说:
给预设值
NovRain--Sth In the Way 说:
谁知道它输入0的时候是想存0还是不存
Sarah--Conquering 说:
那就-1
NovRain--Sth In the Way 说:
谁知道它输入-1的时候是想存0还是不存

NovRain--Sth In the Way 说:
谁知道它输入-1的时候是想存-1还是不存

Sarah--Conquering 说:
那就if(...!=null){

NovRain--Sth In the Way 说:
呵呵,总之这个样子是没办法了,框架,我要你
Sarah--Conquering 说:
其实,最好还是用封装类传输参数
Sarah--Conquering 说:
便于判空
还是缺省值
Sarah--Conquering 说:
或者,至少用String类型传递参数
Sarah--Conquering 说:
/**
   * update a PO
   * @param templ
   * @throws HibernateException
   * @throws java.lang.Exception
   */
  public void updateTemplate(Template templ) throws HibernateException,
      Exception {
    Transaction transaction = null;
    Session session = sessionFactory.openSession();
    try {
      transaction = session.beginTransaction();
      session.update(templ);
      transaction.commit(
Sarah--Conquering 说:
}
    catch (HibernateException he) {
      if (transaction != null) {
        transaction.rollback();
      }
      throw he;
    }
    finally {
      session.close();
    }

  }
NovRain--Sth In the Way 说:
恩,以前怎么做的,忘了
Sarah--Conquering 说:
hibernate什么都不要你做
Sarah--Conquering 说:
这是我写的一段更新一条记录的代码,是不是很爽?
NovRain--Sth In the Way 说:
嫉妒阿
Sarah--Conquering 说:
你们的系统效率估计很高,所以不太可能用Hibernate
NovRain--Sth In the Way 说:
如果只要更新几个字段怎么办
Sarah--Conquering 说:
一定要拼的话,没办法了
NovRain--Sth In the Way 说:
hibernate岂不是有问题
Sarah--Conquering 说:
什么问题
NovRain--Sth In the Way 说:
为了更新两个字段更新所有字段,可能有50个
Sarah--Conquering 说:
不会的,hibernate最后会转化成sql语句执行必要的更新,它知道那些要变那些不要变
NovRain--Sth In the Way 说:
那就是说他更新前必须已经查出来了
Sarah--Conquering 说:
他有非常优秀的缓存机制
NovRain--Sth In the Way 说:
不管怎么样他也要查阿
Sarah--Conquering 说:
一个被更新的对象必须处于一个Hibernate的自治的session中
Sarah--Conquering 说:
所以会有一个固定的代码模式
Sarah--Conquering 说:
 Transaction transaction = null;
    Session session = sessionFactory.openSession();
    try {
      transaction = session.beginTransaction();
      session.save(templ);
      transaction.commit();
    }
    catch (HibernateException he) {
      if (transaction != null) {
        transaction.rollback();
      }
      throw he;
    }
    finally {
      session.close();
    }
Sarah--Conquering 说:
 Transaction transaction = null;
    Session session = sessionFactory.openSession();
    try {
      transaction = session.beginTransaction();
      ...
      transaction.commit();
    }
    catch (HibernateException he) {
      if (transaction != null) {
        transaction.rollback();
      }
      throw he;
    }
    finally {
      session.close();
    }
NovRain--Sth In the Way 说:
这个templ是已经查出来的吧
Sarah--Conquering 说:
在transaction.commit();
时才会去查
Sarah--Conquering 说:
然后更新,建议你课后了解了解hibernate的机制
NovRain--Sth In the Way 说:
恩,不过大概应该是这样了吧,他要能判断重复就得先查
Sarah--Conquering 说:
hinernate数据库,不允许重复,必须确定主键
NovRain--Sth In the Way 说:
这样他才能查到,呵呵
Sarah--Conquering 说:
我想还是有必要继续翻译hibernateInAction
NovRain--Sth In the Way 说:
恩,挺有收获,谢谢smart bear
Sarah--Conquering 说:
hehe SB

<?xml version="1.0" encoding="gbk"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="classpath:/nc/ui/fdcpr/uipub/view/config/ServiceCenterBillManage.xml" /> <bean id="billType" class="java.lang.String"> <constructor-arg value="H33K" /> </bean> <bean id="headVoClassName" class="java.lang.String"> <constructor-arg value="nc.vo.fdcprcm.feelist.CmFeeListVO" /> </bean> <bean id="mnyNumFldInfoClassName" class="java.lang.String"> <constructor-arg value="nc.vo.fdcprcm.feelist.FeeListMnyNumFldInfo" /> </bean> <bean id="bodyVoClassName" class="java.util.ArrayList"> <constructor-arg> <list> </list> </constructor-arg> </bean> <bean id="aggVoName" class="java.lang.String"> <constructor-arg value="nc.vo.fdcprcm.feelist.AggCmFeeListVO" /> </bean> <!-- 自定义项配置,目前不区分卡片显示还是列表显示,减小重复配置 --> <bean id="userdefQueryParam" class="java.util.ArrayList"> <constructor-arg> <list> <bean class="nc.ui.uif2.editor.UserdefQueryParam"> <property name="mdfullname" value="fdcprcm.CmFeeListVO" /> <property name="pos" value="0" /> <property name="prefix" value="vdef" /> </bean> </list> </constructor-arg> </bean> <!-- 数量金额精度换算字段配置 --> <!-- 查询条件初始化 --> <bean id="qryCondInitializer" class="nc.ui.fdcprcm.feelist.query.FeeListQueryConditionInitializer" > <property name="serviceCenterField" ref="serviceCenterField"/> </bean> <!-- ? --> <bean id="pageQueryService" class="nc.ui.fdcpr.uipub.pagination.JZFDCUIPageQueryService"> <property name="allPagePkQueryServiceMethod" value="nc.itf.fdcprcm.feelist.IFeeCalculation.queryPKs"></property> <property name="dataOfPksQueryServiceMethod" value="nc.itf.fdcprcm.feelist.IFeeCalculation.queryBillByPK"></property> <property name="headVoClassName" ref="headVoClassName"></property> <property name="aggVoName" ref="aggVoName"></property> </bean> <!-- 费用计算--> <bean id="feeCalcAction" class="nc.ui.fdcprcm.feelist.action.FeeCalculateAction"> <property name="dialog" ref="feeCalcDlg" /> <property name="paginationModel" ref="paginationModel" /> <property name="context" ref="context" /> </bean> <!-- 修改--> <bean id="editAction" class="nc.ui.pubapp.uif2app.actions.EditAction"> <property name="model" ref="manageAppModel" /> <property name="interceptor" ref="showCardInterceptor" /> </bean> <!-- 生成账单按钮 --> <bean id="generateBillsAction" class="nc.ui.fdcprcm.feelist.action.GenerateBillsAction"> <property name="model" ref="manageAppModel" /> <property name="billForm" ref="billFormEditor" /> </bean> <!-- 生成应收单按钮 --> <bean id="generateArapRecBillAction" class="nc.ui.fdcprcm.feelist.action.GenerateArapRecBillAction"> <property name="model" ref="manageAppModel" /> <property name="billForm" ref="billFormEditor" /> </bean> <bean id="feeCalcDlg" class="nc.ui.fdcprcm.feelist.dlg.FeeCalcChooseDlg"> <constructor-arg ref="container" /> <constructor-arg ref="context" /> </bean> <!-- 列表视图 --> <bean id="listView" class="nc.ui.fdcpr.uipub.view.JZFDCShowUpableBillListView" init-method="initUI"> <property name="paginationBar" ref="paginationBar" /> <property name="model" ref="manageAppModel" /> <property name="templateContainer" ref="templateContainer" /> <property name="multiSelectionMode" value="1" /> <property name="showTotalLine" value="true" /> <!-- 列表自定义项处理 --> <property name="userdefitemListPreparator"> <bean class="nc.ui.fdcpr.uipub.view.prepare.JZFDCCompositeBillListDataPrepare"> <property name="billListDataPrepares"> <list> <ref bean="userdefitemlistPreparator" /> </list> </property> </bean> </property> </bean> <bean id="billFormEditor" class="nc.ui.fdcprcm.bd.sevrecord.view.FeeListBillForm" init-method="initUI"> <property name="model" ref="manageAppModel"></property> <property name="templateContainer" ref="templateContainer" /> <property name="billOrgPanel" ref="serciveCenterPanel" /> <property name="showOrgPanel" value="true" /> <!-- 是否自动增行 --> <property name="autoAddLine" value="false" /> <!-- 卡片自定义项处理 --> <property name="userdefitemPreparator"> <bean class="nc.ui.fdcpr.uipub.view.prepare.JZFDCCompositeBillDataPrepare"> <property name="billDataPrepares"> <list> <ref bean="userdefitemPreparator" /> </list> </property> </bean> </property> </bean> <!-- 列表显示下的按钮 --> <bean id="actionsOfListBase" class="nc.ui.fdcpr.uipub.action.container.JZFDCStandAloneToftPanelActionContainer"> <constructor-arg ref="listView" /> <property name="model" ref="manageAppModel" /> <property name="actions"> <list> <ref bean="deleteAction" /> <ref bean="queryAction" /> <ref bean="refreshAction" /> <ref bean="separatorAction" /> <ref bean="feeCalcAction" /> <ref bean="separatorAction" /> <ref bean="commitMenuAction" /> <ref bean="auditMenuAction" /> <ref bean="assistMenuAction" /> <ref bean="linkMenuAction" /> <ref bean="printMenuAction" /> <ref bean="separatorAction" /> <ref bean="generateBillsAction" /> <ref bean="separatorAction" /> <ref bean="generateArapRecBillAction" /> </list> </property> </bean> <!-- 卡片显示下的按钮 --> <bean id="actionsOfCardBase" class="nc.ui.fdcpr.uipub.action.container.JZFDCStandAloneToftPanelActionContainer"> <constructor-arg ref="billFormEditor" /> <property name="model" ref="manageAppModel" /> <!-- 此处配置的Action浏览态始终可见 --> <property name="actions"> <list> <ref bean="queryAction" /> <ref bean="editAction" /> <ref bean="cardRefreshAction" /> <ref bean="separatorAction" /> <ref bean="commitMenuAction" /> <ref bean="auditMenuAction" /> <ref bean="assistMenuAction" /> <ref bean="linkMenuAction" /> <ref bean="printMenuAction" /> <ref bean="separatorAction" /> <ref bean="generateBillsAction" /> <ref bean="separatorAction" /> <ref bean="generateArapRecBillAction" /> </list> </property> <!-- 此处配置的Action编辑态始终可见 --> <property name="editActions"> <list> <ref bean="saveAction" /> <ref bean="separatorAction" /> <ref bean="cancelAction" /> </list> </property> </bean> </beans> 单据 XML代码,如何找到错误代码的 文件名?
最新发布
10-14
请详细分析下面代码:<template> <div> <a-form-model ref="formRef" :model="searchData" :rules="rules" > <a-card style="margin-top: 20px" title="Applicant Information"> <a-row> <a-col :span="12"> <a-form-model-item prop="caseNo" label="Case NO:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.caseNo" :disabled="disabled" /> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="status" label="Status:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.status" :disabled="disabled" /> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12" v-if="false"> <a-form-model-item prop="applicant" label="Applicant:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.applicant" :disabled="disabled" /> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="applicantName" label="Applicant:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-textarea v-model="searchData.applicantName" :disabled="disabled" /> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="orgDescription" label="Org Description:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-textarea v-model="searchData.orgDescription" :disabled="disabled" /> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="createTime" label="Create Date:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.createTime" :disabled="disabled" /> </a-form-model-item> </a-col> </a-row> </a-card> <a-card style="margin-top: 20px" title="Base Information"> <a-row> <a-col :span="12"> <a-form-model-item prop="caseType" label="Case Type:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 14, offset: 2 }" :required ='required'> <a-radio-group v-model="searchData.caseType" @change="caseTypeChange" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-radio :value="1">out</a-radio> <a-radio :value="0">inner</a-radio> </a-radio-group> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="realFabBu" label="Real Fab Bu:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-select placeholder="请选择" v-model="searchData.realFabBu" style="width: 100%" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-select-option v-for="item in fabList" :key="item">{{ item }}</a-select-option> </a-select> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="changeStatus" label="Change Status:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 14, offset: 2 }" :required ='required'> <a-radio-group v-model="searchData.changeStatus" @change="changeStatusChange" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-radio :value="1">yes</a-radio> <a-radio :value="0">no</a-radio> </a-radio-group> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="changeCode" label="Change Code:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-select placeholder="请选择" v-model="searchData.changeCode" style="width: 100%" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-select-option v-for="item in fabList" :key="item">{{ item }}</a-select-option> </a-select> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="flowType" label="Flow Type:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-select placeholder="请选择" v-model="searchData.flowType" style="width: 100%" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-select-option :value="0">Normal</a-select-option> <a-select-option :value="1">Urgent</a-select-option> </a-select> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="equipmentType" label="Equipment Type:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-select placeholder="请选择" v-model="searchData.equipmentType" style="width: 100%" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-select-option v-for="item in equipmentTypeList" :key="item">{{ item }}</a-select-option> </a-select> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="expectTime" label="Expect Time:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-date-picker type="date" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="searchData.expectTime" :disabled="signCaseVo.jyStatus!='Applicant'" :show-time="{ defaultValue: moment('00:00:00', 'HH:mm:ss') }"/> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="expectUsageHours" label="Expect Usage Hours:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.expectUsageHours" type="number" :disabled="signCaseVo.jyStatus!='Applicant'"/> </a-form-model-item> </a-col> </a-row> <a-row > <a-col :span="12"> <a-form-model-item prop="purposeCode" label="Purpose Code:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-select placeholder="请选择" v-model="searchData.purposeCode" style="width: 100%" @change="actionChange" :disabled="signCaseVo.jyStatus!='Applicant'"> <a-select-option v-for="item in purposeCodeList" :key="item">{{ item }}</a-select-option> </a-select> </a-form-model-item> </a-col> </a-row> <a-row v-if="isShow2"> <a-col :span="12"> <a-form-model-item prop="projectCode" label="Project Code:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.projectCode" :disabled="signCaseVo.jyStatus!='Applicant'||disabled2"/> <a-button @click="checkCode()" :disabled="signCaseVo.jyStatus!='Applicant'">check</a-button> <a-button @click="resetCode()" :disabled="signCaseVo.jyStatus!='Applicant'">reset</a-button> </a-form-model-item> </a-col> </a-row> <a-row v-if="isShow2"> <a-col :span="12"> <a-form-model-item prop="projectName" label="project name" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.projectName" :disabled="disabled" /> </a-form-model-item> </a-col> </a-row> <a-row v-if="isShow"> <a-row v-for="(lot, index) in searchData.lotList" :key="index" > <a-col :span="12"> <a-form-model-item :prop="`lotList.${index}.lotId`" label="lotId" :labelCol="{ span: 6 }" :wrapperCol="{span: 12,offset: 2 }" :rules="[{ required: true, message: 'lotId is required', trigger: 'change' }]"> <a-input v-model="lot.lotId" :disabled="signCaseVo.jyStatus!='Applicant'" type="String" @blur="lotBlur(lot.lotId,index)" /> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item label="operation" :labelCol="{ span: 6 }" :wrapperCol="{span: 12,offset: 2 }"> <a-button @click="deleteItem(searchData.lotList, index)" :disabled="signCaseVo.jyStatus!='Applicant'" >Delete {{lot.lotId}}</a-button> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item :prop="`lotList.${index}.vendorId`" label="vendorId" :labelCol="{ span: 6 }" :wrapperCol="{span: 12,offset: 2 }"> <a-input v-model="lot.vendorId" type="String" :disabled="signCaseVo.jyStatus!='Applicant'" /> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item :prop="`lotList.${index}.waferId`" label="waferId" :labelCol="{ span: 6 }" :wrapperCol="{span: 16,offset: 2 }"> <a-input v-model="lot.waferId" :disabled="signCaseVo.jyStatus!='Applicant'" type="String" @click="cliWaferID(index)" @keydown.prevent /> </a-form-model-item> </a-col> </a-row> <a-row class="form-row" > <a-col :span="12"> <a-form-model-item :wrapperCol="{span: 12,offset: 8 }"> <a-button @click="addLotList(searchData.lotList)" :disabled="signCaseVo.jyStatus!='Applicant'"> AddLot </a-button> </a-form-model-item> </a-col> </a-row> </a-row> <a-row v-if="isShow"> <a-col :span="12"> <a-form-model-item prop="po" label="PO/Electronic/E-mail:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }"> <a-input v-model="searchData.po" :disabled="signCaseVo.jyStatus!='Applicant'"/> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="customerRequester" label="Customer Requester:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }"> <a-input v-model="searchData.customerRequester" :disabled="signCaseVo.jyStatus!='Applicant'"/> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="24"> <a-form-model-item prop="borrowPurpose" label="Borrow Purpose:" :labelCol="{ span: 3 }" :wrapperCol="{ span: 6, offset: 1 }" :required='required'> <a-textarea v-model="searchData.borrowPurpose" placeholder="borrowPurpose" :rows="8" :disabled="signCaseVo.jyStatus!='Applicant'"/> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="targetEquipmentId" label="Target Equipment ID:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input v-model="searchData.targetEquipmentId" :disabled="signCaseVo.jyStatus!='Applicant'"/> </a-form-model-item> </a-col> </a-row> </a-card> <a-card style="margin-top: 20px" title="Testing Plant Frame/MPC Confirm" v-if="signCaseVo.jyStatus=='MPC'||signCaseVo.jyStatus=='LineSuper'||signCaseVo.jyStatus=='SuperClose'||signCaseVo.jyStatus=='Close'||signCaseVo.jyStatus=='Cancel'" > <a-row> <a-col :span="12"> <a-form-model-item prop="executeTime" label="Permit Execute Time:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required ='required'> <a-date-picker placeholder="具体借机时间" type="date" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="searchData.executeTime" :disabled="signCaseVo.jyStatus!='MPC'" :show-time="{ defaultValue: moment('00:00:00', 'HH:mm:ss') }"/> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="executeHours" label="Permit Execute Hours:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input placeholder="具体使用多久(整数)" v-model="searchData.executeHours" :disabled="signCaseVo.jyStatus!='MPC'"/> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="planEquipmentId" label="Plan Equipment ID:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-input placeholder="计划借机机台号" v-model="searchData.planEquipmentId" :disabled="signCaseVo.jyStatus!='MPC'"/> </a-form-model-item> </a-col> </a-row> </a-card> <a-card style="margin-top: 20px" title="Line Leader Plant Frame" v-if="signCaseVo.jyStatus=='LineSuper'||signCaseVo.jyStatus=='SuperClose'||signCaseVo.jyStatus=='Close'||signCaseVo.jyStatus=='Cancel'" > <a-row> <a-col :span="12"> <a-form-model-item prop="realEquipmentId" label="Real Equipment ID:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required ='required'> <a-input placeholder="实际使用机台号" v-model="searchData.realEquipmentId" :disabled="signCaseVo.jyStatus!='LineSuper'"/> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="setUpTime" label="Set Up Time:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" :required='required'> <a-date-picker placeholder="开始时间" type="date" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="searchData.setUpTime" :disabled="signCaseVo.jyStatus!='LineSuper'" :show-time="{ defaultValue: moment('00:00:00', 'HH:mm:ss') }"/> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="setOffTime" label="Set Off Time:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-date-picker placeholder="结束时间" type="date" valueFormat="YYYY-MM-DD HH:mm:ss" v-model="searchData.setOffTime" :show-time="{ defaultValue: moment('00:00:00', 'HH:mm:ss') }" :disabled="signCaseVo.jyStatus!='SuperClose'" @change="changeSetOffTime"/> </a-form-model-item> </a-col> <a-col :span="12"> <a-form-model-item prop="borrowHours" label="Machine Borrow Hours:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-input placeholder="实际借用时间" v-model="searchData.borrowHours" :disabled="true" /> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="checkStatus" label="TMPG Status/Check Items 1:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-checkbox v-model="searchData.checkStatus" :disabled="signCaseVo.jyStatus!='SuperClose'">还机时机台/硬件MES状态正常</a-checkbox> </a-form-model-item> </a-col> </a-row> <a-row> <a-col :span="12"> <a-form-model-item prop="returnToTmpgStatus" label="TMPG Status/Check Items 2:" :labelCol="{ span: 6 }" :wrapperCol="{ span: 12, offset: 2 }" > <a-checkbox v-model="searchData.returnToTmpgStatus" :disabled="signCaseVo.jyStatus!='SuperClose'">还机时机台内无物料</a-checkbox> </a-form-model-item> </a-col> </a-row> </a-card> <a-card style="margin-top: 20px" title="File Information" v-if="this.$route.query.id"> <a-row> <a-col :span="12" > <a-upload :show-upload-list="false" :before-upload="(file) => beforeUpload2(file, text)" > <a-button :disabled="signCaseVo.jyStatus!='Applicant'"> 添加文件 </a-button> </a-upload> </a-col> </a-row> <a-table class="ttable" :columns="columns4" :data-source="fileLists" :pagination="false" :rowKey=" (record, index) => { return index; } " :locale="{ emptyText: '暂无数据' }" @change="handleTableChange"> <span slot="delete" slot-scope="text" > <a @click="deleteList(text)" :disabled="signCaseVo.jyStatus!='Applicant'">Delete</a> </span> <span slot="download" slot-scope="text"> <a @click="downloadList(text)">Download</a> </span> </a-table> </a-card> <a-card style="margin-top: 20px" title="Signoff"> <a-row> <a-row> <a-col :span="24"> <a-form-item label="Comment" :labelCol="{ span: 3 }" :wrapperCol="{ span: 12, offset: 1 }" > <a-textarea style="width: 100%; height: 160px" :maxLength=500 v-model="signCaseVo.comment" ></a-textarea> </a-form-item> </a-col> </a-row> <a-row style="margin-top: 20px" justify="center" type="flex"> <template v-for="item of signCaseVo.actionNames"> <a-button style=" margin-right: 80px; border-radius: 8px; font-weight: bolder; " :key="item" @click="signOff" v-bind:disabled=" signCaseVo.comment && signCaseVo.comment.trim() != '' ? false : true " :data-type="item" > {{ item }} </a-button> </template> </a-row> </a-row> </a-card> <a-card style="margin-top: 20px" title="审批意见" class="colora"> <a-table class="ttable" :columns="columns1" :data-source="signOffHistory" :pagination="false" :rowKey=" (record, index) => { return index; } " :locale="{ emptyText: ' ' }" > <span slot="creator" slot-scope="text, value"> <a @click="toAddressBook(text, value)">{{text}}</a> </span> </a-table> </a-card> </a-form-model> <a-modal :width="900" v-model="WaferIDNumber" v-drag-modal title="Wafer List"> <a-input style="display: none;" v-model="this.indexFlag" /> <a-row> <a-col :span="6"> <a-checkbox v-model="isChecked" value="all" @change="checkboxAll" style="color: black; font-weight: 600">all</a-checkbox> </a-col> </a-row> <a-checkbox-group v-model="checkoutValue" :options="plainOption"></a-checkbox-group> <template #footer> <a-button type="primary" @click="isOk">OK</a-button> <a-button type="primary" @click="isCancel">Cancel</a-button> </template> </a-modal> </div> </template> <script> import { getFabList,listPurposeCode,listEquipmentType,queryDetails,signOffOrder,listChangeCode,checkCode,deleteFile,uploadFile, getAllFile,getLotById} from '@/services/mlcs/myConfig' import '@/theme/style.less' import moment from "moment"; import { message } from 'ant-design-vue'; import axios from "axios"; import { MLCS } from "@/services/api"; const columns1 = [ { title: "StepName", width: "100px", dataIndex: "stepName", }, { title: "Signer", width: "100px", dataIndex: "updateUser", scopedSlots: { customRender: "creator" }, }, { title: "Action", width: "100px", dataIndex: "action", }, { title: "comment", width: "100px", dataIndex: "comment", }, { title: "Time", width: "100px", dataIndex: "updateTime", }, ]; const columns4 = [ { title: "File Name", width: "", dataIndex: "fileName", }, { title: "Delete", width: "", dataIndex: "", scopedSlots: { customRender: "delete" }, }, { title: "Download", width: "", dataIndex: "", scopedSlots: { customRender: "download" }, }, ]; const form= { caseNo:"NA", status:"Draft", applicant:"", orgDescription:"", createTime:"", caseType:1, realFabBu:"", changeStatus:0, changeCode:"", flowType:1, equipmentType:"", expectTime:"", expectUsageHours:null, purpose:"", projectCode:"", projectName:"", po:"", customerRequester:"", borrowPurpose:"", targetEquipmentId:"", executeTime:"", executeHours:"", planEquipmentId:"", realEquipmentId:"", setUpTime:"", setOffTime:"", borrowHours:"", returnToTmpgStatus:"", checkStatus:"" }; export default { name: 'process', props: { }, data() { const checkRealFabBu = (rule, value, callback) => { if (!value&&this.searchData.caseType == 1) { return callback(new Error('realFabBu is required')); }else{ return callback(); } } const checkChangeCode = (rule, value, callback) => { if (!value&&this.searchData.changeStatus == 1) { return callback(new Error('changeCode is required')); }else{ return callback(); } } const checkExpectUsageHours = (rule, value, callback) => { if (!value) { return callback(new Error('ExpectUsageHours is required')); }else if(this.searchData.expectUsageHours > 168||this.searchData.expectUsageHours <1){ return callback(new Error('number between 1-168 ')); }else{ return callback(); } } const checkExpectTime = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='Applicant'){ if (!value) { return callback(new Error('ExpectTime is required')); }else if(new Date(this.searchData.expectTime) <= new Date()){ return callback(new Error('ExpectTime need after now ')); }else{ return callback(); } }else{ return callback(); } } const checkExecuteTime = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='MPC'){ if (!value) { return callback(new Error('ExecuteTime is required')); }else if(new Date(this.searchData.executeTime) <= new Date()){ return callback(new Error('ExecuteTime need after now ')); }else{ return callback(); } }else{ return callback(); } } const checkExecuteHours = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='MPC'){ if (!value) { return callback(new Error('executeHours is required')); }else if(this.searchData.executeHours > 168||this.searchData.executeHours <1){ return callback(new Error('number between 1-168 ')); }else{ return callback(); } }else{ return callback(); } } const checkSetUpTime = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='LineSuper'){ if (!value) { return callback(new Error('SetUpTime is required')); }else if(new Date(this.searchData.setUpTime) <= new Date()){ return callback(new Error('SetUpTime need after now ')); }else{ return callback(); } }else{ return callback(); } } const checkSetOffTime = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='SuperClose'){ if (!value) { return callback(new Error('SetOffTime is required')); // }else if(new Date(this.searchData.setOffTime) <= new Date()){ // return callback(new Error('SetUpTime need after now ')); }else{ return callback(); } }else{ return callback(); } } const checkBorrowHours = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='SuperClose'){ if (!value) { return callback(new Error('BorrowHours is required')); }else if(this.searchData.borrowHours > 168||this.searchData.borrowHours <1){ return callback(new Error('number between 1-168 ')); }else{ return callback(); } }else{ return callback(); } } const checkCheckStatus = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='SuperClose'){ if (!value) { return callback(new Error('CheckStatus is required')); }else{ return callback(); } }else{ return callback(); } } const checkReturnToTmpgStatus = (rule, value, callback) => { if(this.signCaseVo.jyStatus=='SuperClose'){ if (!value) { return callback(new Error('returnToTmpgStatus is required')); }else{ return callback(); } }else{ return callback(); } } return { moment, fabList: [""], purposeCodeList:[""], equipmentTypeList:[""], disabled: true, //是否可编辑 disabled2: false, //是否可编辑 required: true, isShow:false, isShow2:false, /********case信息 start*/ columns1, signCaseVo: { jyStatus:"", actionNames: [], comment: "", }, signOffHistory: [], signWorkOrderDTO: { //这边还是的更新form的数据 workCaseId: 0, caseNo: "", tbMlcsFormData:{}, signWorkCaseVo: { actionName: "", jyongStatus: "", comment: "", }, }, /********case信息 end*/ searchData: { fabBu:"", caseNo:"", status:"", applicant:"", orgDescription:"", createTime:"", caseType:"", realFabBu:"", changeStatus:"", changeCode:"", flowType:"", equipmentType:"", expectTime:"", expectUsageHours:null, purposeCode:"", projectCode:"", projectName:"", po:"", customerRequester:"", borrowPurpose:"", targetEquipmentId:"", executeTime:"", executeHours:"", planEquipmentId:"", realEquipmentId:"", setUpTime:"", setOffTime:"", borrowHours:"", returnToTmpgStatus:"", checkStatus:"" }, fileLists:[], checkoutValue: [], columns4, WaferIDNumber: false, indexFlag:"", isChecked: false, plainOption: [ { label: "01", value: "01", disabled: false }, { label: "02", value: "02", disabled: false }, { label: "03", value: "03", disabled: false }, { label: "04", value: "04", disabled: false }, { label: "05", value: "05", disabled: false }, { label: "06", value: "06", disabled: false }, { label: "07", value: "07", disabled: false }, { label: "08", value: "08", disabled: false }, { label: "09", value: "09", disabled: false }, { label: "10", value: "10", disabled: false }, { label: "11", value: "11", disabled: false }, { label: "12", value: "12", disabled: false }, { label: "13", value: "13", disabled: false }, { label: "14", value: "14", disabled: false }, { label: "15", value: "15", disabled: false }, { label: "16", value: "16", disabled: false }, { label: "17", value: "17", disabled: false }, { label: "18", value: "18", disabled: false }, { label: "19", value: "19", disabled: false }, { label: "20", value: "20", disabled: false }, { label: "21", value: "21", disabled: false }, { label: "22", value: "22", disabled: false }, { label: "23", value: "23", disabled: false }, { label: "24", value: "24", disabled: false }, { label: "25", value: "25", disabled: false }, ], rules: { expectUsageHours: [{ validator:checkExpectUsageHours, trigger: "change" }], borrowPurpose: [{ required: true, message: "Please Input this field ", trigger: "change" }, {max:500,message:"最大长度为500", trigger: "change" } ], realFabBu:[{validator:checkRealFabBu,trigger: "change"}], changeCode:[{validator:checkChangeCode,trigger: "change"}], expectTime:[{validator:checkExpectTime,trigger: "change"}], executeTime:[{validator:checkExecuteTime,trigger: "change"}], executeHours:[{validator:checkExecuteHours,trigger: "change"}], setUpTime:[{validator:checkSetUpTime,trigger: "change"}], setOffTime:[{validator:checkSetOffTime,trigger: "change"}], //borrowHours:[{validator:checkBorrowHours,trigger: "change"}], checkStatus:[{validator:checkCheckStatus,trigger: "change"}], returnToTmpgStatus:[{validator:checkReturnToTmpgStatus,trigger: "change"}], targetEquipmentId:[{pattern: /^[a-zA-Z0-9]+$/,message: "Please Input a-z A-Z 0-9 ", trigger: "change"}], planEquipmentId:[{pattern: /^[a-zA-Z0-9]+$/,message: "Please Input a-z A-Z 0-9 ", trigger: "change"}], realEquipmentId:[{pattern: /^[a-zA-Z0-9]+$/,message: "Please Input a-z A-Z 0-9 ", trigger: "change"}] }, } }, computed: {}, activated() { getFabList().then(res => { const data = res.data.data this.fabList=[""]; for (const i in data) { this.fabList.push(data[i]) } }); listPurposeCode(localStorage.getItem('fabName')).then(res => { const data = res.data.data this.purposeCodeList=[""]; for (const i in data) { this.purposeCodeList.push(data[i]) } }); listChangeCode(localStorage.getItem('fabName')).then(res => { const data = res.data.data this.changeCodeList=[""]; for (const i in data) { this.changeCodeList.push(data[i]) } }); listEquipmentType(localStorage.getItem('fabName')).then(res => { const data = res.data.data this.equipmentTypeList=[""]; for (const i in data) { this.equipmentTypeList.push(data[i]) } }); if (this.$route.query.id != undefined && this.$route.query.id != '') { var params = { id: this.$route.query.id } queryDetails(params).then((res) => { if (res.data.code == 0) { let data = res.data.data.signOffVo.tbMlcsFormData; this.signCaseVo = res.data.data.signOffVo.signCaseVo; this.signOffHistory = res.data.data.signOffVo.signOffHistory; this.searchData = data; this.signWorkOrderDTO.workCaseId = res.data.data.signOffVo.workCaseId; this.signWorkOrderDTO.caseNo =res.data.data.signOffVo.tbMlcsFormData.caseNo; this.fileLists=res.data.data.signOffVo.allFiles; // if (this.searchData.purposeCode.includes('Customer borrow')) { // this.isShow=true; // }else{ // this.isShow=false; // } if (this.searchData.purposeCode.includes('Customer borrow')&&this.searchData.purposeCode.includes('(TSD)')) { this.isShow=true; this.isShow2=true; }else if(this.searchData.purposeCode.includes('Customer borrow')&&this.searchData.purposeCode.includes('(TD2)')) { this.isShow=true; this.isShow2=true; }else if(this.searchData.purposeCode.includes('Other borrow')&&this.searchData.purposeCode.includes('(TD2)')) { this.isShow=false; this.isShow2=true; }else if(this.searchData.purposeCode.includes('Customer borrow')){ this.isShow=true; this.isShow2=false; }else if(this.searchData.purposeCode.includes('(TSD)')){ this.isShow=false; this.isShow2=true; }else{ this.isShow=false; this.isShow2=false; } if(!this.searchData.planEquipmentId){ this.searchData.planEquipmentId=this.searchData.targetEquipmentId; } } }); } }, created() {}, beforeDestroy() {}, methods: { actionChange(e) { if (e.includes('Customer borrow')&&e.includes('(TSD)')) { this.isShow=true; this.isShow2=true; }else if(e.includes('(TD2)')&&e.includes('Customer borrow')){ this.isShow=true; this.isShow2=true; }else if(e.includes('(TD2)')&&e.includes('Other borrow')){ this.isShow=true; this.isShow2=true; }else if(e.includes('Customer borrow')){ this.isShow=true; this.isShow2=false; }else if(e.includes('(TSD)')){ this.isShow=false; this.isShow2=true; }else{ this.isShow=false; this.isShow2=false; } }, changeStatusChange(){ if(this.searchData.changeStatus==0){ this.searchData.changeCode=""; } }, caseTypeChange(){ if(this.searchData.caseType==0){ this.searchData.realFabBu=""; } }, changeSetOffTime(){ var dateBegin = new Date(this.searchData.setUpTime); var dateEnd = new Date(this.searchData.setOffTime); var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数 var hours = (dateDiff / (1000 * 60 * 60)).toFixed(2); //计算出小时数 this.searchData.borrowHours=hours; }, toAddressBook(item) { let name=item.substring(0,7); window.open( `http://mysjsemi/extend/addressBookMain.do?method=findLike&retrievalValue=${name}` ); }, signOff: function (ev) { const that = this; this.signWorkOrderDTO.signWorkCaseVo.actionName =ev.target.dataset["type"]; this.signWorkOrderDTO.signWorkCaseVo.jyongStatus =this.signCaseVo.jyStatus; this.signWorkOrderDTO.signWorkCaseVo.comment = this.signCaseVo.comment; this.signWorkOrderDTO.tbMlcsFormData=this.searchData; let signWorkOrderDTO = this.signWorkOrderDTO; if(this.signWorkOrderDTO.signWorkCaseVo.actionName!='reject'){ this.$refs["formRef"].validate((valid) => { if (valid) { this.$confirm({ title: "确认提交吗?", okText: "是", cancelText: "否", onOk: function () { signOffOrder(signWorkOrderDTO).then((res) => { if (res.data.code == 0) { that.$message.success("已提交"); that.$closePage("/detail"); that.$router.push("/todo"); } }); }, }); } else { return false; } }); }else{ this.$confirm({ title: "确认reject吗?", okText: "是", cancelText: "否", onOk: function () { signOffOrder(signWorkOrderDTO).then((res) => { if (res.data.code == 0) { that.$message.success("已提交"); that.$closePage("/detail"); that.$router.push("/todo"); } }); }, }); } // this.$confirm({ // title: "确认签核吗?", // okText: "是", // cancelText: "否", // onOk: function () { // signOffOrder(signWorkOrderDTO).then((res) => { // if (res.data.code == 0) { // that.$message.success("已提交"); // that.$closePage("/detail"); // that.$router.push("/todo"); // } // }); // }, // }); }, checkCode() { this.searchData.projectName=""; checkCode({projectCode:this.searchData.projectCode}).then((res) => { if (res.data.code == 0) { if(!res.data.data.caseDto){ this.$message.warning("找不到对应子项目,请检查并更新子code后,重新提交"); }else{ if(!res.data.data.caseDto.projectName){ this.searchData.projectName="已通过校验,但是项目名为空" }else{ this.searchData.projectName=res.data.data.caseDto.projectName } this.disabled2=true } } }); }, resetCode() { this.searchData.projectCode="" this.searchData.projectName="" this.disabled2=false }, handleTableChange(pagination) { // this.pagination = pagination; // this.getPage(); }, // 删除文件 deleteList(file) { let that = this; that.$confirm({ title: "Are you sure to delete this data?", okText: "YES", okType: "danger", cancelText: "NO", onOk() { deleteFile(file.id).then((res) => { if (res.data.code == 0) { message.success('Delete succeeded'); that.getAllFile(file.mlcsId); } }) }, onCancel() { }, }); }, // 下载文件 downloadList(file) { let that = this; that.$confirm({ title: "Are you sure to Download this data?", okText: "YES", okType: "danger", cancelText: "NO", onOk() { axios({ url: `${MLCS}/file/download/${file.id}`, method: "get", responseType: "blob", }).then((res) => { const url = window.URL.createObjectURL(new Blob([res.data])); const link = document.createElement('a'); link.href = url; const contentDisposition = res.headers["content-disposition"]; const fileName = decodeURI( contentDisposition.split("fileName=")[1] || contentDisposition.split("filename=")[1] ); link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); link.parentNode.removeChild(link); window.URL.revokeObjectURL(url); }); }, onCancel() { }, }); }, // 上传之前 beforeUpload2(file) { const form = new FormData() form.append("file", file) form.append("mlcsId", this.searchData.id) uploadFile(form).then((res) => { if (res.data.code == 0) { message.success('Upload succeeded'); this.getAllFile(this.searchData.id); } }) return false; }, getAllFile(mlcsId) { getAllFile(mlcsId).then((res) => { this.fileLists = res.data.data }) }, addLotList(addLotList) { addLotList.push({lotId: '', vendorId: '',waferId: ''}) }, deleteItem(addLotList, index) { if(addLotList.length>1){ addLotList.splice(index, 1); } else { this.$message.warning("至少保留一组Lot!") } }, cliWaferID(index) { if(this.searchData.lotList[index].lotId&&this.searchData.lotList[index].lotId !='NA'){ let params = new FormData(); params.append("lotId", this.searchData.lotList[index].lotId); getLotById(params).then((res) => { if (res.data.code == 0) { var i=0; //this.searchData.lotList[index].waferId = res.data.data.waferId; if (res.data.data.waferId != null) { let list = res.data.data.waferId.split("#"); this.plainOption.forEach((item) => { if (list.indexOf(item.label) == "-1") { item.disabled = true; }else{ item.disabled = false; i++; } }); //this.searchData.lotList[index].waferId = null; } this.indexFlag=index; if(i==(this.searchData.lotList[index].waferId? this.searchData.lotList[index].waferId.split(",").length : [].length)){ this.isChecked=true; }else{ this.isChecked=false; } this.WaferIDNumber = true; this.checkoutValue = this.searchData.lotList[index].waferId ? this.searchData.lotList[index].waferId.split(",") : []; } }); } // if(this.indexFlag==index){ // this.WaferIDNumber = true; // this.checkoutValue = this.searchData.lotList[index].waferId // ? this.searchData.lotList[index].waferId.split(",") : []; // }else{ // lotBlur(this.searchData.lotList[index].lotId,index); // this.indexFlag=index; // this.WaferIDNumber = true; // this.checkoutValue = this.searchData.lotList[index].waferId // ? this.searchData.lotList[index].waferId.split(",") : []; // } }, isOk() { console.log(this.checkoutValue); this.WaferIDNumber = false; //this.lotList.waferId = this.checkoutValue.toString(); console.log("111111"+this.indexFlag); this.searchData.lotList[this.indexFlag].waferId= this.checkoutValue.toString(); }, isCancel() { this.WaferIDNumber = false; }, lotBlur(e,index) { const counts = {}; let flag=true; this.searchData.lotList.forEach(lot => { if (counts[lot.lotId]&&lot.lotId==e) { this.searchData.lotList[index].lotId =""; this.searchData.lotList[index].waferId = ""; this.searchData.lotList[index].vendorId = ""; flag=false; this.$message.warning("LotID不可重复"); } else { counts[lot.lotId] = 1; } }); if (e&&flag) { this.searchData.lotList[index].lotId = ""; this.searchData.lotList[index].waferId = ""; this.searchData.lotList[index].vendorId = ""; if(e=="NA"){ this.searchData.lotList[index].vendorId ="NA"; return } this.$warning({ title: `System will get LotId:${e} data from MES`, okText: "ok", onOk: () => { let params = new FormData(); params.append("lotId", e); //params.append("system", "CP"); getLotById(params).then((res) => { if (res.data.code == 0) { this.searchData.lotList[index].lotId = res.data.data.lotId; this.searchData.lotList[index].vendorId = res.data.data.vendorId; this.searchData.lotList[index].waferId = res.data.data.waferId; if (res.data.data.waferId != null) { let list = res.data.data.waferId.split("#"); this.plainOption.forEach((item) => { if (list.indexOf(item.label) == "-1") { item.disabled = true; }else{ item.disabled = false; } }); this.searchData.lotList[index].waferId = ""; } } }); }, }); } }, checkboxAll(e) { this.checkoutValue = []; if (e.target.checked) { this.plainOption.forEach((item) => { if (item.disabled == false) { this.checkoutValue.push(item.label); } }); } else { this.checkoutValue = []; } }, } } </script> <style scoped lang="less"> // /deep/ .ant-form-item label { // white-space: normal; // } /deep/ .ant-form-item { color: #000000; // border: 1px solid #fff; // border-left: 0px; } /deep/ .langName .ant-form-item-label { line-height: 18px; white-space: normal; } /deep/ .ant-form-item { border: 1px solid #fff; border-left: 0px; } /deep/ .ant-checkbox-group-item { margin-right: 10px; width: 10%; color: black; font-weight: 500; } .redColorTable { color: red; } </style>
09-26
代码开发 1)先调用smartform函数获取OTF格式数据 2)后调用函数CONVERT_OTF转换成PDF格式数据 3)再调用GUI_DOWNLOAD函数下载并邮件发送给采购员 ,涉及表 *&---------------------------------------------------------------------* *& 包含 ZNMMX037FA *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_GET_DATA . *modify by songjiaru 20200519 SQL 性能优化 及 更改收件人邮箱取数逻辑 这里默认的是一个PO 只会存在一个工厂的数据 *不然没办法按照采购部的供应商+采购组织+工厂取ZNMMT037A来取数了 SELECT EKKO~EBELN , EKKO~BEDAT , EKKO~EKGRP , EKKO~LIFNR , EKKO~BUKRS , NAST~SPRAS , EKKO~EKORG , EKPO~WERKS INTO CORRESPONDING FIELDS OF TABLE @GT_DATA FROM EKKO INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN JOIN NAST ON NAST~OBJKY = EKKO~EBELN WHERE EKKO~EBELN IN @S_EBELN AND EKKO~LIFNR IN @S_LIFNR AND EKKO~EKORG IN @S_EKORG AND EKKO~EKGRP IN @S_EKGRP AND EKKO~BSART IN @S_BSART AND EKKO~BEDAT IN @S_BEDAT AND EKPO~WERKS IN @S_WERKS1 AND EKKO~FRGKE = '7' AND NAST~SPRAS IN @S_SPRAS. SORT GT_DATA BY EBELN. DELETE ADJACENT DUPLICATES FROM GT_DATA COMPARING EBELN. * LOOP AT GT_DATA INTO GS_DATA . * SELECT SINGLE * FROM ZNMMT037 * WHERE EBELN = GS_DATA-EBELN. * IF SY-SUBRC = 0. * IF CK_WFS = 'X'. * DELETE GT_DATA. * CONTINUE. * ENDIF. * GS_DATA-ICON = '@08@'. * GS_DATA-MESSAGE = '已有发送记录'. * GS_DATA-ERDAT = ZNMMT037-ERDAT. * ENDIF. * * SELECT SINGLE NAME1 MCOD1 ADRNR * INTO (GS_DATA-NAME1,GS_DATA-MCOD1,GS_DATA-ADRNR) * FROM LFA1 * WHERE LIFNR = GS_DATA-LIFNR. * * READ TABLE GT_MAIL INTO GS_MAIL WITH KEY ADRNR = GS_DATA-ADRNR BINARY SEARCH. * IF SY-SUBRC NE 0. * SELECT ADDRNUMBER SMTP_ADDR APPENDING TABLE GT_MAIL * FROM ADR6 * WHERE ADDRNUMBER = GS_DATA-ADRNR. * SORT GT_MAIL BY ADRNR. * ENDIF. * * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = GS_DATA-ADRNR. * IF GS_DATA-SMTP_ADDR IS INITIAL. * GS_DATA-SMTP_ADDR = GS_MAIL-SMTP_ADDR. * ELSE. * GS_DATA-SMTP_ADDR = GS_DATA-SMTP_ADDR && ';' && GS_MAIL-SMTP_ADDR. * ENDIF. * ENDLOOP. * * MODIFY GT_DATA FROM GS_DATA. * ENDLOOP. DATA : LV_TABIX LIKE SY-TABIX. IF GT_DATA IS INITIAL. MESSAGE S322(ZMM) DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. SELECT * FROM ZNMMT037 FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037~EBELN = @GT_DATA-EBELN INTO TABLE @DATA(LT_ZNMMT037). SORT LT_ZNMMT037 BY EBELN. DATA : LS_ZNMMT037 LIKE LINE OF LT_ZNMMT037. SELECT LFA1~LIFNR , LFA1~NAME1 , LFA1~MCOD1 FROM LFA1 WHERE LFA1~LIFNR IN @S_LIFNR INTO TABLE @DATA(LT_LFA1). SORT LT_LFA1 BY LIFNR. DATA : LS_LFA1 LIKE LINE OF LT_LFA1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~EKORG , ZNMMT037A~WERKS ,ZNMMT037A~EKGRP,ZNMMT037A~EMAIL FROM ZNMMT037A FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037A~LIFNR = @GT_DATA-LIFNR AND ZNMMT037A~EKORG = @GT_DATA-EKORG INTO TABLE @DATA(LT_ZNMMT037A) . SORT LT_ZNMMT037A BY LIFNR EKORG WERKS EKGRP . DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<LFS_DATA>). *------------填充发送记录---------------* CLEAR LS_ZNMMT037. READ TABLE LT_ZNMMT037 INTO LS_ZNMMT037 WITH KEY EBELN = <LFS_DATA>-EBELN BINARY SEARCH. IF SY-SUBRC = 0. IF CK_WFS = 'X'. <LFS_DATA>-FLAG = 'X'. CONTINUE. ENDIF. <LFS_DATA>-ICON = '@08@'. <LFS_DATA>-MESSAGE = TEXT-002. <LFS_DATA>-ERDAT = LS_ZNMMT037-ERDAT. ENDIF. *-----------填充供应商信息名字等等--------* CLEAR LS_LFA1. READ TABLE LT_LFA1 INTO LS_LFA1 WITH KEY LIFNR = <LFS_DATA>-LIFNR BINARY SEARCH. IF SY-SUBRC = 0. <LFS_DATA>-NAME1 = LS_LFA1-NAME1. <LFS_DATA>-MCOD1 = LS_LFA1-MCOD1. ENDIF. *--------填充供应商对应的邮件地址---------* *先根据供应商采购组织工厂采购员找,再根据供应商采购组织工厂找,如果找不到,就根据供应商采购组织找 CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS EKGRP = <LFS_DATA>-EKGRP BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS AND LS_ZNMMT037A-EKGRP = <LFS_DATA>-EKGRP. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = '' BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = ''. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. ENDLOOP. *end modify ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_OUTPUT_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_OUTPUT_DATA . DEFINE MAC_FCAT. CLEAR gs_fcat. gs_fcat-fieldname = &1. gs_fcat-coltext = &2. gs_fcat-key = &3. gs_fcat-ref_field = &4. gs_fcat-ref_table = &5. gs_fcat-just = &6. * IF &6 = 'R'. * gs_fcat-no_zero = 'X'. * ENDIF. if &1 = 'ICON'. gs_fcat-icon = 'X'. endif. APPEND gs_fcat TO gt_fcat. END-OF-DEFINITION. CLEAR GT_FCAT. IF SY-LANGU EQ '1'. MAC_FCAT 'EBELN' '采购订单号' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' '供应商' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' '供应商名称' '' '' '' ''.. MAC_FCAT 'BEDAT' '凭证日期' ' ' '' '' ''. MAC_FCAT 'EKGRP' '采购组' ' ' '' '' ''. MAC_FCAT 'MCOD1' '简称' ' ' '' '' ''. MAC_FCAT 'SPRAS' '语言' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' '供应商邮件' ' ' '' '' ''. MAC_FCAT 'ICON' '发送状态' ' ' '' '' ''. MAC_FCAT 'ERDAT' '发送日期' ' ' '' '' ''. MAC_FCAT 'MESSAGE' '消息' ' ' '' '' ''. ELSE. MAC_FCAT 'EBELN' 'PO' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' 'Supplier' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' 'Supplier Name' '' '' '' ''.. MAC_FCAT 'BEDAT' 'Date' ' ' '' '' ''. MAC_FCAT 'EKGRP' 'Purchase Group' ' ' '' '' ''. MAC_FCAT 'MCOD1' 'Name For Short' ' ' '' '' ''. MAC_FCAT 'SPRAS' 'Language' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' 'Email' ' ' '' '' ''. MAC_FCAT 'ICON' 'Status' ' ' '' '' ''. MAC_FCAT 'ERDAT' 'Send Date' ' ' '' '' ''. MAC_FCAT 'MESSAGE' 'Message' ' ' '' '' ''. ENDIF. GS_LAYOUT-ZEBRA = 'X'. GS_LAYOUT-CWIDTH_OPT = 'X'. GS_LAYOUT-BOX_FNAME = 'BOX'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID IS_LAYOUT_LVC = GS_LAYOUT IT_FIELDCAT_LVC = GT_FCAT I_SAVE = 'U' I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' TABLES T_OUTTAB = GT_DATA EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. DATA:LV_ANSWER TYPE C. DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA : LV_CLSS TYPE C . "X 代表发送给供应商和采购员 ''代表发送给采购员 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' " IMPORTING E_GRID = LR_GRID. CALL METHOD LR_GRID->CHECK_CHANGED_DATA. CASE R_UCOMM. WHEN 'EMAIL'. "保存事件 LV_CLSS = 'X'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. ELSE. GS_DATA-ICON = '@0A@'. GS_DATA-MESSAGE = TEXT-003 ." ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. *ADD BY SONGJIARU 20200519 增加只发送给采购员 WHEN 'EMAIL1'. LV_CLSS = ''. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. * IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 * GS_DATA-ADRNR GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. * ELSE. * GS_DATA-ICON = '@0A@'. * GS_DATA-MESSAGE = '邮件为空,不能发送' ." * ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. WHEN 'DOWN'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X'. PERFORM FRM_DOWN_PDF USING GS_DATA-EBELN GS_DATA-SPRAS. ENDLOOP. WHEN '&IC1'. IF RS_SELFIELD-FIELDNAME = 'EBELN'. READ TABLE GT_DATA INTO GS_DATA INDEX RS_SELFIELD-TABINDEX. IF SY-SUBRC = 0. SET PARAMETER ID 'BES' FIELD GS_DATA-EBELN. CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN. ENDIF. ENDIF. WHEN OTHERS. ENDCASE. RS_SELFIELD-REFRESH = 'X'."刷新ALV报表 RS_SELFIELD-COL_STABLE = 'X'. RS_SELFIELD-ROW_STABLE = 'X'. ENDFORM. "FRM_USER_COMMAND *&---------------------------------------------------------------------* *& Form frm_set_pf_status2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->RT_EXTAB text *----------------------------------------------------------------------* FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'PF_STATUS'. ENDFORM. "FRM_SET_PF_STATUS *&---------------------------------------------------------------------* *& Form FRM_SEND_MAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& <-- GS_DATA_ICON *& <-- GS_DATA_MESSAGE *& <-- ELSE *&---------------------------------------------------------------------* FORM FRM_SEND_MAIL USING P_EBELN P_SPRAS P_EKGRP P_MCOD1 P_BUKRS P_EMAIL P_CLSS CHANGING P_ICON P_MESSAGE P_ERDAT. DATA:LS_ZT37 LIKE ZNMMT037. DATA:LV_BUTXT LIKE T001-BUTXT. DATA:LT_CONTENT_BIN TYPE SOLIX_TAB. DATA: CL_SEND_REQUEST TYPE REF TO CL_BCS, CL_DOCUMENT TYPE REF TO CL_DOCUMENT_BCS, CL_BCS_EXCEPTION TYPE REF TO CX_BCS, CL_SENDER TYPE REF TO IF_SENDER_BCS, CL_RECIPIENT TYPE REF TO IF_RECIPIENT_BCS. DATA: LT_MAIN_TEXT TYPE BCSY_TEXT, LS_MAIN_TEXT LIKE LINE OF LT_MAIN_TEXT, LV_TITLE TYPE SO_OBJ_DES, LV_BOOL TYPE OS_BOOLEAN. DATA:LV_PATH TYPE STRING. DATA:LT_BIN TYPE TABLE OF TBL1024. DATA LV_CONTENT TYPE XSTRING. DATA LV_VLINE TYPE I. DATA : BEGIN OF LS_RECIEVE, EMAIL TYPE AD_SMTPADR, END OF LS_RECIEVE. DATA : LT_RECIEVE LIKE TABLE OF LS_RECIEVE. DATA : LV_INDEX1 TYPE I. DATA : LV_INDEX2 TYPE I. DATA : LV_INDEX3 TYPE I. LV_PATH = 'C:\PO\' && P_EBELN && '_' && SY-UZEIT && '.PDF'. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS LV_PATH CHANGING P_ICON P_MESSAGE. IF P_ICON IS INITIAL. CALL FUNCTION 'GUI_UPLOAD' EXPORTING FILENAME = LV_PATH FILETYPE = 'BIN' IMPORTING FILELENGTH = LV_VLINE TABLES DATA_TAB = LT_BIN[]. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING INPUT_LENGTH = LV_VLINE IMPORTING BUFFER = LV_CONTENT TABLES BINARY_TAB = LT_BIN EXCEPTIONS FAILED = 1 OTHERS = 2. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = LV_CONTENT IMPORTING OUTPUT_LENGTH = LV_VLINE TABLES BINARY_TAB = LT_CONTENT_BIN. TRY. * 创建发送请求 CL_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ). SELECT SINGLE BUTXT INTO LV_BUTXT FROM T001 WHERE BUKRS = P_BUKRS. **处理标题头内容 CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO LV_TITLE SEPARATED BY SPACE. **处理邮件内容 *DG01 要求加上客制化描述 * IF P_BUKRS EQ 'DG01'. * IF SY-LANGU EQ '1'. * LS_MAIN_TEXT = * '附件是东莞长城开发新订单,请收到订单后邮件回复确认给采购员,并于3个工作日内在供应商平台上确认订单交期。供应商平台网址:https://sp.kaifa.cn '. * ELSE. * DATA(LV_STR) = 'The attachment is the new PO of Dongguan Kaifa Technology Co.,Ltd,' * && 'Please reply to the buyer after receiving the PO, and confirm the order delivery date on the supplier portal within 3 working days.' * && 'Supplier portal website(URL): https://sp.kaifa.cn '. * LS_MAIN_TEXT = LV_STR. * ENDIF. * APPEND LS_MAIN_TEXT TO LT_MAIN_TEXT. * ENDIF. * 创建整理发送内容 CL_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT( I_TYPE = 'RAW' I_TEXT = LT_MAIN_TEXT I_SUBJECT = LV_TITLE ). * 添加附件 DATA:L_OBJTP TYPE SOODK-OBJTP. DATA:L_OBJDES TYPE SOOD-OBJDES. L_OBJTP = 'PDF'. * l_objdes = p_ebeln && p_mcod1. CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO L_OBJDES SEPARATED BY SPACE. CALL METHOD CL_DOCUMENT->ADD_ATTACHMENT EXPORTING I_ATTACHMENT_TYPE = L_OBJTP I_ATTACHMENT_SUBJECT = L_OBJDES I_ATT_CONTENT_HEX = LT_CONTENT_BIN. * 添加邮件内容到发送请求 CL_SEND_REQUEST->SET_DOCUMENT( CL_DOCUMENT ). * 指定邮件发件人为采购员邮箱 * data:lv_sendtype type SX_ADDRTYP value '*', * lv_address_string type string value 'yuli@kaifa.cn', * lv_address_name type string value 'Yuli'. * cl_sender->ADDRESS_TYPE( lv_sendtype ). * cl_sender->ADDRESS_STRING( EXPORTING result = lv_address_string ). * cl_sender->ADDRESS_NAME( EXPORTING result = lv_address_name ). * cl_send_request->set_sender( cl_sender ). * data: sender type ref to cl_sapuser_bcs, * lv_uname type sy-uname value 'DTANG.IS'. * sender = cl_sapuser_bcs=>create( lv_uname ). * call method cl_send_request->set_sender * exporting * i_sender = sender. *modify by songjiaru 20200519 *----------------指定发件人----------------------------* CLEAR GS_MAIL-SMTP_ADDR. SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR FROM T024 WHERE EKGRP = P_EKGRP. DATA(LO_SENDER) = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS_STRING = GS_MAIL-SMTP_ADDR I_ADDRESS_NAME = GS_MAIL-SMTP_ADDR ). CALL METHOD CL_SEND_REQUEST->SET_SENDER EXPORTING I_SENDER = LO_SENDER. * "指定邮件接收人 * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = P_ADRNR. * CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). * CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). * ENDLOOP. IF GS_MAIL-SMTP_ADDR IS NOT INITIAL. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDIF. IF P_CLSS = 'X'. * CLEAR GS_MAIL-SMTP_ADDR. * SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR * FROM T024 * WHERE EKGRP = P_EKGRP. LV_INDEX1 = 0. LV_INDEX2 = 0. LV_INDEX3 = 1. CLEAR LT_RECIEVE. WHILE ( LV_INDEX3 <= STRLEN( P_EMAIL ) ). LV_INDEX2 = LV_INDEX2 + 1. LV_INDEX3 = LV_INDEX3 + 1. IF P_EMAIL+LV_INDEX1(LV_INDEX2) CA '/'. LV_INDEX2 = LV_INDEX2 - 1 . LS_RECIEVE-EMAIL = P_EMAIL+LV_INDEX1(LV_INDEX2). APPEND LS_RECIEVE TO LT_RECIEVE. CLEAR LS_RECIEVE. LV_INDEX1 = LV_INDEX3 - 1. LV_INDEX2 = 0. ENDIF. ENDWHILE. LOOP AT LT_RECIEVE INTO LS_RECIEVE. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_RECIEVE-EMAIL ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDLOOP. ENDIF. ** 正式发送并提交作业 CLEAR LV_BOOL. "将邮件置于发件箱,可以在工作台outbox查看邮件的发送状态及内容 CL_SEND_REQUEST->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ). CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_REQUESTED_STATUS EXPORTING I_REQUESTED_STATUS = 'N'. CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_STATUS_MAIL EXPORTING I_STATUS_MAIL = 'A'. CL_SEND_REQUEST->SET_SEND_IMMEDIATELY( 'X' ). LV_BOOL = CL_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X'). IF LV_BOOL = 'X'. COMMIT WORK. * submit rsconn01 with mode = 'INT' and return. IF LT_CONTENT_BIN IS INITIAL. P_ICON = '@0A@'. P_MESSAGE = TEXT-004. "默认导入成功 ELSE. P_ICON = '@08@'. P_MESSAGE = TEXT-005. "默认导入成功 P_ERDAT = SY-DATUM. CLEAR LS_ZT37. LS_ZT37-EBELN = P_EBELN. LS_ZT37-ERDAT = SY-DATUM. LS_ZT37-ERTIM = SY-UZEIT. LS_ZT37-ERNAM = SY-UNAME. MODIFY ZNMMT037 FROM LS_ZT37. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-006. "默认导入成功 ROLLBACK WORK. ENDIF. CATCH CX_BCS INTO CL_BCS_EXCEPTION. P_ICON = '@0A@'. P_MESSAGE = TEXT-006 && CL_BCS_EXCEPTION->ERROR_TYPE.. "默认导入成功 ENDTRY. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& --> GS_DATA_TDSPOOLID *&---------------------------------------------------------------------* FORM FRM_DOWN_PDF USING P_EBELN P_SPRAS. DATA:LV_ICON TYPE ICON-NAME, LV_MESSAGE TYPE C LENGTH 120. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS '' CHANGING LV_ICON LV_MESSAGE. IF LV_ICON NE ''. LV_MESSAGE = P_EBELN && LV_MESSAGE. MESSAGE LV_MESSAGE TYPE 'E' . ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_EBELN *& --> P_SPRAS *& <-- P_ICON *& <-- P_MESSAGE *&---------------------------------------------------------------------* FORM FRM_GET_PDF USING P_EBELN P_SPRAS P_PATH CHANGING P_ICON P_MESSAGE. DATA:LT_PDF LIKE TLINE OCCURS 0 WITH HEADER LINE, LS_PDF LIKE TLINE. DATA:LS_NAST LIKE NAST, LV_SUBRC TYPE SY-SUBRC, LV_VLINE TYPE I, LV_SMARTFORM_NAME TYPE RS38L_FNAM VALUE 'ZPO_FORM', " 请替换为实际的Smart Form名称 LV_TEMPLATE TYPE STXH-TDNAME VALUE 'ZPO_FORM'. " 请替换为实际的模板名称 FIELD-SYMBOLS <FS_VALUE> TYPE ITCPP. SELECT SINGLE * INTO LS_NAST FROM NAST WHERE OBJKY = P_EBELN AND SPRAS = P_SPRAS. CALL FUNCTION 'WFMC_MESSAGE_SINGLE' EXPORTING PI_NAST = LS_NAST IMPORTING PE_RCODE = LV_SUBRC. IF LV_SUBRC = 0. ASSIGN ('(SAPLMEDRUCK)RESULT') TO <FS_VALUE>. IF <FS_VALUE>-TDSPOOLID IS NOT INITIAL. CLEAR LT_PDF. " 使用Smart Forms函数替代原函数 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING FORMNAME = ZPO_FORM IMPORTING FM_NAME = LV_FM_NAME EXCEPTIONS NO_FORM = 1 NO_FUNCTION_MODULE = 2 OTHERS = 3. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '获取Smart Forms函数失败'. EXIT. ENDIF. " 动态调用Smart Forms函数 CALL FUNCTION LV_FM_NAME EXPORTING EXPORTING = 'X' TEMPLATE = LV_TEMPLATE OUTPUT_OPTIONS = LS_OUTPUT_OPTIONS IMPORTING JOB_OUTPUT_INFO = LS_JOB_OUTPUT_INFO TABLES LINES = LT_PDF EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '执行ZPO_FORM函数失败'. EXIT. ENDIF. " 计算PDF字节数 LV_VLINE = LINES( LT_PDF ). IF LT_PDF[] IS NOT INITIAL. "先下载到本地,再上载做为附件 IF P_PATH IS NOT INITIAL. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = P_PATH FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ELSE. DATA:LV_FILE TYPE STRING. PERFORM FRM_GET_PATH USING LV_FILE. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = LV_FILE FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-007. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-008. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-009. "默认导入成功 ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PATH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> LV_PATH *&---------------------------------------------------------------------* FORM FRM_GET_PATH USING P_FILE. DATA: L_V_FILE_FILTER TYPE STRING. DATA: L_V_FILETABLE TYPE FILE_TABLE, L_T_FILETABLE TYPE FILETABLE. DATA: L_V_RC TYPE I. DATA: L_V_USER_ACTION TYPE I. * l_v_file_filter = '(*.xlsx;*.xls)|*.xlsx;*.xls|'. L_V_FILE_FILTER = '(*.PDF)|*.PDF|'. CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG( EXPORTING WINDOW_TITLE = '选择文件' FILE_FILTER = L_V_FILE_FILTER CHANGING FILE_TABLE = L_T_FILETABLE RC = L_V_RC USER_ACTION = L_V_USER_ACTION ). CHECK L_V_USER_ACTION EQ 0. CHECK L_T_FILETABLE[] IS NOT INITIAL. READ TABLE L_T_FILETABLE INTO L_V_FILETABLE INDEX 1. P_FILE = L_V_FILETABLE-FILENAME. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MOD_SCREEN *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MOD_SCREEN . LOOP AT SCREEN. IF SCREEN-GROUP1 = 'M1'. IF R1 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M2'. IF R2 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M3'. IF R3 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. MODIFY SCREEN. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_TEMPLATE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DOWN_TEMPLATE . CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'. SET PROPERTY OF V_EXCEL 'VISIBLE' = 1. CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_BOOK . CALL METHOD OF V_BOOK 'ADD'. IF SY-LANGU EQ '1'. PERFORM FRM_FILL_CELL USING: 1 1 '供应商代码(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 '采购组织(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 '工厂(选填)' 40 0 10, 1 4 '采购员(选填)' 40 0 10, 1 5 '订单发送邮箱(必填)' 40 0 10. ELSE. PERFORM FRM_FILL_CELL USING: 1 1 'Vendor Code(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 'Purchase Organization(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 'Plant' 40 0 10, 1 4 'Buyer.Code' 40 0 10, " add buyer code 20210413 wahkenlee 1 5 'Email' 40 0 10. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_1 *& --> P_1 *& --> P_ *& --> P_40 *& --> P_0 *& --> P_10 *&---------------------------------------------------------------------* FORM FRM_FILL_CELL USING FU_ROW FU_COLUMN FU_VALUE FU_COLOR FU_BOLD FU_SIZE. DATA: L_CELL TYPE OLE2_OBJECT, L_COLOR TYPE OLE2_OBJECT, L_BOLD TYPE OLE2_OBJECT, L_COLUMN TYPE OLE2_OBJECT. CALL METHOD OF V_EXCEL 'CELLS' = L_CELL EXPORTING #1 = FU_ROW #2 = FU_COLUMN. SET PROPERTY OF L_CELL 'Value' = FU_VALUE. "赋值。" * call method of L_CELL 'INTERIOR' = int. GET PROPERTY OF L_CELL 'Interior' = L_COLOR. SET PROPERTY OF L_COLOR 'ColorIndex' = FU_COLOR. "根据值 显示对应的颜色。 GET PROPERTY OF L_CELL 'Font' = L_BOLD. SET PROPERTY OF L_BOLD 'Bold' = FU_BOLD. "1是加粗,0是不加粗" SET PROPERTY OF L_BOLD 'SIZE' = FU_SIZE. "设置字体大小。" CALL METHOD OF V_EXCEL 'Columns' = L_COLUMN " 选定列 EXPORTING #1 = FU_COLUMN . SET PROPERTY OF L_COLUMN 'ColumnWidth' = 20. " 定义列宽 SET PROPERTY OF L_COLUMN 'rowheight' = 24. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MAINTAIN_EMAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MAINTAIN_EMAIL . PERFORM FRM_CHECK_AUTH. PERFORM FRM_UPLOAD_DATA. PERFORM FRM_CHECK_DATA. PERFORM FRM_UPDATE_DATA. PERFORM FRM_ALV. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPLOAD_DATA . CLEAR : GS_ITEM ,GT_ITEM. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = GV_FILE I_BEGIN_COL = 1 I_BEGIN_ROW = 2 I_END_COL = 5 I_END_ROW = 65535 TABLES INTERN = GT_ALSM EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE S000(ZMM) WITH TEXT-010 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. * 转换数据 LOOP AT GT_ALSM. ASSIGN COMPONENT GT_ALSM-COL OF STRUCTURE GS_ITEM TO <GFS_DATA>. TRANSLATE GT_ALSM-VALUE TO UPPER CASE. <GFS_DATA> = GT_ALSM-VALUE. AT END OF ROW. APPEND GS_ITEM TO GT_ITEM. CLEAR GS_ITEM. ENDAT. ENDLOOP. LOOP AT GT_ITEM ASSIGNING FIELD-SYMBOL(<LFS_ITEM>). CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = <LFS_ITEM>-LIFNR IMPORTING OUTPUT = <LFS_ITEM>-LIFNR. ENDLOOP. IF GT_ITEM IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-011 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_DATA . DATA LV_NAME TYPE STRING . data:ls_email_stru type SX_ADDRESS, ls_email_stru_out type SX_ADDRESS. *前面已经判断过gt_item 不为空 SELECT LFA1~LIFNR , LFA1~NAME1 INTO TABLE @GT_LFA1 FROM LFA1 FOR ALL ENTRIES IN @GT_ITEM WHERE LFA1~LIFNR = @GT_ITEM-LIFNR. SORT GT_LFA1 BY LIFNR . SELECT T024E~EKORG , T001K~BWKEY FROM T024E INNER JOIN T001K ON T024E~BUKRS = T001K~BUKRS FOR ALL ENTRIES IN @GT_ITEM WHERE T024E~EKORG = @GT_ITEM-EKORG INTO TABLE @DATA(LT_T024E). SELECT T024~EKGRP FROM T024 FOR ALL ENTRIES IN @GT_ITEM WHERE T024~EKGRP = @GT_ITEM-EKGRP INTO TABLE @DATA(LT_T024). SORT LT_T024E BY EKORG BWKEY. SORT LT_T024 BY EKGRP. DATA LS_T024E LIKE LINE OF LT_T024E. DATA LS_T024 LIKE LINE OF LT_T024. LOOP AT GT_ITEM INTO GS_ITEM. MOVE-CORRESPONDING GS_ITEM TO GS_MESSAGE. CLEAR GS_LFA1. READ TABLE GT_LFA1 INTO GS_LFA1 WITH KEY LIFNR = GS_ITEM-LIFNR BINARY SEARCH . IF SY-SUBRC <> 0. GS_MESSAGE-MESSAGE = TEXT-012. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-NAME1 = GS_LFA1-NAME1. ENDIF. IF GS_ITEM-EKORG IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-013 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. IF GS_ITEM-WERKS IS NOT INITIAL AND GS_ITEM-EKORG IS NOT INITIAL. CLEAR LS_T024E. READ TABLE LT_T024E INTO LS_T024E WITH KEY EKORG = GS_ITEM-EKORG BWKEY = GS_ITEM-WERKS BINARY SEARCH. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-014 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_ITEM-EMAIL IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE '' INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. "校验导入邮箱的格式 ls_email_stru-type = 'INT'. ls_email_stru-address = gs_item-email. CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL' EXPORTING ADDRESS_UNSTRUCT = ls_email_stru IMPORTING ADDRESS_NORMAL = ls_email_stru_out EXCEPTIONS ERROR_ADDRESS_TYPE = 1 ERROR_ADDRESS = 2 ERROR_GROUP_ADDRESS = 3 OTHERS = 4. if ls_email_stru is INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-025 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. endif. ENDIF. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. IF LV_NAME IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-016 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-UNAME = LV_NAME. ENDIF. IF GS_ITEM-EKGRP IS NOT INITIAL. CLEAR:LS_T024. READ TABLE LT_T024 INTO LS_T024 WITH KEY EKGRP = GS_ITEM-EKGRP. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-024 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_MESSAGE-FLAG <> 'X'. CONCATENATE TEXT-017 SY-DATUM+0(4) '/' SY-DATUM+4(2) '/' SY-DATUM+6(2) TEXT-018 SYST-UZEIT+0(2) ':' SYST-UZEIT+2(2) ':' SYST-UZEIT+4(2) INTO GS_MESSAGE-MESSAGE. ENDIF. APPEND GS_MESSAGE TO GT_MESSAGE. CLEAR GS_MESSAGE. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPDATE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPDATE_DATA . DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_MESSAGE INTO GS_MESSAGE WHERE FLAG <> 'X'. MOVE-CORRESPONDING GS_MESSAGE TO LS_ZNMMT037A. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDLOOP. IF LT_ZNMMT037A IS NOT INITIAL. MODIFY ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-DBCNT <> 0. COMMIT WORK. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_ALV . CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. MOVE-CORRESPONDING GT_MESSAGE TO GT_EMAIL_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'Domain' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS1' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND2' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_EMAIL_ALV EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM FRM_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0100' . ENDFORM. FORM FRM_SET_PF_STATUS1 USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0200' . ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_QUERY *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_QUERY . CLEAR : GT_QUERY_ALV. CLEAR : GS_QUERY_ALV. CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~NAME1 , ZNMMT037A~EKORG , ZNMMT037A~WERKS , ZNMMT037A~EMAIL , ZNMMT037A~UNAME , ZNMMT037A~MESSAGE , ZNMMT037A~EKGRP FROM ZNMMT037A WHERE ZNMMT037A~LIFNR IN @S_LIFNR1 AND ZNMMT037A~EKORG IN @S_EKORG1 AND ZNMMT037A~WERKS IN @S_WERKS INTO TABLE @DATA(LT_ZNMMT037A) . MOVE-CORRESPONDING LT_ZNMMT037A TO GT_QUERY_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'DOMAIN_NAME' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. GS_LAYOUT1-BOX_FIELDNAME = 'BOX'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND1' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_QUERY_ALV EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM FRM_USER_COMMAND1 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. DATA : LV_SELTAB TYPE TABLE OF RSPARAMS. CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' "获取当前的选择屏幕元素 EXPORTING CURR_REPORT = SY-REPID * IMPORTING * SP = TABLES SELECTION_TABLE = LV_SELTAB * SELECTION_TABLE_255 = EXCEPTIONS NOT_FOUND = 1 NO_REPORT = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. "使用获取到的屏幕元素跳转初始界面 SUBMIT ZNMMR037 WITH SELECTION-TABLE LV_SELTAB VIA SELECTION-SCREEN. WHEN 'DELETE'. IF R2 = 'X'. PERFORM FRM_DELETE_DATA. ENDIF. WHEN OTHERS. ENDCASE. ENDFORM. FORM FRM_USER_COMMAND2 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. LEAVE TO SCREEN 0. WHEN OTHERS. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DELETE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DELETE_DATA . DATA : LS_COUNT TYPE I VALUE 0."删除记录的条数 DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A TYPE ZNMMT037A. DATA : LT_ALV LIKE GT_QUERY_ALV. DATA : LS_ALV LIKE LINE OF LT_ALV. CLEAR : LT_ZNMMT037A, LS_ZNMMT037A, LT_ALV, LS_ALV. LOOP AT GT_QUERY_ALV INTO GS_QUERY_ALV. IF GS_QUERY_ALV-BOX EQ 'X'. MOVE-CORRESPONDING GS_QUERY_ALV TO LS_ALV. APPEND LS_ALV TO LT_ALV. CLEAR LS_ALV. LS_ZNMMT037A-LIFNR = GS_QUERY_ALV-LIFNR. LS_ZNMMT037A-EKORG = GS_QUERY_ALV-EKORG. LS_ZNMMT037A-WERKS = GS_QUERY_ALV-WERKS. LS_ZNMMT037A-EMAIL = GS_QUERY_ALV-EMAIL. LS_ZNMMT037A-EKGRP = GS_QUERY_ALV-EKGRP. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDIF. ENDLOOP. IF LT_ZNMMT037A IS INITIAL. MESSAGE E322(ZMM) DISPLAY LIKE 'W'. ENDIF. DELETE ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-SUBRC EQ 0. COMMIT WORK AND WAIT. LOOP AT LT_ALV INTO LS_ALV. DELETE TABLE GT_QUERY_ALV FROM LS_ALV. LS_COUNT = LS_COUNT + 1. ENDLOOP. MESSAGE S104(ZMM) WITH LS_COUNT. DATA: LV_REF_GRID TYPE REF TO CL_GUI_ALV_GRID, LV_VALID TYPE C. IF LV_REF_GRID IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING E_GRID = LV_REF_GRID. ENDIF. IF NOT LV_REF_GRID IS INITIAL. LV_REF_GRID->CHECK_CHANGED_DATA( IMPORTING E_VALID = LV_VALID ). ENDIF. IF LV_VALID IS NOT INITIAL. LV_REF_GRID->REFRESH_TABLE_DISPLAY( ) . ENDIF. ELSE. ROLLBACK WORK. MESSAGE E105(ZMM). ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_AUTH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_AUTH . DATA LV_NAME TYPE STRING . CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT SINGLE ZNMMT037B~DOMAIN_USER INTO @DATA(LV_DOMAIN) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND DOMAIN_USER = @LV_NAME. SELECT SINGLE ZNMMT037B~UNAME INTO @DATA(LV_UNAME) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND UNAME = @SY-UNAME. IF LV_DOMAIN IS INITIAL AND LV_UNAME IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-019 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK . DATA: LV_STRING TYPE STRING. DATA : LV_NAME TYPE STRING. FIELD-SYMBOLS : <LFS_WERKS> LIKE GS_WERKS. CLEAR GT_WERKS. CLEAR GS_WERKS. IF S_WERKS1[] IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-023. LEAVE LIST-PROCESSING. ELSE. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT ZME2M_PLANT~UNAME , ZME2M_PLANT~USER_DOMAIN ,ZME2M_PLANT~WERKS_LIST FROM ZME2M_PLANT WHERE ZME2M_PLANT~USER_DOMAIN = @LV_NAME INTO TABLE @DATA(LT_PLANT). SORT LT_PLANT BY WERKS_LIST. SELECT T001W~WERKS FROM T001W WHERE T001W~WERKS IN @S_WERKS1 INTO CORRESPONDING FIELDS OF TABLE @GT_WERKS. SORT GT_WERKS BY WERKS. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-022 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. IF LT_PLANT IS NOT INITIAL."在单点登录权限里面的用户在需要检查,不在里面的不需要检查 LOOP AT LT_PLANT INTO DATA(LS_PLANT). READ TABLE GT_WERKS WITH KEY WERKS = LS_PLANT-WERKS_LIST TRANSPORTING NO FIELDS BINARY SEARCH. IF SY-SUBRC <> 0. DELETE GT_WERKS WHERE WERKS = LS_PLANT-WERKS_LIST. ENDIF. ENDLOOP. ENDIF. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-021. LEAVE LIST-PROCESSING . ENDIF. LOOP AT GT_WERKS ASSIGNING <LFS_WERKS> . AUTHORITY-CHECK OBJECT 'M_BEST_WRK' ID 'ACTVT' FIELD '03' ID 'WERKS' FIELD <LFS_WERKS>-WERKS. IF SY-SUBRC <> 0. <LFS_WERKS>-FLAG = 'X'. ENDIF. ENDLOOP. DELETE GT_WERKS WHERE FLAG = 'X'. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-020 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING . ENDIF. ENDIF. CLEAR S_WERKS1[]. CLEAR S_WERKS1. LOOP AT GT_WERKS INTO GS_WERKS. S_WERKS1-SIGN = 'I'. S_WERKS1-OPTION = 'EQ'. S_WERKS1-LOW = GS_WERKS-WERKS. APPEND S_WERKS1. CLEAR S_WERKS1. ENDLOOP. ENDFORM.
05-16
FUNCTION /sc1/ftd_mm_migo. *"---------------------------------------------------------------------- *"*"本地接口: *"  TABLES *"      ET_RETURN STRUCTURE  /SC1/FTD_MM_BAPIRET *"      IT_INPUT STRUCTURE  /SC1/S_WIS_INPUT *"----------------------------------------------------------------------   DATA: lt_po          TYPE STANDARD TABLE OF /sc1/s_wis_input,         lt_inbound_do  TYPE STANDARD TABLE OF /sc1/s_wis_input,         lt_outbound_do TYPE STANDARD TABLE OF /sc1/s_wis_input,         lt_tl          TYPE STANDARD TABLE OF /sc1/s_wis_input,"铁笼物料做无采购订单收货         lt_ekpo        TYPE STANDARD TABLE OF ty_ekpo,         lt_return      TYPE STANDARD TABLE OF /sc1/ftd_mm_bapiret,         lt_/sc1/mm_migo_log TYPE STANDARD TABLE OF /sc1/mm_migo_log.   "拆分数据&过滤掉已经收货成功的数据   PERFORM split_data TABLES it_input       "传入参数                             lt_po          "采购订单                             lt_inbound_do  "内向交货                             lt_outbound_do "外向交货                             lt_tl          "铁笼物料                             lt_ekpo.   "采购订单收货   PERFORM action_po TABLES lt_po  lt_ekpo  lt_return lt_/sc1/mm_migo_log.   "内向交货单收货   PERFORM action_inbound_do TABLES lt_inbound_do  lt_return lt_/sc1/mm_migo_log.   "外向交货单收货   PERFORM action_outbound_do TABLES lt_outbound_do  lt_return lt_/sc1/mm_migo_log.   "铁笼物料收货   PERFORM action_tl TABLES lt_tl  lt_return lt_/sc1/mm_migo_log.   "保存日志   PERFORM save_log TABLES lt_return lt_/sc1/mm_migo_log.   "编辑消息   PERFORM edit_msg TABLES lt_return et_return . ENDFUNCTION. *----------------------------------------------------------------------* ***INCLUDE /SC1/LFTD_MM_WISF03. *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *&      Form  GET_DATA_MIO1_NEW *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_ITEM[]  text *      -->P_LS_HEAD  text *      <--P_LT_RETURN1  text *      <--P_LV_EBELN  text *      <--P_LV_VBELN  text *----------------------------------------------------------------------* FORM action_po TABLES   pt_po STRUCTURE /sc1/s_wis_input                         pt_ekpo TYPE ty_t_ekpo                         et_return STRUCTURE /sc1/ftd_mm_bapiret                         et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.   DATA: lt_po_sh     TYPE STANDARD TABLE OF ty_po_sh.   DATA: ls_po_sh     TYPE ty_po_sh.   DATA: lt_ekbe      TYPE STANDARD TABLE OF ekbe,         lt_ekbe_sum  TYPE STANDARD TABLE OF ekbe,         ls_ekbe_sum  TYPE ekbe,         ls_po        TYPE /sc1/s_wis_input,         lv_menge_temp TYPE ekpo-menge,         lv_end_flg    TYPE char1,         lt_ekpo_temp  TYPE ty_t_ekpo.   DATA:ls_return TYPE /sc1/ftd_mm_bapiret .   FIELD-SYMBOLS:<ls_ekpo> TYPE ty_ekpo,                 <ls_po>   TYPE  /sc1/s_wis_input.   CHECK pt_po[] IS NOT INITIAL.   READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .   CHECK sy-subrc <> 0.   "(2)根据上一步获得的信息,获取每个项目当前待入库的剩余量;   "(2)-1:获取采购订单历史数据   IF pt_ekpo[] IS NOT INITIAL.     SELECT ebeln            ebelp            menge            shkzg       FROM ekbe       INTO CORRESPONDING FIELDS OF TABLE lt_ekbe       FOR ALL ENTRIES IN pt_ekpo[]       WHERE ebeln = pt_ekpo-ebeln         AND ebelp = pt_ekpo-ebelp.   ENDIF.   "(2)-2:计算已收货总数量   LOOP AT lt_ekbe ASSIGNING FIELD-SYMBOL(<ls_ekbe>).     IF <ls_ekbe>-shkzg = 'H'.       <ls_ekbe>-menge  = <ls_ekbe>-menge * -1.     ENDIF.     CLEAR <ls_ekbe>-shkzg.     COLLECT <ls_ekbe> INTO lt_ekbe_sum.   ENDLOOP.   "(2)-3:计算每个行项目的剩余库存   LOOP AT pt_ekpo ASSIGNING <ls_ekpo>.     READ TABLE  lt_ekbe_sum INTO ls_ekbe_sum                          WITH KEY ebeln = <ls_ekpo>-ebeln                                   ebelp = <ls_ekpo>-ebelp .     IF sy-subrc = 0."采购订单部分收货       <ls_ekpo>-menge_re =  <ls_ekpo>-menge - ls_ekbe_sum-menge.     ELSE."采购订单没有进行过收货       <ls_ekpo>-menge_re = <ls_ekpo>-menge.     ENDIF.   ENDLOOP.   "(3)(4)入库数量分配   SORT pt_po BY matnr.   LOOP AT pt_po ASSIGNING <ls_po>.     MOVE-CORRESPONDING <ls_po> TO ls_po_sh.     "先本单全收货     LOOP AT pt_ekpo ASSIGNING <ls_ekpo> WHERE matnr = <ls_po>-matnr AND ebeln = <ls_po>-vbeln.       "(本次收货数量 - 采购单剩余数量) 大于0说明采购订单剩余量不够收货用,采购订单剩余收货数量一定为0       IF ( <ls_po>-lfimg - <ls_ekpo>-menge_re ) >= 0.         <ls_ekpo>-menge_sh = <ls_ekpo>-menge_sh + <ls_ekpo>-menge_re.         "SKU入库数量         <ls_po>-lfimg = <ls_po>-lfimg - <ls_ekpo>-menge_re.         ls_po_sh-lfimg = <ls_ekpo>-menge_re."采购订单本次收货数量=采购订单剩余数量 1         <ls_ekpo>-menge_re = 0.             "采购订单剩余收货数量一定为0           2,1和2的赋值顺序不能变         ls_po_sh-ebeln = <ls_ekpo>-ebeln.         ls_po_sh-ebelp = <ls_ekpo>-ebelp.         COLLECT ls_po_sh INTO lt_po_sh.       ELSE."采购订单剩余量>本次收货量         <ls_ekpo>-menge_sh = <ls_ekpo>-menge_sh + <ls_po>-lfimg .         <ls_ekpo>-menge_re = <ls_ekpo>-menge_re - <ls_po>-lfimg.         ls_po_sh-lfimg = <ls_po>-lfimg.  "收货数量         ls_po_sh-ebeln = <ls_ekpo>-ebeln.         ls_po_sh-ebelp = <ls_ekpo>-ebelp.         COLLECT ls_po_sh INTO lt_po_sh.         <ls_po>-lfimg = 0. "待收货数量为0,结束         EXIT.       ENDIF.     ENDLOOP.     "如果本单全收货后还有剩余,则在剩下的po中同物料进行收货     IF <ls_po>-lfimg  > 0."       LOOP AT pt_ekpo ASSIGNING <ls_ekpo> WHERE matnr = <ls_po>-matnr .         IF  <ls_ekpo>-ebeln <> <ls_po>-vbeln.           IF ( <ls_po>-lfimg - <ls_ekpo>-menge_re ) >= 0.             ls_po_sh-lfimg = <ls_ekpo>-menge_re."收货数量           ELSE.             ls_po_sh-lfimg = <ls_po>-lfimg."收货数量           ENDIF.           ls_po_sh-ebeln = <ls_ekpo>-ebeln.           ls_po_sh-ebelp = <ls_ekpo>-ebelp.           COLLECT ls_po_sh INTO lt_po_sh.           "SKU入库数量           <ls_po>-lfimg = <ls_po>-lfimg - <ls_ekpo>-menge_re.           "SKU剩余入库数量           <ls_ekpo>-menge_re = <ls_ekpo>-menge_re - <ls_po>-lfimg.           IF <ls_po>-lfimg <= 0."SKU入库数量已分配完成,结束分配             EXIT.           ELSEIF <ls_po>-lfimg > 0."SKU入库数量未分配完,需要继续分配           ENDIF.         ENDIF.       ENDLOOP.     ENDIF.   ENDLOOP.   SORT pt_ekpo BY matnr.   LOOP AT pt_po INTO ls_po.     IF ls_po-lfimg > 0."没有       ls_return-uuid = ls_po-uuid.       ls_return-type = 'E'.       ls_return-message =  '库存数量不足'.       APPEND ls_return TO et_return.       DELETE  lt_po_sh WHERE matnr = ls_po-matnr.     ENDIF.   ENDLOOP.   "收货   SORT lt_po_sh BY ebeln ebelp.   PERFORM goodsmvt_create_new TABLES et_return  USING lt_po_sh.   PERFORM edit_log TABLES pt_po                           et_return                           et_/sc1/mm_migo_log. ENDFORM.                    " GET_DATA_MIO1_NEW *&---------------------------------------------------------------------* *&      Form  GOODSMVT_CREATE *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *  -->  p1        text *  <--  p2        text *----------------------------------------------------------------------* FORM goodsmvt_create  TABLES et_return STRUCTURE /sc1/ftd_mm_bapiret                       USING pt_ekpo TYPE ty_t_ekpo                            ps_po    TYPE /sc1/s_wis_input.   "BAPI_GOODSMVT_CREATE 用内表 begin   DATA lv_mblnr            TYPE mseg-mblnr.   DATA ls_goodsmvt_header  TYPE bapi2017_gm_head_01.   DATA ls_code             LIKE  bapi2017_gm_code.   DATA ls_goodsmvt_item    TYPE bapi2017_gm_item_create.   DATA lt_goodsmvt_item    TYPE STANDARD TABLE OF  bapi2017_gm_item_create.   DATA lt_return           TYPE STANDARD TABLE OF bapiret2.   DATA ls_return           TYPE bapiret2.   "BAPI_GOODSMVT_CREATE 用内表 end   DATA: ls_ekpo            TYPE ty_ekpo.   DATA: ls_et_return       TYPE /sc1/ftd_mm_bapiret.   LOOP AT pt_ekpo INTO ls_ekpo.     CLEAR ls_goodsmvt_item.     ls_goodsmvt_item-material  = ps_po-matnr.     ls_goodsmvt_item-move_type =  '101'.    "移动类型     ls_goodsmvt_item-mvt_ind   = 'B'.       "移动标识     ls_goodsmvt_item-entry_qnt = ls_ekpo-menge_sh.     ls_goodsmvt_item-entry_uom = ps_po-meins.     ls_goodsmvt_item-plant     = ps_po-werks.     ls_goodsmvt_item-stge_loc  = ps_po-lgort.     ls_goodsmvt_item-batch     = ps_po-charg.     ls_goodsmvt_item-prod_date = ps_po-hsdat."生产日期     ls_goodsmvt_item-expirydate = ps_po-vfdat."货架寿命到期日     ls_goodsmvt_item-vendrbatch = ps_po-licha."供应商批次     ls_goodsmvt_item-stck_type  = ps_po-insmk.     ls_goodsmvt_item-po_number  = ls_ekpo-ebeln.     ls_goodsmvt_item-po_item    = ls_ekpo-ebelp.     IF ls_goodsmvt_item-entry_qnt IS NOT INITIAL.       APPEND ls_goodsmvt_item TO lt_goodsmvt_item.     ENDIF.   ENDLOOP.   ls_goodsmvt_header-pstng_date  = ps_po-wadat_ist."凭证中的过帐日期   ls_goodsmvt_header-doc_date    = sy-datum."凭证中的凭证日期   ls_goodsmvt_header-pr_uname    = sy-datum.    "用户名   ls_goodsmvt_header-ref_doc_no  = ls_ekpo-ebeln.   ls_code-gm_code                = '01'.  "按照采购订单收货   CALL FUNCTION 'BAPI_GOODSMVT_CREATE'     EXPORTING       goodsmvt_header  = ls_goodsmvt_header       goodsmvt_code    = ls_code     IMPORTING       materialdocument = lv_mblnr     TABLES       goodsmvt_item    = lt_goodsmvt_item       return           = lt_return.   READ TABLE lt_return WITH KEY  type = 'E' INTO ls_return.   IF  sy-subrc = 0.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .     ls_et_return-uuid = ps_po-uuid.     ls_et_return-type = 'E'.     LOOP AT lt_return INTO ls_return WHERE type = 'E' .       CONCATENATE ls_et_return-message ls_return-message '|' INTO ls_et_return-message.     ENDLOOP.   ELSE.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.     ls_et_return-uuid = ps_po-uuid.     ls_et_return-type = 'S'.     ls_et_return-message = ps_po-vbeln && '收货成功'.   ENDIF.   APPEND ls_et_return TO et_return. ENDFORM.                    " GOODSMVT_CREATE *&---------------------------------------------------------------------* *&      Form  ACTION_INBOUND_DO *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_INBOUND_DO  text *      -->P_LT_EKPO  text *      -->P_ET_RETURN  text *----------------------------------------------------------------------* FORM action_inbound_do  TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                           et_return STRUCTURE /sc1/ftd_mm_bapiret                         et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.   DATA: lt_do_temp    TYPE STANDARD TABLE OF /sc1/s_wis_input,         ls_inbound_do TYPE /sc1/s_wis_input,         lv_end_flg    TYPE char1,         lv_exec_flg   TYPE char1.   CHECK pt_inbound_do[] IS NOT INITIAL.   READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .   CHECK sy-subrc <> 0.   SORT pt_inbound_do BY vbeln posnr.   LOOP AT pt_inbound_do INTO ls_inbound_do.     APPEND ls_inbound_do TO lt_do_temp.     AT END OF vbeln.       lv_end_flg = 'X'.     ENDAT.     IF lv_end_flg = 'X'.       CLEAR: lv_end_flg,lv_exec_flg.       "如果遇出错,剩余数据不进行收货       READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS.       IF sy-subrc = 0.         CLEAR: lt_do_temp.         CONTINUE.       ENDIF.       "比较接口传入的信息和系统中的内向交货单信息,行项目数或者数量不相同,则进行修改操作       PERFORM inbound_do_update TABLES  lt_do_temp et_return                                CHANGING lv_exec_flg.       "批次拆分       PERFORM inbound_do_batch_split TABLES  lt_do_temp et_return                                    CHANGING lv_exec_flg.       "拣配       PERFORM do_picking TABLES  lt_do_temp et_return                                CHANGING lv_exec_flg.       "过账       PERFORM inbound_do_confirm TABLES  lt_do_temp et_return                                CHANGING lv_exec_flg.       PERFORM edit_log TABLES lt_do_temp                               et_return                               et_/sc1/mm_migo_log.       CLEAR: lt_do_temp,lv_end_flg.     ENDIF.   ENDLOOP. ENDFORM.                    " ACTION_INBOUND_DO *&---------------------------------------------------------------------* *&      Form  ACTION_OUTBOUND_DO *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_INBOUND_DO  text *      -->P_LT_EKPO  text *      -->P_ET_RETURN  text *----------------------------------------------------------------------* FORM action_outbound_do  TABLES pt_outbound_do STRUCTURE /sc1/s_wis_input                           et_return STRUCTURE /sc1/ftd_mm_bapiret                         et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.   DATA: lt_do_temp  TYPE STANDARD TABLE OF /sc1/s_wis_input,         ls_outbound_do TYPE /sc1/s_wis_input,         lv_end_flg  TYPE char1,         lv_exec_flg TYPE char1.   CHECK pt_outbound_do[] IS NOT INITIAL.   READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .   CHECK sy-subrc <> 0.   SORT pt_outbound_do BY vbeln posnr.   "从数据库表获取交货单数量并与传入数量进行对比(以传入数量为准) 在小于等于数据库交货单数量的情况下对交货单进行修改   LOOP AT pt_outbound_do INTO ls_outbound_do.     APPEND ls_outbound_do TO lt_do_temp.     AT END OF vbeln.       lv_end_flg = 'X'.     ENDAT.     IF lv_end_flg = 'X'.       CLEAR: lv_end_flg,lv_exec_flg.       READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS.       IF sy-subrc = 0.         CLEAR lt_do_temp.         CONTINUE.       ENDIF.       "收货       PERFORM goodsmvt_create_outbound_do TABLES lt_do_temp et_return                                         CHANGING lv_exec_flg.       PERFORM edit_log TABLES lt_do_temp                               et_return                               et_/sc1/mm_migo_log.       CLEAR lt_do_temp.     ENDIF.   ENDLOOP. ENDFORM.                    " ACTION_INBOUND_DO *&---------------------------------------------------------------------* *&      Form  GR_INBOUND_DO *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_DO_TEMP  text *----------------------------------------------------------------------* FORM inbound_do_update   TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                                  et_return STRUCTURE /sc1/ftd_mm_bapiret                          CHANGING pv_exec_flg      TYPE c.  .   "BAPI_INB_DELIVERY_CHANGE 用变量 begin   DATA:ls_header_data TYPE bapiibdlvhdrchg.   DATA:ls_header_control TYPE bapiibdlvhdrctrlchg.   DATA:ls_delivery TYPE bapiibdlvhdrchg-deliv_numb.   DATA:lt_return  LIKE TABLE OF bapiret2 WITH HEADER LINE.   DATA:ls_return  LIKE bapiret2 .   DATA:ls_item_data TYPE bapiibdlvitemchg,        lt_item_data TYPE STANDARD TABLE OF bapiibdlvitemchg.   DATA:ls_item_control TYPE bapiibdlvitemctrlchg,        lt_item_control TYPE STANDARD TABLE OF bapiibdlvitemctrlchg.   "BAPI_INB_DELIVERY_CHANGE 用变量 end   DATA: lt_lips TYPE STANDARD TABLE OF lips,         ls_lips TYPE lips,         ls_inbound_do TYPE /sc1/s_wis_input,         ls_do   TYPE /sc1/s_wis_input,         lv_end_flg TYPE char1,         lv_msg     TYPE char255,         ls_et_return TYPE /sc1/ftd_mm_bapiret,         lt_inbound_do_temp TYPE STANDARD TABLE OF /sc1/s_wis_input,         ls_inbound_do_temp TYPE /sc1/s_wis_input.   CHECK pv_exec_flg IS  INITIAL.   LOOP AT pt_inbound_do INTO ls_inbound_do.     ls_inbound_do_temp-vbeln = ls_inbound_do-vbeln.     ls_inbound_do_temp-posnr = ls_inbound_do-posnr.     ls_inbound_do_temp-lfimg = ls_inbound_do-lfimg.     COLLECT ls_inbound_do_temp INTO lt_inbound_do_temp.   ENDLOOP.   READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.   SELECT * FROM lips     INTO CORRESPONDING FIELDS OF TABLE lt_lips     WHERE vbeln = ls_inbound_do-vbeln.   "1.比较订单行项目数和传入信息一致(接口传入行项目3条,订单4条,修改内向交货的行项目为3条(删除未传入的行项目))   "2.比较行项目数量,同理(数量以接口传入数量为主)   LOOP AT lt_lips INTO ls_lips .     READ TABLE lt_inbound_do_temp INTO ls_inbound_do_temp WITH KEY vbeln = ls_lips-vbeln                                                          posnr = ls_lips-posnr .     IF sy-subrc = 0.       IF ls_lips-lfimg <> ls_inbound_do_temp-lfimg.         CLEAR ls_item_data.         ls_item_data-deliv_numb           =  ls_lips-vbeln. "被拆分DN号         ls_item_data-deliv_item           =  ls_lips-posnr.        "被拆分DN Item         ls_item_data-material             =  ls_lips-matnr.        "物料         ls_item_data-dlv_qty              =  ls_inbound_do_temp-lfimg.  "交货数量,         ls_item_data-dlv_qty_imunit       =  ls_inbound_do_temp-lfimg.         ls_item_data-sales_unit           =  ls_lips-vrkme.        "被拆分DN销售单位         ls_item_data-sales_unit_iso       =  ls_lips-meins.        "被拆分DN基本单位         ls_item_data-fact_unit_nom        =  ls_lips-umvkz.        "销售数量转换成SKU的分子(因子)         ls_item_data-fact_unit_denom      =  ls_lips-umvkn.        "销售数量转换为 SKU 的值(分母)         APPEND ls_item_data TO lt_item_data.         CLEAR ls_item_control.         ls_item_control-deliv_numb        = ls_lips-vbeln.         "被拆分DN号         ls_item_control-deliv_item        = ls_lips-posnr.         "被拆分DN Item         ls_item_control-chg_delqty        = 'X'.                   "数量修改标志         APPEND ls_item_control TO lt_item_control.       ENDIF.     ELSE."如果没有找到对应的行项目,则删除操作       CLEAR:ls_item_data.       ls_item_data-deliv_numb      = ls_lips-vbeln.       ls_item_data-deliv_item      = ls_lips-posnr.       ls_item_data-material        = ls_lips-matnr.       ls_item_data-batch           = ls_lips-charg.       ls_item_data-dlv_qty         = ls_lips-lfimg.       ls_item_data-dlv_qty_imunit  = '0'.       ls_item_data-hieraritem      = ls_lips-posnr.       ls_item_data-usehieritm      = 1.       ls_item_data-fact_unit_nom   = ls_lips-umvkz.       ls_item_data-fact_unit_denom = ls_lips-umvkn.       ls_item_data-base_uom        = ls_lips-meins.       ls_item_data-sales_unit      = ls_lips-vrkme.       APPEND ls_item_data TO lt_item_data.       CLEAR ls_item_data.       ls_item_control-deliv_numb = ls_lips-vbeln.       ls_item_control-deliv_item = ls_lips-posnr.       ls_item_control-del_item   = 'X'.       APPEND ls_item_control TO lt_item_control.     ENDIF.   ENDLOOP.   IF lt_item_data IS NOT INITIAL.     DATA: ls_techn_control TYPE bapidlvcontrol.     ls_header_data-deliv_numb       = ls_inbound_do-vbeln.     ls_header_control-deliv_numb    = ls_inbound_do-vbeln.     ls_delivery                     = ls_inbound_do-vbeln.     ls_techn_control-upd_ind        = 'U'.     CALL FUNCTION 'BAPI_INB_DELIVERY_CHANGE'       EXPORTING         header_data    = ls_header_data         header_control = ls_header_control         delivery       = ls_delivery         techn_control  = ls_techn_control       TABLES         item_data      = lt_item_data         item_control   = lt_item_control         return         = lt_return.     READ TABLE lt_return INTO ls_return WITH KEY  type  = 'E' .     IF sy-subrc = 0.       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .       LOOP AT lt_return INTO ls_return WHERE type  = 'E'.         CALL FUNCTION 'MESSAGE_TEXT_BUILD'           EXPORTING             msgid               = sy-msgid             msgnr               = sy-msgno             msgv1               = sy-msgv1             msgv2               = sy-msgv2             msgv3               = sy-msgv3             msgv4               = sy-msgv4           IMPORTING             message_text_output = lv_msg.         CLEAR ls_et_return.       ENDLOOP.       ls_et_return-message = '交货单'&& ls_lips-vbeln && lv_msg.       ls_et_return-type = 'E'.       ls_et_return-uuid = ls_inbound_do-uuid.       APPEND ls_et_return TO lt_return.     ELSE.       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'         EXPORTING           wait = 'X'.     ENDIF.   ENDIF. ENDFORM.                    " GR_INBOUND_DO *&---------------------------------------------------------------------* *&      Form  ACTION_TL *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_OUTBOUND_DO  text *      -->P_ET_RETURN  text *----------------------------------------------------------------------* FORM action_tl  TABLES pt_tl STRUCTURE /sc1/s_wis_input                           et_return STRUCTURE /sc1/ftd_mm_bapiret                         et_/sc1/mm_migo_log STRUCTURE /sc1/mm_migo_log.                    .   "BAPI_GOODSMVT_CREATE 用内表 begin   DATA lv_mblnr            TYPE mseg-mblnr.   DATA ls_goodsmvt_header  TYPE bapi2017_gm_head_01.   DATA ls_code             LIKE  bapi2017_gm_code.   DATA ls_goodsmvt_item    TYPE bapi2017_gm_item_create.   DATA lt_goodsmvt_item    TYPE STANDARD TABLE OF  bapi2017_gm_item_create.   DATA lt_return           TYPE STANDARD TABLE OF bapiret2.   DATA ls_return           TYPE bapiret2.   "BAPI_GOODSMVT_CREATE 用内表 end   DATA: ls_tl              TYPE /sc1/s_wis_input.   DATA: ls_et_return       TYPE /sc1/ftd_mm_bapiret.   CHECK pt_tl[] IS NOT INITIAL.   READ TABLE et_return with KEY type = 'E' TRANSPORTING NO FIELDS .   CHECK sy-subrc <> 0.   LOOP AT pt_tl INTO ls_tl.     CLEAR ls_goodsmvt_item.     ls_goodsmvt_item-material  = ls_tl-matnr.     ls_goodsmvt_item-move_type =  '501'.    "无采购订单的收货     ls_goodsmvt_item-mvt_ind   = ''.        "移动标识     ls_goodsmvt_item-entry_qnt = ls_tl-lfimg.     ls_goodsmvt_item-entry_uom = ls_tl-meins.     ls_goodsmvt_item-plant     = ls_tl-werks.     ls_goodsmvt_item-stge_loc  = ls_tl-lgort.     ls_goodsmvt_item-batch     = ls_tl-charg.     ls_goodsmvt_item-prod_date = ls_tl-hsdat."生产日期     ls_goodsmvt_item-expirydate = ls_tl-vfdat."货架寿命到期日     ls_goodsmvt_item-vendrbatch = ls_tl-licha."供应商批次     ls_goodsmvt_item-stck_type  = ls_tl-insmk.     IF ls_goodsmvt_item-entry_qnt IS NOT INITIAL.       APPEND ls_goodsmvt_item TO lt_goodsmvt_item.     ENDIF.   ENDLOOP.   ls_goodsmvt_header-pstng_date  = ls_tl-wadat_ist."凭证中的过帐日期   ls_goodsmvt_header-doc_date    = sy-datum."凭证中的凭证日期   ls_goodsmvt_header-pr_uname    = sy-uname.    "用户名   ls_code-gm_code                = '05'.  "其他   CALL FUNCTION 'BAPI_GOODSMVT_CREATE'     EXPORTING       goodsmvt_header  = ls_goodsmvt_header       goodsmvt_code    = ls_code     IMPORTING       materialdocument = lv_mblnr     TABLES       goodsmvt_item    = lt_goodsmvt_item       return           = lt_return.   READ TABLE lt_return WITH KEY  type = 'E' INTO ls_return.   IF  sy-subrc = 0.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .     ls_et_return-uuid = ls_tl-uuid.     ls_et_return-type = 'E'.     LOOP AT lt_return INTO ls_return WHERE type = 'E' .       CONCATENATE ls_et_return-message ls_return-message '|' INTO ls_et_return-message.     ENDLOOP.   ELSE.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.     ls_et_return-uuid = ls_tl-uuid.     ls_et_return-type = 'S'.     ls_et_return-message = ls_tl-vbeln && '收货成功'.   ENDIF.   APPEND ls_et_return TO et_return.   PERFORM edit_log TABLES pt_tl                           et_return                           et_/sc1/mm_migo_log. ENDFORM.                    " ACTION_TL *&---------------------------------------------------------------------* *&      Form  INBOUND_DO_PICKING *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_DO_TEMP  text *      -->P_ET_RETURN  text *      -->P_ENDIF  text *----------------------------------------------------------------------* FORM do_picking  TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                             et_return STRUCTURE /sc1/ftd_mm_bapiret                             CHANGING pv_exec_flg      TYPE c.  .   "BAPI用变量 begin   DATA: lt_vbpok    TYPE TABLE OF vbpok,         ls_vbpok    TYPE vbpok,         lt_prott    TYPE TABLE OF prott,         ls_prott    TYPE prott,         ls_vbkok    TYPE vbkok.   "BAPI用变量 end   DATA: lt_lips       TYPE STANDARD TABLE OF lips,         ls_lips       TYPE lips,         ls_inbound_do TYPE /sc1/s_wis_input,         lv_msg        TYPE char255,         ls_et_return  TYPE /sc1/ftd_mm_bapiret.   CHECK pv_exec_flg IS  INITIAL.   READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.   SELECT * FROM lips     INTO CORRESPONDING FIELDS OF TABLE lt_lips     WHERE vbeln = ls_inbound_do-vbeln.   LOOP AT lt_lips INTO ls_lips.     ls_vbpok-vbeln_vl = ls_lips-vbeln.     ls_vbpok-posnr_vl = ls_lips-posnr.     ls_vbpok-vbeln    = ls_lips-vgbel.     ls_vbpok-posnn    = ls_lips-vgpos.     ls_vbpok-meins    = ls_lips-meins.     ls_vbpok-vrkme    = ls_lips-vrkme.     ls_vbpok-pikmg    = ls_lips-lfimg.     ls_vbpok-ndifm    = 0.     ls_vbpok-brgew    = ls_lips-brgew.     ls_vbpok-gewei    = ls_lips-gewei.     ls_vbpok-volum    = ls_lips-volum.     ls_vbpok-voleh    = ls_lips-voleh.     ls_vbpok-charg    = ls_lips-charg.     ls_vbpok-matnr    = ls_lips-matnr.     ls_vbpok-orpos    = 0.     APPEND ls_vbpok TO lt_vbpok.     CLEAR: ls_vbpok.   ENDLOOP.   ls_vbkok-vbeln_vl = ls_inbound_do-vbeln.   CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'     EXPORTING       vbkok_wa      = ls_vbkok       synchron      = 'X'     TABLES       vbpok_tab     = lt_vbpok       prot          = lt_prott     EXCEPTIONS       error_message = 1.   LOOP AT lt_prott INTO ls_prott WHERE msgty CA 'EA'.     EXIT.   ENDLOOP.   IF sy-subrc <> 0.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.   ELSE.     pv_exec_flg = 'E'.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     CALL FUNCTION 'FORMAT_MESSAGE'       EXPORTING         id        = ls_prott-msgid         no        = ls_prott-msgno         v1        = ls_prott-msgv1         v2        = ls_prott-msgv2         v3        = ls_prott-msgv3         v4        = ls_prott-msgv4       IMPORTING         msg       = lv_msg       EXCEPTIONS         not_found = 1         OTHERS    = 2.     ls_et_return-uuid    = ls_inbound_do-uuid.     ls_et_return-type    = 'E'.     ls_et_return-message = lv_msg.     APPEND ls_et_return TO et_return.   ENDIF. ENDFORM.                    " INBOUND_DO_PICKING *&---------------------------------------------------------------------* *&      Form  INBOUND_DO_CONFIRM *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_DO_TEMP  text *      -->P_ET_RETURN  text *      <--P_LV_EXEC_FLG  text *----------------------------------------------------------------------* FORM inbound_do_confirm  TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                                  et_return STRUCTURE /sc1/ftd_mm_bapiret                         CHANGING pv_exec_flg      TYPE c.   "bapi 用变量---begin   DATA: ls_header_data      TYPE bapiibdlvhdrcon,         ls_header_control   TYPE bapiibdlvhdrctrlcon,         lw_delivery         TYPE bapiobdlvhdrcon-deliv_numb,         lt_return           TYPE TABLE OF bapiret2 ,         ls_return           TYPE bapiret2.   "bapi 用变量---end   DATA: ls_inbound_do TYPE /sc1/s_wis_input,         ls_et_return  TYPE /sc1/ftd_mm_bapiret,          lv_msg       TYPE char255.   CHECK pv_exec_flg IS INITIAL.   READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.   ls_header_data-deliv_numb     = ls_inbound_do-vbeln."交货单号.   ls_header_control-deliv_numb  = ls_inbound_do-vbeln."交货单号.   ls_header_control-post_gi_flg = 'X'   .   lw_delivery                   = ls_inbound_do-vbeln."交货单号.   CALL FUNCTION 'BAPI_INB_DELIVERY_CONFIRM_DEC'     EXPORTING       header_data    = ls_header_data       header_control = ls_header_control       delivery       = lw_delivery     TABLES       return         = lt_return.   LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.     EXIT.   ENDLOOP.   IF sy-subrc <> 0.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.     ls_et_return-uuid    = ls_inbound_do-uuid.     ls_et_return-type    = 'S'.     ls_et_return-message = '收货成功'.     APPEND ls_et_return TO et_return.   ELSE.     pv_exec_flg = 'E'.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     CALL FUNCTION 'FORMAT_MESSAGE'       EXPORTING         id        = ls_return-id         no        = ls_return-number         v1        = ls_return-message_v1         v2        = ls_return-message_v2         v3        = ls_return-message_v3         v4        = ls_return-message_v4       IMPORTING         msg       = lv_msg       EXCEPTIONS         not_found = 1         OTHERS    = 2.     ls_et_return-uuid    = ls_inbound_do-uuid.     ls_et_return-type    = 'E'.     ls_et_return-message = lv_msg.     APPEND ls_et_return TO et_return.   ENDIF. ENDFORM.                    " INBOUND_DO_CONFIRM *&---------------------------------------------------------------------* *&      Form  INBOUND_DO_CONFIRM *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_DO_TEMP  text *      -->P_ET_RETURN  text *      <--P_LV_EXEC_FLG  text *----------------------------------------------------------------------* FORM outbound_do_confirm  TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                                  et_return STRUCTURE /sc1/ftd_mm_bapiret                         CHANGING pv_exec_flg      TYPE c.   "bapi 用变量---begin   DATA: ls_header_data      TYPE bapiobdlvhdrcon,         ls_header_control   TYPE bapiobdlvhdrctrlcon,         lw_delivery         TYPE bapiobdlvhdrcon-deliv_numb,         lt_return           TYPE TABLE OF bapiret2 ,         ls_return           TYPE bapiret2.   "bapi 用变量---end   DATA: ls_inbound_do TYPE /sc1/s_wis_input,         ls_et_return  TYPE /sc1/ftd_mm_bapiret,          lv_msg       TYPE char255.   CHECK pv_exec_flg IS INITIAL.   READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.   ls_header_data-deliv_numb     = ls_inbound_do-vbeln."交货单号.   ls_header_control-deliv_numb  = ls_inbound_do-vbeln."交货单号.   ls_header_control-post_gi_flg = 'X'   .   lw_delivery                   = ls_inbound_do-vbeln."交货单号.   CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'     EXPORTING       header_data    = ls_header_data       header_control = ls_header_control       delivery       = lw_delivery     TABLES       return         = lt_return.   LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.     EXIT.   ENDLOOP.   IF sy-subrc <> 0.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.     ls_et_return-uuid    = ls_inbound_do-uuid.     ls_et_return-type    = 'S'.     ls_et_return-message = '收货成功'.     APPEND ls_et_return TO et_return.   ELSE.     pv_exec_flg = 'E'.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     CALL FUNCTION 'FORMAT_MESSAGE'       EXPORTING         id        = ls_return-id         no        = ls_return-number         v1        = ls_return-message_v1         v2        = ls_return-message_v2         v3        = ls_return-message_v3         v4        = ls_return-message_v4       IMPORTING         msg       = lv_msg       EXCEPTIONS         not_found = 1         OTHERS    = 2.     ls_et_return-uuid    = ls_inbound_do-uuid.     ls_et_return-type    = 'E'.     ls_et_return-message = lv_msg.     APPEND ls_et_return TO et_return.   ENDIF. ENDFORM.                    " INBOUND_DO_CONFIRM *&---------------------------------------------------------------------* *&      Form  SPLIT_DATA *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_IT_INPUT  text *      -->P_LT_PO  text *      -->P_LT_INBOUND_DO  text *      -->P_LT_OUTBOUND_DO  text *      -->P_LT_TL  text *----------------------------------------------------------------------* FORM split_data  TABLES   pt_input      STRUCTURE /sc1/s_wis_input                           pt_po          STRUCTURE /sc1/s_wis_input                           pt_inbound_do  STRUCTURE /sc1/s_wis_input                           pt_outbound_do STRUCTURE /sc1/s_wis_input                           pt_tl          STRUCTURE /sc1/s_wis_input                           pt_ekpo        TYPE ty_t_ekpo.   DATA: ls_input       TYPE /sc1/s_wis_input,         lv_new_flg     TYPE char1,         lv_action      TYPE char15,         lv_matkl       TYPE mara-matkl,         lt_/sc1/mm_migo_log TYPE STANDARD TABLE OF /sc1/mm_migo_log,         ls_/sc1/mm_migo_log TYPE /sc1/mm_migo_log.   FIELD-SYMBOLS: <ls_input> TYPE /sc1/s_wis_input.   "检查此次需要收货是否有已经处理完成的数据,已完成数据不再处理   IF pt_input[] IS NOT INITIAL.     SELECT * FROM  /sc1/mm_migo_log INTO TABLE lt_/sc1/mm_migo_log       FOR ALL ENTRIES IN pt_input       WHERE uuid = pt_input-uuid.   ENDIF.   SORT pt_input BY action vbeln posnr.   LOOP AT pt_input ASSIGNING <ls_input>.     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       EXPORTING         input  = <ls_input>-vbeln       IMPORTING         output = <ls_input>-vbeln.     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       EXPORTING         input  = <ls_input>-posnr       IMPORTING         output = <ls_input>-posnr.     CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'       EXPORTING         input        = <ls_input>-matnr       IMPORTING         output       = <ls_input>-matnr       EXCEPTIONS         length_error = 1         OTHERS       = 2.   ENDLOOP.   LOOP AT pt_input INTO ls_input.     AT NEW vbeln.       lv_new_flg = 'X'.     ENDAT.     IF lv_new_flg = 'X'.       CLEAR:lv_new_flg.       IF ls_input-action = '1'.         SELECT *           FROM ekpo           APPENDING CORRESPONDING FIELDS OF TABLE pt_ekpo           WHERE ebeln = ls_input-vbeln.         IF sy-subrc = 0.           lv_action = 'PO'.         ELSE.           lv_action = 'INBOUND_DO'.         ENDIF.       ELSEIF ls_input-action = '2'.         lv_action = 'OUTBOUND_DO'.       ENDIF.     ENDIF.     "检查此次需要收货是否有已经处理完成的数据,已完成数据不再处理     READ TABLE lt_/sc1/mm_migo_log INTO ls_/sc1/mm_migo_log with KEY uuid = ls_input-uuid.     IF sy-subrc = 0.       CONTINUE.     ENDIF.     SELECT SINGLE matkl FROM mara INTO lv_matkl       WHERE matnr = ls_input-matnr         AND matkl = 'YS000013'."铁笼     IF sy-subrc = 0.       APPEND ls_input TO pt_tl.       CONTINUE.     ENDIF.     CASE lv_action.       WHEN 'PO'.         APPEND ls_input TO pt_po.       WHEN 'INBOUND_DO'.         APPEND ls_input TO pt_inbound_do.       WHEN 'OUTBOUND_DO'.         APPEND ls_input TO pt_outbound_do.       WHEN OTHERS.     ENDCASE.   ENDLOOP. ENDFORM.                    " SPLIT_DATA *&---------------------------------------------------------------------* *&      Form  INBOUND_DO_BATCH_SPLIT *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* *      -->P_LT_DO_TEMP  text *      -->P_ET_RETURN  text *      <--P_LV_EXEC_FLG  text *----------------------------------------------------------------------* FORM inbound_do_batch_split TABLES pt_inbound_do STRUCTURE /sc1/s_wis_input                                  et_return STRUCTURE /sc1/ftd_mm_bapiret                          CHANGING pv_exec_flg      TYPE c.  .   "bapi用变量begin   DATA: ls_header_data     TYPE bapiobdlvhdrchg, "Delivery header         ls_header_control  TYPE bapiobdlvhdrctrlchg, "delivery header control         lt_item_data       TYPE STANDARD TABLE OF  bapiobdlvitemchg,         ls_item_data       TYPE  bapiobdlvitemchg,         lt_item_control    TYPE STANDARD TABLE OF bapiobdlvitemctrlchg,         ls_item_control    TYPE bapiobdlvitemctrlchg,         lt_item_data_spl   TYPE STANDARD TABLE OF /spe/bapiobdlvitemchg,         ls_item_data_spl   TYPE /spe/bapiobdlvitemchg,         ls_techn_control   TYPE bapidlvcontrol,         lt_return          TYPE STANDARD TABLE OF bapiret2,         ls_return          type bapiret2.   DATA: lv_message         TYPE c LENGTH 220.   "bapi用变量end   DATA: ls_inbound_do TYPE /sc1/s_wis_input,         lt_lips            TYPE STANDARD TABLE OF lips,         ls_lips            TYPE lips,         ls_et_teturn       TYPE /sc1/ftd_mm_bapiret,         lv_vbeln_batch     TYPE lips-vbeln..   READ TABLE pt_inbound_do INTO ls_inbound_do INDEX 1.   SELECT *     FROM lips     INTO TABLE lt_lips    WHERE vbeln = ls_inbound_do-vbeln.   lv_vbeln_batch = '900000'.   LOOP AT pt_inbound_do INTO ls_inbound_do.     READ TABLE lt_lips INTO ls_lips WITH KEY vbeln = ls_inbound_do-vbeln                                              posnr = ls_inbound_do-posnr.     "批次拆分出来的新行     CLEAR: ls_item_data.     lv_vbeln_batch = lv_vbeln_batch + 1.     ls_item_data-deliv_numb = ls_inbound_do-vbeln..     ls_item_data-deliv_item =  lv_vbeln_batch.     ls_item_data-hieraritem = ls_inbound_do-posnr.        "项目层次中的高级项目-批次拆分字段     ls_item_data-usehieritm = '1'.                        "使用层次项目-批次拆分字段     ls_item_data-material   = ls_inbound_do-matnr.     ls_item_data-batch      = ls_inbound_do-charg.     ls_item_data-dlv_qty    = ls_inbound_do-lfimg.     ls_item_data-fact_unit_nom   = ls_lips-umvkz.     ls_item_data-fact_unit_denom = ls_lips-umvkn.     APPEND ls_item_data TO lt_item_data.     "批次拆分出来的新行     CLEAR: ls_item_control.     ls_item_control-deliv_numb = ls_inbound_do-vbeln.     ls_item_control-deliv_item = lv_vbeln_batch.     ls_item_control-chg_delqty = 'X'.     APPEND ls_item_control TO lt_item_control.     CLEAR: ls_item_control.     ls_item_data_spl-deliv_numb = ls_inbound_do-vbeln.     ls_item_data_spl-deliv_item = lv_vbeln_batch.     ls_item_data_spl-stge_loc   = ls_inbound_do-lgort."库存地点     APPEND ls_item_data_spl TO lt_item_data_spl.   ENDLOOP.   ls_header_data-deliv_numb    = ls_inbound_do-vbeln.   ls_header_control-deliv_numb = ls_inbound_do-vbeln.   ls_techn_control-upd_ind     = 'U'.   CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'     EXPORTING       header_data    = ls_header_data       header_control = ls_header_control       delivery       = ls_inbound_do-vbeln       techn_control  = ls_techn_control     TABLES       item_data      = lt_item_data       item_control   = lt_item_control       item_data_spl  = lt_item_data_spl       return         = lt_return.   LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.     EXIT.   ENDLOOP.   IF sy-subrc <> 0.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       EXPORTING         wait = 'X'.   "更改库存地点   CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'     EXPORTING       header_data    = ls_header_data       header_control = ls_header_control       delivery       = ls_inbound_do-vbeln       techn_control  = ls_techn_control     TABLES       item_data      = lt_item_data       item_control   = lt_item_control       item_data_spl  = lt_item_data_spl       return         = lt_return.   ELSE.     pv_exec_flg = 'E'.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     CALL FUNCTION 'FORMAT_MESSAGE'       EXPORTING         id        = ls_return-id         no        = ls_return-number         v1        = ls_return-message_v1         v2        = ls_return-message_v2         v3        = ls_return-message_v3         v4        = ls_return-message_v4       IMPORTING         msg       = lv_message       EXCEPTIONS         not_found = 1         OTHERS    = 2.     ls_et_teturn-uuid = ls_inbound_do-uuid.     ls_et_teturn-type = 'E'.     ls_et_teturn-message = lv_message.     APPEND ls_et_teturn TO et_return.   ENDIF. ENDFORM.                    " INBOUND_DO_BATCH_SPLIT 帮我分析一下,让你写出这样的代码,你作为顾问应该提怎么样的需求,总结一下
07-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值