Xử lý query biến kết quả trả về

Dùng để bẩy lỗi trong 1 số trường hợp lỗi mạng, lỗi session đăng nhập.

Dùng để bẩy lỗi trong 1 số trường hợp lỗi mạng, lỗi session đăng nhập.

  1. Quy trình xử lý code js
  2. Cách viết code ProcSQL
  3. Xử lý lỗi _SERVER_ERR

1. Quy trình chính khi click 1 nút lên và gọi hàm có gởi dữ liệu đến server

 (1) Kiểm tra có internet không ?   Check_iif_Before_CallServer

    Lệnh:   if( !Check_iif_Before_CallServer()) return;       
             Nếu internet bị ngắt kết nối sẽ dừng xử lý và thông báo
 (2) Sau khi gọi server xong, sẽ trả về kết quả response.data        

   response.data  luôn có 1 table tên __SYS_Query để xác định tình trạng trả về từ SQL

* Ngoài datatable của sql trả về còn có thêm
 * Datatable hệ thống (__SYS_Query) luôn có
__SYS_Query
    Row 0:
************************
        State: 100
        DESC:  Connect server success
************************
        State: 400
        DESC:  Login error

*  _SERVER_ERR nếu lệnh Query lỗi
_SERVER_ER[0].Exception_Return

-- CODE
Include: <script src="/themes/lib_cm/lib_app.js"></script>

 $http({
        method : "POST",
        data:  objData,
        url : "--url---"
        }).then(function mySuccess(response)
        {        
            try{               
             const _iif_DBS = new iif_DBS(response.data);
                // tình trạng Server trả về
                // 100-success, 400: login err, 410: cmd query lỗi
               // alert(_iif_DBS.StateCon);
                 //01-Nếu có trả kết quả qua PARAMATER 
                //alert(cc._RDB_Para_Out_State);
                //alert(cc._RDB_Para_Out_Desc);
                //alert(cc_RDB_Para_Out_Has);
                //02-Nếu có trả kết quả qua datatable
                 // getReturnProc: phân tích giá trị trả về từ SQL Server là ERR: hay SUCCESS:
                 _iif_DBS.getReturnProc(); // cách gọi không phân biệt nghiệp vụ
                 _iif_DBS.getReturnProc('khuvuc'); // cách gọi có phân biệt nghiệp vụ
                 //* Khi gọi xong getReturnProc kết quả trả về 1 chuổi _RDB_Out (dữ liệu thô thông báo)
                 // nếu thành công có dạng SUCCESS/-/KẾT QUẢ  
                 // nếu lỗi có dạng ERR/-/KẾT QUẢ  
                 // Muốn lấy phần kết quả:   _iif_DBS.getMsg_Desc(); 
             

                 //-------------
                 alert( _iif_DBS.getErr_Has() ); // in ra True / False
                 _iif_DBS.getErr_Has(1)  ; nếu có lỗi là in
                 // in lỗi dạng if
                 if ( _iif_DBS.getErr_Has())
                           alert( _iif_DBS.getErr_Desc() );

                 _iif_DBS.getSuccess_Has(); // true: thành công, false không thành công
                 _iif_DBS.getSuccess_Has(1 / 2); // in ra nếu thành công

              if( _iif_DBS.getSuccess_Has() ) // Chú ý: cấu trúc trả về tên cột phải đúng:  as _CL1_DBS_Rt,'' as _TB_DBS_Rt
              {
           
                window.parent.angular.element( window.parent.document.getElementById('mainIIF_angu')).scope().call_from_Popup_ChungTu_SuaNgayTao_doSave(null);
                }

            }
            catch(err){iif_try_myError(err);}
            finally {iif_stop_loading();}
            
        }, function myError(response){iif_http_myError(response);}

 

2. Cách viết PROC SQL

ALTER PROCEDURE [dbo].[pr__SYS_RDB_TEST]
    @ts01 nvarchar(50)
,    @_RDB_State nvarchar(50) output
,    @_RDB_Desc nvarchar(250) output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    set @_RDB_State='100' --100: ok , 400: Error
    set @_RDB_Desc='SQL OK'

    select 'a' as a,'b' as b
    select * from tbChungTu_ChiTiet

    -- Cách viết này dài
    Select 'ERR|->|Ket qua tu NVu khuvuc - _CL1_DBS_Rt =02' as _CL1_DBS_Rt,'khuvuc' as _TB_DBS_Rt
    Select 'SUCCESS|->|Ket qua tu NVu banhang - _CL1_DBS_Rt =01' as _CL1_DBS_Rt,'banhang' as _TB_DBS_Rt

   -- * Cách viết có sử dụng hàm
     Exec pr__SYS_Str_Return '1',N'Lưu ĐÃ XONG',''
     Exec pr__SYS_Str_Return '0',N'LỖI => Chứng từ ĐÃ XONG / CẤP SỐ, không thể sửa',''



END
 

 

3. XỬ LÝ LỖI _SERVER_ERR

{"_SERVER_ERR":[{"Exception_Return":"Column 'Pass' does not belong to table root."}],"__SYS_Query":[{"STATE":100,"DES":"Connect server success","DATE":"2024-08-14T11:11:37.6604311"}]}

Cách khắc phục:

 

* Nếu là Query Insert và Update thì query trả về:

 

CountDo: 1
1: là số bảng ghi insert, update, delete thành công, dựa vào để xác định việc cập nhập có thành công không ?

*************************************************
-- Cách code thêm có xử lý loading và bẩy lỗi:
* (1): Thêm nút lệnh có xử lý đóng
<button type="button" class="btSave btn btn-danger" state=""><i class="far fa-save"></i> Lưu</button>
<button type="button" class="btSave btSaveClose btn btn-danger" state="close"><i class="far fa-save"></i> Lưu và đóng</button>
<button type="button" class="btCloseFrm btn btn-primary"><i class="fas fa-times-circle"></i> Đóng</button>
********************************
* (2): Thêm lệnh cho sự kiện nút lưu
$(".btSave").click(function(){
..... thêm vào đây
 });

********************************
        alert_pIIF_stand('* Đang lưu...');
       var data = {};
        $.each( $("#frmMe").serializeArray(), function() {
            data[this.name]=   htmlEncode( this.value);
            if(this.name=="CotNgay") // nếu có kểu ngày
                data[this.name]= convertDate_dmy_ymd( data[this.name] ).replaceAll("/","-") ;

        });

       
var state= $(this).attr("state");
        var url="/adminxml/Query_Do.aspx?name=NhaHang/HopDong_CapNhat&key="+urlGetValuePara("key")+"&out=json";
        $.post( url,
            data
        )
        .done(function( data ) {
             //*******PRINT TEST ************
            // alert( JSON.stringify(data )  );
            // alert_pIIF_stand_close();
            // alert( data.__SYS_Query[0].STATE);
            if( data.__SYS_Query[0].STATE==100 ) // kết nối thành công server và thực query
            {
                if( data.Q1[0].CountDo !=undefined)
                {
                    if( data.Q1[0].CountDo>1)
                        alert_pIIF('Thông báo',"Lưu thành công",2500,"success");
                    else
                        alert_pIIF('Thông báo',"Lưu gặp lỗi",3000,"danger");
                }
                if( data.Q1[0].Return !=undefined)
                    alert_pIIF('Lỗi', data.Q1[0].Return);
            }// if( data.__SYS_Query[0].STATE==100 )
            else if( data.__SYS_Query[0].STATE==400 ) // kết nối thành công server nhưng login error
            {
                alert_pIIF('Thông báo',"Đăng nhập thất bại !",5000,"danger");
            }
         
            if(state=="close" && data.__SYS_Query[0].STATE==100)
            {
                // Nếu là pupop thì đóng và nạp lại
                setTimeout(function(){
                    //window.parent.alert_pIIF_stand('* Đang nạp lại...');    //muốn xuất hiện thông báo
                    window.parent.IIF_f_Close_Popup_R();
                }, 1200);

            }
       })
       .fail(function() {
            alert( "Error SYS ....." );
       })
       .always(function() {
            //alert( "finished" );
       });


**** Khi chạy lỗi kiểm tra lại
1. Biến Query trả về có phải Q1 hay không, nếu là Q2 sửa lại, hay sửa lại code JS cho phù hợp
2. Trong query cần sửa lệnh
        - Thêm điều kiện nếu ngày null, xem cấu hình lệnh cấu hình ngày null x
        - Cấu hình
SqlConfig
           <SqlConfig>
           Call:ExecuteNonQuery
           </SqlConfig>
           Vì cần trả về số bảng ghi thực hiện được, không để
ExecuteScalar
3. Nút đóng chưa thực hiện được, thêm
    $('.btCloseFrm').click(function(){
         window.parent.IIF_f_Close_Popup();
    });
 

 

x

Bài viết liên quan:

Dùng để bẩy lỗi trong 1 số trường hợp lỗi mạng, lỗi session đăng nhập.