flex 多級視窗互調連線oracle動態管理生成動態datagrid
廢話不多說,直接上程式碼講解:
首先是對datagrid的管理介面,裡面有增加,刪除,修改,介面如下:
然後主頁面名字:EditeBusPdGo.xml,程式碼如下:
點選增加,彈出AddBusLineRunTime.mxml,介面如下:
程式碼如下:
此頁面又彈出新增AddShouMo.mxml,新增任意組首末站的介面:
程式碼如下:
再然後就是一個修改的頁面:UpdateBusLineRunTm.mxml介面如下:
程式碼如下:
下面說下這其中的難點:
原始碼,和後臺webservice以及資料庫檔案在附件中,其中涉及到一個資料傳輸的問題,webservice可以傳輸可以序列化的資料型別,本demo中,是以xml的方式傳輸的,webservice,我用c#寫的,首先就是連線資料庫,這裡使用的OLEDB連線的資料庫:首先在web.config中加入如下欄位:
然後連線資料庫
由於是同時操作一對多的兩張表,增刪改,我們如何保證資料的一致性和完整性呢
先建立一個序列
每次插入,先從序列拿到值:
同時插入主表和附表就保證了主鍵的唯一性以及主表附表的資料的完整性
取得收據,後要生成xml,傳給前臺
前臺到後臺的xml的遍歷:
oracle時間型別的處理:
關於oracle時間處理的詳解:
ORACLE/JSP技術涉及日期、時間問題的處理
(1)在英文版本的ORACLE中預設日期格式為'DD-MON-YY',例如'01-JAN-98'
在漢化的中文版本中ORACLE預設日期格式為'日-月-年',例如'21-8月-2003'或'21-8月-03'
(2)轉換字串為日期
使用ORACLE內部函式to_date()
to_date()函式的引數是to_char()函式引數的反轉。
to_date(string_value , date_format)
變數定義如下:
string_value :為字串直接值(字串本身)、字串列(資料庫中定義的某個表的某列)或某字串內部函式的返回值。
date_format為合法的Oracle日期格式。
下列更新語句均符合ORACLE的日期格式,更新成功:
create table student (name varchar2(10) not null primary key , enrolldate date not null);//建立student表
insert into student values('mark',to_date('08-21-2003','MM-DD-YYYY'));
insert into student values('mark1',to_date('21-08-2003','DD-MM-YYYY'));
insert into student values('mark2','21-8月-2003');
insert into xiongxiaomin.student values('mark3','21-8月-03');
(3)轉換日期為字串
使用ORACLE內部函式to_char()
to_char(date_value,date_format)
變數定義如下:
date_value :為日期型直接值(日期本身)、日期型列值(資料庫中定義的某個表的某列)或某內部函式的返回的日期型值。
date_format為合法的Oracle日期格式。
選擇enrolldate欄位的時間部分:
select (to_char(enrolldate,'HH24:MI:SS'))enrolldate from student;
(4)注意:ORACLE中的date資料型別定義的列包含日期和時間。
1、系統當前日期為2003年8月21日,之後執行下列語句
insert into student values('mark5',to_date('09:28:03','HH:MI:SS'));//注意此種在一條記錄的date型別欄位中插入時間的方法,系統預設的日期為系統當前日期所在月份的第一天,因此得到的記錄為
Name enrolldate
mark5 01-八月 -2003 09:28:03 AM
2、修改系統當前日期為2003年7月21日,之後執行下列語句
insert into student values('mark6',to_date('09:28:03','HH:MI:SS'));
得到的記錄為
Name enrolldate
mark6 01-七月 -2003 09:28:03 AM
insert into student values('mark8',to_date('20:28:03','HH24:MI:SS'));
3、同時在一條記錄中插入日期和時間的方法
insert into student values('mark9',to_date('21-08-2003
20:28:03','DD-MM-YYYY HH24:MI:SS'));//同時在一條記錄中插入日期和時間的方法
insert into student values('mark',to_date('21-08-2003
09:52:03','DD-MM-YYYY HH:MI:SS'));//同時在一條記錄中插入日期和時間的方法
注意不能使用下列方法同時插入日期和時間
insert into student values('mark2','21-8月-2003'+to_date('
09:52:03','HH:MI:SS'));//無效插入記錄方法
4、在SQL*Plus Worksheet中執行下列SQL語句
select * from student;
得到的記錄結果如下:注意date型別欄位中只顯示了日期,時間並未顯示
NAME ENROLLDATE
mark 18-8月 -03
mark1 21-8月 -03
mark2 21-8月 -03
已選擇3行。
5、但在JSP程式中同樣執行select * from student order by enrolldate
顯示結果見下圖(既顯示了日期,又顯示了時間)
JSP頁面中的顯示結果
6、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期和時間
NAME TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH:MI:SS
mark 21-08-2003 12:00:00
mark1 21-08-2003 12:00:00
已選擇2行
注意:5和6中的不同,時間到秒時,JSP頁面中顯示時多出了". 0"
7、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期,時間
NAME TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH24:MI:
mark 18-08-2003 17:40:20
mark1 21-08-2003 00:00:00
mark2 21-08-2003 00:00:00
已選擇3行。
注意:6和7中的SELECT中的"HH:MI:SS"和"HH24:MI:SS"兩者的不同是"HH"為小時制,值的範圍為0-12;"HH24"為24小時制,值的範圍為0-23。
看下列例子:
①insert into student values('南太裡',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH24:MI:SS'));
ORACLE中的記錄結果為:
NAME enrolldate
南太裡 19-八月 -2003 01:54:05 PM
②insert into student values('南太裡2',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH:MI:SS'));//插入錯誤
錯誤提示為:
insert into student values('南太裡2',to_date('08-19-2003 13:54:05','MM-DD
*
ERROR 位於第 1 行:
ORA-01849: 小時值必須介於 1 和 12 之間
即應用"HH"時,不能應用"13:54:05",而應改為"01:54:05"
正確語句如下:
insert into student values('南太裡2',to_date('08-19-2003
01:54:05','MM-DD-YYYY HH:MI:SS'));
ORACLE中的記錄結果為:
NAME enrolldate
南太裡2 19-八月 -2003 01:54:05 AM
注意上述兩種方式得出的結果一種為PM,另一種為AM。
為了提高正確性,建議都是用地一種方式"HH24"
8、但在JSP程式中同樣執行select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student
顯示結果見下圖。(其結果與在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;相同)
9、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'month dd,yyyy HH24:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期,時間
NAME TO_CHAR(ENROLLDATE,'MONTHDD,YYYYHH24:MI:SS')
mark 8月 18,2003 17:40:20
mark1 8月 21,2003 00:00:00
mark2 8月 21,2003 00:00:00
已選擇3行。
10、to_char()函式,'DD-MM-YYYY'格式及'MM-DD-YYYY'格式和'month dd,yyyy'格式的不同
'DD-MM-YYYY'格式:21-08-2003
'month dd,yyyy'格式:8月 21,2003
11、注意:在日期和時間格式中非常容易混淆的是月份和秒的格式(即MM和MI)
在SQLPlus*Worksheet中執行下列語句,不報錯。
insert into student values('王嘉',to_date('08:05','HH24:MM'));//08被認為是小時,05被認為是月份。
commit;
在表編輯器中檢視:實際插入值為
NAME ENROLLDATE
王嘉 01-五月 -2003 08:00:00 AM
select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS')enrolldate from
student where name='王嘉';
NAME ENROLLDATE
王嘉 01-05-2003 08:00:00
已選擇 1 行。
insert into student values('汪嘉2',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH24:MI:SS'));
12、使用Oracle的date資料型別的另一個優點是:它支援日期的運算。可以對已經存在的
日期加上或減去若干天,例如:
insert into student values('熊',sysdate+7);
還有一個問題就是附表主鍵自增長問題,寫一個序列和觸發器:
序列:
觸發器:
flex前端,xml轉array:
array轉xml
其他見附件
首先是對datagrid的管理介面,裡面有增加,刪除,修改,介面如下:
然後主頁面名字:EditeBusPdGo.xml,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
<fx:Declarations>
<!-- 將非可視元素(例如服務、值物件)放在此處 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.ArrayList;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.CloseEvent;
import mx.events.ListEvent;
import mx.formatters.DateFormatter;
import mx.managers.PopUpManager;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.WebService;
public var dgDataArr:Array;
private static var dateFormatter:DateFormatter = new DateFormatter();
// private var formatString:String="YYYY-MM-DD";
[Bindable]
private var notes:ArrayCollection ;
private var addNoteScreen:AddBusLineRunTime;
private var UpdateNoteScreen:UpdateBusLineRunTm;
private var WebServiceUrl:String="http://localhost:10635/AnalysisRdBl/AnalysisBL.asmx?wsdl";
private var setBusName:String="99路";
private var setTime:String="2012-12-02";
private function init():void{
runTimeTable.text=setBusName+"行車計劃時刻表";
doTime.text="實施日期: "+setTime;
getdata();
addNoteScreen = new AddBusLineRunTime();
addNoteScreen.addEventListener("SaveNote", saveNote);
UpdateNoteScreen=new UpdateBusLineRunTm();
UpdateNoteScreen.addEventListener("SaveNote",update);
}
private function update(e:Event):void
{
var ob:Object=new Object();
ob.線路名=setBusName;
ob.路牌名=UpdateNoteScreen.lupai.text;
ob.圈=UpdateNoteScreen.quan.text;
ob.實施時間=setTime;
ob.報到=UpdateNoteScreen.baodao.text;
ob.工時=UpdateNoteScreen.gongshi.text;
ob.出場=UpdateNoteScreen.chuchang.text;
ob.離場=UpdateNoteScreen.lichang.text;
var updatenotes:ArrayCollection= new ArrayCollection();
updatenotes.addItem(ob);
var temparr:ArrayCollection=new ArrayCollection();
temparr=UpdateNoteScreen.notes;
var xx:XML=TWOarrToXml(updatenotes,temparr);
var xxString:String=xx.toXMLString();
//trace(xx.toXMLString());
var ws1:WebService = new WebService();
ws1.loadWSDL(WebServiceUrl);
ws1.updateTable.addEventListener(ResultEvent.RESULT, resultUpdateData);
ws1.updateTable.send(updateO,xxString);
PopUpManager.removePopUp(UpdateNoteScreen);
}
private function resultUpdateData(e:ResultEvent):void
{
getdata();
if(e.result as String=="success")
{
Alert.show("更新成功!");
}
else
{
Alert.show("更新失敗!");
}
}
private function getdata():void
{
var ws1:WebService = new WebService();
ws1.loadWSDL(WebServiceUrl);
ws1.GetBusRunTimeList.addEventListener(ResultEvent.RESULT, resultGetData);
ws1.GetBusRunTimeList.send(setBusName,setTime);
}
public var ObObArr:Array;
private function refreshObOb():void
{
ObObArr=new Array();
for(var i:int=0;i<dgDataArr.length;i++)
{
var LuLU:String=dgDataArr[i]["路牌名"].toString();
ObObArr.push(LuLU);
}
}
private function resultGetData(e:ResultEvent):void{
if(e.result as String=="noData")
{
Alert.show("您好,本線路下面還沒有具體線路資訊,請新增","沒有資訊!")
}
else{
var returnValue:XMLList=XML(e.result).children();
//ShowRunTimeTable.dataProvider=xmlListToArray(returnValue);
dgDataArr=new Array();
dgDataArr=xmlListToArray(returnValue);
refreshObOb();
// for(var i:int=0;i<dgDataArr.length;i++)
// {
// var LuLU:String=dgDataArr[i]["路牌名"].toString();
// trace(LuLU);
// ObObArr.push(LuLU);
//
//
// }
//deleteArr=xmlListToArray(returnValue);
showTableInit();
}
}
private function xmlListToArray(results:XMLList):Array
{
var array:Array=new Array();
for each(var child:XML in results)
{
var obj:Object=new Object();
//obj[child.nodeKind()]=child[child.nodeKind()];
for each(var ite:XML in child.children())
{
obj[ite.name().toString()]=child[ite.name().toString()];
}
//array.addItem(obj);
array.push(obj);
}
return array;
}
private function getArraylistFromXMLList(data:XMLList):Array
{
var al:Array=new Array();
for(var i:int=0;i<data.length();i++)
{
var obj:Object=new Object();
for(var j:int=0;j<data[i].children().length();j++)
{
var dataColoum:String=data[i].children()[j].localName();
obj[dataColoum]=data[i].children()[j].toString();
}
al.addItem(obj);
}
return al;
}
//public var deleteArr:Array=new Array();
//public var xxfc:Function;
private function showCol():Array
{
var arr:Array=new Array();
var dataNum:int=dgDataArr[0]["站長"];
//trace(dataNum.toString());
//trace(dgDataArr[0]["OBJECTID"]);
var shouzhan:String="首站";
var mozhan:String="末站";
for(var i:int=1;i<=dataNum;i++)
{
var temp1:String=shouzhan+i.toString();
var temp2:String=mozhan+i.toString();
arr.push(temp1);
arr.push(temp2);
}
return arr;
}
// private function upArray(ii:int):void
// {
// var dataNum:int=dgDataArr[ii]["此長"];
// //trace(dataNum.toString());
//
//
// //trace(dgDataArr[0]["OBJECTID"]);
// var shouzhan:String="首站";
// var mozhan:String="末站";
//
// for(var i:int=1;i<=dataNum;i++)
// {
// var temp1:String=shouzhan+i.toString();
// var temp2:String=mozhan+i.toString();
// arr.push(temp1);
// arr.push(temp2);
//
// }
//
//
//
// }
//public var upArr:Array=new Array();
public var dataGrid:DataGrid;
private var busNam:String="99路";
private function showTableInit():void
{
var dgData:ArrayCollection = new ArrayCollection(dgDataArr);
dataGrid = new DataGrid();
dataGrid.horizontalScrollPolicy = "on";
dataGrid.x = 10;
dataGrid.y = 20;
//dataGrid.editable = true;
dataGrid.percentWidth = 100;
dataGrid.percentHeight=90;
dataGrid.setStyle("fontSize", 14);
dataGrid.styleName
dataGrid.dataProvider = dgData;
//dataGrid.addEventListener(ListEvent.ITEM_CLICK, itemClickHandler);
showDT.removeAllElements();
showDT.addElement(dataGrid);
var columns:Array = new Array();
var col:DataGridColumn;
var buslineName1:String=dgDataArr[0]["線路名"];
//busNam=buslineName1;
var time:String=dgDataArr[0]["實施時間"];
var lupaicol:DataGridColumn=new DataGridColumn();
lupaicol.headerText="路牌";
lupaicol.dataField="路牌名";
columns.push(lupaicol);
var baodaocol:DataGridColumn=new DataGridColumn();
baodaocol.headerText="報到";
baodaocol.dataField="報到";
columns.push(baodaocol);
var chuchangcol:DataGridColumn=new DataGridColumn();
chuchangcol.headerText="出場";
chuchangcol.dataField="出場";
columns.push(chuchangcol);
var arr:Array= showCol();
for(var i:int=1;i<=arr.length;i++)
{
var d:String=arr[i-1];
if(i%2==0)
{
col = new DataGridColumn(d);
col.headerText="末站";
columns.push(col);
}
else{
col = new DataGridColumn(d);
col.headerText="首站";
columns.push(col);
}
}
var lichangcol:DataGridColumn=new DataGridColumn();
lichangcol.headerText="離場";
lichangcol.dataField="離場";
columns.push(lichangcol);
var gongshicol:DataGridColumn=new DataGridColumn();
gongshicol.headerText="工時";
gongshicol.dataField="工時";
columns.push(gongshicol);
var quancol:DataGridColumn=new DataGridColumn();
quancol.headerText="圈";
quancol.dataField="圈";
columns.push(quancol);
dataGrid.columns=columns;
}
private function itemClickHandler(e:ListEvent):void
{
trace(e.target);
}
private function addNote():void
{
PopUpManager.addPopUp(addNoteScreen, this, true);
PopUpManager.centerPopUp(addNoteScreen);
addNoteScreen.ObObArr=ObObArr;
//addNoteScreen.author.text = "";
//addNoteScreen.topic.text = "";
//addNoteScreen.description.text = "";
}
private function close():void
{
PopUpManager.removePopUp(this);
}
private function arrToXml(arr:ArrayCollection):XML{
var root:XML = new XML("<result/>");
for(var i:int = 0;i<arr.length;i++){
var node:XML = new XML("<item/>");
node.線路名=arr[i].線路名;
node.路牌名=arr[i].路牌名;
node.圈=arr[i].圈;
node.實施時間=arr[i].實施時間;
node.報到=arr[i].報到;
node.工時=arr[i].工時;
node.出場=arr[i].出場;
node.離場=arr[i].離場;
root.appendChild(node);
}
return root;
}
private function TWOarrToXml(arr:ArrayCollection,arr2:ArrayCollection):XML{
var root:XML = new XML("<result/>");
for(var i:int = 0;i<arr.length;i++){
var node:XML = new XML("<item/>");
node.線路名=arr[i].線路名;
node.路牌名=arr[i].路牌名;
node.圈=arr[i].圈;
node.實施時間=arr[i].實施時間;
node.報到=arr[i].報到;
node.工時=arr[i].工時;
node.出場=arr[i].出場;
node.離場=arr[i].離場;
for(var j:int=0;j<arr2.length;j++)
{
var shou:String="首站"+(j+1);
var mo:String="末站"+(j+1);
node[shou]=arr2[j].首站;
node[mo]=arr2[j].末站;
}
root.appendChild(node);
}
return root;
}
public var xxString:String;
private function saveNote(e:Event):void
{
var ob:Object=new Object();
ob.線路名=setBusName;
ob.路牌名=addNoteScreen.lupai.text;
ob.圈=addNoteScreen.quan.text;
ob.實施時間=setTime;
ob.報到=addNoteScreen.baodao.text;
ob.工時=addNoteScreen.gongshi.text;
ob.出場=addNoteScreen.chuchang.text;
ob.離場=addNoteScreen.lichang.text;
notes= new ArrayCollection();
notes.addItem(ob);
var temparr:ArrayCollection=new ArrayCollection();
temparr=addNoteScreen.notes;
var xx:XML=TWOarrToXml(notes,temparr);
var ws1:WebService = new WebService();
ws1.loadWSDL(WebServiceUrl);
ws1.insertTable.addEventListener(ResultEvent.RESULT, resultInsert);
//ws1.insertTable.send(xxString);
//xxString="<result><item><線路名>640路</線路名><路牌名>88</路牌名><圈>88</圈> <實施時間>2012-06-10</實施時間><報到>88</報到><工時>88</工時> <出場>88</出場> <離場>88</離場> <首站1>765</首站1><末站1>654</末站1> <首站2>543</首站2><末站2>432</末站2><首站3>321</首站3><末站3>210</末站3></item></result>";
//ws.GetBusRunTimeList.send();
xxString=xx.toXMLString();
//trace(xxString);
ws1.insertTable.send(xxString);
//trace(xxString);
// trace(notes.toString());
//trace(arr1.toString());
//trace(arr2.toString());
PopUpManager.removePopUp(addNoteScreen);
//var upadteString:String=
}
private function resultInsert(e:ResultEvent):void{
var sh:String=String(e.result);
getdata();
if(sh=="success")
{
Alert.show("插入成功!","成功");
}
else
{
Alert.show("插入失敗!","失敗");
}
}
private function deletePiece(event:CloseEvent):void{
if (event.detail==Alert.YES){
if (dataGrid.selectedItems == null)
return;
var index:int=0;
var seledIndexs:int=dataGrid.selectedIndex;
//for (var i:int=0; i < seledIndexs.length; i++)
//{
//index=seledIndexs[i];
//dgDataArr[0]["線路名"]
//var id:Number=xxfc(seledIndexs) as Number;
//trace(xxfc(seledIndexs));
var s:String=(dgDataArr[seledIndexs]["OBJECTID"].toString());
//delete(dgDataArr[seledIndexs]);
//notes.removeItemAt(seledIndexs);
var deletewsl:WebService=new WebService();
deletewsl.loadWSDL(WebServiceUrl);
deletewsl.deleteData.addEventListener(ResultEvent.RESULT, resultDelete);
deletewsl.deleteData.send(s);
delete(dgDataArr[seledIndexs]);
//ObObArr.splice(0,ObObArr.length);
//refreshObOb();
//delete(ObObArr[seledIndexs]);
}
}
private function resultDelete(e:ResultEvent):void
{
var sh:String=String(e.result);
getdata();
if(sh=="success")
{
Alert.show("刪除成功!","成功");
}
else
{
Alert.show("刪除失敗!","失敗");
}
}
private var updateO:String;
private function updatePiece():void{
UpdateNoteScreen.ObObArr=ObObArr;
UpdateNoteScreen.oldLupai=dgDataArr[seledIndexs]["路牌名"].toString();
updateO=dgDataArr[seledIndexs]["OBJECTID"].toString();
PopUpManager.addPopUp(UpdateNoteScreen, this, true);
PopUpManager.centerPopUp(UpdateNoteScreen);
if (dataGrid.selectedItems == null)
return;
var index:int=0;
var seledIndexs:int=dataGrid.selectedIndex;
UpdateNoteScreen.lupai.text=dgDataArr[seledIndexs]["路牌名"].toString();
UpdateNoteScreen.baodao.text=dgDataArr[seledIndexs]["報到"].toString();
UpdateNoteScreen.chuchang.text=dgDataArr[seledIndexs]["出場"].toString();
UpdateNoteScreen.lichang.text=dgDataArr[seledIndexs]["離場"].toString();
UpdateNoteScreen.gongshi.text=dgDataArr[seledIndexs]["工時"].toString();
UpdateNoteScreen.quan.text=dgDataArr[seledIndexs]["圈"].toString();
//UpdateNoteScreen.time.text=dgDataArr[seledIndexs]["實施時間"].toString();
var notes:ArrayCollection=new ArrayCollection();
//trace(dgDataArr[seledIndexs]["此長"].toString());
var len:int=int(dgDataArr[seledIndexs]["此長"].toString());
//trace(len.toString());
for(var i:int=1;i<=len;i++)
{
var sh:String="首站"+i;
var mo:String="末站"+i;
var ob:Object=new Object();
//trace(sh);
//trace(dgDataArr[seledIndexs][sh].toString());
ob.首站=dgDataArr[seledIndexs][sh].toString();
ob.末站=dgDataArr[seledIndexs][mo].toString();
//note.author = addNoteScreen.author.text;
//note.topic = addNoteScreen.topic.text;
//note.description = addNoteScreen.description.text;
notes.addItem(ob);
//trace(notes.length.toString());
//UpdateNoteScreen.shoumo.dataProvider=notes;
UpdateNoteScreen.notes=notes;
UpdateNoteScreen.shoumo.dataProvider=UpdateNoteScreen.notes;
}
}
private function deleteAsk():void
{
Alert.show("確定刪除?","系統提示",(1|2),this,deletePiece);
}
]]>
</fx:Script>
<!-- <s:Button x="156" y="114" label="顯示資料" click="getdata()"/>
<s:DataGrid id="showData" x="525" y="128" requestedRowCount="4">
</s:DataGrid>
<s:DataGrid id="xx" x="301" y="114" requestedRowCount="4">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="OBJECTID" headerText="列 1"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
-->
<s:Panel title="公交時刻行車計劃表"
width="100%" height="100%">
<s:VGroup x="0" y="0" width="100%" height="100%" gap="0" horizontalAlign="left"
verticalAlign="top">
<s:HGroup width="100%" height="29">
<s:Group width="100%" height="30">
<s:Label id="companyName" x="19" y="10" text="公司名稱:楊高公交"/>
<s:Label id="runTimeTable" x="374" y="10" text="行車時刻計劃表"/>
<s:Label id="doTime" x="739" y="11" text="實施日期:"/>
<!--<s:Button x="159" y="10" label="按鈕" click="getdata()"/>-->
</s:Group>
</s:HGroup>
<s:HGroup width="100%" height="27">
<s:Button label="增加" click="addNote()"/>
<s:Button label="刪除" click="deleteAsk()"/>
<s:Button label="修改" click="updatePiece()"/>
</s:HGroup>
<s:VGroup width="100%" id="showDT" height="90%">
</s:VGroup>
</s:VGroup>
</s:Panel>
</s:Application>
點選增加,彈出AddBusLineRunTime.mxml,介面如下:
程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
layout="absolute" width="498" height="598"
title="增加一條資料" xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.managers.PopUpManager;
// [Bindable]
public var notes:ArrayCollection=new ArrayCollection();
public var ObObArr:Array=new Array();
private var addNoteScreen:AddShouMo;
private var WebServiceUrl:String="http://localhost:8081/AnalysisBL.asmx?wsdl";
private function close():void
{
PopUpManager.removePopUp(this);
}
private function save():void{
// for(var i:int=0;i<ObObArr.length;i++)
// {
// // trace(ObObArr[i].toString());
// }
if(ObObArr.indexOf(lupai.text.toString())==-1)
{
this.dispatchEvent(new Event("SaveNote"));
}
else
{
Alert.show("已經存在該路牌名!請重新輸入!");
}
}
private function init():void{
addNoteScreen = new AddShouMo();
addNoteScreen.addEventListener("SaveShouMo", SaveShouMo);
}
private function add():void{
PopUpManager.addPopUp(addNoteScreen, this, true);
PopUpManager.centerPopUp(addNoteScreen);
//addNoteScreen.author.text = "";
//addNoteScreen.topic.text = "";
//addNoteScreen.description.text = "";
}
private function SaveShouMo(e:Event):void
{
// notes=
// if(notes.length!=0)
// {
// notes.removeAll();
// }
//var note:Note = new Note();
var ob:Object=new Object();
ob.首站=addNoteScreen.shouzhan.text;
ob.末站=addNoteScreen.mozhan.text;
//note.author = addNoteScreen.author.text;
//note.topic = addNoteScreen.topic.text;
//note.description = addNoteScreen.description.text;
notes.addItem(ob);
PopUpManager.removePopUp(addNoteScreen);
shoumo.dataProvider=notes;
}
private function shanchu():void{
if (shoumo.selectedItems == null)
return;
var index:int=0;
var seledIndexs:int=shoumo.selectedIndex;
//for (var i:int=0; i < seledIndexs.length; i++)
//{
//index=seledIndexs[i];
notes.removeItemAt(seledIndexs);
//}
}
]]>
</fx:Script>
<fx:Metadata>
[Event(name="SaveNote")]
</fx:Metadata>
<mx:Label x="35" y="10" text="路牌"/>
<mx:TextInput id="lupai" width="150" x="84" y="8"/>
<mx:Label text="報到" y="36" x="35"/>
<mx:TextInput id="baodao" width="150" x="84" y="34"/>
<mx:Button label="取消" x="233" y="490" click="close()"/>
<mx:Button label="儲存" x="344" y="490" click="save()"/>
<s:Label x="37" y="75" text="出場"/>
<s:TextInput id="chuchang" x="84" y="65" width="150"/>
<s:Label x="37" y="110" text="離場"/>
<s:Label x="37" y="147" text="工時"/>
<s:Label x="43" y="185" text="圈"/>
<s:TextInput id="lichang" x="84" y="100" width="150"/>
<s:TextInput id="gongshi" x="84" y="137" width="150"/>
<s:TextInput id="quan" x="84" y="175" width="150"/>
<s:DataGrid x="84" y="234" width="148" height="234" requestedRowCount="4" id="shoumo">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="首站" headerText="首站"></s:GridColumn>
<s:GridColumn dataField="末站" headerText="末站"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
<s:Button x="84" y="205" label="增加" click="add()"/>
<s:Button x="162" y="205" label="刪除" click="shanchu()"/>
</mx:TitleWindow>
此頁面又彈出新增AddShouMo.mxml,新增任意組首末站的介面:
程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
layout="absolute" width="348" height="138"
title="增加首末站">
<fx:Script>
<![CDATA[
import mx.managers.PopUpManager;
private function close():void
{
PopUpManager.removePopUp(this);
}
private function save():void{
this.dispatchEvent(new Event("SaveShouMo"));
}
]]>
</fx:Script>
<fx:Metadata>
[Event(name="SaveShouMo")]
</fx:Metadata>
<mx:Label text="首站" x="35" y="10"/>
<mx:TextInput id="shouzhan" width="150" x="84" y="8"/>
<mx:Label text="末站" y="36" x="35"/>
<mx:TextInput id="mozhan" width="150" x="84" y="34"/>
<mx:Button label="取消" x="154" y="69" click="close()"/>
<mx:Button label="儲存" x="257" y="68" click="save()"/>
</mx:TitleWindow>
再然後就是一個修改的頁面:UpdateBusLineRunTm.mxml介面如下:
程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:fx="http://ns.adobe.com/mxml/2009"
layout="absolute" width="498" height="598"
title="增加一條資料" xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.managers.PopUpManager;
[Bindable]
public var notes:ArrayCollection=new ArrayCollection();
public var ObObArr:Array=new Array();
private var addNoteScreen:AddShouMo;
public var oldLupai:String;
private function close():void
{
PopUpManager.removePopUp(this);
}
private function save():void{
if(lupai.text.toString()==oldLupai)
{
this.dispatchEvent(new Event("SaveNote"));
}
if(ObObArr.indexOf(lupai.text.toString())==-1)
{
this.dispatchEvent(new Event("SaveNote"));
}
else
{
Alert.show("已經存在該路牌名!請重新輸入!");
}
}
private function init():void{
addNoteScreen = new AddShouMo();
addNoteScreen.addEventListener("SaveShouMo", SaveShouMo);
//shoumo.dataProvider=notes;
}
private function add():void{
PopUpManager.addPopUp(addNoteScreen, this, true);
PopUpManager.centerPopUp(addNoteScreen);
//addNoteScreen.author.text = "";
//addNoteScreen.topic.text = "";
//addNoteScreen.description.text = "";
}
private function SaveShouMo(e:Event):void
{
// notes=
// if(notes.length!=0)
// {
// notes.removeAll();
// }
//var note:Note = new Note();
var ob:Object=new Object();
ob.首站=addNoteScreen.shouzhan.text;
ob.末站=addNoteScreen.mozhan.text;
//note.author = addNoteScreen.author.text;
//note.topic = addNoteScreen.topic.text;
//note.description = addNoteScreen.description.text;
notes.addItem(ob);
PopUpManager.removePopUp(addNoteScreen);
// shoumo.dataProvider=notes;
}
private function shanchu():void{
if (shoumo.selectedItems == null)
return;
var index:int=0;
var seledIndexs:int=shoumo.selectedIndex;
//for (var i:int=0; i < seledIndexs.length; i++)
//{
//index=seledIndexs[i];
notes.removeItemAt(seledIndexs);
//}
}
]]>
</fx:Script>
<fx:Metadata>
[Event(name="SaveNote")]
</fx:Metadata>
<mx:Label x="35" y="10" text="路牌"/>
<mx:TextInput id="lupai" width="150" x="84" y="8"/>
<mx:Label text="報到" y="36" x="35"/>
<mx:TextInput id="baodao" width="150" x="84" y="34"/>
<mx:Button label="取消" x="209" y="539" click="close()"/>
<mx:Button label="儲存" x="291" y="539" click="save()"/>
<s:Label x="37" y="75" text="出場"/>
<s:TextInput id="chuchang" x="84" y="65" width="150"/>
<s:Label x="37" y="110" text="離場"/>
<s:Label x="37" y="147" text="工時"/>
<s:Label x="43" y="185" text="圈"/>
<s:TextInput id="lichang" x="84" y="100" width="150"/>
<s:TextInput id="gongshi" x="84" y="137" width="150"/>
<s:TextInput id="quan" x="84" y="175" width="150"/>
<s:DataGrid x="81" y="258" width="148" height="234" requestedRowCount="4" id="shoumo" >
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="首站" headerText="首站"></s:GridColumn>
<s:GridColumn dataField="末站" headerText="末站"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
<s:Button x="81" y="215" label="增加" click="add()"/>
<s:Button x="164" y="215" label="刪除" click="shanchu()"/>
</mx:TitleWindow>
下面說下這其中的難點:
原始碼,和後臺webservice以及資料庫檔案在附件中,其中涉及到一個資料傳輸的問題,webservice可以傳輸可以序列化的資料型別,本demo中,是以xml的方式傳輸的,webservice,我用c#寫的,首先就是連線資料庫,這裡使用的OLEDB連線的資料庫:首先在web.config中加入如下欄位:
<appSettings>
<add key="oracleconnection" value="Provider=MSDAORA;Persist Security Info=true;User ID=pdjt;password=pdjt;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxxxxxxxxxxooooooooooooooooooo)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))"/>
<add key="SDEServer" value="xxxxxxxxxxxxxxxxxxooooooooooooooooooo"/>
<add key="SDEInstance" value="5151"/>
<add key="SDEUser" value="pdjt"/>
<add key="SDEPwd" value="pdjt"/>
<add key="SDEDatabase" value="ORCL"/>
<add key="SDEVersion" value="SDE.DEFAULT"/>
<add key="bufferDistance" value="5"/>
<add key="filterDistance" value="10"/>
</appSettings>
然後連線資料庫
//連線並開啟資料庫
string connString = System.Configuration.ConfigurationManager.AppSettings["oracleconnection"];
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
由於是同時操作一對多的兩張表,增刪改,我們如何保證資料的一致性和完整性呢
先建立一個序列
CREATE SEQUENCE "PDJT"."NewSequence"
INCREMENT BY 1
MINVALUE 1
MAXVALUE 2147483647
START WITH 161
CACHE 20;
GRANT SELECT, ALTER ON "PDJT"."NewSequence" TO PUBLIC;
每次插入,先從序列拿到值:
string sql = "Select YZN001.nextval from dual";
OleDbCommand commsql = new OleDbCommand(sql, conn);
double OBJECTID=Convert.ToDouble(commsql.ExecuteScalar()) ;
同時插入主表和附表就保證了主鍵的唯一性以及主表附表的資料的完整性
取得收據,後要生成xml,傳給前臺
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("result"));
XmlElement item = doc.CreateElement("item");
XmlElement nodeZhanZhang = doc.CreateElement("站長");
nodeZhanZhang.InnerText = maxIN.ToString();
item.AppendChild(nodeZhanZhang);
XmlElement nodeCiChang = doc.CreateElement("此長");
nodeCiChang.InnerText = tbl.Rows.Count.ToString();
item.AppendChild(nodeCiChang);
.........doc.LastChild.AppendChild(item);
return doc.InnerXml;
前臺到後臺的xml的遍歷:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
ArrayList headersubList = new ArrayList();
//獲取當前XML文件的根 一級
XmlNode oNode = doc.DocumentElement;
//獲取根節點的所有子節點列表
XmlNodeList oList = oNode.ChildNodes;
//標記當前節點
XmlNode oCurrentNode;
//遍歷所有二級節點
for (int i = 0; i < oList.Count; i++)
{
//二級
oCurrentNode = oList[i];
// 線路名 = oList[i].Value;
//檢測當前節點的名稱,節點的值是否與已知匹配
if (oCurrentNode.Name.ToLower().Equals("item"))
{
//檢測是否有子節點 三級
if (oCurrentNode.HasChildNodes)
{
//Console.WriteLine(oCurrentNode.ChildNodes.Count);
//遍歷當前節點的所有子節點
for (int n = 0; n < oCurrentNode.ChildNodes.Count; n++)
{
,
oracle時間型別的處理:
public string 實施時間 = "2012-06-05";
to_date('" + 實施時間 + "','yyyy-mm-dd'));
關於oracle時間處理的詳解:
ORACLE/JSP技術涉及日期、時間問題的處理
(1)在英文版本的ORACLE中預設日期格式為'DD-MON-YY',例如'01-JAN-98'
在漢化的中文版本中ORACLE預設日期格式為'日-月-年',例如'21-8月-2003'或'21-8月-03'
(2)轉換字串為日期
使用ORACLE內部函式to_date()
to_date()函式的引數是to_char()函式引數的反轉。
to_date(string_value , date_format)
變數定義如下:
string_value :為字串直接值(字串本身)、字串列(資料庫中定義的某個表的某列)或某字串內部函式的返回值。
date_format為合法的Oracle日期格式。
下列更新語句均符合ORACLE的日期格式,更新成功:
create table student (name varchar2(10) not null primary key , enrolldate date not null);//建立student表
insert into student values('mark',to_date('08-21-2003','MM-DD-YYYY'));
insert into student values('mark1',to_date('21-08-2003','DD-MM-YYYY'));
insert into student values('mark2','21-8月-2003');
insert into xiongxiaomin.student values('mark3','21-8月-03');
(3)轉換日期為字串
使用ORACLE內部函式to_char()
to_char(date_value,date_format)
變數定義如下:
date_value :為日期型直接值(日期本身)、日期型列值(資料庫中定義的某個表的某列)或某內部函式的返回的日期型值。
date_format為合法的Oracle日期格式。
選擇enrolldate欄位的時間部分:
select (to_char(enrolldate,'HH24:MI:SS'))enrolldate from student;
(4)注意:ORACLE中的date資料型別定義的列包含日期和時間。
1、系統當前日期為2003年8月21日,之後執行下列語句
insert into student values('mark5',to_date('09:28:03','HH:MI:SS'));//注意此種在一條記錄的date型別欄位中插入時間的方法,系統預設的日期為系統當前日期所在月份的第一天,因此得到的記錄為
Name enrolldate
mark5 01-八月 -2003 09:28:03 AM
2、修改系統當前日期為2003年7月21日,之後執行下列語句
insert into student values('mark6',to_date('09:28:03','HH:MI:SS'));
得到的記錄為
Name enrolldate
mark6 01-七月 -2003 09:28:03 AM
insert into student values('mark8',to_date('20:28:03','HH24:MI:SS'));
3、同時在一條記錄中插入日期和時間的方法
insert into student values('mark9',to_date('21-08-2003
20:28:03','DD-MM-YYYY HH24:MI:SS'));//同時在一條記錄中插入日期和時間的方法
insert into student values('mark',to_date('21-08-2003
09:52:03','DD-MM-YYYY HH:MI:SS'));//同時在一條記錄中插入日期和時間的方法
注意不能使用下列方法同時插入日期和時間
insert into student values('mark2','21-8月-2003'+to_date('
09:52:03','HH:MI:SS'));//無效插入記錄方法
4、在SQL*Plus Worksheet中執行下列SQL語句
select * from student;
得到的記錄結果如下:注意date型別欄位中只顯示了日期,時間並未顯示
NAME ENROLLDATE
mark 18-8月 -03
mark1 21-8月 -03
mark2 21-8月 -03
已選擇3行。
5、但在JSP程式中同樣執行select * from student order by enrolldate
顯示結果見下圖(既顯示了日期,又顯示了時間)
JSP頁面中的顯示結果
6、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期和時間
NAME TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH:MI:SS
mark 21-08-2003 12:00:00
mark1 21-08-2003 12:00:00
已選擇2行
注意:5和6中的不同,時間到秒時,JSP頁面中顯示時多出了". 0"
7、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期,時間
NAME TO_CHAR(ENROLLDATE,'DD-MM-YYYYHH24:MI:
mark 18-08-2003 17:40:20
mark1 21-08-2003 00:00:00
mark2 21-08-2003 00:00:00
已選擇3行。
注意:6和7中的SELECT中的"HH:MI:SS"和"HH24:MI:SS"兩者的不同是"HH"為小時制,值的範圍為0-12;"HH24"為24小時制,值的範圍為0-23。
看下列例子:
①insert into student values('南太裡',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH24:MI:SS'));
ORACLE中的記錄結果為:
NAME enrolldate
南太裡 19-八月 -2003 01:54:05 PM
②insert into student values('南太裡2',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH:MI:SS'));//插入錯誤
錯誤提示為:
insert into student values('南太裡2',to_date('08-19-2003 13:54:05','MM-DD
*
ERROR 位於第 1 行:
ORA-01849: 小時值必須介於 1 和 12 之間
即應用"HH"時,不能應用"13:54:05",而應改為"01:54:05"
正確語句如下:
insert into student values('南太裡2',to_date('08-19-2003
01:54:05','MM-DD-YYYY HH:MI:SS'));
ORACLE中的記錄結果為:
NAME enrolldate
南太裡2 19-八月 -2003 01:54:05 AM
注意上述兩種方式得出的結果一種為PM,另一種為AM。
為了提高正確性,建議都是用地一種方式"HH24"
8、但在JSP程式中同樣執行select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student
顯示結果見下圖。(其結果與在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'DD-MM-YYYY HH:MI:SS') from student;相同)
9、在SQL*Plus Worksheet中執行下列SQL語句
select name,to_char(enrolldate,'month dd,yyyy HH24:MI:SS') from student;
得到的記錄結果如下:注意date型別欄位中顯示了日期,時間
NAME TO_CHAR(ENROLLDATE,'MONTHDD,YYYYHH24:MI:SS')
mark 8月 18,2003 17:40:20
mark1 8月 21,2003 00:00:00
mark2 8月 21,2003 00:00:00
已選擇3行。
10、to_char()函式,'DD-MM-YYYY'格式及'MM-DD-YYYY'格式和'month dd,yyyy'格式的不同
'DD-MM-YYYY'格式:21-08-2003
'month dd,yyyy'格式:8月 21,2003
11、注意:在日期和時間格式中非常容易混淆的是月份和秒的格式(即MM和MI)
在SQLPlus*Worksheet中執行下列語句,不報錯。
insert into student values('王嘉',to_date('08:05','HH24:MM'));//08被認為是小時,05被認為是月份。
commit;
在表編輯器中檢視:實際插入值為
NAME ENROLLDATE
王嘉 01-五月 -2003 08:00:00 AM
select name,to_char(enrolldate,'DD-MM-YYYY HH24:MI:SS')enrolldate from
student where name='王嘉';
NAME ENROLLDATE
王嘉 01-05-2003 08:00:00
已選擇 1 行。
insert into student values('汪嘉2',to_date('08-19-2003
13:54:05','MM-DD-YYYY HH24:MI:SS'));
12、使用Oracle的date資料型別的另一個優點是:它支援日期的運算。可以對已經存在的
日期加上或減去若干天,例如:
insert into student values('熊',sysdate+7);
還有一個問題就是附表主鍵自增長問題,寫一個序列和觸發器:
序列:
CREATE SEQUENCE "PDJT"."NewSequence"
INCREMENT BY 1
MINVALUE 1
MAXVALUE 2147483647
START WITH 281
CACHE 20;
GRANT SELECT, ALTER ON "PDJT"."NewSequence" TO PUBLIC;
觸發器:
CREATE OR REPLACE TRIGGER "PDJT"."NewTrigger" BEFORE INSERT ON "PDJT"."公交線路行車時刻計劃表附表" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
BEGIN
SELECT YZN002.NEXTVAL INTO :NEW.OBJECTID FROM DUAL;
END;
;
ALTER TRIGGER "PDJT"."NewTrigger" ENABLE;
flex前端,xml轉array:
private function xmlListToArray(results:XMLList):Array
{
var array:Array=new Array();
for each(var child:XML in results)
{
var obj:Object=new Object();
//obj[child.nodeKind()]=child[child.nodeKind()];
for each(var ite:XML in child.children())
{
obj[ite.name().toString()]=child[ite.name().toString()];
}
//array.addItem(obj);
array.push(obj);
}
return array;
}
array轉xml
private function arrToXml(arr:ArrayCollection):XML{
var root:XML = new XML("<result/>");
for(var i:int = 0;i<arr.length;i++){
var node:XML = new XML("<item/>");
node.線路名=arr[i].線路名;
node.路牌名=arr[i].路牌名;
node.圈=arr[i].圈;
node.實施時間=arr[i].實施時間;
node.報到=arr[i].報到;
node.工時=arr[i].工時;
node.出場=arr[i].出場;
node.離場=arr[i].離場;
root.appendChild(node);
}
return root;
}
其他見附件
相關文章
- Bootstrap4動態模態視窗jquery外掛bootjQuery
- elementUI 多級選單動態渲染UI
- winform動態生成窗體並實現傳值返回ORM
- 動態連結庫的生成和使用(二)
- 淺析mysql互動式連線&非互動式連線MySql
- YARN線上動態資源調優Yarn
- vue 動態監聽視窗大小變化事件Vue事件
- 動態IPvps,選用動態IPvps的意義,使用動態IPvps的說明及連線操作
- MAUI Blazor (Windows) App 動態設定視窗標題UIBlazorWindowsAPP
- cmake:生成靜態庫和動態庫
- AAAI 2020 | 多模態基準指導的生成式多模態自動文摘AI
- Spring Boot 使用Apollo動態調整日誌級別Spring Boot
- 動態IPvps的介紹及其連線方法
- 如何利用遠端桌面連線動態IPvps?
- GStreamer基礎教程04 - 動態連線Pipeline
- 動態連結庫與靜態連結庫
- Qt+ECharts開發筆記(二):Qt視窗動態調整大小,使ECharts跟隨Qt視窗大小變換QTEcharts筆記
- WPF將視窗置於桌面下方(可用於動態桌面)
- 動態IPvps,租用動態IPvps的意義以及連線辦法及操作步驟
- 前端匯出Excel之動態多級表頭前端Excel
- 用動態連結動態洩露system地址並利用
- 動態IPvps介紹,有哪種連線方式?
- 簡述動態IPvps以及連線其的方法
- C編譯: 動態連線庫 (.so檔案)編譯
- VUE 實現 Studio 管理後臺(四):狀態模式實現視窗停靠,靈動、自由Vue模式
- 動態生成HTML元素-模擬線上考試功能HTML
- 互動視訊 :新形態,新價值(附下載)
- 動態生成簽名工具類
- cmake 連結動態連結庫
- 基於vue3.0+electron新開視窗|Electron多開窗體|父子模態視窗Vue
- 動態規劃初級動態規劃
- 【Logback日誌級別】動態調整Logback的日誌級別
- oracle的靜態註冊和動態註冊Oracle
- 虛擬主播上線:多模態將改變人機互動的未來
- log4j日誌列印級別動態調整
- 在動態IP下遠端連線計算機計算機
- 動態IPvps簡介,連線vps的操作方法
- 深挖JDK動態代理(二):JDK動態生成後的位元組碼分析JDK
- 動態規劃-----線性動態規劃