2017-02-07 14 views
0

Я создал оплату экрана Экран Acumatica и выписал ее. См. Следующий снимок экрана.Вставить/Отправить RefNbr в другую базу данных в системе Acumatica ERP

enter image description here

Я уже создать следующий код, чтобы обеспечить его.

protected virtual void APPayment_RowPersisted(PXCache sender, PXRowPersistedEventArgs e) 
    { 
     string serverJade, dbJade, userJade, passJade; 
     serverJade = Properties.Settings.Default.serverJade; 
     dbJade = Properties.Settings.Default.dbJade; 
     userJade = Properties.Settings.Default.userJade; 
     passJade = Properties.Settings.Default.passJade; 


     APPayment app = (APPayment)e.Row; 
     if (e.Operation == PXDBOperation.Update && e.TranStatus == PXTranStatus.Completed) 
     { 
      if (app.DocType == APPaymentType.Check || app.DocType == APPaymentType.Prepayment) 
      { 
       if (app.RefNbr != null) 
       { 

        using (SqlConnection con = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + "")) 
        { 
         con.Open(); 
         //---- query to update a field in the table of another database -------// 
         string query = "Update EVMaster set AcuRefNo = '" + app.RefNbr + "' where VchNo = 'DD02/16-VIII/12206-VCH-01'"; 
         using (SqlCommand com = new SqlCommand(query, con)) 
         { 
          SqlDataReader sdr = com.ExecuteReader(); 
          sdr.Close(); 
         } 
         con.Close(); 
        } 
       } 
      } 
     } 
    } 

Я уже пытался отладить этот код, но не работал. И затем я пытаюсь использовать этот код.

protected virtual void APPayment_RowPersisted(PXCache sender, PXRowPersistedEventArgs e) 
    { 
     string serverJade, dbJade, userJade, passJade; 
     serverJade = Properties.Settings.Default.serverJade; 
     dbJade = Properties.Settings.Default.dbJade; 
     userJade = Properties.Settings.Default.userJade; 
     passJade = Properties.Settings.Default.passJade; 


     APPayment app = (APPayment)e.Row; 
      if (app.DocType == APPaymentType.Check || app.DocType == APPaymentType.Prepayment) 
      { 
       if (app.RefNbr != null) 
       { 

        using (SqlConnection con = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + "")) 
        { 
         con.Open(); 
         //---- query to update a field in the table of another database -------// 
         string query = "Update EVMaster set AcuRefNo = '" + app.RefNbr + "' where VchNo = 'DD02/16-VIII/12206-VCH-01'"; 
         using (SqlCommand com = new SqlCommand(query, con)) 
         { 
          SqlDataReader sdr = com.ExecuteReader(); 
          sdr.Close(); 
         } 
         con.Close(); 
        } 
       } 
      } 
    } 

Коды выше работала, я просто удалить, если условие (если (e.Operation == PXDBOperation.Update & & e.TranStatus == PXTranStatus.Completed) {}).

Но это не моя цель, я должен отфильтровать документ только для Doc Status = 'print' из документа, и этот процесс будет выполнен, когда была нажата кнопка «Release».

А также любая идея, как получить все записи в APAdjust текущего документа? потому что мне нужно сравнить adjgrefnbr в apadjust с refnbr в APInvoice на основе adjgrefnbr (apadjust) = refnbr (apinvoice). Поэтому я могу получить также все записи APinvoice, основанные на refnbr (APinvoice) = ajgrefnbr (текущий apadjust). Это условие используется для того, чтобы условие «где» не должно быть жестко запрограммировано, я буду использовать переменную для ее предоставления.

любые предложения, чтобы решить эту проблему?

ответ

1

Ниже приведен пример, показывающий, как продлить процесс выпуска для проверки и подписаться на обработчик RowPersisted для APRegister DAC, чтобы сохранить выпущенный документ RefNbr в другую базу данных:

public class APPaymentEntryExt : PXGraphExtension<APPaymentEntry> 
{ 
    public PXAction<APPayment> release; 

    [PXUIField(DisplayName = "Release", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Update)] 
    [PXProcessButton] 
    public IEnumerable Release(PXAdapter adapter) 
    { 
     PXGraph.InstanceCreated.AddHandler<APReleaseProcess>((graph) => 
     { 
      graph.RowPersisted.AddHandler<APRegister>(APReleaseCheckProcess.APPaymentRowPersisted); 
     }); 

     return Base.release.Press(adapter); 
    } 
} 

public class APReleaseChecksExt : PXGraphExtension<APReleaseChecks> 
{ 
    protected virtual void ReleaseChecksFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e) 
    { 
     var row = e.Row as ReleaseChecksFilter; 
     if (row == null) return; 

     Base.APPaymentList.SetProcessDelegate(list => 
     { 
      PXGraph.InstanceCreated.AddHandler<APReleaseProcess>((graph) => 
      { 
       graph.RowPersisted.AddHandler<APRegister>(APReleaseCheckProcess.APPaymentRowPersisted); 
      }); 

      APReleaseChecks.ReleasePayments(list, row.Action); 
     }); 
    } 
} 

Выполнив довольно простой BQL запрос, который вы можете получить доступ к APAdjust записи, связанные с выпущенной проверкой в ​​обработчике событий RowPersisted:

public static class APReleaseCheckProcess 
{ 
    public static void APPaymentRowPersisted(PXCache sender, PXRowPersistedEventArgs e) 
    { 
     if (e.TranStatus == PXTranStatus.Completed && e.Operation == PXDBOperation.Update) 
     { 
      var doc = e.Row as APPayment; 
      if (doc != null && doc.Released == true) 
      { 
       // save RefNbr to another database 

       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)) 
       { 

       } 
      } 
     } 
    } 
} 
+0

Благодарим вас за ответ. Оно работает. – HariEko