Opération SData (sdata)

De Wiki1000
(Différences entre les versions)
(Au niveau d'une entité en tant que méthode de classe.)
(Au niveau d'une entité en tant que méthode de classe.)
Ligne 64 : Ligne 64 :
 
end;
 
end;
 
</source>
 
</source>
 +
 +
{{tip|Cette forme d'appel est la seule à être conforme au standard SData.}}
  
 
===Au niveau d'une entité en tant que méthode d'instance.===
 
===Au niveau d'une entité en tant que méthode d'instance.===

Version du 23 mai 2011 à 13:15

Les opérations SData peuvent être défini à trois niveaux dans le Contrat SData :

Au niveau d'une classe "Support de service local"

Dans ce cas l'attribut "path" associé à l'opération ne fait pas référence à une entité du contrat :

<xsd:element name="ndfContractOperation1" 
 type="tns:ndfContractOperation1--type" 
 sme:role="serviceOperation" 
 sme:path="$service/Operation1" />
<xsd:complexType name="ndfContractOperation1--type">
<xsd:all>
...
</xsd:all>
</xsd:complexType>

lors de l'import de ce contrat la méthode sera ajouté à une classe "Support de Service distant (sdata)" du même nom que le contrat.

Au niveau d'une entité en tant que méthode de classe.

Dans ce cas l'attribut "path" associé à l'opération fait référence à l'entité du contrat en utilisant le nom pluriel de l'entité :

<xsd:element name="expenseUpdateAllExpenseStatus" 
 type="tns:expenseUpdateAllExpenseStatus--type" 
 sme:role="serviceOperation" 
 sme:path="expenses/$service/UpdateAllExpenseStatus" />
<xsd:complexType name="expenseUpdateAllExpenseStatus--type">
<xsd:all>
...
</xsd:all>
</xsd:complexType>

lors de l'import de ce contrat la méthode sera ajouté à une classe "Support de Service distant (sdata)" du même nom que le contrat.

Le flux SData généré par l'appel de la méthode :

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" 
  xmlns:sdata="http://schemas.sage.com/sdata/2008/1" 
  xmlns:http="http://schemas.sage.com/sdata/http/2008/1" 
  xmlns:ns3="http://www.sage.com/fr/line1000/ndfContract">
<id>http://syfre/syfre/server/sdata/syfre/ndfContract/-/expenses/$service/UpdateAllExpenseStatus</id>
<sdata:payload>
<ns3:expenseUpdateAllExpenseStatus>
<ns3:request>
...
</ns3:request>
</ns3:expenseUpdateAllExpenseStatus>
</sdata:payload>
</entry>

Exemple d'appel d'une méthode de classe :

//Procedure OperationUpdateExpenses;
var aReason:string;
begin
  aReason := Format('All expenses has been accepted %s',[FormatDatetime('c',Now)]);
  RE_expense.UpdateAllExpenseStatus(RE_NDF_STATUS_PENDING,aReason);
end;
Tip-20px.png Tip : Cette forme d'appel est la seule à être conforme au standard SData.

Au niveau d'une entité en tant que méthode d'instance.

Dans ce cas l'attribut "path" associé à l'opération fait référence à l'entité du contrat en utilisant le nom singulier de l'entité :

<xsd:element name="expenseUpdateExpense" 
 type="tns:expenseUpdateExpense--type" 
 sme:role="serviceOperation" 
 sme:path="expense/$service/UpdateExpense" />
<xsd:complexType name="expenseUpdateExpense--type">
<xsd:all>
...
</xsd:all>
</xsd:complexType>

lors de l'import de ce contrat la méthode sera ajouté en tant qu'opération de Service à l'entité correspondante :

entity-instance-operation.png


Le flux SData généré par l'appel de la méthode :

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" 
  xmlns:sdata="http://schemas.sage.com/sdata/2008/1" 
  xmlns:http="http://schemas.sage.com/sdata/http/2008/1" 
  xmlns:ns3="http://www.sage.com/fr/line1000/ndfContract">
<id>http://syfre/syfre/server/sdata/syfre/ndfContract/-/expense('11CD0000000001D20002000000360001')/$service/UpdateExpense</id>
<sdata:payload>
<ns3:expenseUpdateExpense>
<ns3:request>
...
</ns3:request>
</ns3:expenseUpdateExpense>
</sdata:payload>
<http:ifMatch>11CD0000000001D20002000000360001-0000002400000001</http:ifMatch>
</entry>

Exemple de code d'appel d'une méthode d'instance SData :

//Procedure OperationUpdateExpense;
var typ:RE_expenseType; inst:RE_Expense; aReason:string;
begin
  // Get the expense type
  //
  aReason := 'Hotel';
  typ := RE_expenseType.GetWhere('title=%1','',[aReason]) as RE_expenseType;
  if not Assigned(typ) then
   raise Exception.Create('Type Hotel not found');
 
  // Create an expense
  //
  aReason := Format('expense du %s',[FormatDatetime('c',Now)]);
 
  inst := RE_Expense.Create;
  inst.reason := aReason;
  inst.dateExpense := Now;
  inst.quantity := 1;
  inst.status.AsVariant := RE_NDF_STATUS_DRAFT;
  inst.typeExpense := typ;
  inst.Post;
 
  // Change status
  //
  aReason := Format('Accepted %s',[FormatDatetime('c',Now)]);
  inst.UpdateExpense(RE_NDF_STATUS_PENDING,aReason);
 
  // Check change
  //
  inst := RE_Expense.GetWhere('reason=%1','dateExpense',[aReason]) as RE_expense;
  if Assigned(inst)
   then showMessage('udate ok')
   else showMessage('not found after update');
end;
Outils personnels