Append&Include for enhancement

本文详细解析了SAP系统中的两种结构:包含结构(include structures)和追加结构(append structures)。介绍了这两种结构的应用场景及区别,包含结构适用于自定义表(Z-tables),而追加结构主要用于增强标准表,且必须添加到表末尾。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

there are three types of adding fields

1. Normal structures (Which are nothing but include structure that start with '.INCLUDE')

2. APPEND STRUCTURES (FOR STANDARD TABLES) (START WITH ".APPEND")

3. customizing includes(FOR STANDARD TABLES) (".CI", THESE ARE DONE BY END USERS NOT BY US ).

STRUCTURE IS A COLLECTION OF FIELDS.

COMING TO THE DIFFERENCE BETWEEN INCLUDE STRUCTURES AND APPEND STRUCTURES.

INCLUDE STRUCTURES CAN USED BY US TO ADD FIELDS INTO ANY ZTABLES. BECAUSE, IN A ZTABLE, WE CAN ADD FIELDS WHER EVER WE WANT.


APPEND STRUCTURES ARE USED ONLY TO ENHANCE STANDARD TABLES.  只用于增强标准table?
STANDARD TABLES MAY HAVE INCLUDE STRUCTURES ALREADY CREATED , BUT IF WE WANT TO ADD SOME MORE FIELDS

TO THE STANDARD TABLES, WE NEED TO GO FOR APPEND STRUCTURES.


APPEND STRUCTURES SHOULD BE ADDED AT THE END OF A STANDARD TABLE. THIS IS A MUST. BECAUSE WE SHOULD NOT CHANGE THE ORIGINAL STANDARD TABLE IN THE MIDDLE.

SOME STANDARD TABLES FOR WHICH THERE ARE LONG DATA TYPE FIELDS cannot be enhanced because, LONG TYPE FIELDS SHOULD ALWAYS BE AT THE END AND APPEND STRUCTURES SHOULD ALSO BE AT THE END, SO THERE WILL BE A CONFLICT

上面讲的不知所云,找了几个地方说法都不一样。下面靠谱一点。有时间再测一测。

An APPEND belongs to one and only one table (1:1 relation). An INCLUDE can be included in many tables (and structures) and APPENDs.

 

I prefer the following approach:

(1) Create APPEND for my target table
(2) Create one ore many INCLUDE structures (which group different kinds of fields, 
      .e.g. address fields, accouting fields, etc.)
(3) Include the INCLUDE structures in the single APPEND structure


So, to summarize the usage:

- you want to add your own fields to a SAP table/structure: use append structure

- you want to define a structure consisting of a logically related group of fields, and you want to be able to refer to this structure in any table or structure of your own: use an include structure

总结一下,就是当需要重用性的时候,用include。


#include "stdafx.h" #include "LPEAWrapper.h" #include "hedyErrHandler.h" #include "hedyDebug.h" // Calibration #include "HEDYCalibration.h" // Enhancement #include "HEDYDMPLstruct.h" #include "LPEAlgoriAPI.h" // 乳腺图像增强算法默认方式 // @param pInImg[in] 原始图像 // @param pOutImg[out] 增强图像 // @param strDMConfigFilePath[in] 增强参数文件路径 // @return // 返回SUCCESS,增强成功。否则返回错误代码。 ERRTYPE mgEnExcute( PWORD pInImg, PWORD pOutImg, INT nWid, INT nHei, CString strDMConfigFilePath) { if(pInImg == NULL || pOutImg == NULL){ HEDYERRHANDLER_logFile("pInImg / pOutImg is NULL."); return PARAM_ERR; } if(strDMConfigFilePath.Compare(_T("")) == 0){ HEDYERRHANDLER_logFile("Empty config file path."); return PARAM_ERR; } DMConfig dmConfig; if(!GetAllDataString(strDMConfigFilePath, dmConfig)){ HEDYERRHANDLER_logFile("Load config file failed."); return PARAM_ERR; } INT dataLen = nWid * nHei; if(dataLen == 0){ HEDYERRHANDLER_logFile("Load image failed, incorrect image size."); return PARAM_ERR; } ERRTYPE errHandler = SUCCESS; // 需要在服务中开放接口 INT nDetailLev = dmConfig.modulatePara.nDetailLev; INT nDepthLev = dmConfig.modulatePara.nDepthLev; INT nMicroCaLev = dmConfig.modulatePara.nMicroCaLev; errHandler = mgEnAlgori( pInImg, pOutImg, nWid, nHei, dmConfig, nDetailLev, nDepthLev, nMicroCaLev); return SUCCESS; } // 乳腺图像增强算法调整方式 // @param pInImg[in] 原始图像 // @param pOutImg[out] 增强图像 // @param strDMConfigFilePath[in] 增强参数文件路径 // @param nDetailLev[in] 细节增强权重 // @param nDepthLev[in] 层次增强权重 // @param nMicroCaLev[in] 钙化点增强权重 // @return // 返回SUCCESS,增强成功。否则返回错误代码。 ERRTYPE mgEnAdjust( PWORD pInImg, PWORD pOutImg, INT nWid, INT nHei, CString strDMConfigFilePath, INT nDetailLev, INT nDepthLev, INT nMicroCaLev) { if(pInImg == NULL || pOutImg == NULL){ HEDYERRHANDLER_logFile("pInImg / pOutImg is NULL."); return PARAM_ERR; } if(strDMConfigFilePath.Compare(_T("")) == 0){ HEDYERRHANDLER_logFile("Empty config file path."); return PARAM_ERR; } DMConfig dmConfig; if(!GetAllDataString(strDMConfigFilePath, dmConfig)){ HEDYERRHANDLER_logFile("Load config file failed."); return PARAM_ERR; } INT dataLen = nWid * nHei; if(dataLen == 0){ HEDYERRHANDLER_logFile("Load image failed, incorrect image size."); return PARAM_ERR; } ERRTYPE errHandler = SUCCESS; errHandler = mgEnAlgori( pInImg, pOutImg, nWid, nHei, dmConfig, nDetailLev, nDepthLev, nMicroCaLev); return SUCCESS; } // 乳腺图像增强算法调整方式 // @param pInImg[in] 原始图像 // @param pOutImg[out] 增强图像 // @param dmConfig[in] 增强参数列表 // @param nDetailLev[in] 细节增强权重 // @param nDepthLev[in] 层次增强权重 // @param nMicroCaLev[in] 钙化点增强权重 // @return // 返回SUCCESS,增强成功。否则返回错误代码。 ERRTYPE mgEnAlgori( PWORD pInImg, PWORD pOutImg, INT nWid, INT nHei, DMConfig dmConfig, INT nDetailLev, INT nDepthLev, INT nMicroCaLev) { INT dataLen = nWid * nHei; ERRTYPE errHandler = SUCCESS; /// 0. 若需要对碳纤维板上的杂质进行校正: if (dmConfig.caliConfig.isCFiberPlate){ /// 0.1. 读入碳纤维板中杂质模板 if (dmConfig.caliConfig.strCFiberPlateMask.Compare(_T("")) == 0){ HEDYERRHANDLER_errLogFile( PARAM_ERR, "Load CarbonFibreCaliMask file failed."); return PARAM_ERR; } PWORD pnCaliMaskLUT = new WORD [dataLen](); if(!HEDYDEBUG_readRaw(dmConfig.caliConfig.strCFiberPlateMask, pnCaliMaskLUT, nWid, nHei)){ delete [] pnCaliMaskLUT; pnCaliMaskLUT = NULL; HEDYERRHANDLER_errLogFile(INNER_ERR, "HEDYDEBUG_readRaw"); return INNER_ERR; } /// 调用CarbonFibreCaliMask,生成杂质模板 errHandler = carbonFibreCaliMask( pnCaliMaskLUT, pnCaliMaskLUT, nWid, nHei); if(errHandler){ delete [] pnCaliMaskLUT; pnCaliMaskLUT = NULL; HEDYERRHANDLER_errLogFile(INNER_ERR, "CarbonFibreCaliMask"); #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in CarbonFibreCaliMask."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 0.2. 对碳纤维模板中有杂质的部分实施双线性插值 errHandler = neighbor8Interpolation( pInImg, pnCaliMaskLUT, nWid, nHei); delete [] pnCaliMaskLUT; pnCaliMaskLUT = NULL; if(errHandler){ HEDYERRHANDLER_errLogFile( INNER_ERR, "neighbor8Interpolation"); #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in neighbor8Interpolation."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } } /// 1. 载入算法相关数据,调用API: ImportAlgoriInfo errHandler = ImportAlgoriInfo( pInImg, nWid, nHei, dmConfig.algoriInfo.strVersion, dmConfig.algoriInfo.nLevelNum, dmConfig.algoriInfo.fDESpacing, dmConfig.algoriInfo.fAECThres, dmConfig.algoriInfo.fPreBkg, dmConfig.algoriInfo.fNewBkg); if(errHandler){ #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in ImportAlgoriInfo."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 2. 设置预处理参数,调用API: SetPreProcPara INT nParam = dmConfig.preProcPara.grayValueTransform.paramList.size(); PFLOAT pfParamList = new FLOAT [nParam](); for(INT idx = 0; idx < nParam; ++idx){ pfParamList[idx] = dmConfig.preProcPara.grayValueTransform.paramList[idx]; } errHandler = SetPreProcPara( dmConfig.caliConfig.isMark, dmConfig.caliConfig.nMarkX, dmConfig.caliConfig.nMarkY, dmConfig.caliConfig.nMarkH, dmConfig.caliConfig.nMarkW, dmConfig.preProcPara.grayValueTransform.strOprType, pfParamList); delete [] pfParamList; pfParamList = NULL; if(errHandler){ #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in SetPreProcPara."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 3.设置增强曲线参数集 INT nLev = dmConfig.algoriInfo.nLevelNum; CString* pEnOprType = new CString [nLev](); PFLOAT* ppfParamList = new PFLOAT [nLev]; /**************************** * [0] pfEnEnhanceThres; * * [1] pfEnCrossThres; * * [2] pfEnDefectThres; * ****************************/ if(nLev != dmConfig.vLevels.size()){ for(INT l = 0; l < nLev; ++l){ pEnOprType[l].Empty(); delete [] ppfParamList[l]; ppfParamList[l] = NULL; } delete [] pEnOprType; pEnOprType = NULL; delete [] ppfParamList; ppfParamList = NULL; HEDYERRHANDLER_errLogFile(ARGU_ERR, "DeconPara missing."); #ifdef _DEBUG MessageBox( NULL, _T("ARGU_ERR:\n DeconPara missing."), _T("Error Handler"), MB_OK); #endif // _DEBUG return ARGU_ERR; } PFLOAT pfWDetails = new FLOAT [nLev](); PFLOAT pfWDepthes = new FLOAT [nLev](); for(INT l = 0; l < nLev; ++l){ pEnOprType[l] = dmConfig.vLevels[l].enhancePara.strEnOprType; nParam = dmConfig.vLevels[l].enhancePara.paramList.size() - 2; ppfParamList[l] = new FLOAT [nParam](); for(INT idx = 0; idx < nParam; ++idx){ ppfParamList[l][idx] = dmConfig.vLevels[l].enhancePara.paramList[idx]; } pfWDetails[l] = dmConfig.vLevels[l].enhancePara.paramList[nParam]; pfWDepthes[l] = dmConfig.vLevels[l].enhancePara.paramList[nParam + 1]; } errHandler = SetDeconPara(nLev, pEnOprType, ppfParamList, pfWDetails, nDetailLev); for (INT l = 0; l < nLev; ++l){ pEnOprType[l].Empty(); delete [] ppfParamList[l]; ppfParamList[l] = NULL; } delete [] pEnOprType; pEnOprType = NULL; delete [] ppfParamList; ppfParamList = NULL; delete [] pfWDetails; pfWDetails = NULL; if(errHandler){ #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in SetEdgeEnhancePara."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 4.设置压缩曲线参数集 CString* pCurveType = new CString [nLev](); ppfParamList = new PFLOAT [nLev]; for(INT l = 0; l < nLev; ++l){ pCurveType[l] = dmConfig.vLevels[l].depressDCPara.strOprType; if(pCurveType[l].Compare(_T("")) != 0){ nParam = dmConfig.vLevels[l].depressDCPara. paramList.size(); ppfParamList[l] = new FLOAT [nParam](); for(INT idx = 0; idx < nParam; ++idx){ ppfParamList[l][idx] = dmConfig.vLevels[l]. depressDCPara.paramList[idx]; } } else{ ppfParamList[l] = NULL; } } errHandler = SetReconPara( nLev, pCurveType, ppfParamList, pfWDepthes, nDepthLev, nMicroCaLev); for (INT l = 0; l < nLev; ++l){ pCurveType[l].Empty(); if (ppfParamList[l] != NULL){ delete [] ppfParamList[l]; ppfParamList[l] = NULL; } } delete [] pCurveType; pCurveType = NULL; delete [] ppfParamList; ppfParamList = NULL; delete [] pfWDepthes; pfWDepthes = NULL; if(errHandler){ #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in SetReconPara."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 5. 设置后处理参数,调用API: SetPostProcPara nParam = dmConfig.postProcPara.paramList.size(); pfParamList = new FLOAT [nParam](); for(INT idx = 0; idx < nParam; ++idx){ pfParamList[idx] = dmConfig.postProcPara.paramList[idx]; } errHandler = SetPostProcPara( dmConfig.postProcPara.strCurveType, pfParamList); delete [] pfParamList; pfParamList = NULL; if(errHandler){ #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in SetPostProcPara."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } /// 6. 将图像转化为16位无符号图像 errHandler = GetEnImg(pOutImg); if(errHandler){ HEDYERRHANDLER_errLogFile(INNER_ERR, "GetEnImg"); #ifdef _DEBUG MessageBox( NULL, _T("INNER_ERR:\n Error in GetEnImg."), _T("Error Handler"), MB_OK); #endif // _DEBUG return INNER_ERR; } return SUCCESS; } 将这些代码转为python代码,并解释其作用
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值