Hi David,
Thanks for the response. Yeah, this is basically what I am proposing we do.
I'll define a blob parameter (and now I see 4D can define XML or DOM SOAP
parameters too!), which they pass everything too. I take the contents of that
single parameter and parse it out.
What the SAP team is telling me is I should be able to define a "record" (for
lack of better term), which might have numerous parameters. These can be
int/real/string/boolean/array/etc. That would all be for a single record
entry. But if SAP has 10 "records" to send, they don't want to call the web
service 10 times, but rather call the web service once, with all 10 records in
that single call.
Normally 4D makes it so easy to create and consume web services, but this is
beyond my knowledge of SOAP and Web Services. I'm 99% sure 4D can't do this,
but was hoping for a definitive answer so I can let the SAP team know and move
onward with other solutions.
Hope that makes sense and grateful for any other insight you might have.
Thank You!
Jason
-----Original Message-----
From: "David Ringsmuth" <[email protected]>
Sent: Tuesday, February 18, 2020 10:38am
To: "4D iNug Technical" <[email protected]>
Cc: "JasonH" <[email protected]>
Subject: RE: Web Services - Receiving Complex Type
Jason,
I use 4D’s SOAP Webservice to receive hierarchical packets of records defined
in XML.
I’m not clear on your question, so please forgive me if I fail to answer it:
C_TEXT(tMonitorPswd;tMonitorEmail;tCurrentMachine;tCurrentMachineOwner)
C_TEXT($tMonitorPswd;$tMonitorEmail;$tCurrentMachine;$tCurrentMachineOwner)
C_LONGINT(ws_errorCode)
C_TEXT(ws_errorText)
C_LONGINT($ws_errorCode)
C_TEXT($ws_errorText)
ws_errorCode:=0 // 0=No Error
ws_errorText:=""
C_BLOB(xBlob;xResult;$xBlob;$xResult)
ARRAY TEXT(atProviderIDs;0)
SOAP_Err_Handle_Install (1)
ws_Debug
//compiler_web
SOAP DECLARATION(tMonitorEmail;Is text;SOAP input;"MonitorEmail")
SOAP DECLARATION(tMonitorPswd;Is text;SOAP input;"MonitorPswd")
SOAP DECLARATION(tCurrentMachine;Is text;SOAP input;"CurrentMachine")
SOAP DECLARATION(tCurrentMachineOwner;Is text;SOAP input;"CurrentMachineOwner")
SOAP DECLARATION(xBlob;Is BLOB;SOAP input;"xBlob")
SOAP DECLARATION(fAuthentic;Is boolean;SOAP output;"Authentic")
SOAP DECLARATION(ws_errorCode;Is longint;SOAP output;"ws_ErrorCode")
SOAP DECLARATION(ws_errorText;Is text;SOAP output;"ws_ErrorText")
SOAP DECLARATION(xResult;Is BLOB;SOAP output;"xResult")
SOAP DECLARATION(nCnt;Is longint;SOAP output;"nCnt")
fAuthentic:=Monitor_Authenticate_Local
(tMonitorEmail;tMonitorPswd;tCurrentMachine;tCurrentMachineOwner;Current method
name)
$fAuthentic:=fAuthentic
ws_Declare_Cnts ("Init")
SOAP DECLARATION(nProviderCnt;Is longint;SOAP output;"nProviderCnt")
SOAP DECLARATION(nLicenseCnt;Is longint;SOAP output;"nLicenseCnt")
SOAP DECLARATION(nMenusCnt;Is longint;SOAP output;"nMenusCnt")
SOAP DECLARATION(nHome_VisitCnt;Is longint;SOAP output;"nHome_VisitCnt")
SOAP DECLARATION(nParentCnt;Is longint;SOAP output;"nParentCnt")
SOAP DECLARATION(nChildCnt;Is longint;SOAP output;"nChildCnt")
SOAP DECLARATION(nMeal_CountCnt;Is longint;SOAP output;"nMeal_CountCnt")
SOAP DECLARATION(nTrainingCnt;Is longint;SOAP output;"nTrainingCnt")
SOAP DECLARATION(nWorksheetCnt;Is longint;SOAP output;"nWorksheetCnt")
If ($fAuthentic)
READ ONLY(*)
C_TEXT($xml;$xPath;$xml_root;$tRIS;$tTableNo)
C_POINTER($pTable)
$xPath:="/Providers"
$xml_root:=xmlRec_NewRecord ("Providers")
$pTable:=->[Provider]
$tTableNo:=String(Table($pTable))
ARRAY TEXT($atProviderIDs;0)
BLOB TO VARIABLE(xBlob;$atProviderIDs)
QUERY WITH ARRAY([Provider]ID;$atProviderIDs)
$tRIS:=String(Records in selection([Provider]))
DOM SET XML
ATTRIBUTE($xml_root;"TableNo";$tTableNo;"Selection";$tRIS)
C_LONGINT($i;$k;nCnt)
nCnt:=0
nProviderCnt:=Size of array($atProviderIDs)
Web_Log_SOAP (Current method name;"Getting "+String(Size of
array($atProviderIDs))+" Provider(s) and Related")
For ($i;1;Size of array($atProviderIDs))
QUERY([Provider];[Provider]ID=$atProviderIDs{$i})
Case of
: (Records in
selection([Provider])=0)
ws_errorCode:=-1
ws_errorText:="No Provider record found for ID "+$atProviderIDs{$i}
: (Records in
selection([Provider])>1)
ws_errorCode:=-1
ws_errorText:="Multiple Providers found for ID "+$atProviderIDs{$i}
Else
C_DATE($d90DaysAgo)
C_LONGINT($nProvider_TableNo)
C_TEXT($Path_Record)
$d90DaysAgo:=Add to date(Current date;0;0;-90)
$nProvider_TableNo:=Table(->[Provider])
$Path_Record:=$xPath+"/"+Table name(->[Provider])+"["+String($i)+"]"
$xml:=DOM
Create XML element($xml_root;$Path_Record)
DOM SET XML
ATTRIBUTE($xml;"TableNo";String(Table(->[Provider])))
For ($k;1;Get
last field number(->[Provider]))
If (Is field number valid($nProvider_TableNo;$k)) // 02/01/17 DBR: sync
dis-similar structures
$tValue:=xmlRec_FieldValue (Field($nProvider_TableNo;$k))
xmlRec_AddField ($xml;Field name($nProvider_TableNo;$k);$tValue)
End if
End for
xmlSelection_Add (1;->[License]ID;->[Provider]License_ID;$xml_root;$Path_Record)
xmlSelection_Add
(1;->[Menus]Provider_ID;->[Provider]ID;$xml_root;$Path_Record;->[Menus]Menu_Date;$d90DaysAgo)
xmlSelection_Add
(1;->[Home_Visit]Provider_ID;->[Provider]ID;$xml_root;$Path_Record;->[Home_Visit]Visit_Date;Add
to date(Current date;-3;0;0))
QUERY([Child];[Child]Provider_ID=[Provider]ID)
If (Records in
selection([Child])#0)
BB_RelateSelection (->[Parent]ID;->[Child]Parents_ID)
If (Records in selection([Parent])#0)
xmlSelection_Add
(0;->[Parent]ID;->[Child]Parents_ID;$xml_root;$Path_Record)
xmlSelection_Add
(1;->[Child]Provider_ID;->[Provider]ID;$xml_root;$Path_Record)
End if
End if
xmlSelection_Add
(1;->[Meal_Count]Provider_ID;->[Provider]ID;$xml_root;$Path_Record;->[Meal_Count]Month;$d90DaysAgo)
BB_RelateSelection (->[Worksheet]Meal_Count_ID;->[Meal_Count]ID)
xmlSelection_Add
(0;->[Worksheet]Meal_Count_ID;->[Meal_Count]ID;$xml_root;$Path_Record)
xmlSelection_Add
(1;->[Training]Monitor_ID;->[Provider]Monitor_ID;$xml_root;$Path_Record)
End case
End for
nCnt:=nCnt+Size of array($atProviderIDs)
$nCnt:=nCnt
If (Bool(Storage.debug.On))
ws_ExportToFile ($xml_root;"Providers")
End if
DOM EXPORT TO VAR($xml_root;xResult)
DOM CLOSE XML($xml_root)
End if
SOAP_Err_Handle_Install (0+2)
David Ringsmuth
From: [ JasonH via 4D_Tech ]( mailto:[email protected] )
Sent: Tuesday, February 18, 2020 11:19 AM
To: [ [email protected] ]( mailto:[email protected] )
Cc: [ JasonH ]( mailto:[email protected] )
Subject: Web Services - Receiving Complex Type
Forgive the double post, but my first was in the general "4D" forum and 4D
tech support suggested posting in the "4D Tech" forum. I'm not sure if
people look at both forums, hence the double post.
-------------------------------------------------------------------------------------------
I need to define a 4D web service called by SAP sending multiple records in
a single request. In a nutshell 4D will be uploading a bunch of sales
orders to SAP, and SAP will invoice and return all the invoice numbers in
one request. Something like:
<element name="SAP_Invoice">
<complexType>
<sequence>
<element minOccurs="1" maxOccurs="1" name="Sales_Order_No"
type="xsd:string"/>
<element minOccurs="1" maxOccurs="1" name="Invoice_No"
type="xsd:string"/>
</sequence>
</complexType>
</element>
I don't see any way to do this when defining the web service in 4D with SOAP
DECLARATION? Anything I do is defined as a single occurrence only. I
suggested having SAP send 2 matched arrays, which I can do by declaring the
input as type array, but they don't want to do that.
--
Sent from: http://4d.1045681.n5.nabble.com/4D-Tech-f1376241.html
**********************************************************************
4D Internet Users Group (4D iNUG)
Archive: http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub: mailto:[email protected]
**********************************************************************
**********************************************************************
4D Internet Users Group (4D iNUG)
Archive: http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub: mailto:[email protected]
**********************************************************************