to display netsuite transactions detail-CarlZeng

&xml=T https://system.netsuite.com/app/accounting/transactions/transaction.nl?id=3179&e=T use &xml=T below to display xml 用于排除故障用的测试地址, 把xml输出 既可查询一些数值情况,优先于UI的动作。 zeng.cz 20090421 1508

&xml=T

https://system.netsuite.com/app/accounting/transactions/transaction.nl?id=3179&e=T use &xml=T below to display xml

用于排除故障用的测试地址, 把xml输出 既可查询一些数值情况,优先于UI的动作。

zeng.cz
20090421 1508

totemsuite与Netsuite OneWorld-CarlZeng

NetSuite OneWorld产品代理: 图腾盛视(北京)科技有限公司(TotemSute)是美国NetSuite公司在中国唯一的战略合作伙伴。美国NetSuiteInc.在中国地区的首家增值解决方案供应商。图腾盛视(北京)科技有限公司座落于北京市朝阳区建国路华贸商务中心。办公场地有600余平。管理团队由优秀的互联网技术、运营人员和有多年传统行业成功…

NetSuite OneWorld产品代理:
图腾盛视北京)科技有限公司(TotemSute)是美国NetSuite公司在中国唯一的战略合作伙伴。美国NetSuiteInc.在中国地区的首家增值解决方案供应商。图腾盛视(北 京)科技有限公司座落于北京市朝阳区建国路华贸商务中心。办公场地有600余平。管理团队由优秀的互联网技术、运营人员和有多年传统行业成功商务经验的人 员组成。我公司致力于将国际化的先进的管理理念和先进的信息技术相融合,尽最大努力满足本地用户的业务需求,为客户创造更多价值。

跨国公司在全世界范围内运行一个系统

NetSuite OneWorld允许企业实时管理他们的跨国公司或多个子公司的经营活动

NetSuite OneWorld 是首个为中型企业提供全球业务管理和财务合并功能的按需定制系统。利用NetSuite OneWorld,您可以通过一个系统管理多个子公司、商业部门等,方便快捷地处理不同的货币、税收政策和报表需求。每一个独立用户都可以用其当地语言使用软件并用当地货币作交易,税收和财政也完全符合当地法规。

实时全球商业管理

与那些只能把财务信息合并在一起的财务/ERP解决方案不同,NetSuite OneWorld 的功能远比管理财务要高级——它让您更好地管理您的整个全球商业活动。

全球 财务/ERP
实时的多币种财务合并和总计。

全球CRM
多币种配额、预测、佣金支付、计算营业税、实时报表、销售线索管理、案例发送、实时的市场营销和服务。

全球电子商务
单一系统管理多币种、多语言、多国家或多商标的网站。

全球商务智能
基于角色的仪表盘显示了地方、区域和全球范围内所有的商业活动,深入挖掘各个子公司的货币信息。

NetSuite OneWorld 主要优势:

  • 更高级的业务管理。NetSuite OneWorld 为世界范围内的管理人员和员工提供了他们能更好地管理整个业务所需的所有功能、信息和工具。
  • 即时合并。那些拥有跨国子公司或多个实体机构的企业可以提高工作效率,加强财务和操作数据的合并。
  • 实时可视性。局部地区的仪表盘和全球范围内的仪表盘在显示内容上统一,所作决策得到明显改善。
  • 前所未有的整合性和数据的高质量性。由于您全球业务都在一个软件内执行并托管到一个数据库中,因此您整个业务信息的出处只有一个,保证了资料的真实性。
  • 节省成本。NetSuite OneWorld的成本比传统ERP系统的要少得多。
  • 提高预测性。多币种、跨国预测确保销售管理万无一失。
  • 高适应性和内部可控性OneWorld遵循大多数法规,如国际财务报告准则(IFRS)和萨班斯-奥克斯利法案等。
  • 简单迅速地部署。NetSuite OneWorld的部署时间要比其他传统ERP系统少90%。

更多关于NetSuite OneWorld

数据文档:

白皮书:

特定区域的仪表盘


每个国家及用户都有一个基于用户的仪表盘
来扩展他们的需求。点击这里查看.

(today) oracle 获取当前日期 netsuite-CarlZeng

GETDATE()oracle 获取当前日期在netsuite中 设置某个date类型的数据即可以初始化其内容为当前日期。(Validation & Defaultingtab中设置) 应设置为 :{today}Define the formula ({today}-{startdate}) > 3 as a search filter to return only cases open fo…

GETDATE()
oracle 获取当前日期

在netsuite中  设置某个date类型的数据即可以初始化其内容为当前日期。(

Validation & Defaulting

tab中设置)  应设置为 :{today}

Define the formula ({today}-{startdate}) > 3 as a search filter to return only cases open for greater than 3 days.

netsuite中支持的数据库级的default value 可用的方法有:

<script>
var win = window.isOLC ? window : parent.makeDropdown ? parent : window;
var dd = win.makeDropdown(‘function’, 184, [”, ”, ‘ABS’, ‘ABS(n)’, ‘ACOS’, ‘ACOS(n)’, ‘ADD_MONTHS’, ‘ADD_MONTHS(date, integer)’, ‘ASCII’, ‘ASCII(char)’, ‘ASIN’, ‘ASIN(n)’, ‘ATAN’, ‘ATAN(n)’, ‘ATAN2’, ‘ATAN2(n1 { , | / } n2)’, ‘BITAND’, ‘BITAND(expr1, expr2)’, ‘CEIL’, ‘CEIL(n)’, ‘CHR’, ‘CHR(n [ USING NCHAR_CS ])’, ‘COALESCE’, ‘COALESCE(expr [, expr ]…)’, ‘CONCAT’, ‘CONCAT(char1, char2)’, ‘COS’, ‘COS(n)’, ‘COSH’, ‘COSH(n)’, ‘DECODE’, ‘DECODE(expr, search, result [, search, result ]…[, default ])’, ‘DENSE_RANK’, ‘DENSE_RANK(expr [, expr ]…) WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [,expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]… )’, ‘EXP’, ‘EXP(n)’, ‘FLOOR’, ‘FLOOR(n)’, ‘INITCAP’, ‘INITCAP(char)’, ‘INSTR’, ‘INSTR(string , substring [, position [, occurrence ]])’, ‘KEEP’, ‘KEEP(DENSE_RANK { FIRST | LAST } ORDER BY expr [ NULLS { FIRST | LAST } ])’, ‘LAST_DAY’, ‘LAST_DAY(date)’, ‘LENGTH’, ‘LENGTH(char)’, ‘LN’, ‘LN(n)’, ‘LOG’, ‘LOG(n2, n1)’, ‘LOWER’, ‘LOWER(char)’, ‘LPAD’, ‘LPAD(expr1, n [, expr2 ])’, ‘LTRIM’, ‘LTRIM(char [, set ])’, ‘MOD’, ‘MOD(n2, n1)’, ‘MONTHS_BETWEEN’, ‘MONTHS_BETWEEN(date1, date2)’, ‘NANVL’, ‘NANVL(n2, n1)’, ‘NEXT_DAY’, ‘NEXT_DAY(date, char)’, ‘NULLIF’, ‘NULLIF(expr1, expr2)’, ‘NVL’, ‘NVL(expr1, expr2)’, ‘NVL2’, ‘NVL2(expr1, expr2, expr3)’, ‘POWER’, ‘POWER(n2, n1)’, ‘RANK’, ‘RANK(expr [, expr ]…) WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [,expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] ]… )’, ‘REGEXP_INSTR’, ‘REGEXP_INSTR(source_char, pattern [, position [, occurrence [, return_option [, match_parameter ]]]])’, ‘REGEXP_REPLACE’, ‘REGEXP_REPLACE(source_char, pattern [, replace_string [, position [, occurrence [, match_parameter ]]]])’, ‘REGEXP_SUBSTR’, ‘REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, match_parameter ]]])’, ‘REMAINDER’, ‘REMAINDER(n2, n1)’, ‘REPLACE’, ‘REPLACE(char, search_string [, replacement_string ])’, ‘ROUND (DATE)’, ‘ROUND(date [, fmt ])’, ‘ROUND (number)’, ‘ROUND(n [, integer ])’, ‘RPAD’, ‘RPAD(expr1 , n [, expr2 ])’, ‘RTRIM’, ‘RTRIM(char [, set ])’, ‘SIGN’, ‘SIGN(n)’, ‘SIN’, ‘SIN(n)’, ‘SINH’, ‘SINH(n)’, ‘SOUNDEX’, ‘SOUNDEX(char)’, ‘SQRT’, ‘SQRT(n)’, ‘SUBSTR’, ‘SUBSTR(char, position [, substring_length ])’, ‘TAN’, ‘TAN(n)’, ‘TANH’, ‘TANH(n)’, ‘TO_CHAR()’, ‘TO_CHAR({ datetime | interval } [, fmt [, ‘nlsparam’ ] ])’, ‘TRANSLATE’, ‘TRANSLATE(expr, from_string, to_string)’, ‘TREAT’, ‘TREAT(expr AS [ REF ] [ schema. ]type)’, ‘TRIM’, ‘TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ] | trim_character} FROM ]trim_source)’, ‘TRUNC (number)’, ‘TRUNC(n1 [, n2 ])’, ‘TRUNK (DATE)’, ‘TRUNC(date [, fmt ])’, ‘UPPER’, ‘UPPER(char)’], 0, ”, ”, “setWindowChanged(window, true);setValueToFormula(this,formula);”, null, 200,document,-2147483648);
dd.setMandatoryBackgroundColor(‘FFFFE5’);
</script>

po,so等单据,读取关联的流程业务数据,netsuite-CarlZeng

刚发现一个未公布的对象,拿purchaseorder举例,就是Receipts & Bills这个subtab有于当前业务单据,所有相关联的流程数据。对于系统流程的断定很有帮助。我们在nlapiLoadRecord的返回中可以找到这样对象[undefined, [undefined total=380.00 type=Bill linktype=Order Bill/Invoice]] ;id,l…

刚发现一个未公布的对象,

拿purchaseorder举例,就是

Receipts & Bills😉

这个subtab有于当前业务单据,所有相关联的流程数据。对于系统流程的断定很有帮助。

我们在nlapiLoadRecord的返回中可以找到这样对象

[undefined, [undefined total=380.00 type=Bill linktype=Order Bill/Invoice]] ;id,linktype,linkurl,total,trandate,type

就是这些对象。

nlapiGetContext 应用与介绍-CarlZeng

var currentContext = nlapiGetContext();var procId = currentContext.getSetting(‘SCRIPT’,ncConst.BGP_ProcessIdParam);去读取这个值,难道这个值可以动态被设置?错了, 这个值不可以动态设置!这个Type:SCRIPT是UI级的手工在script地方设置,下面介绍取值的getSetting(…

var currentContext = nlapiGetContext();

var procId = currentContext.getSetting(‘SCRIPT’,ncConst.BGP_ProcessIdParam);

去读取这个值,难道这个值可以动态被设置?

错了, 这个值不可以动态设置!这个Type:SCRIPT是UI级的手工在script地方设置,

下面介绍取值的

getSetting(type, name)
Returns a system or script setting
Important: SCRIPT is the only type supported in Client SuiteScript.

Parameters
? type{string}[required] – The type of script/system setting. Possible values include:
? SCRIPT – script parameter (defined per script)
? SESSION – session variable (volatile setting defined per session)
? FEATURE – returns T (enabled) or F (disabled) depending on whether a feature is
enabled. In the SuiteScript Reference Guide, see “Feature Names and IDs” o
page 335 for all NetSuite feature names and internal IDs.
? PERMISSION – returns permission level: 0 (none), 1 (view), 2 (create), 3 (edit), 4
(full). In the SuiteScript Reference Guide, see “Permission Names and IDs” o
page 327 for all NetSuite permission IDs.
? name {string} [required]- The name of the script/system setting

Important: You must use the nlobContext.getSetting method on nlapiGetContext to reference
script parameters. For example, to obtain the value of a script parameter called
custscript_case_field, you use the following code:
nlapiGetContext().getSetting(‘SCRIPT’, ‘custscript_case_field’)

Returns
? If type is specified as SCRIPT, SESSION, or FEATURE, a string value is returned. If
type is specified as PERMISSION, an integer value is returned.

————————————————————————————————-

下面介绍设置值的:

setSetting(type, name, value)
Sets the value of a script or user-defined setting. Only available in Server SuiteScript.
? type{string} [required] – The type of script/system setting
? SESSION – session variable (volatile setting defined per session)
? name{string} [required]- The name of the script/system setting
? value {string} [required]- The new value for the script/system setting
Returns
? void

所以我们可以知道设置时,仅支持设置SESSION类的东西,其他类不支持。

netsuite弹出窗体的数据回传例子-CarlZeng

netsuite弹出窗体的数据回传例子这样如果顺利,你就能很多开发出一个 弹出的窗体(实现特殊的货品列表),回传单个或多项的货品会销售或采购订单。————————————User Event suitescript beforeloadform.getSubList(‘item’).addButton(‘custpage_name_print’, ‘…

netsuite弹出窗体的数据回传例子

这样如果顺利,你就能很多开发出一个 弹出的窗体(实现特殊的货品列表),回传单个或多项的货品会销售或采购订单。

————————————

User Event suitescript beforeload

form.getSubList(‘item’).addButton(‘custpage_name_print’, ‘添加选配件’, “nlOpenWindow(‘suitelet url &item=’+passitem,750,500,true)”);

说明:nlOpenWindow(‘/app/common/search/search.nl?l=T&searchtype=Item’,750,500,true); 这个是用来实现弹窗的。

现在的关键就是在suitelet中抓取这个passitem,然后通过这个条件按一定规律给用户生成一个item的列表,供用户选择和回传数据。

suitelet: sublist

netsuite固定资产模块-CarlZeng

下面介绍一下,我分析 资产, 财产asset的一些结论,全是netsuite的固定资产解决方案,希望对您有些帮助。~总体分类如下:模块一:proposal 提议; 建议模块二:资产dispose处理,模块三:revaluation再评估,模块四:depreciation折旧,模块五:registerReport资产注册报表,模块六:DepreciationScheduleReport折旧定期报表,…

下面介绍一下,我分析 资产, 财产asset的一些结论,全是netsuite的固定资产解决方案,希望对您有些帮助。~
总体分类如下:

模块一:proposal 提议; 建议
模块二:资产dispose处理,
模块三:revaluation再评估,
模块四:depreciation折旧,
模块五:registerReport资产注册报表,
模块六:DepreciationScheduleReport折旧定期报表,
模块七:AssetsStatus固定资产状态,
模块八:SystemSetup注册安装模块
模块九:SummaryReport汇总报表

模块一:proposal 提议; 建议

——————————————————————– 以下是操作界面:proposal 提议

function ncFAR_ProposalSL(request, response)
{
var RKResp = nlapiRequestURL( RKcheckURL, null, RKparams ); // params now passed as custom headers
var RKresult = RKResp.getBody().split(‘:’); 请求一个验证注册的sl,然后进一步判断。

if (request.getMethod() == ‘GET’) // page display
{
var Params = new Array();
ncFAR_RenderProposalForm(PropList,’Edit’,null,null,Params); //初始化一个列表,或sublist
response.writePage(PropList);
}
else // user submit
{
var rParams = request.getAllParameters();

if( rParams[‘ncactionid’] == ‘Propose’ ) //动作1:建议
else if( rParams[‘ncactionid’] == ‘Generate’ )//动作2:生成
var ProposalList = new Array();
for(var i=1; i<=request.getLineItemCount(‘proposals’); ++i) //在最开始的页面上,submit后直接getLineItemCount ;经典应用!
else if( rParams[‘ncactionid’] == ‘Reject’ ) //动作3:拒绝
for(var i=1; i<=request.getLineItemCount(‘proposals’); ++i) //经典应用zeng.cz200901051710;说明了submit以后request本身成为了一种Record可以直接getLineItemValue等动作,这个应用非常经典。其他main的变量都可以request.getAllParameters()中取道。
{
if( request.getLineItemValue(‘proposals’,’marked’,i) == ‘T’ )
{
nlapiSubmitField(ncConst.FAR_Proposal,request.getLineItemValue(‘proposals’,’id’,i),
‘custrecord_propstatus’,’4′,false); // 10 units not 30!
}
}

}

function ncFAR_RenderProposalForm(form,recState,id,rec,params) //This function builds the tabs, fields and buttons for the Asset Proposal window
{
// header area Filter expressions
var f_msAssetType = params[‘filter_msAssetType’];
if( f_msAssetType == null ) f_msAssetType = ”;

var fld0 = form.addField(‘ncactionid’,’text’,’Action Id’);
fld0.setDisplayType(‘hidden’);
fld0.setDefaultValue(”);

var pList = form.addSubList(‘proposals’,’list’,’Proposed Assets’);

pList.addField(‘editurl’,’url’,’Edit’,true).setLinkText(‘Edit’);
pList.addField(‘custrecord_propassetdescr’,’text’,’Description’).setDisplayType(‘inline’); //简写经典应用。
pList.addField(‘custrecord_propaccmethod’,’select’,’Depreciation Method’,ncConst.FAR_DeprMethod).setDisplayType(‘inline’);
pList.addField(‘custrecord_propassetcost’,’currency’,’Initial Cost’).setDisplayType(‘inline’);

pList.addMarkAllButtons();

form.addSubmitButton(‘Refresh’);
form.addButton(‘Propose’,’Propose New Assets’,”if (window.isinited && window.isvalid && save_record(true)){main_form.ncactionid.value=’Propose’;main_form.submit();}”);
form.addButton(‘Generate’,’Generate Assets’,”if (window.isinited && window.isvalid && save_record(true)){main_form.ncactionid.value=’Generate’;main_form.submit();}”);
form.addButton(‘Reject’,’Reject Proposals’,”if (window.isinited && window.isvalid && save_record(true)){main_form.ncactionid.value=’Reject’;main_form.submit();}”); //经典应用2:main_form.ncactionid.value=’Propose’ 这样给一个’ncactionid’ 页面隐藏的变量赋值了!! 然后main_form.submit()以后request.getAllParameters()就可以得到所有这些字段的值(包括隐藏的字段),然后再if( rParams[‘ncactionid’] == ‘Propose’ )进行动作判断。
200901051702
zeng.cz

动作 完毕!~ 书写系统日志 经典:

/* ncBGP_WriteToLog – utility function to write to the Background Process Manager log table
*
* This function will create a new NC Process Log record using the details provided
*
* Parameters:
* ProcessId – the id of the current process record
* RecordRef – a reference for the current record being processed or which the message relates to
* MessageText – the message text to be written to the log
* MessageType – the type of message, ‘Error’, ‘Warning’ or ‘Message’
*/
function ncBGP_WriteToLog(ProcessId,RecordRef,MessageText,MessageType)
{
var l_MsgType;
switch (MessageType)
{
case ‘Error’:
l_MsgType = 1;
break;

case ‘Warning’:
l_MsgType = 2;
break;

case ‘Message’:
default:
l_MsgType = 3;
}

var LogRec = nlapiCreateRecord(‘customrecord_ncbgp_processlog’);
LogRec.setFieldValue(‘custrecord_logprocessid’,ProcessId);
LogRec.setFieldValue(‘custrecord_logrecordref’,RecordRef);
LogRec.setFieldValue(‘custrecord_logmessagetype’,l_MsgType);
LogRec.setFieldValue(‘custrecord_logmessagedetail’,MessageText);
nlapiSubmitRecord(LogRec,false);
}

模块二:dispose 处理;处置

DisposalPageInit – Event Script for Page Init to disable or enable fields
Once sold or disposed, everything should be read-only

onload. assetid change
var Rec = nlapiLoadRecord(‘customrecord_ncfar_asset’, Id);
nlapiSetFieldValue(‘assetdescr’, ncToEmptyString(Rec.getFieldValue(‘custrecord_assetdescr’)));
DisposalPageInit();

AssetOnSave
Please select a Disposal Type
Sale amount must be greater than zero

——————————————————————– 以下是操作界面:dispose 处理

1,ncFAR_RenderDisposalForm(DisposalForm,’New’,null,null,Params);

2,submit后创建form; 总体circle的经典应用

var dParams = request.getAllParameters();
var assetId = dParams[‘assetid’];
var dAsset;
if( (assetId != null) && (assetId != ”) )
{
dAsset = nlapiLoadRecord(ncConst.FAR_Asset, assetId);
}

var result = AssetDisposal(dAsset, assetId, dParams); //根据提交的id 和变量信息,提交给第三步的事务处理来解决
if(result !=”)
{
// disposal failed
ncFAR_RenderDisposalForm(DisposalForm, ‘Error’, assetId, dAsset, dParams,result); //如果出错则 创建form
response.writePage(DisposalForm);
}
else
{
//disposal successful – redirect to full view of asset //如果成功,直接跳转业务流程。
response.sendRedirect(‘RECORD’,ncConst.FAR_Asset,assetId,false); //suitelet良好应用sendRedirect

3,处理特殊具体的事务

* Generate disposal journal and update asset status.
* Generate asset history record.
* If a Sale, create Sales Invoice record and update link on Asset.

// if Sale
if( DispType == 1 )
var usermsg = ‘
Failed to create invoice for asset sale.
Check setup of location and subsidiary on asset record.’;
var result = CreateJournalEntry(DispDate,CurrencyId,FixedExchangeRate,accts,debits,credits,refs,JournalId,Subsid,ClassId,DepartmentId,LocationId);
fNames = new Array(‘custrecord_assetstatus’, ‘custrecord_assetdepractive’,’custrecord_assetbookvalue’,’custrecord_assetdisposaldate’, ‘custrecord_assetdisposaltype’, ‘custrecord_assetdisposalitem’, ‘custrecord_assetsalecustomer’, ‘custrecord_assetsaleamount’, ‘custrecord_assetsalesinvoice’);
fValues = new Array(‘4’, ‘2’,’0.00′,DispDate, DispType, SaleItem, CustomerId, SaleAmount, SIrecId);
nlapiSubmitField(‘customrecord_ncfar_asset’, id, fNames, fValues, ‘F’); //经典应用,数组批量的submitField
// if Write Off
else if( DispType == 2 )
msg = result + ‘
Journal entry for asset write-off not created.’; //make JE
nlapiSubmitField(‘customrecord_ncfar_asset’, id, fNames, fValues, ‘F’);//更新资产
var rDeprHist = nlapiCreateRecord(ncConst.FAR_DeprHistory); //书写历史。

模块三:revaluation 再评估

if(nlapiGetFieldText(‘assetstatus’) == ‘Disposed’)
alert(‘This asset has been disposed.’);

save
Revaluation details must be supplied;

——————————————————————– 以下是操作界面:revaluation 再评估

三个结构,思路很清晰:

1。构造主界面如果是request.getMethod() == ‘GET’) // page display显示
构造初始form然后writePage。 else 获得request 的参数开始运算过程

2。书写构造form的函数,subtab等的界面按钮等。

3。ncFAR_ProcessRevaluation进行运算。书写JE,完成系统内部联系。

模块四:depreciation 折旧

/* DeprMethodOnSave – Event Script to invoke validation and display error if failed (and prevent save)
*
* This function will use SL_DeprMethodValidate (suitelet function) to validate the formula.
* If the formula parses successfully it will continue the save operation.
* If the formula fails an error is displayed and the save is aborted.
*/

var SLparams = new Array();
SLparams[‘deprmethodformula’] = l_Fn;
SLparams[‘render’] = ‘false’;
var OnSaveURL = nlapiResolveURL(‘SUITELET’,’customscript_ncfar_deprmethodvalidate’,’customdeploy_ncfar_deprmethodvalidate’,true);
var OnSaveResp = nlapiRequestURL( OnSaveURL, SLparams );
var OnSaveResult = OnSaveResp.getBody().split(‘~’);

if( OnSaveResult[0] == ‘OK’ )
{

document.all.item(‘divNCFN’).innerHTML = OnSaveResult[1];
alert(‘Function validated successfully. Please review formula representation.’);

——————————————————————– 以下是操作界面:RenderDepreciate

留在后期在补充。。200812111500

var fNames = new Array();
fNames[0] = ‘custrecord_currentprocessstatus’;
fNames[1] = ‘custrecord_processactivitytype’;
fNames[2] = ‘custrecord_numrecordsprocessed’;
fNames[3] = ‘custrecord_processfailuremessage’;
fNames[4] = ‘custrecord_processparamnames’;
fNames[5] = ‘custrecord_processparamvalues’;
var fValues = new Array();
fValues[0] = ‘1’; // status 1 = in progress
fValues[1] = ‘1’; // activity type 1 = custom (direct call)
fValues[2] = ‘0’; // reset record count
fValues[3] = ”; // reset error message
fValues[4] = ‘ATarray,ATypes,DeprPeriod’;
fValues[5] = ATlist+’,’+ATlist+’,’+DeprPeriodDate;

nlapiSubmitField(ncConst.NC_ProcessActivity, ProcessId, fNames, fValues, false); //经典应用,….数组赋值,多字段submit,ncConst.NC_ProcessActivity 全局变量中取值
ncFAR_DepreciateAssetBG(ProcessId); //should be in main transfer function

模块五:registerReport 资产注册报表

Client code for Asset Register Report scriptlet

ncFAR_AssetRegisterReportSL – entry point for Asset Register Report Scriptlet

form.addSubmitButton(‘Generate Report’);

suitelet:

var AssetReportForm = nlapiCreateForm(‘Asset Register Report’);

var ReportOptions = new Array();

if (request.getMethod() == ‘GET’) // page display //在显示之前,先把form等变量定义好
{
var Params = new Array();
ncFAR_RenderReportOptionsForm(AssetReportForm,’Edit’,null,null,Params);
response.writePage(AssetReportForm);
}
else // user submit
{
var rParams = request.getAllParameters(); //这个方法 取得那些变量

ReportOptions[0] = rParams[‘filtermsassettype’];
ReportOptions[1] = rParams[‘filtermssubsid’];

var fld_rptData = AssetReportForm.addField(‘reportdata’, ‘inlinehtml’, ”); //用户点击提交后改变或添加一些field,然后设置值 然后再writePage 这个form即可!! 经典应用!高效 的动态刷新了页面。
fld_rptData.setDisplayType(‘inline’); //因为是inlinehtml的类型 并且设置显示类型:inline 所以结构就灵活了。。。
fld_rptData.setDefaultValue( ncFAR_BuildReportData(ReportOptions, response) );
response.writePage(AssetReportForm);
}

模块六:Depreciation Schedule Report 折旧定期报表

// aiming to make the following table structure:
//
// [ ][ Asset Type Name 1 ][ Asset Type Name 2 ]…
// [‘Asset’][Asset No.
Name][Asset No.
Name]… [Asset No.
Name][Asset No.
Name]…
// [period1][depr amt][nbv amt][depr amt][nbv amt] [depr amt][nbv amt][depr amt][nbv amt]
// [period2][depr amt][nbv amt][depr amt][nbv amt] [depr amt][nbv amt][depr amt][nbv amt]
// [… ][depr amt][nbv amt][depr amt][nbv amt] [depr amt][nbv amt][depr amt][nbv amt]
//
// so, outer table for 3 columns, n periods + 2 rows; each row (except first) contains sub-table for cols 2 and 3

while( (srAT != null) && (i < srAT.length) )
{
while( (srAssets != null) && (j < srAssets.length) )
{ ++j;
}
++i;
}

Asset Depreciation Schedule – Period Depreciation 折旧期间

Asset Depreciation Schedule – Net Book Value

模块七: Fixed Assets Status固定资产状态

处理状态报告,搜索状态表,
var sr = nlapiSearchRecord(‘customrecord_ncbgp_processcontrol’,null,sf,sc);

var rProcessInfo = sr[0];
var procStatus = rProcessInfo.getValue(‘custrecord_currentprocessstatus’); //get text
var procStatusText = rProcessInfo.getText(‘custrecord_currentprocessstatus’);
var l_RecordCount = rProcessInfo.getValue(‘custrecord_numrecordsprocessed’);

fld_1.setDefaultValue(procStatusText);

var _InProgress = false;
if(procStatus == ‘1’ || procStatus == ‘5’) // In Progress or In Queue
_InProgress = true;

if(_InProgress)

else // processing complete
{
fld_3.setDefaultValue(l_RecordCount + ‘ assets(s) have been depreciated.’);
}

模块八: SystemSetup注册安装模块

三个结构,思路很清晰:

1。构造主界面如果是request.getMethod() == ‘GET’) // page display显示
构造初始form然后writePage。 else 获得request 的参数开始运算过程

2。先判断是new的setup还是edit的form,然后书写构造form的函数,subtab等的界面及按钮等。
如果有ncConst.FAR_SystemSetup记录的话,把默认的系统设置带出来,并且把配置信息子标签和内容都弄出来。
如果没有就只弄出界面而已,不包含配置Subsidiaries、Departments、Locations、Classes、Jobs、Multiple Currencies的checkbox。

ncFAR_RenderSetupForm(form,setupState,id,rec)
var fld1 = form.addField(‘farsetupautopropose’, ‘checkbox’, ‘Auto-Propose from Asset Accounts’, ”, ‘custpagesettings’);
var fld1b = form.addField(‘farsetupautocreate’, ‘checkbox’, ‘Auto-Create from Asset Accounts’, ”, ‘custpagesettings’);
var fld2 = form.addField(‘farsetuppostlocation’, ‘checkbox’, ‘Post on Location Change’, ”, ‘custpagesettings’);
var fld3 = form.addField(‘farsetuppostclass’, ‘checkbox’, ‘Post on Class Change’, ”, ‘custpagesettings’);
var fld4 = form.addField(‘farsetuppostdepartment’, ‘checkbox’, ‘Post on Department Change’, ”, ‘custpagesettings’);
var fld4b = form.addField(‘farsetupsummaryjournals’, ‘checkbox’, ‘Summarise Depreciation Journals’, ”, ‘custpagesettings’
var fldAFD = form.addField(‘farsetupfuturedepreciations’, ‘checkbox’, ‘Allow Future-dated Depreciation’, ”, ‘custpagesettings’);
if (setupState == ‘Edit’) // 如果是要编辑一些系统设置的话,
{
fld1.setDefaultValue(rec.getFieldValue(‘custrecord_autopropose’));
form.addTab(‘custpagefeatures’, ‘Features’);

var fld6 = form.addField(‘farsetupsubsidsenabled’, ‘checkbox’, ‘Subsidiaries’, ”, ‘custpagefeatures’);
var hiddenIDField = form.addField(‘hidden_field’, ‘text’, ‘hidden’);
hiddenIDField.setDisplayType(‘hidden’);
hiddenIDField.setDefaultValue(id); //如果是编辑,把id带过去。
form.addSubmitButton(‘Save’);
}
else
{
fld1.setDefaultValue(‘T’); // checked
fld1b.setDefaultValue(‘T’); // checked
form.addSubmitButton(‘Submit’);
}

3。else(即submit后)进行运算:先CreateRecord创建记录

var rec = nlapiCreateRecord(ncConst.FAR_SystemSetup);
rec.setFieldValue(‘custrecord_allowfuturedepr’, request.getParameter(‘farsetupfuturedepreciations’));
rec.setFieldValue(‘custrecord_subsidsenabled’, currentContext.getSetting(‘FEATURE’, ‘subsidiaries’));
var id = request.getParameter(‘hidden_field’); //用request中隐含字段带出id
if( id != null )
{
rec.setFieldValue(‘id’, id); //关键语句
}
try {
id = nlapiSubmitRecord(rec); //关键语句;经典应用,如果是edit的话(有id),submitRecord系统就会更新原有记录,如果没有就会创建一条!!
} catch (e) {
if ( e instanceof nlobjError )
nlapiLogExecution(‘Error’,’System Setup Suitelet’, e.getCode() + ‘n’ + e.getDetails());
else
nlapiLogExecution(‘Error’,’System Setup Suitelet’, e.toString());
}

var form = nlapiCreateForm(‘Fixed Assets Register’); //经典应用二! submit后直接在CreateForm然后把id赋予直接创建form然后writePage.!!  完美circle!
ncFAR_RenderSetupForm(form,’Edit’,id,rec);
response.writePage(form);

模块九:SummaryReport汇总报表

关键点:ncFAR_BuildReportData(ReportOptions)
* This function will read through the Asset data, filtering by the given Report
* Options, and convert the results to HTML
*
* Parameters: ReportOptions – Array of range values to restrict the report data

模块十:核心主函数

if( currentContext.getSetting(‘FEATURE’,’multicurrency’) == ‘T’ ) //for what?
{
sColumns[sColumns.length] = new nlobjSearchColumn(‘currency’); // N.B. this (as at 9 Nov 2007) will return currency id (not name)
sColumns[sColumns.length] = new nlobjSearchColumn(‘exchangerate’); //good way!~`
}

全局变量设定:

/* ************* Shared Constant Values ************* */

function ncConst() // dummy constructor for ncConst object which will contain our Record Type constants
{
}

ncConst.BGP_ProcessIdParam = ‘custscript_bgp_processid’; /* parameter name for Process Id on scheduled script deployments */
ncConst.BGP_ProcessIdParam2 =’custscript_bgp_startprocessid’; /* parameter name for Process Id on additional scheduled script deployments */

//–SEARCHBLOCK:customrecord – replace these values on deployment
ncConst.FAR_SystemSetup = ‘customrecord_ncfar_systemsetup’; /* record type for System Setup */
ncConst.FAR_AssetType = ‘customrecord_ncfar_assettype’; /* record type for Asset Type */
ncConst.FAR_DeprMethod = ‘customrecord_ncfar_deprmethod’; /* record type for Deprecation Method */
ncConst.FAR_Asset = ‘customrecord_ncfar_asset’; /* record type for Asset */
ncConst.FAR_Proposal = ‘customrecord_ncfar_assetproposal’; /* record type for Asset Proposal */
ncConst.FAR_AssetUsage = ‘customrecord_ncfar_assetusage’; /* record type for Asset Usage */
ncConst.FAR_DeprHistory = ‘customrecord_ncfar_deprhistory’; /* record type for Depreciation History */
ncConst.FAR_XferAccounts = ‘customrecord_ncfar_transferaccounts’; /* record type for Asset Transfer Accounts */
ncConst.NC_ProcessActivity = ‘customrecord_ncbgp_processcontrol’; /* record type for Process Activity */
ncConst.NC_ProcessLog = ‘customrecord_ncbgp_processlog’; /* record type for Process Log */

netsuite凭证批量打印中涉及的html分页打印问题,页面的部分打印-CarlZeng

zeng.cz在打印HTML页面时控制分页,可以使用层来动态控制。 具体的方法是,在需要分页的地方动态添加如下代码: 这是一个经典应用,如果netsuite中涉及的批量凭证打印 需要用这个来控制每张凭证的页面的。很重要,因为html打印是无法像pdf那样的位置决定性。如果一个页面中的表格被分摊到不同的页面来打印了:无标题文档每页都有的表头表格内容表格内容表格内容表格内容表格内容表格内容表格内容…

zeng.cz

在打印HTML页面时控制分页,可以使用层来动态控制。

具体的方法是,在需要分页的地方动态添加如下代码:

这是一个经典应用,如果netsuite中涉及的批量凭证打印 需要用这个来控制每张凭证的页面的。很重要,因为html打印是无法像pdf那样的位置决定性。

如果一个页面中的表格被分摊到不同的页面来打印了:





无标题文档

































每页都有的表头
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
表格内容表格内容
每页都有的表尾



总体方案的确认:

一、浏览器的打印功能菜单
这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
1. 不能精确分页。
浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
2. 不能准确对齐边边距及打印文字。
3. 不能解决连续打印。
比如,不是仅打印一张票据,而是连续一次打印若干个票据。

二、使用webbrowser控件+ javascript
这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。

三、使用print css
这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print css推出已经有些时日,但遗憾的是,至今
没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见http://css-discuss.incutio.com/?page=PrintStylesheets

四、使用pdf文件
用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。

七、轻量级的ActiveX打印方式
这是本公司应客户要求,最新推出的一种最具创意的web套打解决方案。
杰表作为一款纯java的报表工具,以前的提供的web套打方案也是基于Applet的,Applet也做到了尽可能的小(只有24kb),但用户还是抱怨,因为jre太大,安装需要耐心。另外,用Applet方式,很难实现客户端的批量打印功能。

我们采用轻量级的ActiveX打印方案,很好地解决了客户的问题。以下是一个典型的该种方案的示例。

轻量级的ActiveX打印方案的优点是:
1.效率高。可以直接打印指定的html文档,不必向后台再次提起请求。
2.能做到精确打印,分页;
3.功能丰富。可以利用该控件,实现对当前票据文档的打印,预览,及多个html文档的连续打印。
4.成本低廉,ActiveX只有20kb。、

http://www.jatools.com/print/ 这是一个收费的东西,可以找找那些绿色版的,

==================netsuite凭证批量打印中涉及的html分页打印问题,页面的部分打印

window.print() 实际上,是浏览器打印功能菜单的一种程序调用。与点击打印功能菜单一样,不能精确分页,不能设置纸型,套打的问题更加无从谈起,只不过,可以让用户不用去点菜单,直接点击网页中的一个按钮,或一个链接里面调用罢了。事实上,很多用户都是采用这种方式打印,但是这种方式最致命的缺点是不能设置打印参数,比如纸型,页边距,选择打印机等等。

需要指出的是这种方法提供一个打印前和打印后的事件onbeforeprint、onafterprint。可以在打印前的时候重新编辑一些格式,专门送去打印,打印后又处理回来。
function window.onbeforeprint()
{
//将一些不需要打印的隐藏
}
function window.onafterprint()
{
//放开隐藏的元素
}

通过这两个方法,就可以实现页面的部分打印

netsuite内部ajax请求,返回Code: 500错误-CarlZeng

500是服务器本身的错误代码。+代表”Internal Server Error”。一般是500都是你响应数据的页面本身就不能正确执行function login(){//alert(‘in login script’)var soap = ”;soap += ”;soap += ‘http://schemas.xmlsoap.org/soap/envelope/”>’;soap += ”;…

500是服务器本身的错误代码。+代表”Internal Server Error”。

一般是500都是你响应数据的页面本身就不能正确执行

function login()
{
//alert(‘in login script’)
var soap = ”;
soap += ‘<?xml version=”1.0″?>’;
soap += ‘<SOAP-ENV:Envelope xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”>’;
soap += ‘‘;
soap += ‘‘;
soap += ‘
‘;
soap += ‘
‘;
soap += ‘‘;
soap += ‘‘;
soap += ‘‘;
soap += ‘[email protected]‘;
soap += ‘******‘;
soap += ‘TSTDRV******‘;
soap += ‘‘;
soap += ‘
‘;
soap += ‘
‘;
soap += ‘
‘;
soap += ‘
‘;
soap += ‘‘;

return soap;
}

把这个soap 传递给 ‘https://webservices.netsuite.com/services/NetSuitePort_2_6’;

response =nlapiRequestURL(ns_ws_url, loginsoap, a);

问题估计是发生在了这个soap上,由于最新的netsuite更新这个soap估计有问题了。

关联应用:

var test_value = request.getAllHeaders();

var the_response =nlapiRequestURL(‘https://system.netsuite.com/app/common/multicurrency/currencyratelist.nl’, null, test_value);

var the_body = the_response.getBody();

这个关联的应用代表登陆后在访问的页面,携带登陆信息。这个应用很经典!就是在服务端通过ajax直接操作了很多东西,用户可能还察觉不到。

netsuite与首信易支付(v4.3)接口-CarlZeng

问题1 ,文档中提及了 URL参数是以http://开头的完整URL地址。 而netsuite中向外开放的可用的地址都是https://,难道首信就不支持?这个问题需要与首信确认。 已答复:支持,曾经只有发现一个https无法返回的案例。说明此问题不是主要问题。问题2,步骤一, 用户从客户中心中自己下了订单后,决定支付,于是到订单页面点’前往支付’按钮,系统要传递订单信息,到suitelet来读取…

问题1 ,文档中提及了 URL参数是以http://开头的完整URL地址。 而netsuite中向外开放的可用的地址都是https://,难道首信就不支持?这个问题需要与首信确认。 已答复:支持,曾经只有发现一个https无法返回的案例。说明此问题不是主要问题。

问题2,步骤一, 用户从客户中心中自己下了订单后,决定支付,于是到订单页面点’前往支付’按钮,系统要传递订单信息,到suitelet来读取订单的资料,并展示给客户(下方定有一个’确认支付’),内容大致如下:


商户编号
订单编号
收货人姓名
收货人地址
收货人电话
收货人邮编
订单总金额
订单产生日期
配货状态
订货人姓名
币种,0为人民币,1为美元
//支付动作完成后返回到该url,支付结果以GET方式发送
//订单数字指纹

function str2binlExpress(str) 是在md5.inc中定义的,也就是说验证的程序需要调用vbscript 这样netsuite支持吗?
javascript中只有Unicode转换没有ascii码转换,所以要用vbscript中的代码来实现…加了这段代码后,最好在页面中有脚本的地方都写清楚脚本语言,否则可能会出现错误。

解决:c=String.fromCharCode(65)
—————————————————————

str.charCodeAt(x),表示将字符串str中的第x个字符转变成ASCII值
求ASCII转字符:javascript用String.fromCharCode(x);vbscript用chr(x)或chrw(x)
求字符转ASCII:javascript用??;vbscript用asc(‘字符’)

_chr_ Asc 这两个函数很难转的 ??碰到了Asc

function str2binlExpress(str)
result = “”
a = “”
b = 0
for i = 1 to len(str)

a = mid(str,i,1)
b = asc(a)

if b > -1 and b < 255 then result = result & b & "," end if if b<0 then result = result & int((b + 65536)/256) & "," result = result & (b and 255) & "," end if if(b > 255) then
result = result & int((b)/256) & “,”
result = result & (b and 255) & “,”
end if
next
str2binlExpress = result
end function

将被从vbscript转化为javascript 转化结果如下:

function str2binlExpress(str)
{
result = “”;
var a = “”;
var b = 0;
for( var i=0; i -1 && b < 255) result = result + b + "," ; if ( b<0 ) { result = result + parseInt( (parseInt(b) + 65536)/256 ) + ","; //result = result + int((b + 65536)/256) + ","; result = result + (b & 255) + "," ; } if( b > 255) {
result = result + parseInt( b/256 ) + “,”; //result = result + int((b)/256) + “,”;
result = result + (b & 255) + “,”;
}
}
var str2binlExpress = result;
//alert(‘str:’+str+’a:’+a+’b:’+b+’str2binlExpress:’+str2binlExpress);
return str2binlExpress;
}

英文状态下是ok的,询问易支付后得知,他们都使用gb2312来校验的,我需要做的就是发送时v_rcvname涉及字符装换;接收时涉及 v_pmode 和 v_pstring的字符转化。

问题4:已确认发送成功,并且银行支付成功,但是没有取得实时的返回,那么原因已排出url是带119个字符并且有参数的原因,那么需要继续测试银行支付成功以后,银行给我中转值的情况。