2017-04-17 74 views
1

我已经为APReleaseCheckProcess创建了扩展。我需要将DocType ='REF'(将Vendor Refund的RefNbr发送给)另一个数据库的文档的RefNbr发送给另一个数据库。 我用下面的代码。在Acumatica中使用BQL检索数据

public static class APReleaseCheckProcess 
    { 
     public static void APPaymentRowPersisted(PXCache sender, PXRowPersistedEventArgs e) 
     { 
      string serverJade, dbJade, userJade, passJade; 

      serverJade = "BS-DEV64\\SQL2014"; //--- Server Jade : 192.168.10.13 
      dbJade = "SGL"; //--- DB Jade Live : SGL || DB Jade test : SGL_TEST 
      userJade = "sa"; //--- User ID : sa 
      passJade = "Admin1"; //--- Password : sa_091073 

      if (e.TranStatus == PXTranStatus.Completed && e.Operation == PXDBOperation.Update) 
      { 
       var doc = e.Row as APPayment; 
       #region Doc Type = Vendor Refund 
       if (doc != null && doc.Released == true && doc.DocType == "REF") 
       { 
        foreach (APAdjust oldadj in PXSelect<APAdjust, 
         Where< 
          APAdjust.adjgDocType, Equal<Required<APPayment.docType>>, 
           And<APAdjust.adjgRefNbr, Equal<Required<APPayment.refNbr>>, 
           And<APAdjust.adjNbr, Less<Required<APPayment.lineCntr>>>>>> 
         .Select(sender.Graph, doc.DocType, doc.RefNbr, doc.LineCntr)) 
        { 
         string refNbr = oldadj.AdjdRefNbr; 
         string docType = oldadj.AdjdDocType; 

         // I need to retrieve InvoiceNbr from this query below using BQL statement: 
         string InvNbr = "select InvoiceNbr from APInvoice where CompanyID = 2 and RefNbr = refnbr"; 

         // query to send to another database 
         using (SqlConnection conJade = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + "")) 
            { 
             string qRefund = "update b set b.cano = "+doc.RefNbr+"" + 
                 "from evmaster as b " + 
                  "inner join evmaster as a on a.svno = b.vchno " + 
                 "where a.vchno = "+InvNbr+""; 
             conJade.Open(); 
             using (SqlCommand comJade = new SqlCommand(qRefund, conJade)) 
             { 
              SqlDataReader sdr = comJade.ExecuteReader(); 
              sdr.Close(); 
             } 
            } 
        } 
       } 
       #endregion 
      } 
     } 
    } 

如何在Acumatica自定义项目中使用BQL编写代码以生成上面的查询。

+0

您是否检查过Acumatica大学的API参考和培训材料? – RuslanDev

+0

感谢您的建议,我会检查它。其实下面的答案一直是工作,我会用它。但我认为如果我有关于BQL的另一个案例,我会确定地检查培训材料。 – HariEko

回答

1

假设你要运行,为公司的查询登录的用户,没有错误检查,这将是:

((APInvoice)PXSelect<APInvoice, Where<APInvoice.refNbr, Equal<Required<APInvoice.refNbr>>>>.Select(sender.Graph, refNbr)).InvoiceNbr 

如果需要运行比公司的其他公司查询登录的用户,建议的方法是将数据放在没有CompanyID字段的表中。

公司的隔离受到BQL的强力执行,除非您登录该公司,否则您将无法从其他公司获取数据。如果此数据与另一家公司分离/共享,ORM还负责将您其他公司ID的数据返回给您。对于不包含CompanyID字段的表,系统将返回此表中包含的所有数据。

+0

我需要为curent公司运行查询,当然它与登录用户相同。我已经尝试过你的BQL,它可以工作。感谢您的回答 :) – HariEko