Laden...

[Gelöst]SAP: OBJNR aus Messpunkt via RFC lesen

Erstellt von EifelYeti vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.671 Views
EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren
[Gelöst]SAP: OBJNR aus Messpunkt via RFC lesen

Hallo Experten,

ich habe versucht im Rahmen meiner Azubitätigkeit ein Programm zu entwickeln welches sich gegen das SAP System authentifiziert und hier einen RFC Call absetzt.

Hierzu benutze ich die rscp4n.dll sowie sapnco.dll und sapnco_utils.dll, die nicht im Standard enthalten sind.

Wenn ich nun den FUBA "MEASUREM_ENTRYLIST_READ_DB" aufrufe liefert er mir die gewünschten Daten zurück, genauso wie beim Aufruf des FUBAs zum anlegen eines Messpunktes, nur wenn ich die Objektnummer aus der Equipmentnummer lesen will, wird mir eine Inception geworfen.

In der __config Datei werden nur die Parameter zum verbinden mit dem SAP System gesichert

 
.
.
.
using System.Text.RegularExpressions;
using SAP.Middleware.Connector;

   class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte warten");
            MyBackendConfig config__ = new MyBackendConfig();
            try
            {
                RfcDestinationManager.RegisterDestinationConfiguration(config__);
            }
            catch   {Console.Write("Falsches PW");}

            RfcDestination rfcDest = RfcDestinationManager.GetDestination("U04");
            RfcRepository rfcRep = rfcDest.Repository;
            try
            {
                Console.Clear();
                Console.WriteLine("Verbinde mit SAP");
                IRfcFunction myfun = rfcRep.CreateFunction("MEASUREM_ENTRYLIST_READ_DB");
                myfun.SetValue("NUMBER_OF_LIST", "000000000002");

                string output = "";
                myfun.Invoke(rfcDest);

                /*------------------------------------------------------*\
                | Daten aus dem ersten Funktionsbaustein auslesen        |
                \*------------------------------------------------------*/

                for (int i = 0; i < myfun.Count; i++) //Daten in einem String sichern
                {
                    if (myfun.GetObject(i) != null) output += myfun.GetObject(i).ToString();
                    // Wenn das Rückgabeobjekt nicht gleich NULL ist soll die Rückgabe in den 
                    // Output string gesichert werden.
                }

                Regex rgx = new Regex("POINT=\\d{12}");     // String nach Regulärem Ausdruck durchsuchen und diesen 
                MatchCollection ma = rgx.Matches(output);   // in der Liste abspeichern (ma = Match Array)
                List <string> Messpunkte = new List<string>();
                foreach (Match m in ma)                             //Nur den Messpunkt (Daten hinter POINT= in Array schreiben
                {
                    Messpunkte.Add((m.ToString().Substring(6)));
                }

                /*------------------------------------------------------*\
                | Zweite Liste auslesen mit den Werten der ersten Liste  |
                \*------------------------------------------------------*/

                string funktion = "MEASUREM_POINT_READ";

                foreach (string s in Messpunkte)
                {
                    myfun = rfcRep.CreateFunction(funktion);
// Hier Tritt der Fehler auf !!
                    myfun.SetValue("MEASUREM_POINT", s);
                    myfun.Invoke(rfcDest);
                }
                Console.WriteLine("Success");
            } // TRY
            catch (Exception e)
            {
                Console.WriteLine("Exeption:\n" + e.Message);
                Console.WriteLine("Inner Exeption: \n" + e.InnerException);
                Console.WriteLine("Full Text: \n" + e.ToString());
            }
        }
    }

Fehlermeldung:
Exeption:
Data type UNKNOWN cannot be used for scalar metadata
Inner Exeption:

Full Text:
SAP.Middleware.Connector.RfcInvalidStateException: Data type UNKNOWN cannot be used for scalar metadata
bei SAP.Middleware.Connector.RfcScalarMetadata.CreateScalarMetadata(RfcDataType dataType, Int32 nucLength, Int32 ucLength, Int32 deci
mals)
bei SAP.Middleware.Connector.RfcScalarMetadata.GetScalarMetadata(RfcDataType dataType, Int32 nucLength, Int32 ucLength, Int32 decimal
s)
bei SAP.Middleware.Connector.RfcRepository.TypeMetadataFromParameters(IRfcTable parameters)
bei SAP.Middleware.Connector.RfcRepository.ProcessRfcMetadataGetResult(RfcFunction rfcMetadataGet, String[] functions, String[] struc
tures, String[] tables)
bei SAP.Middleware.Connector.RfcRepository.LookupFunctionMetadataNew(String name)
bei SAP.Middleware.Connector.RfcRepository.LookupFunctionMetadata(String name)
bei SAP.Middleware.Connector.RfcRepository.GetFunctionMetadata(String name)
bei SAP.Middleware.Connector.RfcRepository.CreateFunction(String name)
bei Test_SAP.Program.Main(String[] args) in H:\EDV\Projekte\Mini-Projekte\SAP\MP12-1155\02-Entwicklung\C# Code\SAP Auth\Test-SAP\Test
-SAP\Program.cs:Zeile 92.

Der Fehler tritt auch auf wenn ich sofort versuche den 2. RFC Call zu starten, also liegt es nicht an Altlasten aus dem rfcRep, denke ich

Vielen Dank im Vorraus und Gruß
EifelYeti

edit: Rechtschreibung etwas überarbeitet

++Rekursion ++
(lat. , die) siehe Rekursion

4.221 Beiträge seit 2005
vor 11 Jahren

MEASUREM_POINT_READ hat keinen Parameter mit dem Namen MEASUREM_POINT... das kann also so sicher nicht funktionieren.

Schau Dir diese Methode in SE37 nochmal an...

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren

Hallo,

erstmal danke für deine schnelle Antwort! Leider tritt der Fehler bereits hier auf:

myfun = rfcRep.CreateFunction(funktion);

Und nicht erst beim setzen des Values, ich habe den Value jetzt auch auf "POINT" gesetzt (so steht er auch in der SE37) aber die Exeption bleibt die gleiche.

MfG
EifelYeti

++Rekursion ++
(lat. , die) siehe Rekursion

4.221 Beiträge seit 2005
vor 11 Jahren

Das Problem kann ich reproduzieren...

Wenn Du den Baustein in SE37 anschaust, dann siehst Du, dass dieser NICHT RFC-fähig ist... das kann so nicht funktionieren.

Mit SAPNCO3 kannst Du nur RFC-fähige Bausteine aufrufen.

Mach Dir einen neuen Baustein im Z-Namensraum welcher dann intern auf den Standard-Baustein wrappt... dies geht aber auch nur, wenn im Baustein ausschliesslich RFC-fähige Parameter verwendet werden...

Ev. kannst Du auch den Baustein auf RFC-fähig setzen... müsstest Du einfach mal probieren... kann aber sein, dass dies nicht möglich ist, da es sich bei diesem Baustein um einen SAP-Standard-Baustein handelt.

Der Fehler tritt auch auf wenn ich sofort versuche den 2. RFC Call zu starten, also liegt es nicht an Altlasten aus dem rfcRep, denke ich

Altlasten aus dem rfcRep kannst Du übrigens mit diesem Code gar nicht haben... Altlasten kannst Du theoretisch nur kriegen wenn Du mit RfcSessionManager.BeginContext(rfcDest) arbeitest...

Dies nur noch der Vollständigkeit halber.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren

Hallo nochmal,

stimmt der Baustein ist nicht RFC-Fähig, das hätte ich mir natürlich vorher mal ansehen sollen. Im SAP System selber Programmieren aber andere und jetzt muss ich da erstmal auf mein CASE warten 😃

Danke für die schnelle und kompetente Hilfe!

Besten Gruß
EifelYeti

++Rekursion ++
(lat. , die) siehe Rekursion

EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren
Erfolgreich geschlossen OBJNR aus Messpunkt lesen

Juhu!

SAP hat bereits einen solchen RFC-Fähigen Baustein auf Lager: MEASUREM_POINT_READ_DIALOG_BUF

Damit lassen sich die Daten auslesen. Damit also erfolgreich geschlossen!

Besten Dank an Programmierhans.

++Rekursion ++
(lat. , die) siehe Rekursion

4.221 Beiträge seit 2005
vor 11 Jahren

Na also geht doch 😃

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...