netsuite 文件上传内部函数-CarlZeng

function new_mediaitem() {document.getElementById(‘mediaitem_popup_new’).onclick()}netsuite 文件上传内部函数;这样就可以打开一个新的窗体 用于上传文件到netsuite文件柜中。已经关联文件的命令。function attach_media() { var mediaitem = getSelectValu…

function new_mediaitem() {
document.getElementById(‘mediaitem_popup_new’).onclick()
}

netsuite 文件上传内部函数;这样就可以打开一个新的窗体 用于上传文件到netsuite文件柜中。

已经关联文件的命令。

function attach_media() {
var mediaitem = getSelectValue(document.forms[‘mediaitem_main_form’].elements[‘mediaitem’]);
var mediatab = ‘history’;
if ( isValEmpty(mediaitem) || parseInt(mediaitem) == -1) {
alert(‘Please select a file.’); return ; }
setSelectValue(document.forms[‘mediaitem_main_form’].elements[‘mediaitem’],”);
window.setIsInited(window,false);
var id = document.forms[‘main_form’].elements[‘id’].value;
document.getElementById(‘server_commands’).src=’/app/common/media/importcrmmedia.nl?action=ADD&recordtype=&fkcol=ktrandoc&fkval=’+id+’&mediaid=’+mediaitem+’&attachfrom=LIST&mediatab=’+mediatab;
}

注意这个getElementById(‘server_commands’).src 这个意味着告诉系统 要做什么,系统内部流程。

隐含字段 :if( nlapiGetFieldValue(‘canbeunapproved’)==’T’ )

可以用来断定该单据是否允许再次需要审批。

netsuite 批次货品 lotnumber 到期日/批号 列的赋值-CarlZeng

在弹出的搜索页面,确认输入的批号时,函数的调用依次是:setTarget(’21/2/2009-269852′,21/2/2009-269852);function setTarget(s,i) {var frm,fldnam,fld;frm = parent.opener.document.forms.item_form;fldnam = ‘serialnumbers’;fld = parent…

在弹出的搜索页面,确认输入的批号时,

函数的调用依次是:

setTarget(’21/2/2009-269852′,21/2/2009-269852);

function setTarget(s,i) {
var frm,fldnam,fld;
frm = parent.opener.document.forms.item_form;
fldnam = ‘serialnumbers’;
fld = parent.opener.getFormElement(frm,fldnam);
addMultiSelectValue(fld,i,s);
window.opener.setTimeout(function() { fld.onchange(); }, 0);;
}

所有批号的赋值关键就在这个addMultiSelectValue(fld,i,s);中,我们接着来看:

function addMultiSelectValue(sel, val, name)
{
if (isNLMultiDropDown(sel))
{
var dd = getMultiDropdown(sel);
var idx = dd.getIndexForValue(val);
dd.addIndex(idx);
}
else if (sel.type == “select-multiple”)
{
var opts = sel.options;
for (var i=0; i < opts.length; i++)
if ( opts[i].value == val )
opts[i].selected = true;
}
else
{
var values = sel.value.split(String.fromCharCode(5));
for (var i=0;i < values.length;i++)
if (values[i] == val) return;
sel.form.elements[sel.name+”_display”].style.color = ‘000000’;
if (values.length == 0 || values[0].length == 0)
{
sel.value = val;
sel.form.elements[sel.name+”_display”].value = name;
sel.form.elements[sel.name+”_labels”].value = name;
}
else
{
sel.value += String.fromCharCode(5)+val;
sel.form.elements[sel.name+”_labels”].value += String.fromCharCode(5)+name;
var lines = sel.form.elements[sel.name+”_display”].value.split(/n|r/);
if (lines.length == values.length)
sel.form.elements[sel.name+”_display”].value += “n”+name;
else
{
lines[values.length] = name;
sel.form.elements[sel.name+”_display”].value = lines.join(“n”);
}
}
}
}

总结:document.item_form.elements[‘serialnumbers_display’].value=’21/2/2009-269852′; 即可完成批号的批量赋值。。。

当然:Syncserialnumbers(true);
nlapiFieldChanged(‘item’,this);
validateInventoryNumbers(); 可不能忘记罗。。。

同样学到一点 ,如果elements 没有id 的话,用默认的 getElementById是取不到值的,在firefox下是这样的。所有系统被迫用了sel.form.elements[sel.name+”_display”].value 去赋值了。

zeng.cz

==================================================================由于SO中的lotnumber的序列号列中所有填写的数量,受到SO界面中Location的影响,所以抓到的东西必须是过滤后的东西,而货品的编辑页面(https://system.netsuite.com/app/common/item/item.nl?id=42)的SubTab(numbers)有两个filter,

一个是Synconhandfilter 另一个是Synclocationfilter ,所以现在取得这两个东西过滤后的东西 成为必须和关键要素。200901071758

To Be Continued….

View “What’s this?”)

All On Hand

Location “What’s this?”)

MX库 NBTY NB库 广州库 总库房 总库房 : MX区 总库房 : NB区 总库房 : PP区 总库房 : 零时区域 缓冲库 赠品库

+

that’s the page we need to catch : https://system.netsuite.com/app/common/item/item.nl?itemtype=InvtPart&costingmethod=LOT&cf=7&id=’+itemid+’&q=locationfilter&si=’+location+’&si_onhandfilter=onhand&f=T&machine=numbers’

itemid is the item’s internalId ; and location is the location’s InternalId;

ok it’ come to more easyer…

netsuite 与google app集成方案(预计)-CarlZeng

什幺是 Google 企业应用套件? 了解更多 | 注册 Google 企业应用套件包含一系列面向企业、基于 Web 的生产性服务,它提供有功能强大的通信和协作工具。 Google 企业应用套件包括: 企业 Gmail – 向您所在域的电子邮件地址发送和接收电子邮件。 日历 – 同步计划并共享事件。 即时消息 – 通过 Google Talk 插件保持联系和展开合作。 文档 – 实时创建在线文档…

什幺是 Google 企业应用套件?

了解更多 | 注册

Google 企业应用套件包含一系列面向企业、基于 Web 的生产性服务,它提供有功能强大的通信和协作工具。 Google 企业应用套件包括:

  • 企业 Gmail – 向您所在域的电子邮件地址发送和接收电子邮件。
  • 日历 – 同步计划并共享事件。
  • 即时消息 – 通过 Google Talk 插件保持联系和展开合作。
  • 文档 – 实时创建在线文档并展开协作。
  • 电子表格 – 在 Web 浏览器窗口中创建按需电子表格。
  • 演示 – 同整个团队一起创作并演示在线演示文稿。
  • 初始页 – 从集中位置访问公司信息并搜索 Web。

属性 1 配置 Google 企业应用套件域

Google 企业应用套件管理联系人

zeng cz

Google 企业应用套件管理联系人是贵组织中 Google 企业应用套件用户的单一联系人;当用户无法访问某个 Google 企业应用套件服务时,将被引导去联系 Google 企业应用套件管理联系人。

Google 企业应用套件管理联系人不需要使用 Google 注册为贵组织的 Google 企业应用套件管理员的同一个人,但只有 Google 企业应用套件管理员能够在您的域上创建新的 Google 企业应用套件用户。

Google 企业应用套件域

netsuitecn.com

属性 2 启用 Google 企业应用套件服务

操作

名称

编辑

选取的

添加 Google 文档到 netsuite

netsuite.com

编辑

选取的

Google 文档选项卡

netsuite.com

编辑

选取的

Gmail 至 netsuite

netsuite.com

编辑

选取的

Gmail 按钮和链接

netsuite.com

编辑

选取的

Google Talk 插件侧栏组件

netsuite.com

1,Google 文档到 Netsuite.直接将Google文档连接到Netsuite系统内部。

一个是直接挂钩客户或者联系人上面的,发生关联,另外一个直接iframe方便编辑,重新打开,会新开窗口不怎么喜欢

2,Email集成到Netsuite中成为Event or phone。。。

Email 至 Netsuite”允许您自动将您从第三方电子邮件帐户发送的电子邮件作为活动记录到 Netsuite 中的潜在客户和联系人记录上。

在启用”Email 至 Netsuite”后,用户可以访问”My Email 至 Netsuite”页以查看其唯一的”Email 至 Netsuite”地址,并自定义设置。

3,Gmail按钮,实现链接至Gmail内部,email将成为’收件人’。

代码:Gmail

/google/googleSplash.apexp?app=GMAIL&appURL=http%3A%2F%2Fmail.google.com%2Fa%2Fnetsuitecn.com%2Fmail%3Fview%3Dcm%26fs%3D1%26tf%3D1%26to%3Djeanne.liang%40sohu.com 一个地址接收mailto 连接netsuite和google mail。

4,Google Talk插件 侧栏组建,如Gmail内部的左侧的GTalk组件。

netsuite you can’t submit this form due to unexpected error-CarlZeng

due to 2009.1 ‘s version upgrate , many custom form down,example : item fulfillment 、 item receipt,it’s terrible!! without any script.. make me crazy now ..the only way :log a case, call netsuite supp…

due to 2009.1 ‘s version upgrate , many custom form down,

example : item fulfillment 、 item receipt,

it’s terrible!! without any script.. make me crazy now ..

the only way :log a case, call netsuite support . … they can check about the unexpected error in back end with you login id (zeng.chuanzhuo (A) totemsuite.com )

only way….
20090415 zeng.cz

netsuite you can’t submit this form due to unexpected error

netsuite url中?whence= 的作用 functionality-CarlZeng

在我书写开发的过程中,有这样的需求,支付帐单的界面 跳转到支付单个供应商的界面 完成支付。这个时候url上添加参数&entity= 系统可以完成默认的打开页面以后entity的指定,这样的结果是,当用户保存那个的支付单个供应商之后,跳转回原来页面,而如果原来的页面时一个suitelet提交过的页面url就会默认成:https://system.netsuite.com/app/site/hosti…

在我书写开发的过程中,有这样的需求,支付帐单的界面 跳转到支付单个供应商的界面 完成支付。

这个时候url上添加参数&entity= 系统可以完成默认的打开页面以后entity的指定,

这样的结果是,当用户保存那个的支付单个供应商之后,跳转回原来页面,而如果原来的页面时一个suitelet提交过的页面url就会默认成:https://system.netsuite.com/app/site/hosting/scriptlet.nl 这样的页面,

而单独打开这个页面系统默认会给出错误提示:

This request is missing a required parameter.

经过观察,发现很多netsuite的页面地址中都包含一个whence参数,作用就是完成该页面的操作后,负责流程跳转的事务,这样就需要在suitelet的跳转链接上 加上一个?whence= 就可以避免出现错误。

20090417
zeng.cz

netsuite split 分隔符 String.fromCharCode(5)-CarlZeng

netsuite中,一些数组在服务端表示时,需要被分隔开来,系统默认用”来分隔。testarray.split( String.fromCharCode(5) );String.fromCharCode(5) 显示html为一个正方形的符号。数组分隔符。

netsuite中,一些数组在服务端表示时,需要被分隔开来,系统默认用”来分隔。

testarray.split( String.fromCharCode(5) );

String.fromCharCode(5) 显示html为一个正方形的符号。

数组分隔符。

netsuiet recordtype url规则-CarlZeng

https://system.netsuite.com/app/common/custom/custrecordentry.nl?rectype=34&pf=CUSTRECORD_LOSE&pi=1282&pr=-30&cf=14rectype=34 代表记录类型的internalidpf=CUSTRECORD_LOSE 代表记录类型名称pi=1282 代表isparent的关联的单据intern…

https://system.netsuite.com/app/common/custom/custrecordentry.nl?rectype=34&pf=CUSTRECORD_LOSE&pi=1282&pr=-30&cf=14

rectype=34 代表记录类型的internalid

pf=CUSTRECORD_LOSE 代表记录类型名称

pi=1282 代表isparent的关联的单据internalid是1282 这里我代表SO的1282

pr=-30 可不带;

&cf=14 代表用的是那个自定义form ; 14是这个记录类型是用的那个form的internalid

netsuite nlobjSearchFilter anyof noneof ,order状态列表,transaction类型-CarlZeng

var trnTypeAR = [‘Build’,’VendBill’,’InvAdjst’,’InvTrnfr’,’ItemRcpt’,’Journal’];sFilters[filterBase+2] = new nlobjSearchFilter(‘type’,null,’anyof’,trnTypeAR,null);anyof noneof 就是这么应用的. 是比较实用的功能,以及orde…

var trnTypeAR = [‘Build’,’VendBill’,’InvAdjst’,’InvTrnfr’,’ItemRcpt’,’Journal’];
sFilters[filterBase+2] = new nlobjSearchFilter(‘type’,null,’anyof’,trnTypeAR,null);

anyof noneof 就是这么应用的. 是比较实用的功能,

以及order状态列表

var dd = win.makeMultiDropdown(‘Transaction_STATUS’, 8, new Array(‘Bill:Open’, ‘VendBill:A’, ‘Bill:Paid In Full’, ‘VendBill:B’, ‘Bill Payment:Voided’, ‘VendPymt:V’, ‘Bill Payment:Online Bill Pay Pending Accounting Approval’, ‘VendPymt:Z’, ‘Cash Sale:Unapproved Payment’, ‘CashSale:A’, ‘Cash Sale:Not Deposited’, ‘CashSale:B’, ‘Cash Sale:Deposited’, ‘CashSale:C’, ‘Cheque:Voided’, ‘Check:V’, ‘Cheque:Online Bill Pay Pending Accounting Approval’, ‘Check:Z’, ‘Commission:Pending Payment’, ‘Commissn:A’, ‘Commission:Overpaid’, ‘Commissn:O’, ‘Commission:Pending Accounting Approval’, ‘Commissn:P’, ‘Commission:Rejected by Accounting’, ‘Commissn:R’, ‘Commission:Paid in Full’, ‘Commissn:X’, ‘Credit Memo:Open’, ‘CustCred:A’, ‘Credit Memo:Fully Applied’, ‘CustCred:B’, ‘Customer Deposit:Not Deposited’, ‘CustDep:A’, ‘Customer Deposit:Deposited’, ‘CustDep:B’, ‘Customer Deposit:Fully Applied’, ‘CustDep:C’, ‘Customer Refund:Voided’, ‘CustRfnd:V’,

‘Estimate:Open’, ‘Estimate:A’, ‘Estimate:Processed’, ‘Estimate:B’, ‘Estimate:Closed’, ‘Estimate:C’, ‘Estimate:Voided’, ‘Estimate:V’, ‘Estimate:Expired’, ‘Estimate:X’, ‘Expense Report:In Progress’, ‘ExpRept:A’, ‘Expense Report:Pending Supervisor Approval’, ‘ExpRept:B’, ‘Expense Report:Pending Accounting Approval’, ‘ExpRept:C’, ‘Expense Report:Rejected by Supervisor’, ‘ExpRept:D’, ‘Expense Report:Rejected by Accounting’, ‘ExpRept:E’, ‘Expense Report:Approved by Accounting’, ‘ExpRept:F’, ‘Expense Report:Approved (Overridden) by Accounting’, ‘ExpRept:G’, ‘Expense Report:Rejected (Overridden) by Accounting’, ‘ExpRept:H’, ‘Expense Report:Paid In Full’, ‘ExpRept:I’, ‘Invoice:Open’, ‘CustInvc:A’, ‘Invoice:Paid In Full’, ‘CustInvc:B’, ‘Item Fulfillment:Picked’, ‘ItemShip:A’, ‘Item Fulfillment:Packed’, ‘ItemShip:B’, ‘Item Fulfillment:Shipped’, ‘ItemShip:C’, ‘Journal:Pending Approval’, ‘Journal:A’, ‘Journal:Approved for Posting’, ‘Journal:B’, ‘Opportunity:In Progress’, ‘Opprtnty:A’, ‘Opportunity:Issued Estimate’, ‘Opprtnty:B’,

‘Opportunity:Closed – Won’, ‘Opprtnty:C’, ‘Opportunity:Closed – Lost’, ‘Opprtnty:D’, ‘Paycheque:Undefined’, ‘Paycheck:A’, ‘Paycheque:Pending Tax Calculation’, ‘Paycheck:C’, ‘Paycheque:Pending Commitment’, ‘Paycheck:D’, ‘Paycheque:Committed’, ‘Paycheck:F’, ‘Paycheque:Preview’, ‘Paycheck:P’, ‘Paycheque:Reversed’, ‘Paycheck:R’, ‘Payment:Unapproved Payment’, ‘CustPymt:A’, ‘Payment:Not Deposited’, ‘CustPymt:B’, ‘Payment:Deposited’, ‘CustPymt:C’, ‘Payroll Liability Cheque:Voided’, ‘LiabPymt:V’, ‘Purchase Order:Pending Supervisor Approval’, ‘PurchOrd:A’, ‘Purchase Order:Pending Receipt’, ‘PurchOrd:B’, ‘Purchase Order:Rejected by Supervisor’, ‘PurchOrd:C’, ‘Purchase Order:Partially Received’, ‘PurchOrd:D’, ‘Purchase Order:Pending Billing/Partially Received’, ‘PurchOrd:E’, ‘Purchase Order:Pending Bill’, ‘PurchOrd:F’, ‘Purchase Order:Fully Billed’, ‘PurchOrd:G’, ‘Purchase Order:Closed’, ‘PurchOrd:H’, ‘Return Authorisation:Pending Approval’, ‘RtnAuth:A’, ‘Return Authorisation:Pending Receipt’, ‘RtnAuth:B’,

‘Return Authorisation:Cancelled’, ‘RtnAuth:C’, ‘Return Authorisation:Partially Received’, ‘RtnAuth:D’, ‘Return Authorisation:Pending Refund/Partially Received’, ‘RtnAuth:E’, ‘Return Authorisation:Pending Refund’, ‘RtnAuth:F’, ‘Return Authorisation:Refunded’, ‘RtnAuth:G’, ‘Return Authorisation:Closed’, ‘RtnAuth:H’, ‘Sales Order:Pending Approval’, ‘SalesOrd:A’, ‘Sales Order:Pending Fulfillment’, ‘SalesOrd:B’, ‘Sales Order:Cancelled’, ‘SalesOrd:C’, ‘Sales Order:Partially Fulfilled’, ‘SalesOrd:D’, ‘Sales Order:Pending Billing/Partially Fulfilled’, ‘SalesOrd:E’, ‘Sales Order:Pending Billing’, ‘SalesOrd:F’, ‘Sales Order:Billed’, ‘SalesOrd:G’, ‘Sales Order:Closed’, ‘SalesOrd:H’, ‘Sales Tax Payment:Voided’, ‘TaxPymt:V’, ‘Sales Tax Payment:Online Bill Pay Pending Accounting Approval’, ‘TaxPymt:Z’, ‘Statement Charge:Open’, ‘CustChrg:A’, ‘Statement Charge:Paid In Full’, ‘CustChrg:B’, ‘Tax Liability Cheque:Voided’, ‘TaxLiab:V’, ‘Tegata Payable:Endorsed’, ‘TegPybl:E’, ‘Tegata Payable:Issued’, ‘TegPybl:I’,

‘Tegata Payable:Paid’, ‘TegPybl:P’, ‘Tegata Receivable:Collected’, ‘TegRcvbl:C’, ‘Tegata Receivable:Discounted’, ‘TegRcvbl:D’, ‘Tegata Receivable:Endorsed’, ‘TegRcvbl:E’, ‘Tegata Receivable:Holding’, ‘TegRcvbl:H’, ‘Vendor Return Authorization:Pending Approval’, ‘VendAuth:A’, ‘Vendor Return Authorization:Pending Return’, ‘VendAuth:B’, ‘Vendor Return Authorization:Cancelled’, ‘VendAuth:C’, ‘Vendor Return Authorization:Partially Returned’, ‘VendAuth:D’, ‘Vendor Return Authorization:Pending Credit/Partially Returned’, ‘VendAuth:E’, ‘Vendor Return Authorization:Pending Credit’, ‘VendAuth:F’, ‘Vendor Return Authorization:Credited’, ‘VendAuth:G’, ‘Vendor Return Authorization:Closed’, ‘VendAuth:H’, ‘Work Order:Pending Build’, ‘WorkOrd:B’, ‘Work Order:Cancelled’, ‘WorkOrd:C’, ‘Work Order:Partially Built’, ‘WorkOrd:D’, ‘Work Order:Built’, ‘WorkOrd:G’, ‘Work Order:Closed’, ‘WorkOrd:H’), “”,”setWindowChanged(window, true);”,document,0,null,300);

所有系统transaction 状态 如下所示,netsuite将单据的状态分类到上没有的类型。

以及 transaction类型 如 ‘Return Authorisation 那么 他的列表 比如nlobjSearchFilter 必须使用RtnAuth 表示!

在举例:’Expense Report’ 值就是 ExpRept, 其他类似递推。。

netsuite Bin Numbers 输入原理-CarlZeng

重复利用:popupBinDiv(document.forms[‘item_form’].elements[‘itembinlist’].value,document.forms[‘inventory_form’].elements[‘binnumbers’], 0, document.forms[‘inventory_form’].elements[‘adjustqtyby’]);显然netsu…

Bins

重复利用:
popupBinDiv(document.forms[‘item_form’].elements[‘itembinlist’].value,document.forms[‘inventory_form’].elements[‘binnumbers’], 0, document.forms[‘inventory_form’].elements[‘adjustqtyby’]);

显然netsuite在item变化时需要准备这个 ‘itembinlist’ div显示内容库,然后它设置的popupBinDiv 就可以发挥作用来完成可视化的输入效果。

如果时间允许,我们其实可以重建这个显示库,包括动态生成这个可视化显示的div触发起点。

zeng 2009-03-30 0924