webapi调用分布式调入单保存接口报错
金蝶云社区-138xxxx6272_1
138xxxx6272_1
0人赞赏了该文章 1,996次浏览 未经作者许可,禁止转载编辑于2016年09月21日 16:00:32

老师们:
传入json如下:
// 开始构建Web API参数对象
// 参数根对象:包含Creator、NeedUpDateFields、Model这三个子参数
// using Newtonsoft.Json.Linq; // (需引用Newtonsoft.Json.dll)
JObject jsonRoot = new JObject();

// Creator: 创建用户
jsonRoot.Add("Creator", "demo");

// NeedUpDateFields: 哪些字段需要更新?为空则表示参数中全部字段,均需要更新
jsonRoot.Add("NeedUpDateFields", new JArray(""));

// Model: 单据详细数据参数
JObject model = new JObject();
jsonRoot.Add("Model", model);

// 开始设置单据字段值
// 必须设置的字段:主键、单据类型、主业务组织,各必录且没有设置默认值的字段
// 特别注意:字段Key大小写是敏感的,建议从BOS设计器中,直接复制字段的标识属性过来

// 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0
model.Add("FID", 0);
// 单据编号:可以忽略,由系统根据编码规则自动生成
model.Add("FBillNo", "");

// 单据类型::必须填写,是基础资料字段 所有基础资料字段都按FNumber赋值,别用其他字段
JObject basedata = new JObject();
basedata.Add("FNumber", "FBDR01_SYS"); //分布式调入单
model.Add("FBillTypeID", basedata);

// 调拨类型:必须填写
model.Add("FTransferBizType", "InnerOrgTransfer"); // InnerOrgTransfer 组织内调拨

// 调拨方向:必须填写
model.Add("FTransferDirect", "GENERAL");// GENERAL 普通 枚举里找

// 调入库存组织:必须填写,是基础资料字段
// 基础资料类型字段填值,必须再构建一个JObject对象,设置基础资料编码
basedata = new JObject();
basedata.Add("FNumber", FStockOrgID); //"BJ001"
model.Add("FStockOrgID", basedata);
// 调出库存组织:必须填写,是基础资料字段
basedata = new JObject();
basedata.Add("FNumber", FStockOrgID); //"BJ001"
model.Add("FStockOutOrgID", basedata);
// 调入库存组织:必须填写,是基础资料字段
basedata = new JObject();
basedata.Add("FNumber", FStockOrgID); //"BJ001"
model.Add("FStockInOrgID", basedata);

//单据日期(FDate)
model.Add("FDate", FDate); //DateTime.Today

// 调拨方式:必须填写
model.Add("FTransferMode", "INDIRECT");// INDIRECT 间接 枚举里找 这个字段是隐藏的

//调出货主类型:FOwnerTypeOutIdHead 隐藏字段 默认一下
model.Add("FOwnerTypeOutIdHead", "BD_OwnerOrg");

//创建日期:FCreateDate
model.Add("FCreateDate", DateTime.Today);

model.Add("FVESTONWAY", "B"); //默认调入方
//是否跨组织结算生成:FIsGenForIOS
model.Add("FIsGenForIOS", false);
//业务类型:FBizType NORMAL
//model.Add("FIsGenForIOS", "NORMAL"); //标准
//是否组织间业务(财务):FIsIOSForFin
model.Add("FIsIOSForFin", false);
//跨组织业务类型(基础资料):FTransferBizTypeID OverOrgTransfer
basedata = new JObject();
basedata.Add("FNumber", "OverOrgTransfer");
model.Add("FTransferBizTypeID", basedata);

//备注:FNOTE
model.Add("FNOTE", FNOTE);
//跨法人交易:FIsInterLegalPerson
model.Add("FIsInterLegalPerson", false);

//业务系统主表ID
model.Add("FYWID", FYWID);

//-------------------------------------------------------------- 开始构建单据体参数:集合参数JArray
JArray entryRows = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识 BOS里的分录标识
string entityKey = "STK_TRANSFERIN__FSTKTRSINENTRY"; //
model.Add(entityKey, entryRows);

// 通过循环创建单据体行:示例代码仅创建一行
//for (int i = 0; i <= 0; i++)
//{
//处理分录
foreach (TRANSFERINENTRY entry in req.entries)
{
string FMaterialId = entry.FMaterialId;
string FUnitID = entry.FUnitID;
string FQty = entry.FQty;
string FSrcStockID = entry.FSrcStockID;
string FDestStockID = entry.FDestStockID;
string FYWENTRYID = entry.FYWENTRYID;
string FSORYWID = entry.FSORYWID;
string FSORYWENTRYID = entry.FSORYWENTRYID;

// 添加新行,把新行加入到单据体行集合
JObject entryRow = new JObject();
entryRows.Add(entryRow);

// 给新行,设置关键字段值
// 单据体主键:必须填写,系统据此判断是新增还是修改行
entryRow.Add("FEntryID", 0);

//物料(FMaterialId):基础资料,填写编码 这个需要传
basedata = new JObject();
basedata.Add("FNumber", FMaterialId );//"BZ0001"
entryRow.Add("FMaterialId", basedata);
//调出物料
basedata = new JObject();
basedata.Add("FNumber", FMaterialId);//"BZ0001"
entryRow.Add("FSRCMATERIALID", basedata);

// 单位(FUnitId):基础资料,填写编码 这个需要传
basedata = new JObject();
basedata.Add("FNumber", FUnitID); //"盒"
entryRow.Add("FUnitID", basedata);

// 数量(FQty):数量字段
entryRow.Add("FQty", FQty);
//计划调拨数量
entryRow.Add("FPLANTRANSFERQTY", FQty);
//调出仓库 FSrcStockID
basedata = new JObject();
basedata.Add("FNumber", FSrcStockID); //"BJ000"
entryRow.Add("FSrcStockID", basedata);
//调入仓库 FDestStockID
basedata = new JObject();
basedata.Add("FNumber", FDestStockID); //"BJ001"
entryRow.Add("FDestStockID", basedata);

entryRow.Add("FSORYWID", FYWID);
entryRow.Add("FYWENTRYID", FYWENTRYID);

////在途库存状态 FSrcStockStatusID
//entryRow.Add("FSrcStockStatusID", "KCZT05_SYS");

//调入库存状态 FDestStockStatusID 在途库存状态
basedata = new JObject();
basedata.Add("FNumber", "KCZT01_SYS");
entryRow.Add("FDestStockStatusID", basedata);

//*********************************以下是关联字段,尝试一下
// 创建与源单之间的关联关系,以支持上查与反写源单
// 本示例演示创建与采购申请单之间的关联关系
// 源单类型、源单编号
entryRow.Add("FSRCBILLTYPEID", "STK_TRANSFEROUT");

SorBillNo = GetSorBillNo(FSORYWID);
if (SorBillNo == "")
{
rs = CreateReturn("-1", "FALSE", "当前FSORYWID字段对应的cloud调拨出库单未找到!");
return rs;
}
entryRow.Add("FSRCBILLNO", SorBillNo);

// 创建Link行集合
JArray linkRows = new JArray();

// 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link
string linkEntityKey = "FSTKTRSINENTRY_Link";//string.Format("{0}_Link", entityKey);
entryRow.Add(linkEntityKey, linkRows);

// 创建Link行:
// 如有多条源单行,则分别创建Link行记录各条源单行信息
JObject linkRow = new JObject();
linkRows.Add(linkRow);

// 填写Link行上的字段值
// 特别说明:Link子单据体上字段的标识,必须在前面增加子单据体标识

//// FFlowId : 业务流程图,可选
//string fldFlowIdKey = string.Format("{0}_FFlowId", linkEntityKey);
//linkRow.Add(fldFlowIdKey, "");

//// FFlowLineId :业务流程图路线,可选
//string fldFlowLineIdKey = string.Format("{0}_FFlowLineId", linkEntityKey);
//linkRow.Add(fldFlowLineIdKey, "");

// FRuleId :两单之间的转换规则内码,必填
// 可以通过如下SQL语句到数据库获取
// select FID, *
// from T_META_CONVERTRULE
// where FSOURCEFORMID = 'PUR_Requisition'
// and FTARGETFORMID = 'PUR_PurchaseOrder'
// and FDEVTYPE = 0;
string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey);
linkRow.Add(fldRuleIdKey, "STK_TRANSFEROUT-STK_TRANSFERIN");

// FSTableName :必填,源单单据体表格编码,通过如下语句获取:
// SELECT FTableNumber
// FROM t_bf_tabledefine
// WHERE fformid = 'STK_TRANSFEROUT'
// AND fentitykey = 'FSTKTRSOUTENTRY'
// 如果如上语句未返回结果,请到K/3 Cloud中,手工选单一次,后台会自动产生表格编码
string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey);
linkRow.Add(fldSTableNameKey, "T_STK_STKTRANSFEROUTENTRY");

// FSBillId :必填,源单单据内码
string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey);
string SorFID=GetSorFID(SorBillNo);
linkRow.Add(fldSBillIdKey, SorFID);

// FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码
string fldSIdKey = string.Format("{0}_FSId", linkEntityKey);
string FSorEntryID = GetSorEntryFID(FSORYWID, FSORYWENTRYID);
linkRow.Add(fldSIdKey, FSorEntryID);

// FEntity_Link_FBaseQtyOld :控制字段原始携带值,从源单带了多少下来
string fldBaseQtyOldKey = string.Format("{0}_FBASETRANSFERQTYOLD", linkEntityKey);
linkRow.Add(fldBaseQtyOldKey, FQty);

// FEntity_Link_FBaseQty :控制字段实际值,本单实际填写了多少
string fldBaseQtyKey = string.Format("{0}_FBASETRANSFERQTY", linkEntityKey);
linkRow.Add(fldBaseQtyKey, FQty);

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------
返回错误:{"Result":{"ResponseStatus":{"ErrorCode":500,"IsSuccess":false,"Errors":[{"FieldName":"","Message":"单据的所有分录必须关联生成。","DIndex":0}],"SuccessEntitys":[]},"Id":""}}

请老师们指导一下。