Могу ли я удалить файл в Acumatica через API? - PullRequest
0 голосов
/ 19 ноября 2018

Я создаю файл в Acumatica, вызывая действие из API, чтобы я мог получить файл в своем приложении.

Можно ли удалить файл через API после того, как я закончу с ним? Я бы предпочел, чтобы это не загромождало мою базу данных Acumatica.

В противном случае, есть ли рекомендуемый метод очистки для этих файлов?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Найдены примеры того, как удалить файл из Acumatica, а также как сохранить новую версию существующего файла!Приведенная ниже реализация сохраняет новую версию, но закомментировал метод удаления.Поскольку я встроил это в процесс создания отчета, я не буду позже удалять отчет через API, но было бы легко перевести удаление в действие, вызываемое API.

private IEnumerable ExportReport(PXAdapter adapter, string reportID, Dictionary<String, String> parameters)
    {
        //Press save if the SO is not completed 
        if (Base.Document.Current.Completed == false)
        {
            Base.Save.Press();
        }

        PX.SM.FileInfo file = null;
        using (Report report = PXReportTools.LoadReport(reportID, null))
        {
            if (report == null)
            {
                throw new Exception("Unable to access Acumatica report writer for specified report : " + reportID);
            }

            PXReportTools.InitReportParameters(report, parameters, PXSettingProvider.Instance.Default);
            ReportNode reportNode = ReportProcessor.ProcessReport(report);
            IRenderFilter renderFilter = ReportProcessor.GetRenderer(ReportProcessor.FilterPdf);

            //Generate the PDF
            byte[] data = PX.Reports.Mail.Message.GenerateReport(reportNode, ReportProcessor.FilterPdf).First();
            file = new PX.SM.FileInfo(reportNode.ExportFileName + ".pdf", null, data);

            //Save the PDF to the SO
            UploadFileMaintenance graph = new UploadFileMaintenance();

            //Check to see if a file with this name already exists                
            Guid[] files = PXNoteAttribute.GetFileNotes(Base.Document.Cache, Base.Document.Current);
            foreach (Guid fileID in files)
            {
                FileInfo existingFile = graph.GetFileWithNoData(fileID);
                if (existingFile.Name == reportNode.ExportFileName + ".pdf")
                {
                    //If we later decide we want to delete previous versions instead of saving them, this can be changed to 
                    //UploadFileMaintenance.DeleteFile(existingFile.UID);
                    //But in the meantime, for history purposes, set the UID of the new file to that of the existing file so we can save it as a new version.
                    file.UID = existingFile.UID;
                }
            }

            //Save the file with the setting to create a new version if one already exists based on the UID                          
            graph.SaveFile(file, FileExistsAction.CreateVersion);  
            //Save the note attribute so we can find it again.              
            PXNoteAttribute.AttachFile(Base.Document.Cache, Base.Document.Current, file);
        }

        //Return the info on the file
        return adapter.Get();
    }
0 голосов
/ 05 декабря 2018

Ответ от Acumatica: API S-b (Screen-base) позволяет легко загружать отчет, сгенерированный в виде файла. C-b (Contract-base) просто не добавляет эту функцию. Я предлагаю вам оставить отзыв здесь: feedback.acumatica.com (РЕДАКТИРОВАТЬ: Готово! https://feedback.acumatica.com/ideas/ACU-I-1852)

Я думаю, что есть несколько обходных путей: 1) использовать s-b, используя логин c-b, чтобы сгенерировать отчет и получить его в виде файла (см. Пример ниже), или 2) создать другой способ удаления файла после загрузки необходимого файла отчета. Для этого вам нужно будет вернуть FileID или что-то еще, чтобы идентифицировать его для удаления.

пример # 1

        using (DefaultSoapClient sc = new DefaultSoapClient("DefaultSoap1"))
        {
            string sharedCookie;
            using (new OperationContextScope(sc.InnerChannel))
            {
                sc.Login("admin", "123", "Company", null, null);
                var responseMessageProperty = (HttpResponseMessageProperty)
                OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name];
                sharedCookie = responseMessageProperty.Headers.Get("Set-Cookie");
            }

            try
            {
                Screen scr = new Screen();  // add reference to report e.g. http://localhost/Demo2018R2/Soap/SO641010.asmx
                scr.CookieContainer = new System.Net.CookieContainer();
                scr.CookieContainer.SetCookies(new Uri(scr.Url), sharedCookie);

                var schema = scr.GetSchema();
                var commands = new Command[]
                {
                    new Value { LinkedCommand = schema.Parameters.OrderType, Value = "SO" },
                    new Value { LinkedCommand = schema.Parameters.OrderNumber, Value = "SO004425" },
                    schema.ReportResults.PdfContent
                };

                var data = scr.Submit(commands);
                if(data != null && data.Length > 0)
                {
                    System.IO.File.WriteAllBytes(@"c:\Temp\SalesOrder.pdf", 
                        Convert.FromBase64String(data[0].ReportResults.PdfContent.Value));
                }
            }
            finally
            {
                sc.Logout();
            }
        } 

Надеюсь, это поможет. Кроме того, было бы неплохо, если бы вы обновили пост-стек на основе этих предложений.

Спасибо

Наян Мансинья Lead - Поддержка разработчиков | Acumatica

...