Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[Gelöst]SAP: OBJNR aus Messpunkt via RFC lesen
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

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

beantworten | zitieren | melden

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());
            }
        }
    }
Fehler
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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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.
Zitat von EifelYeti
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...
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

Erfolgreich geschlossen OBJNR aus Messpunkt lesen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Na also geht doch :-)
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers