Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi von Delphi 2006 aus Datensätze zu SAP R/3 senden (https://www.delphipraxis.net/78762-von-delphi-2006-aus-datensaetze-zu-sap-r-3-senden.html)

Roland Wind 20. Feb 2007 10:55

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Hi

Das mit den einfachen Datentypen für die Import und Exportparameter funktioniert
auch schon ganz gut. Mein Problem ist, dass unsere SAP Jungs da keine einfachen
Datentypen, sondern Strukturen dafür verwendet haben.

Folgende Importparameter werden verwendet:

Delphi-Quellcode:
   

TTFieldName = record
  Field: array[1..30] of Char;
end;

TInputParam = record
  I_FabNr: array[1..6] of Char;            // Fabrication Number
  I_PAufN: array[1..8] of Char;            // Order Number
  I_VBELN: array[1..10] of Char;           // SD-Number
  I_OPSDokNr: array[1..25] of Char;        // Job-Number
  IT_Req_Act_Fields: TTFieldName;
  IT_Req_Txt_Fields: TTFieldName;
end;
Das Problem sind die IT_Req* Strukturen. Ich kann da eine beliebige Anzahl an Strukturen anhängen.
Das mit den Strukturen haben unsere SAP Leute auch bei den Changing und Output Parametern gemacht.

mfg
Roli

kalmi01 20. Feb 2007 11:16

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Zitat:

Bei deinem Bespiel installierst du eine Struktur (RFCInstallStructure) und
hängst diese dann einer Tabelle an. Ich benötige jedoch das Anhängen an die
Import, Export und Changing Parameter.
Die Tabellenstruktur generieren und mit
Delphi-Quellcode:
procedure setRFCTable(tableName: string; rowsize: integer);
z.B. in testRFC8.dpr
erzeugen.

Zitat:

Das hat bei mir leider nicht geklappt
(SYSTEM_FAILURE nach Aufruf der Exec Methode).
schalte mal das TraceFlag ein.
Im Trace-FIle stehen dann so Sachen wie:
Delphi-Quellcode:
 >>> Logon check: calling RFCPING

>>> RfcCall [1] ...
*> RfcCall
  FUNCTION RFCPING
        handle = 1
        parameter  = <NULL>
        tables     = <NULL>
UUID: RfcCallNew send the uuid to the partner {5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62}
>>>> [1] <unknown>   : EXT <ac: 3> L 172.16.2.220 >>> WRITE (73504050)
  -{5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62}
000000 | D9C6C3F0 F0F0F0F0 F0F0F0E3 01010008 |................|
000010 | 01010101 01010000 01010103 00040000 |................|
und was dann so zurück kam
Delphi-Quellcode:
Listen/WaitForRequest (counter = 3)
>>>> [1] <unknown>   : EXT <ac: 6> L 172.16.2.220 >>> LISTEN (73504050)
  -{5AA1EECC-AFD7-4FD2-8D3A-14D5FE7E3A62}
000000 | 01010008 01020101 01010000 01010103 |................|
000010 | 00040000 020B0103 0106000B 01010000 |................|
Nicht besonders erbaulich, aber teilweise sehr hilfreich beim debuggen.
Zumindest sieht man, wer der Depp ist :wink:
Sprich, ob was Falsches zurück kommt, oder ob man selbst zu blöd ist, es richtig zu "verwurschten".

Zitat:

Mein Problem ist, dass unsere SAP Jungs da keine einfachen
Datentypen, sondern Strukturen dafür verwendet haben.
Also ich habe für Strukturen nach einigen Fehlschlägen immer Strings verwendet, die ich erst einmal mit Nullen und dann erst mit Daten befüllt habe.
Klingt abenteuerlich, aber mit anderen Konstrukten bin ich mehrfach auf die Nase gefallen.
Wichtig ist nur das vorherige Befüllen mit #0

Misek 20. Feb 2007 11:22

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
hmmm... würd dir da gerne helfen, aber ich glaube das ich nicht dahintersteige was genau dein Problem ist.
Ich versuche es mal zu interpretieren.

Du hast einfache Importparameter mit nur EINEM Feld.
Nun hast du das Problem, dass du viele Felder in einem Importparameter vorhanden sind richtig?

Und hier die Lösung:


Eine Struktur in RFC ist nix weiteres als ein laaaanger String. Hier eine kleine Grafik dazu


FELD 1 | FELD 2 | FELD 3|
ich.bin.das.erste.FeldTest......test3...

in der Tabelle oder Struktur wird es so aussehen:
Feld 1 | ich bin das erste Feld
Feld 2 | Test
Feld 3 | test3

das ganze ist in wirklichkeit nicht gesplittet. Die Importparams sind nur durch offsets, also die länge der einzelnen Felder, gekennzeichnet.

Also gilt

Delphi-Quellcode:
TMusterStruct = record
   name   : array[1..10] of char;
   vorname : array[1..20] of char;
end;

procedure schiessmichtot();
var
   komplizierteStruktur : TMusterStruct;
begin
   komplizierteStruktur.name := 'meinName';
   komplizierteStruktur.vorname := 'meinVorname';
   
   RFC.HochladenUndExecute( komplizierteStruktur );  

end;
Struktur sieht dann wie folgt aus:

komplizierteStruktur = |meinName..meinVorname.........|

Roland Wind 20. Feb 2007 11:32

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Hi

Habe natürlich was vergessen. Neben den beschriebenen Strukturen habe ich auch
noch folgende Struktur zu befüllen:

Delphi-Quellcode:
 
  TReqFields = record
    FName: array[1..30] of Char;
    Value: array[1..132] of Char;
  end;

  TChangingParam = record
    CT_Order_Fields: array of TReqFields;
  end;
Die Import und Exportparameter benötigen nur eine einfache Struktur. Der Changing
Parameter benötigt jedoch eine Struktur, bei der FName der Eingangsparameter und
Value der Rückgabeparameter von SAP sind.

Und da streikt das RFC.

Roland Wind 20. Feb 2007 11:35

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Ach ja. Danke für deinen Tipp mit dem Trace. Bekomme folgenden Rückgabewert:

>>> RfcReceiveEx [1] ...
>>>> [1] <unknown> : EXT <ac: 10> 128.47.15.231 >>> FLUSH(WRITE) (79696407)
-{3F826D77-F3DD-47C2-84F3-12DF672E9638}
>>>> [1] <unknown> : EXT <ac: 11> 128.47.15.231 >>> READ (79696407)
-{3F826D77-F3DD-47C2-84F3-12DF672E9638}
000000 | 05000000 05000403 001E4341 4C4C5F46 |..........CALL_F|
000010 | 554E4354 494F4E5F 494C4C45 47414C5F |UNCTION_ILLEGAL_|
000020 | 44415441 5F545950 04030402 00454461 |DATA_TYP.....EDa|
000030 | 74656E66 65686C65 72202875 6E67FC6C |tenfehler (ung.l|
000040 | 74696765 72204461 74656E74 79702030 |tiger Datentyp 0|
000050 | 29206265 69206569 6E656D20 2752656D |) bei einem 'Rem|
000060 | 6F746520 46756E63 74696F6E 2043616C |ote Function Cal|
000070 | 6C272E04 02FFFF00 00FFFF00 00000000 |l'..............|
>TS> Tue Feb 20 10:49:23 2007
======> Datenfehler (ungültiger Datentyp 0) bei einem 'Remote Function Call'.
>>>> [1] <unknown> : EXT <ac: 12> 128.47.15.231 >>> CLOSE abrfcrcv.c 400 (79696407)
-{3F826D77-F3DD-47C2-84F3-12DF672E9638}
*> RfcReceiveEx ...
handle = 1
Data conversion On

<* RfcReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION
<* RfcCallReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION
*> RfcClose ...
handle = 1
>>>> [1] <unknown> : EXT <ac: 13> 128.47.15.231 >>> FREE abrfc.c 522 (79696407)
-{3F826D77-F3DD-47C2-84F3-12DF672E9638}

**** Trace file opened at 20070220 104923 Westeuropäische, SAP-REL 620,0,1929 RFC-VER 3 755830 MT-SL
<* RfcClose

Habe ich da den Typ falsch angegeben ??

Misek 20. Feb 2007 11:39

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
im zweifel immer nur strings übergeben... die werden immer angenommen ;)



Die Import und Exportparameter benötigen nur eine einfache Struktur. Der Changing
Parameter benötigt jedoch eine Struktur, bei der FName der Eingangsparameter und
Value der Rückgabeparameter von SAP sind.


Dann mach es doch einfach.... baue noch eine struktur mit jeweis nur einem Feld

Roland Wind 20. Feb 2007 11:48

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Hi

Habe es nochmal ausprobiert, die Struktur folgendermaßen zu übergeben:

Delphi-Quellcode:
if (StrLen(@InputParam.IT_Req_Txt_Fields.Field) <> 0) then
  SetInputParam('IT_REQ_TXT_FIELDS', 30, @InputParam.IT_Req_Txt_Fields.Field, 0);

procedure TSAPRFC.SetInputParam(const aParamName: string; aParamLength: Integer; aParamValue: Pointer;
  aParamType: Integer);
// Setzt Eingabeparameter für den RFC
var
  i: integer;
begin
  i := 0;
  while (i < SAPRFC_MaxParameters) and (FExporting[i].Name <> nil) do
    inc(i);

  if i = SAPRFC_MaxParameters then
    raise Exception.Create('Max params exeeded!');

  FExporting[i].Name := PChar(aParamName);
  FExporting[i].nLen := Length(aParamName);
  FExporting[i].aType := aParamType;
  FExporting[i].Leng := aParamLength;
  FExporting[i].Addr := aParamValue;
end;
Dabei bekomme ich folgende Meldung:

T:3256 ======> Datenfehler (ungültiger Datentyp 0) bei einem 'Remote Function Call'.
T:3256 <* RfcReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION
T:3256 <* RfcCallReceiveEx [1] : returns 3:RFC_SYS_EXCEPTION

Schätze den Datentyp so zu übergeben funktioniert nicht. Habe in der Transaktion se37 nachgeguckt und zu dem Datentyp TTFIELDNAME folgende Informationen gefunden:

Initialisierung und Zugriff: Standardtabelle
Zeilentyp: Datentyp = CHAR
Zahl der Stellen = 30

Wie kann ich nun einen Tabellentyp als Importparameter übergeben ??

Misek 20. Feb 2007 11:58

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
was hast du denn jetzt zum übergeben, ein Parameter oder eine Tabelle? Das ganze Teil funktioniert bei mir. Und ich habe NUR Char's benutzt. Anders lässt sich das nicht lösen.

Also ParamType immer auf "0" lassen !!!

Es handelt sich hierbei nur um einen Typen... egal ob er als parameter oder als feld in der tabelle auftaucht

Roland Wind 20. Feb 2007 12:01

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Hi

Das ist genau die Frage, die ich nicht beantwortet bekomme. Laut SAP ist der Datentyp TTFieldName
eine Standardtabelle, die als Importparameter übergeben wird. Muss ich nun mit SetRFCTable das als
Tabelle anhängen (dachte immer dafür wäre der Tables Reiter), oder als normlen Importparameter übergeben (wo ja SAP motzt wegen dem DatenTyp) ??

Misek 20. Feb 2007 12:08

Re: von Delphi 2006 aus Datensätze zu SAP R/3 senden
 
Also doch eine Tabelle ;)

Ja du musst diese Struktur im System einbinden, dann abschicken. Das hatte ich aber schon mal beschrieben wie das geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.
Seite 5 von 7   « Erste     345 67      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz