簡體   English   中英

從 C# 轉換為 PROGRESS OPENEDGE ABL

[英]Translate from C# to PROGRESS OPENEDGE ABL

I received an C# DLL to access an API and another C# to invoke the DLL.

我正在嘗試制作一個 ABL 程序來調用 DLL。

我試過使用,也將它作為外部運行,但沒有運氣。

從未使用過C#,但看起來很簡單的程序無法找到如何從ABL中實例化DLL。

提前致謝,

雨果

這是 C# 代碼,將不勝感激任何幫助

代碼:

using System;
using System.Windows.Forms;

namespace CayanConnectSample
{
    public partial class MainFrm : Form
    {
        public MainFrm()
        {
            InitializeComponent();
        }

        private string merchantName = "Test Dynamic Payments";
        private string merchantSiteId = "2Q5JSJH3";
        private string merchantKey = "GQPXT-GTJTP-66A1Y-RWT5G-CNULU";
        private string terminalIPAddress = "192.168.1.32"; //ip address in CDI Technologies
        private int requestTimeout = 60;

        private void btnCreateTransaction_Click(object sender, EventArgs e)
        {

            decimal amount = Convert.ToDecimal(0.09);
            string clerkId = "MIKE";

            //only transactionType used are sale & refund
            CayanConnect.CreateTransaction.Request request = new CayanConnect.CreateTransaction.Request()
            {
                MerchantName = merchantName,
                MerchantSiteId = merchantSiteId,
                MerchantKey = merchantKey,
                TransactionType = CayanConnect.CreateTransaction.TransactionTypeEnum.SALE,
                ClerkId = clerkId,
                Dba = merchantName,
                Amount = amount,
                //[Amount] is always positive.  TransactionType has the sign.  Sale or Refund
                OrderNumber = "1234"
            };

            CayanConnect.CreateTransaction createTrx = new CayanConnect.CreateTransaction();

            CayanConnect.CreateTransaction.Response ctr = createTrx.Process(request, CayanConnect.ThemeEnum.None);

            if (ctr.Success)
            {
                CayanConnect.InitiateTransaction it = new CayanConnect.InitiateTransaction(terminalIPAddress, ctr.TransportKey, null, CayanConnect.ThemeEnum.None, "Waiting for customer...");

                CayanConnect.InitiateTransaction.Response response = it.Process(requestTimeout, true);

                string emvDetail = response.EMVDetail;
                bool approved = false;


                if (response.Success)
                {
                    //THERE IS NO TIMEOUT OR ERROR CALLING THE SERVICE
                    if (response.Status.ToUpper() == "APPROVED")
                    {
                        //AN AMOUNT HAS BEEN APPROVED
                        if (Convert.ToDecimal(Math.Abs(amount)) == response.AmountApproved)
                        {
                            //FULL AMOUNT APPROVED
                            approved = true;
                            txtResponse.Text = "Good to go!!";
                        }
                        else
                        {
                            //PARTIALLY APPROVED, HAS TO VOID THIS
                            string v = this.VoidApprovedTransaction(response.Token);
                            string em = v.IsEmpty() ? "Transaction was voided succesfully." : v;
                            txtResponse.Text = $"Invalid approved amount.{Environment.NewLine}Amount: {amount.ToString("C")}{Environment.NewLine}Approved Amount: {response.AmountApproved.ToString("c")}{em}";
                        }
                    }
                    else
                    {
                        //AMOUNT WAS DECLINED
                        txtResponse.Text = response.DeclinedMessage(amount);
                    }
                }
                else
                {
                    //THERE WAS A PROBLEM CALLING THE SERVICE
                    txtResponse.Text = response.ErrorMessage;
                }
            }
            else
            {
                //THERE WAS A PROBLEM CALLING THE SERVICE
                txtResponse.Text = ctr.ErrorMessage;
            }
        }
        private string GetStatus()
        {
            string rt = string.Empty;

            CayanConnect.GetStatus status = new CayanConnect.GetStatus(this.terminalIPAddress, null, CayanConnect.ThemeEnum.None, "Verifying terminal status...");
            CayanConnect.GetStatus.Response statusResponse = status.Process(this.requestTimeout);

            rt = statusResponse.ToXml();

            return rt;
        }
        private string VoidApprovedTransaction(string token)
        {
            string rt = string.Empty;

            CayanConnect.Void _void = new CayanConnect.Void();

            CayanConnect.Void.Request request = new CayanConnect.Void.Request()
            {
                MerchantName = this.merchantName,
                MerchantKey = this.merchantKey,
                MerchantSiteId = this.merchantSiteId,
                Token = token,
                Timeout = this.requestTimeout
            };

            CayanConnect.Void.Response response = _void.Process(request, CayanConnect.ThemeEnum.None);

            if (!response.Success)
            {
                rt = $"Error voiding transaction.{Environment.NewLine}{Environment.NewLine}{response.ErrorMessage}";
            }

            return rt;
        }

        private void btnIsOnLine_Click(object sender, EventArgs e)
        {
            txtResponse.Text = GetStatus();
        }
    }
}

==================================================== ===========================

您不需要“調用”DLL。 我發現 DLL 的文檔非常重要,您需要了解 memory 分配和釋放的負責人(ABL 或 DLL)、結構大小等。此外,AVM不可重入(所以不能注冊為任何 DLL 的回調)。

有關從 ABL class 中調用 DLL/SO 函數的示例,請查看位於https://github.com/PeterJudge-PSC/abl_odbc_api的存儲庫。

您需要創建 function 原型(參見https://github.com/PeterJudge-PSC/abl_odbc_api/blob/master/src/OpenEdge/Data/ODBC/ODBCConnectionProto.i中的示例)然后您可以調用這些函數從一個方法中。 查看https://github.com/PeterJudge-PSC/abl_odbc_api/blob/master/src/OpenEdge/Data/ODBC/SqlCommonFunctions.cls示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM