Cách tạo Form nâng cao

Cách tạo Form nâng cao trong ngôn ngữ lập trình iif

1. Cách tạo
2. Cách thực thi
3. Query
    3.1 Sinh dữ liệu html/json trực tiếp từ lệnh iif thông qua tên query trong lệnh iif
    3.2 Sinh dữ liệu html/json từ cấu hình query của FORM.
    3.3 Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  thông qua jquery
    3.4 Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  trực tiếp từ lệnh iif
    3.5 Ví dụ với angular, sinh biến json trước khi nạp angular
4. Dùng lệnh
5. Sử dụng các lệnh từ iif để làm giao diện
6. Các tham số url
7. Cấu hình config
 - AddUrlPara
9. Một số nghiệp vụ hay code
10. Một số lỗi hay gặp
--------


1. Cách tạo

Truy cập đường dẫn: /Adminxml/xml_form_ds.aspx?file=SysFormHTML.xml

Name: Tên
Title: hiển thị trên cùng
Query: nguồn truy cập dữ liệu
HTML_Start
HTML_Body
HTML_End
HTML_Header
      * Nạp phần header của page web, dùng để nạp javascript hay style css
Config


2. Cách thực thi
* Chế độ 1:
/adminxml/xml_form_ds.aspx?name=Tên
/adminxml/xml_form_ds.aspx?name=Tên&config_sys=nomaster  (ko xuất hiện giao diện menu)

* Chế độ 2:
** /adminxml/xml_form_ds_mini.aspx?name=Tên

* Chế độ mini chạy sẽ không nạp các thư viện js, css từ trang master



3. Query: Lấy nguồn dữ liệu từ Query đã tạo
   Tham số này có thể để trống
   Nếu dùng dữ liệu nên sử dụng để tăng tốc độ xử lý.
   * Nếu query để trong file riêng cấu hình BanHang_iif/BangGia
           File query BanHang_iif.xml có tên BangGia
    Tham khảo cách tạo Query

   Gọi query nhưng có tham số truyền vào cho query
Ví dụ:
<Query>
<ID>cauhinh</ID>
<Src>cnSQL</Src>
<Type>Sql</Type>
<Cmd>
Select * From tbCauHinh
Where _SYS_Key Like @Ma
</Cmd>
<SqlParameter>
Ma<pr&/><iif-D>Url:ma</iif-D>
</SqlParameter>
</Query>
Gọi trực tiếp từ FORM thì gõ ô Query: CauHinh , nhưng không muốn Ma nhận từ URL mà nhận từ câu query truyền vào.

CauHinh/--><iif-D>Url:ma</iif-D>--->ChonSP_%

 Thay thế đoạn màu hồng thành chữ phía sau --->

  Có 2 cách lấy dữ liệu trong html của form
    3.1 Sinh dữ liệu html/json trực tiếp từ lệnh iif thông qua tên query trong lệnh iif
    3.2 Sinh dữ liệu html/json từ cấu hình query của FORM.
    3.3 Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  thông qua jquery
    3.4 Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  trực tiếp từ lệnh iif
    3.5 Ví dụ với angular, sinh biến json trước khi nạp angular


     
   * Cách 1: truy cập trực tiếp từ html
   Sinh dữ liệu html/json trực tiếp từ lệnh iif thông qua tên query trong lệnh iif

     <iif-F>
  <Source><type:query/>BanHang_iif/DonHang_Load</>0</Source>
  <ItemF>
  <%i=Ten=i%>      
  </ItemF>
  </iif-F>

Giải thích:   <Source><type:query/>_PATH_QUERY_</>chỉ_số</Source>
    * Nếu lấy 1 table thì ổn, nhưng nếu lấy nhiều table (2 table trả về) thì chậm vì lấy 1 table phải kết nối sql 1 lần.

  
      * Cách 2: cấu hình tên query tại ô query trong FORM
    Sinh dữ liệu html/json từ cấu hình query của FORM.
    Ví dụ ta có 1 query tên banhang trả về 2 table: 1 chứng từ, 2 loại chứng từ

, Ví dụ query trả về 2 table 0 1
<iif-F>
  <Source><type:query/>#</>0</Source>
  <ItemF>
  <%i=Ten=i%>      
  </ItemF>
  </iif-F>
<iif-F>
  <Source><type:query/>#</>1</Source>
  <ItemF>
  <%i=Ten=i%>      
  </ItemF>
  </iif-F>


  
  Cách 3: Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  thông qua jquery
<script>

   $.get("Query_Do.aspx?name=NhaHang/SoDoTiec&out=json&nam=2023&thang=2", function(data, status){
       for (x in data.Q1) {
          alert( data.Q1[x]._SYS_KEY );
      }
  });
</script>
* Cách này có nhược điểm là query lấy xong mới trả về có độ trể, nên chưa tương tác được với biến của trang
 

 
Cách 4: Sinh ra dữ liệu JSON, từ JSON hiển thị ra body html  trực tiếp từ lệnh iif
  * Cách này chậm, nhưng ứng dụng trong một số trường hợp
    - Khi ứng dụng angular / jquery cần có biến trước mới load từ angular


<script>
const obj1 = <iif-F><Source><type:query/>NhaHang/SoDoTiec</>0</Source><OutData>json</OutData></iif-F>;
alert(obj1.length);
alert(  JSON.stringify( obj1 ) );
</script>
 * Cách lặp đối tượng json

* Cách này hay dùng


Ví dụ với angular, sinh biến json trước khi nạp angular
file javascript
const jsonTinhTrang = <iif-F><Source><type:query/>nv/tt</>0</Source><OutData>json</OutData></iif-F>;
//nv/tt nếu đã gán ở form thì gõ #
// alert(  JSON.stringify( jsonTinhTrang ) );
var app = angular.module("myApp",  ['ngSanitize']);
app.controller('myCtrl', function($scope, $http){
    //==== khi vào thì biến tinhtrang được khởi tạo đầu tiên
    $scope.tinhtrang= jsonTinhTrang;
}   

** Nếu query trả nhiều table cần lấy hết ta sửa

<Source><type:query/>nv/tt</>0</Source>   * 0 thành all

$scope.tinhtrang= jsonTinhTrang.table1;
const jsonCH = <iif-F><Source><type:query/>#</>all</Source><OutData>json</OutData></iif-F>;

Ví dụ lấy cấu hình theo mã từ tbCauHinh:


var timsp_theo_macdinh = jsonCH.cauhinh.filter( obj =>  obj._SYS_KEY=='ChonSP_TimTheo' );
 
    if(timsp_theo_macdinh.length==0)
        $scope.timsp_theo_chon="X";
    else
        $scope.timsp_theo_chon="Y";


4. Dùng lệnh trong
 HTML_Start, HTML_Body, HTML_End, HTML_Header
Lệnh nạp file html
<iif-H>tenfile.htm</iif-H> 
  * Tham chiếu thư mục App_Data/html_form/tenfile.htm
  * Nếu để trong thư mục cấp con
    ví dụ: App_Data/html_form/banhang_iif/trangchu.html thì dùng
<iif-H>/banhang_iif/trangchu.htm</iif-H> 
Gợi ý:
Nếu Form có tên TaoPhieu được tạo vào 1 file xml có tên ví dụ là BanHang.xml
Khi truy cập form có url là: xml_form_ds.aspx?name=BanHang/TaoPhieu

Thì tại lệnh #_url_name_#  sẽ trả về BanHang/TaoPhieu
Ta muốn thống nhất tất cả các Form trong file BanHang.xml truy cập đến
    * path thực tại: /App_Data/html_form/BanHang
      Thì ta dùng lệnh  <iif-H>/#_url_name_#.htm</iif-H>
      -->  Tất cả các file để vào 1 thư mục dễ quản lý, nếu có đổi tên thư mục giúp linh hoạt hơn.
     Chỉ dùng trong HTML_Body và HTML_Hearder
    * Tham khảo cách lấy dữ liệu ra form qua html
   
* Để thêm css hay js vào Form
Tại HTML_Header
Thêm
<style>
<iif-H>/banhang_iif/trangchu.css</iif-H>  
</style>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>

*** Các file để tại /App_Data/html_form/banhang_iif
banhang_iif là thư mục tạo thêm để dễ quản lý theo từng phần mềm, có thể để bên ngoài /App_Data/html_form

Gợi ý:
Cách nạp css <iif-H>/banhang_iif/trangchu.css</iif-H>   sẽ làm chậm, vì lệnh css được nạp thẳng vào html
Để nhanh nạp kiểu:
<link href="/vendor/datatables/extend/style_01.css" rel="stylesheet">

** Thứ tự thực thi lênh <iif-F>
<iif-F0></iif-F0>
<iif-F></iif-F>
<iif-F1></iif-F1>





5. Sử dụng các lệnh từ iif để làm giao diện

   Tham khảo các lệnh iif  

6. Các tham số url
     config_sys=nomaster để không xuất hiện menu
    Không xuất hiện nút button sys Cấu hình  bt_sys_config:
    Thêm trên url:    &config_class_hide=bt_sys_config

7. Cấu hình config
 
  * AddUrlPara
* nếu url FORM chưa có tham số chỉ định thì tạo ra, nếu đã có thì lấy url đang dùng

Ví dụ: khi truy cập form
- xml_form_ds.aspx?name=NhaHang/SoDoBanTiec
    * Nếu chưa có tham số url tháng và năm thì tạo ra lấy ngày hiện hành
- xml_form_ds.aspx?name=NhaHang/SoDoBanTiec&thang=02&nam=2023

Ví dụ 1: tạo tham số thang=&nam=  (hiện hành)
thang</><iif-D>Date:Now<fm>{0:MM}</fm></iif-D>
nam</><iif-D>Date:Now<fm>{0:yyyy}</fm></iif-D>
Ví dụ 2: tạo tham số ngày bắt đầu và kết thúc của tháng hiện hành
tungay</><iif-D>Date:Now_AddDay;-1<fm>{0:1/MM/yyyy}</fm></iif-D>
denngay</><iif-D>Date:Now_AddDay;-1<fm>{0:#DaysInMonth/MM/yyyy}</fm></iif-D>
Ví dụ 3: tạo tham số ngày bắt đầu và kết thúc của năm hiện hành

<iif-D>Date:Now_AddDay;-1<fm>{0:1/1/yyyy}</fm></iif-D>
<iif-D>Date:Now_AddDay;-1<fm>{0:31/12/yyyy}</fm></iif-D>

 

9. Một số nghiệp vụ hay sử dụng khi code
     - Lấy dữ liệu query đưa vào Form HTML
    
  * Thêm mô tả tiêu đề cho form
$("#title_frm_sub1").html("<span class='badge badge-primary ml-2 titleTop'><i class='fas fa-question'></i> Danh sách khách hàng từ nhật ký+danh mục</span>");

 

10. Một số lỗi hay gặp
* File html đã có nhưng không nạp ra
    Nguyên nhân do: thiếu lệnh <iif-H>/#_url_name_#.htm</iif-H>  trong HTML_Body
 

Bài viết liên quan:

Cách tạo Form nâng cao trong ngôn ngữ lập trình iif