Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SAP RFC: Case Insensitive bei RFC_READ_TABLE (https://www.delphipraxis.net/170442-sap-rfc-case-insensitive-bei-rfc_read_table.html)

s.h.a.r.k 17. Sep 2012 14:40

SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Heyho,

hänge gerade an einem etwas blöden Thema, bei dem ich im Moment irgendwie nicht so wirklich weiter komme. Ich soll Daten aus SAP auslesen, was ich üebr die RFC-Funktion RFC_READ_TABLE bewerkstellige. Das ganze klappt eigentlich auch wunderbar, allerdings habe ich mir zum Test eine kleine Anwendung gebastelt und mir ist dabei (negativ) aufgefallen, dass die Abfragen eben leider case sensitive sind. Hätte es gerne so, dass diese (in den gewünschten Fällen) eben case insensitive sind.

Habe schon einige Varianten im WHERE-Clause probiert, welcher ja der OPTIONS-Tabelle mit übergeben wird. Dachte eigentlich, dass der WHERE-Clause direkt an die DB geleitet wird, aber scheinbar ist das nicht der Fall, wenn mann ich folgendes mache, dann erscheint die folgende Fehlermeldung:
Code:
Dim Condition As String = String.Format("MANDT = 140 AND LOWERCASE(BNAME) = '{0}'", Username.ToUpper())
' ODER
Dim Condition As String = String.Format("MANDT = 140 AND LOWER(BNAME) = '{0}'", Username.ToUpper())
Code:
RfcAbapRuntimeException: Ein dynamisch angegebener Spaltenname ist unbekannt.
Ideen? Vorschläge? Lösungen?

PS: Ich code das ganze über VB.Net und SAP NCo 3.0.

s.h.a.r.k 20. Sep 2012 08:11

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Hat damit noch keiner was gemacht oder eine Idee?

jobo 20. Sep 2012 09:57

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Ist es Absicht, dass Du links ~lower und recht vom Vergleich ~upper verwendest?

Ichhatte bis jetzt nur einmal das Vergnügen im Rahmen einer Schulung mit SAP zu arbeiten. Demzufolge gäbe 2 Wege, das zu realisieren:
1. Eine SAP eigene Funktion für die Caseumwandlung zu verwenden (kenne ich nicht)
2. Die Datenbankspezifische Variante zu nutzen.
Die drunterliegende DB kann man kennen oder raten, Oracle ist es offenbar nicht, bleibt z.B. DB2 oder was da sonst noch heutzutage drunter ist.
Variante 2 ist natürlich schäbig, aber das stört bei SAP scheinbar selten jemand.

s.h.a.r.k 20. Sep 2012 12:29

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Der RAF_READ_TABLE Baustein erzeugt direkt ein ABAP-Select-Befehl und geht nicht direk auf die Datenbank. Und eine entsprechende ABAP-Funktion habe ich noch nicht gefunden, die mir das entsprechend umsetzen lassen würde... Nachdem ich im Web nichts dazu finde, ist es wohl so direkt nicht möglich...

p80286 20. Sep 2012 12:39

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Zitat:

Zitat von jobo (Beitrag 1183687)
Die drunterliegende DB kann man kennen oder raten, Oracle ist es offenbar nicht, ...

Warum nicht?
Oracle kann man auch auf casesensitive umstellen/einstellen.

Gruß
K-H

jobo 20. Sep 2012 13:41

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1183716)
Der RAF_READ_TABLE Baustein erzeugt direkt ein ABAP-Select-Befehl und geht nicht direk auf die Datenbank.

Ja, schon klar. Am Ende landet das Stück SQL mit großer Wahrscheinlichkeit trotzdem auf der eigentlichen DB- die Nutzung einer nativen Funktion wäre also möglich.
Wie auch immer, außer der alten, grausligen Schulung, habe ich weiter keine Erfahrungen damit.
@p80286: Wenn es Oracle wäre und der Code unverdaut auf der DB ankommt, hätte ein Lower()- wie im Beispiel angegeben- funktionieren sollen.

s.h.a.r.k 20. Sep 2012 13:49

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Ausgehend von obiger Fehlermeldung denke ich, dass da irgendwas geparst wird. Selbst, wenn ich das Lower nur um den Wert selbst positioniere und nicht um die Spalte schlägt die Abfrage dann fehl.

Trotzdem vielen Dank für die Mühe!

Bernhard Geyer 20. Sep 2012 14:14

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Zitat:

Zitat von jobo (Beitrag 1183738)
Am Ende landet das Stück SQL mit großer Wahrscheinlichkeit trotzdem auf der eigentlichen DB- die Nutzung einer nativen Funktion wäre also möglich.
@p80286: Wenn es Oracle wäre und der Code unverdaut auf der DB ankommt, ...

Wenn hier nicht gegen Fehl- und unberechtigte Eingaben geprüft würde wäre einer SQL-Injection Tür und Tor geöffnet. Und ich glaube nicht das sich SAP hier so eine geöffnetes Scheunentor erlaubt.

jobo 20. Sep 2012 14:28

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1183740)
Selbst, wenn ich das Lower nur um den Wert selbst positioniere und nicht um die Spalte schlägt die Abfrage dann fehl.

Das ist doch der spannende Punkt. Angenommen es wird nicht geparst, dann setzt diese where clause voraus, das LOWER() im Befehlsumfang des SQL Dialekts liegt.
Lower ist jedenfalls eine Oracle Funktion, die Du hier ja offenbar nutzen willst.

@Bernhard:
Da hast Du sicher nicht Unrecht. Meine "Kenntnisse" sind vage und veraltet (5Jahre?). Es wäre allerdings auch denkbar, ohne Parsen nur auf Basis der aktuellen Berechtigungen zu arbeiten. Also die so zu setzen, dass außer der View in der Fromclause nichts geht.

Ich kann mich jedenfalls noch gut an mein "Staunen" erinnern, als wir in dem Kurs "Bedingungen" gebaut haben. Es waren schlicht 'where clauses', die String für String untereinander geklascht wurden, Parametrierung hat keinen interessiert. Ja und Zitat Kursleiter: "als erste Bedingungen nennen wir mal 1=1, da sind wir auf der sicheren Seite".

Thomas Horstmann 24. Sep 2012 11:50

AW: SAP RFC: Case Insensitive bei RFC_READ_TABLE
 
Hallo,
das Problem mit "Case Insensitive" und RFC kommt bei mir auch vor. Und ich habe bei RFC_READ_TABLE z.B. in den "OPTIONS" keine Möglichkeit gefunden dies zu ändern. Das liegt wahrscheinlich daran, dass SAP außer bei beim Benutzer/Passwort auch nicht zwischen Groß- und Kleinschreibung unterscheidet (Selektionsbildschirm usw.). Die zugrundeliegende Datenbank und deren Funktionen spielt dabei keine Rolle, da sich diese per RFC nicht direkt ansprechen lässt. Deshalb prüfe ich beim Abholden der Daten (Schleife über "DATA") die Felder nochmal und werfe die Datensätze raus, die nicht passen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.

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