2007/04/18

will + be doing sth.

you will be doing me a favor

2007/04/17

ajax labels based on blogger

Fw: SAP启动第一个面向业务流程专家的开放社区

SAP启动第一个面向业务流程专家的开放社区

作者:出处:天极网
[ 2006-09-15 19:46 ]
摘要:SAP公司在大会上宣布,为了更好地帮助客户和合作伙伴体验企业级面向服务的架构 (企业级SOA) 带来的商业价值, SAP公司启动了该行业领域里的第一个业务流程专家社区。

  认证项目

   社区启动后,SAP还引进多种新方法,帮助业务流程专家加速职业发展速度,向各自的组织机构提供增值服务。通过提供从专家到负责人3种不同等级 的证明,认证项目对于帮助业务流程专家拓展技术并提高自身专业技能起到重要作用。除了SAP以外,包括威得恩大学工商管理学院在内的教育伙伴协会也将提供 多种课程,帮助个人获得业务流程专家证书。

  威得恩大学工商管理学院院长Savas Ozatalay说:“多年以来,SAP带头开发工具和应用软件,加速业务流程创新,在威得恩大学,通过我们的卓越业务流程创新中心,我们已经感受到来自 SAP的帮助,并且支持其继续发挥领导作用。此外,我们最新修订的MBA项目也集中在业务流程创新领域。对于SAP针对业务流程专业的新资格证书,我们很 感兴趣,也很荣幸能够提供这方面的教育支持。SAP将业务流程专家定义为—由业务分析师、应用咨询顾问,还有过程开发商共同扮演的一种角色——恰恰是我们 BPI的课程所涉及的内容,也是认证项目的目标所在。 ”

  SAP平台生态系统执行副总裁Zia Yusuf说:“展望未来,我们希望业务流程专家的作用能够以企业的着眼点为中心,那就是促进业务流程创新和支持企业进行最大效益的IT投资。该社区内的 合作创新正在以前所未有的速度向前发展,我们很兴奋能看到业务流程专家聚集一堂与其它会员一同交流专业技能,推动业务流程创新,并增加企业运营的敏捷 度。”

  SAP社区

  今天启动的业务流程专家社区为工作性质相似和同行业的客户与合作伙伴提供了一个崭新的论坛,从而有助于大家合作创新,获取资源并共享最佳实践经验。其他的社区还包括:

   SAP技术开发者网络——SDN(sdn.sap.com):SDN是中心资源区。SAP生态圈的技术专家在SAP NetWeaver平台上通力合作,共同创新解决方案,并且为各个独立软件供应商、系统集成销售代表、开发商、企业建筑师和咨询顾问之间的信息共享做出了 贡献。目前,SDN有来自200多个国家的50万名会员。

  SAP企业服务社区(esc.sap.com):2006年4月推出的SAP企业服务社区,目前已拥有为界定企业服务而通力合作的会员100多名。现在有5条企业服务社区通道:银行业企业服务、跨行业RFID、手机企业服务、卫生保健企业服务和公共行业税收管理服务。

   行业价值网络(http://www.sap.com/community/pub/innovation/ivn/):在客户参与和SAP深 层行业经验的帮助下,这些网络将客户、合作伙伴和SAP连接在一起,进行合作创新,快速找出方案以解决专门的行业问题。通过独立软件供应商,这些方案将支 持SAP NetWeaver平台创造一种端对端的解决方案,从而完善企业服务。最终结果将使客户加大和扩展对SAP解决方案的投资,从而有助于最优化利用资产并降 低IT投资风险。目前有5个独立软件供应商:化学制品、消费者产品、高科技、公共部门和零售商。

json-plsql version 0.1

CREATE OR REPLACE PACKAGE BODY FYANG.PKG_JSON_PLSQL
is

c_crlf varchar2(2) := chr(13) || chr(10);
c_mdl varchar2(30) := 'PKG_JSON_PLSQL' ;
c_dbg_mode boolean := false;

procedure append (p_src in out varchar2, p_opnd in varchar2)
is
begin
p_src := p_src || p_opnd;
dbms_output.put(p_opnd);
end;

procedure appendln (p_src in out varchar2, p_opnd in varchar2)
is
begin
p_src := p_src || p_opnd || c_crlf;
dbms_output.put_line(p_opnd);
end;

function quote (p_src in varchar2) return varchar2
is
begin
return '"' || p_src || '"';
end;

function js_naming (p_pls_name in varchar2) return varchar2
is
v_rst varchar2(2000) := p_pls_name;
begin
v_rst := lower(v_rst);
v_rst := replace(v_rst, '_a', 'A');
v_rst := replace(v_rst, '_b', 'B');
v_rst := replace(v_rst, '_c', 'C');
v_rst := replace(v_rst, '_d', 'D');
v_rst := replace(v_rst, '_e', 'E');
v_rst := replace(v_rst, '_f', 'F');
v_rst := replace(v_rst, '_g', 'G');
v_rst := replace(v_rst, '_h', 'H');
v_rst := replace(v_rst, '_i', 'I');
v_rst := replace(v_rst, '_j', 'J');
v_rst := replace(v_rst, '_k', 'K');
v_rst := replace(v_rst, '_l', 'L');
v_rst := replace(v_rst, '_m', 'M');
v_rst := replace(v_rst, '_n', 'N');
v_rst := replace(v_rst, '_o', 'O');
v_rst := replace(v_rst, '_p', 'P');
v_rst := replace(v_rst, '_q', 'Q');
v_rst := replace(v_rst, '_r', 'R');
v_rst := replace(v_rst, '_s', 'S');
v_rst := replace(v_rst, '_t', 'T');
v_rst := replace(v_rst, '_u', 'U');
v_rst := replace(v_rst, '_v', 'V');
v_rst := replace(v_rst, '_w', 'W');
v_rst := replace(v_rst, '_x', 'X');
v_rst := replace(v_rst, '_y', 'Y');
v_rst := replace(v_rst, '_z', 'Z');
return v_rst;
end;

procedure dbg (p_msg in varchar2)
is
begin
if c_dbg_mode then
dbms_output.put_line ('[DBG] '
|| to_char(systimestamp, 'YYYY/MM/DD HH24:MI:SSXFF')
|| ' ' || c_mdl
|| ' ' || p_msg);
end if;
end;

procedure tbl2json (p_json out varchar2, p_owner in varchar2, p_name in varchar2, p_table in varchar2, p_cond in varchar2)
is
-- prepare parameters
v_json varchar2(2000) := '';
v_owner all_tables.owner%type := nvl(upper(p_owner), user);
v_name all_tables.table_name%type := p_name;
v_table all_tables.table_name%type := upper(p_table);
v_cond varchar2(2000) := p_cond;
v_first_row boolean := true;
v_first_column boolean := true;
begin
if v_cond is not null then
v_cond := ' where ' || v_cond;
end if;

-- begin log
dbg ('begin v_json = ' || v_json
|| ', v_owner = ' || v_owner
|| ', v_name = ' || v_name
|| ', v_table = ' || v_table
|| ' v_cond = ' || v_cond);


appendln (v_json, 'var ' || v_name || ' = {');
appendln (v_json, '"name" : "' || v_name ||'", ');
appendln (v_json, '"rows" : [');
v_first_row := true;
for y in (
select person_no, person_name, modify_ts
from m01_person) loop

dbg ('fetch row: person_no = ' || y.person_no || ', person_name = ' || y.person_name);

if v_first_row = true then
v_first_row := false;
else
appendln (v_json, ', ');
end if;
append (v_json, '{');

v_first_column := true;

for x in (
select column_name
from all_tab_columns
where table_name = v_table
and owner = v_owner
order by column_id) loop

dbg (js_naming(x.column_name));

if v_first_column = true then
v_first_column := false;
else
append (v_json, ', ');
end if;

if x.column_name = upper('person_no') then
append (v_json, '"' || js_naming(x.column_name) || '" : "' || y.person_no || '"');
elsif x.column_name = upper('person_name') then
append (v_json, '"' || js_naming(x.column_name) || '" : "' || y.person_name || '"');
elsif x.column_name = upper('modify_ts') then
append (v_json, '"' || js_naming(x.column_name) || '" : ""');
end if;

end loop;
append (v_json, '}');

end loop;
appendln (v_json, '');
appendln (v_json, ']');
appendln (v_json, '}');
dbg ('end');
p_json := v_json;
end;

procedure cursor2json (p_json out varchar2, p_name in varchar2, p_sql in varchar2)
is
-- prepare parameters
v_json varchar2(2000) := '';
v_name all_tables.table_name%type := p_name;
v_sql varchar2(2000) := p_sql;
v_first_row boolean := true;
v_first_column boolean := true;
c number;
d number;
col_cnt pls_integer;
f boolean;
rec_tab dbms_sql.desc_tab;
col_num number;
type row_typ is table of varchar2(2000);
v_row row_typ := row_typ();
i number;
j number;
begin

-- begin log
dbg ('begin v_json = ' || v_json
|| ', v_name = ' || v_name
|| ', v_sql = ' || v_sql);

c := dbms_sql.open_cursor;
dbms_sql.parse(c, p_sql, dbms_sql.native);
d := dbms_sql.execute(c);
dbms_sql.describe_columns(c, col_cnt, rec_tab);
for i in 1..col_cnt loop
if not v_row.exists(i) then
v_row.extend;
end if;
dbms_sql.define_column(c, i, v_row(i), 2000);
end loop;

appendln (v_json, 'var ' || v_name || ' = {');
appendln (v_json, '"name" : "' || v_name ||'", ');
appendln (v_json, '"rows" : [');
v_first_row := true;
j := 0;
loop
j := j + 1;
if dbms_sql.fetch_rows(c) > 0 then

dbg ('processing row ' || j);
if v_first_row = true then
v_first_row := false;
else
appendln (v_json, ', ');
end if;
append (v_json, '{');

v_first_column := true;

for i in 1..col_cnt loop

dbg (js_naming(rec_tab(i).col_name));

if v_first_column = true then
v_first_column := false;
else
append (v_json, ', ');
end if;

dbms_sql.column_value(c, i, v_row(i));
append (v_json, '"' || js_naming(rec_tab(i).col_name) || '" : "' || v_row(i) || '"');

end loop;
append (v_json, '}');
else
exit;
end if;
end loop;

dbms_sql.close_cursor(c);
appendln (v_json, '');
appendln (v_json, ']');
appendln (v_json, '}');
dbg ('end');
p_json := v_json;
end;


procedure json2tbl (p_json in varchar2, p_owner in varchar2, p_name out varchar2, p_table out varchar2, p_cond out varchar2)
is
begin
null;
end;

-- exec pkg_json_plsql.test_main('cursor')
procedure test_main (p_pattern varchar2 default null)
is
v_json varchar2(2000);
begin
dbms_output.enable(1000000);
if p_pattern is null then
tbl2json (v_json, null, 'person', 'm01_person', null);
dbms_output.put_line('result');
dbms_output.put_line('-------------------------------------');
--dbms_output.put_line(v_json);
elsif p_pattern = 'cursor' then
cursor2json (v_json, 'person', 'select * from m01_person');
dbms_output.put_line('result');
dbms_output.put_line('-------------------------------------');
--dbms_output.put_line(v_json);
end if;

end;

end;
/

JavaScript Unit Test

JSUnit
http://www.jsunit.net/

unittest.js of script.aculo.us
http://wiki.script.aculo.us/scriptaculous/show/UnitTesting

jstest.rb

WEBrick

JavaScript Unit Test

JSUnit
http://www.jsunit.net/

unittest.js of script.aculo.us
http://wiki.script.aculo.us/scriptaculous/show/UnitTesting

jstest.rb

WEBrick

prototype.jsでクロスブラウザなWYSIWIGエディタ

FW prototype.jsのObject汚染を回避する方法

prototype.jsのObject汚染を回避する方法

かなりターゲットの狭いTips。役に立たない。

prototype.jsと いうRuby on Railsなんかのフレームワークで使われている有名なJavaScriptのライブラリがあって、これが色々と使えそうな処理を綺麗に詰め込んであり、 デファクトスタンダート的な地位を確立しているのだけれど、ちょっと微妙だなーと思うところがあって、それはObject.prototypeを拡張してしまう点。

実際の弊害はこういう。
http://d.hatena.ne.jp/nazoking/20050425/1114374966

要は連想配列として使うときに困るって話。
多分prototype.jsはJavaScriptの側でロジックを組むことをあまり想定していないため、この辺の問題にあんまり配慮していないのではないかと思うのだけれど、とりあえず無理やり回避する方法を思いついたので書いてみる。

http://la.ma.la/misc/js/prototype.html

IFRAMEを作ってやって、その中でObjectやArrayなんかを作成してやれば、何にも拡張されていない素の状態のオブジェクトを返すことが出来る、という具合。

どっちにしろ面倒くさいので微妙、使う機会があるのかどうか。
もっと真っ当な方法があるのかも知れない。

----
ついでだから後二つぐらいTipsを。

インストールされているフォント一覧取得(IE限定)
http://la.ma.la/misc/js/fontbrowse.html

バックグラウンドで一覧を勝手に収集して、フォントの普及率を調査するページとか作れそうだな、とか、考えたことがあった。


マウスのホイール操作を検知する(IEとFirefox限定)
http://la.ma.la/misc/js/wheel.html

あんまり使われてない気がするけど、JavaScriptでマウスのホイールイベントを拾ってくることが出来る。IEの場合はonmousewheel、Firefoxの場合はDOMMouseScrollというイベントハンドラが使える。IEとFirefoxで使えればカバー範囲は十分広いと思うので、もっと積極的に使っても良い気がする。


----
追記 07/12

一応書いておくと、これは「IFRAMEを使うことで別のJavaScript実行環境を作れる」という、いわゆるネタです。ビルトインオブジェクトをオーバーライドすると便利なんだけども影響が気になる、という時に使えるかもしれない。
上記のサンプルでも使っているけど、普通のやり方だとprototypeに含まれている要素を除外して処理する関数を作ったり、メソッドを加えてやれば良いと思う。

多分こんな感じ。
    Object.prototype.forEach = function(func){
for(var key in this){
if(!(key in this.constructor.prototype)){
func(this[key],key,this)
}else if(this[key] != this.constructor.prototype[key]){
func(this[key],key,this)
}
}
};
obj.forEach(function(value,key,self){
alert([value,key]);
});

で、これをやるとますますObject.prototypeが汚染される上、
yomi["forEach"] = "ふぉーいーち"
という連想配列に対してはforEachメソッドが使えなくなるという罠もある。

自前のクラスを作るにしても全部Objectオブジェクトがベースになるので、個人的にはObjectはなるべくプレーンな状態で残しておいた方が望ましいと思う。
ただ、prototype.jsに関してはObject.extend()一つでコード量を大幅に減らせているメリットの方が大きいと思うので、その恩恵を受けつつもプレーンな状態のObjectを作成するにはIFRAME内で実行するぐらいしか思いつかなかった、という話。

----
さらに追記

プロパティが、そのインスタンスに固有なのか、クラスに元々存在しているのかを調べるにはhasOwnPropertyというのを使えば良いらしい。

http://www.interq.or.jp/student/exeal/dss/ref/jscript/object/objects.html#hasOwnProperty

上記のコードはこれで良さそう。
prototypeに含まれていない要素のみ回すforEach。
    Object.prototype.forEach = function(func){
for(var key in this){
if(this.hasOwnProperty(key)){
func(this[key],key,this)
}
}
};


オブジェクト指向良くわかってないので用語の使い方とか怪しいかもしれない。

Ajax うきうき Watch - a good ajax report serial

Flex4FileMaker - New Open Source Adobe Flex 2 API to FileMaker

sql designer - ajax based db design utility

AJAX Grid Manage Data

maven ToggleWritePropertiesAction problem with eclipse 3.2

I found that it still does not work even for Eclipse 3.2 final release (aka Callisto). This seems like show stopped for me now!

It says:
Unable to create view: class org.mevenide.ui.eclipse.sync.action.ToggleWritePropertiesAction overrides final method [Æà*(+.ká*(+9

And yields the following stack trace:
java.lang.VerifyError: class org.mevenide.ui.eclipse.sync.action.ToggleWritePropertiesAction overrides final method [Æà*(+.ká*(+9
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:160)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:498)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:468)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:427)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:410)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:188)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:339)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:391)
at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:352)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at org.mevenide.ui.eclipse.sync.view.SynchronizationView.createActions(SynchronizationView.java:352)
at org.mevenide.ui.eclipse.sync.view.SynchronizationView.createPartControl(SynchronizationView.java:164)
at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:332)
at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:197)
at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:566)
at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:290)
at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:525)
at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:140)
at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:268)
at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:394)
at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1144)
at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1097)
at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:795)
at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:781)
at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:123)
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:126)
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:267)
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:276)
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1)
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:84)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:937)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:709)
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3171)
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1953)
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:288)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1914)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1878)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:419)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

[ Permlink | « Hide ]
Radek Riedel [19/Jul/06 08:51 AM]

I have solved this issue by decompiling ToggleWritePropertiesAction class and reimplemnting it by new eclipse code interface.
Then repacking it into plugin jar and it is working. Unfortunately I dont have time to work on the whole issue so I would like to post what I have done for who ever wants to implement it into next version of mevenide.

Here is the reimplemented class.

package org.mevenide.ui.eclipse.sync.action;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;

public class ToggleWritePropertiesAction extends Action {

public ToggleWritePropertiesAction()
{
super(null, 2);
IPropertyChangeListener listener =
new IPropertyChangeListener() {

public void propertyChange(PropertyChangeEvent event) {
if("checked".equals(event.getProperty()))
{
String tooltip;
if(((Boolean)event.getNewValue()).booleanValue())
{ tooltip = "Donot override project.properties"; // beacause I don have the whole project I dont need the dependecy // but if any one want do compile the right way he should yuse theline below //Mevenide.getResourceString("ToggleWriteProperties.NoOverride"); } else
{ tooltip = "Override project.properties"; // tooltip = Mevenide.getResourceString("ToggleWriteProperties.Override"); }

setToolTipText(tooltip);
}
}
};
addPropertyChangeListener(listener);
}

}

FLASH VIDEO PLAYER 3.6

A open-source flash video player, supports Quicktime, Windows Media or Real Media with a single FLV file.

Cygwin dd under WinXP

normal: dd if=\\.\d: of=out.iso bs=4096

diskext

Extents for C:
Extent [1]:
Disk: 0
Offset: 57576960
Length: 20974464000
Extents for D:
Extent [1]:
Disk: 0
Offset: 21139001856
Length: 58860071424
Divide the offset by your block size 21139001856 / 512 = 41287113 and use that with skip=
dd if=\\?\Device\Harddisk0\Partition0 of=bootsector.bin skip=41287113 count=1

Dojo Resource Index

Dojo Homepage
http://dojotoolkit.org/

Dojo API Tool
http://dojotoolkit.org/docs/api

Dojo Developer Guide
http://dojotoolkit.org/docs/book

2007/04/15

Oracle收购Hyperion

2007年3月1日,Oracle宣布收购Hyperion,我们强烈地感受到在BI软件产业正在进行格局变迁……
  2007年3月1日,Oracle宣布收购海波龙(Hyperion),我们强烈地感受到在BI软件产业正在进行格局变迁。
  Oracle面对BI张开了它的血盆大口,Hyperion成了第一块食物,但Hyperion绝不是最后一块,更何况虎视眈眈的也不只是Oracle一家!
点击放大此图片
  从市场结构看,BI作为一个真实存在的市场大致分为如下几个阵营:高端市场垄断阵营;中端市场争夺阵营和低端市场侵扰阵营。目前三级市场基本处于一种两两渗透的状态。

  Gartner预计,到2007年底时,商务智能(BI)市场规模将达15亿英镑。未来十年将稳步增长,预计年均增长将达到9.7%,到2010年,达到19亿英镑规模。

sql2json

sql2json() - Converts SQL Results to JSON String

sql2json() converts the result of the given SQL query to its equivalent JSON string.

See Demo

This function will take a SQL query as it argument, execute it, fetch its result and convert it to a JSON string and then return the JSON string. This is very useful if you are creating Ajax applications and decide to use JSON over XML. If you have decided to use XML, take a look at my XML Parser for JavaScript instead.

Example

Query : SELECT user_id,user_name FROM dummy_data_users WHERE user_status='1'
Code : sql2json("SELECT user_id,user_name FROM dummy_data_users WHERE user_status='1'");
JSON :

[
{"user_id":"1","user_name":"Binny"},
{"user_id":"2","user_name":"Bill Gates"},
{"user_id":"3","user_name":"George Bush"},
{"user_id":"4","user_name":"Secret Agent"}
]

See

Query : SELECT * FROM dummy_data_users WHERE user_id='1'
Code : sql2json("SELECT * FROM dummy_data_users WHERE user_id='1'");
JSON :

[{
"user_id":"1",
"user_name":"Binny",
"user_email":"myfakeemail@nowhere.com",
"user_site":"http://www.bin-co.com/",
"user_info":"Hi!",
"user_status":"1"
}]

See

Code

//Function will take an SQL query as an argument and format the resulting data as a
// json(JavaScript Object Notation) string and return it.
function sql2json($query) {
$data_sql = mysql_query($query) or die("'';//" . mysql_error());// If an error has occurred,
// make the error a js comment so that a javascript error will NOT be invoked
$json_str = ""; //Init the JSON string.

if($total = mysql_num_rows($data_sql)) { //See if there is anything in the query
$json_str .= "[\n";

$row_count = 0;
while(
$data = mysql_fetch_assoc($data_sql)) {
if(
count($data) > 1) $json_str .= "{\n";

$count = 0;
foreach(
$data as $key => $value) {
//If it is an associative array we want it in the format of "key":"value"
if(count($data) > 1) $json_str .= "\"$key\":\"$value\"";
else
$json_str .= "\"$value\"";

//Make sure that the last item don't have a ',' (comma)
$count++;
if(
$count < count($data)) $json_str .= ",\n";
}
$row_count++;
if(
count($data) > 1) $json_str .= "}\n";

//Make sure that the last item don't have a ',' (comma)
if($row_count < $total) $json_str .= ",\n";
}

$json_str .= "]\n";
}

//Replace the '\n's - make it faster - but at the price of bad redability.
$json_str = str_replace("\n","",$json_str); //Comment this out when you are debugging the script

//Finally, output the data
return $json_str;
}