2017-04-17 2 views
1

私はすでにAPReleaseCheckProcessの拡張機能を作成しています。私は文書のRefNbrをDocType = 'REF'(ベンダー払い戻しの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を使用して上記のクエリを生成するコードを書く方法プロジェクトをカスタマイズする。

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

あなたが会社以外の会社のためのクエリを実行する必要がある場合:あなたは次のようになり、エラーチェックを行わずに、ログインしているユーザーの会社のためのクエリを実行すると仮定すると、

+0

Acumatica UniversityでAPIリファレンスとトレーニング資料を確認しましたか? – RuslanDev

+0

あなたの提案をありがとう、私はそれを確認します。実際には以下の答えがうまくいきました。私はそれを使用します。しかし、私はBQLに関して別のケースがあると、教材を確実にチェックすると思います。 – HariEko

答えて

1

ログインしたユーザーの場合は、CompanyIDフィールドのないテーブルにデータを格納することをお勧めします。

企業の隔離はBQLによって強く強制され、この会社にログインしていない限り、別の会社からデータを取得することはできません。このデータが別の会社と分割/共有されている場合、ORMは他の会社IDからのデータを返すこともします。 CompanyIDフィールドを含まないテーブルの場合、このテーブルに含まれるすべてのデータが返されます。

+0

私はcurent社のクエリを実行する必要があります。もちろん、ログインしたユーザーと同じになります。私はあなたのBQLを試して、それは動作します。ご回答有難うございます :) – HariEko

関連する問題