Query lấy dữ liệu file XML

1 Lấy dữ liệu file XML
  1.1 Xử lý nhiều DataTable trong 1 DataSet
  1.2 Xử lý truy cập file xml trong thư mục chỉ định

Cú pháp:
<Query>
<ID>Tên</ID>
<Type></Type>
<Src></Src>
<Para01></Para01>
<Where></Where>
<ColumnAdd></ColumnAdd>
<Column></Column>
<ColumnDel></ColumnDel>
<Sort></Sort>
<Distinct></Distinct>
<Compute_Exp></Compute_Exp>
<FieldAdd></FieldAdd>
<Path></Path>
</Query>


    1.1 Lấy dữ liệu file XML
    * file xml sẽ truy cập mặc định trong thư mục /App_Data/xml_data
       Ví dụ: Lấy dữ liệu file NhanVien.xml
<Query>
<ID>NhanVien</ID>
<Type>Xml</Type>
<Src>NhanVien.xml</Src>
</Query>
* Sẽ tham chiếu /App_Data/xml_Data/NhanVien.xml
* Trường hợp có thư mục con <Src>ThuMucCon/NhanVien.xml</Src>
* Trường hộp file nằm ngoài thư mục mặc định, cần truy cập ta gõ thêm dấu ~
Ví dụ có file /UserFiles/hoso.xml  ta dùng lệnh <Src>~/UserFiles/hoso.xml</Src>

* ColumnAdd:  có 2 dạng tạo
  * Chỉ tạo thêm cột dựa trên bảng có sẵn, nếu muốn tạo cột tính toán dùng Compute_Exp
   - Tạo add trường có tính toán  

    Tạo 1 cột có giá trị là 1 chữ
Chú ý  /-/ </>




Ví dụ 1:
<ColumnAdd>
TenCot/-/String/-/'Giá trị'
</ColumnAdd>

Ví dụ 2: tạo 1 cột giá trị tham chiếu một cột khác
<ColumnAdd>
TenCot/-/String/-/[TenCot]
</ColumnAdd>

Ví dụ 3: nối thêm chuỗi tự tạo với giá trị cột
<ColumnAdd>
TenCot/-/String/-/[HoTen]+' xin chao'
</ColumnAdd>

Ví dụ 4: tạo 1 cột tính toán bởi các cột với nhau
<ColumnAdd>
TenCot/-/String/-/[Cot1] * [Cot2] - 1000
</ColumnAdd>
** sử dụng các phép toán + , - , * , /


Ví dụ 5: áp dụng hàm iif trong khi thêm cột
<ColumnAdd>
TenCot/-/String/-/iif([Cot1]=1,'Nam','Nu')
</ColumnAdd>

TenCot/-/String/-/iif([HSL] is null,'la rong','khac rong')
   -> Có sử dụng xác nhận hàm rỗng

- Tạo trường lấy tên cấp cha khi có cột SYS_KEY_Parent

<ColumnAdd>
$p:Name
</ColumnAdd>

Tự động thêm cột SYS_Name_Parent chứa tên cấp cha 

File XML có cột ngày muốn tách thành Month / Year
<ColumnAdd>
Ngay_Thang/-/Int32</>$date:Ngay-Month
Ngay_Nam/-/Int32</>$date:Ngay-Year
 </ColumnAdd>



   - Tạo add trường theo biểu thức

 
Tạo cột tính toán các hàm SUM,MIN,MAX..
<ColumnAdd>
Tên_Cột_Tạo_1</>Hàm(TenCot)</>Điều_kiện_1
Tên_Cột_Tạo_2</>Hàm(TenCot)</>Điều_kiện_2
</ColumnAdd>
  Tạo cột theo biểu thức
<ColumnAdd>
Luong/-/Double/-/HSL*LuongCB
</ColumnAdd>
* Chú ý: áp dụng hàm IsNull để nếu rỗng thì quy ra 0, nếu rỗng sẽ gặp lỗi khi tính toán
<ColumnAdd>
SL_M_Ton/-/Double/-/[SL_M]-IsNull( [SL_M_DB],0)
</ColumnAdd>


    - Tham chiếu query khác gõ  TenQuery#
    Tên_Cột_Tạo_1</>Q1#Hàm(TenCot)</>Điều_kiện_1
   
    Khi tham chiếu Query khác ta có thể dùng điều kiện
    TongLuong</>Q1#SUM(Luong)</>PhongBan='[PhongBan]'
      * [PhongBan] là giá trị của bảng ghi hiện tại đang lặp


* Tham chiếu ID query
<ColumnAdd>
Tên_Cột_Tạo_1</>Q1#Hàm(TenCot)</>Điều_kiện_1
</ColumnAdd>
* Kiểu dữ liệu và tính toán
<ColumnAdd>
Tên_Cột_Tạo_1/-/Double/-/Cong Thuc</>Q1#Hàm(TenCot)</>Điều_kiện_1
</ColumnAdd>


Ví dụ:
<Query>
<ID>Q1</ID>
<Type>Xml</Type>
<Src>ChungKhoan_GiaoDich.xml</Src>
</Query>
<Query>
<ID>Q2</ID>
<Type>Xml</Type>
<Src>#Q1</Src>
<Where>Ma<>'[NapTien]' AND Ma<>'[RutTien]' </Where>
<Distinct>Ma</Distinct>
</Query>
<Query>
<ID>Q3</ID>
<Type>Xml</Type>
<Src>#Q2</Src>
<ColumnAdd>
TongMua/-/Double</>Q1# Sum(SL_M) </>Ma='[Ma]'
TongBan/-/Double</>Q1#Sum(SL_B)</>Ma='[Ma]'
Ton/-/Double/-/TongMua-TongBan
</ColumnAdd>
</Query>

'[Ma]' là lệnh để lấy giá trị cột Ma của dòng hiện hành

** Hàm WhereR sẽ có tác dụng với các cột sau khi đã Add, dùng hàm Where sẽ lỗi

 ** Chú ý để cập nhật được giá trị thì tại Column_Add không gán giá trị hay công thức
-- Không gán
<ColumnAdd>
TongMua/-/Double
</ColumnAdd>

-- Có gán
<ColumnAdd>
TongMua/-/Double/-/0
</ColumnAdd>
  --> Nếu có gán sẽ báo lỗi ReadOnly


** Cần tại mỗi bảng ghi hiện tại lấy giá trị cột (tên file xml) để tính toán ta cần làm


<ColumnUpdate>
DangLam</>DoiTuongXML#HàmTínhToán</>Where</>Nếu_Rỗng_trả_về
</ColumnUpdate>

Nếu_Rỗng_trả_về:  Num_0 là nếu rỗng trả về số 0
Nếu_Rỗng_trả_về:  Str_X là nếu rỗng trả về X


Ví dụ:
<Query>
<ID>PlanWork</ID>
<Type>Xml</Type>
<Src>PlanMe_DoWork/2022.xml</Src>
<ColumnAdd>
Rate/-/Double/-/JobNumberCurent*100/JobNumberDesired
DangLam/-/Int16
</ColumnAdd>
<ColumnUpdate>
DangLam</>%filexmlwf-PlanData-addParent__Name#COUNT(_SYS_KEY)</>SYS_Name_Parent='Đang làm'</>Num_0
</ColumnUpdate>
</Query>
**** Các chữ màu đỏ là để thay thế giá trị
  * PlanData là tên cột cần lấy giá trị tên file
  * Name: tên cột Name trong xml



*FieldLoopkup: , đự định làm như relaceship
<FieldLoopkup>
Tên_Cột_Tạo_1</>File_XML_Tham_chiếu</>Cột_Tạo_Value</>Cột_Loopkup_Value</>Cột_Loopkup_Display
</FieldLoopkup>
Ví dụ:
<FieldLoopkup>
TenLop</>lop.xml</>MaLop</>ID_Lop</>TenLop
</FieldLoopkup>


FieldLoopkup: Tạo ra cột mới và tham chiếu giá trị từ DataTable chỉ định

  ts01</>ts02</>ts03</>ts04</>ts05

ts01:tên cột thêm mới
ts02:vị trí lấy DataTable để tìm
   dùng ký tự # đầu để lấy giá trị
ts03:tên cột để lấy giá trị đi tìm
ts04:tên cột cần tìm ở Datatable đã tạo
ts05:tên cột cần lấy giá trị ở Datatable



Ví dụ:
<FieldLoopkup>
MoTa_P</>#0</>SYS_KEY_Parent</>_SYS_KEY</>Name
</FieldLoopkup>
* Giải thích: tạo thêm 1 cột tên MoTa_P
        #0 là lấy DataTable vị trí 0 (chính nó)
       Dữ liệu sẽ lặp từ dòng đầu đến dòng cuối
        Trong quá trình lặp sẽ xử lý
       Lấy giá trị cột SYS_KEY_Parent đưa ra biến sau đó tìm xem có giá trị nào bằng với cột _SYS_KEY
      Nếu = thì lấy giá trị cột Name đưa vào cột MoTa_P

 





*Compute_Exp: tính toán và tự động thêm 1 DataTable cấu trúc mới theo Tên_Cột ...
-- Khác với Column_Add là chỉ thêm cột vào cấu trúc hiện tại
<Compute_Exp>
Tên_Cột_Tạo_1</>Hàm(TenCot)</>Điều_kiện_1
Tên_Cột_Tạo_2</>Hàm(TenCot)</>Điều_kiện_2
</Compute_Exp>
Hàm:
Ví dụ:Sum, Min, Max, Count, Avg...
Ví dụ:

<Compute_Exp>
TongDiemLop10</>Sum(Toan)</>Lop='10'
TongDiemLop11</>Sum(Toan)</>Lop='11'
</Compute_Exp>
Kết quả: Tạo 2 cột TongDiemLop10,TongDiemLop11


* Áp có có xử lý kiểu cột tạo ra:

<Compute_Exp>
Tên_Cột_Tạo_1/-/Kiểu_Cột</>Hàm(TenCot)</>Điều_kiện_1
Tên_Cột_Tạo_2</>Hàm(TenCot)</>Điều_kiện_2
</Compute_Exp>

Ví dụ:  Thu_01/-/Int64</>Sum(Thu)</>Ngay_Thang=1</>0

    1.2 Xử lý nhiều DataTable trong 1 DataSet
* Một Query có thể có nạp nhiều dữ liệu file xml đưa vào DataSet, mỗi ID Query tương úng 1 DataTable

<Query>
<ID>Q1</ID>
<Type>Xml</Type>
<Src>nhanvien.xml</Src>
</Query>

<Query>
<ID>Q2</ID>
<Type>Xml</Type>
<Src>#Q1</Src>      -> #Q1 là truy vấn lại Q1
<Compute_Exp>Count(HoTen)</Compute_Exp>
</Query>

* Kết quả sẽ trả về 1 DataSet gồm 2 DataTable
* ->  <Cmd>#Q1</Cmd>   sử dụng # để truy cập tên DataTable trong DataSet

    1.3 Xử lý truy cập file xml trong thư mục chỉ định
Ví dụ có thư mục:

/App_Data/xml_data/hoso  
  hoso1.xml
  hoso2.xml

* Truy cập 1 file:

<Query>
<ID>Q1</ID>
<Type>Xml</Type>
<Src>dulieu/hoso1.xml</Src>
</Query>
* Kết quả: Hệ thống sẽ truy cập dữ liệu trong file hoso1.xml

* Truy cập tất cả các file trong thư mục:
<Query>
<ID>Q1</ID>
<Type>Xml</Type>
<Src>dulieu</Src>
</Query>
* Kết quả: Hệ thống sẽ truy cập dữ liệu trong thư muc hoso gồm 2 file hoso1.xml và hoso2.xml
Kết quả trả về có thêm 2 cột: _SYS_File_Name, _SYS_Path

Dữ liệu dạng:
_SYS_File_Name      _SYS_Path
hoso1.xml                 hoso/hoso1.xml
hoso2.xml                 hoso/hoso2.xml

 

Mục liên quan: