AddAction (TSearchResult)

De Wiki1000
Révision datée du 11 juillet 2022 à 07:27 par Syfre (discussion | contributions) (Page créée avec « {{version1000}} <source lang='delphi'>procedure AddAction(iPos:TSearchActionPosition; iType:TSearchActionType; const iTitle:string; const iICon:string; const iParameter:st... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

<source lang='delphi'>procedure AddAction(iPos:TSearchActionPosition; iType:TSearchActionType; const iTitle:string; const iICon:string; const iParameter:string);</source>

Cette méthode enregistre une action sur un résultat de recherche.

iPos Défini la position de l'action dans la vue du résultat sapLeft,sapRight
iType Défini le type de l'action satNone,satOpenForm,satOpenPanel
iTitle Défini le libellé de l'action (utilisé comme bouton)
iParameter Défini le paramètre associé à l'action
satNone non implémenté
satOpenForm non implémenté
satOpenPanel Nom de la classe exécutant l'action et alimentant le panel

Classe action

Lorsque le type d'action est satOpenPanel le paramètre doit être le nom d'une classe non persistante implémentant une méthode jon Execute.

La signature de cette méthode doit être :

<source lang="delphi">

   Function Execute(action:TjsonStruct; resp:TJson):boolean;

</source>

action input Structure json contenant le résultat de recherche. '{name:"xxx", param:{itemId:"1B28EFFFF1C30002001E0000007F0610", .... valeurs des attributs de la clé de recherche pour ce résultat ...}}'
resp output Objet json contenant une structure de données alimentant la grille résultat du panel action

Exemple

Afficher les pièces comptables sur un résultat de recherche retournant un tiers.

1. Enregistrer l'action sur le résultat de recherche en utilisant la propriété AfterCode de la clé de recherche :

<source lang="delphi"> //procedure Initialize; var sk:TSearchKey; AStr:string;

function _FormOfClass(const iClass:string):string;
begin
  Result := iClass+':'+TFacadeModel.FindFormOfClass(iClass)+';'; 
end; 

begin

 sk := ModelManager.RegisterSearchKey(10,'TRoleTiers',
   'Caption,Tiers.code,Tiers.caption,Tiers.raisonsociale,SitePrivilegie.Adresse.codePostal,SitePrivilegie.Adresse.ville,SitePrivilegie.Adresse.telephone1',
   _FormOfClass('TClient')+
   _FormOfClass('TFournisseur')+
   _FormOfClass('TSalarie')+
   _FormOfClass('TTiersDivers')+
   _FormOfClass('TTransporteur')+
   _FormOfClass('TIntraGroupe')
 ); 
 sk.Limits := 20; 
 sk.ExtraNames := 'SitePrivilegie.Adresse.nomRueVoie';
 sk.FormatValue := _TP('@Tiers.code@ @Tiers.RaisonSociale@ @SitePrivilegie.Adresse.nomRueVoie@ @SitePrivilegie.Adresse.codePostal@ @SitePrivilegie.Adresse.ville@ @SitePrivilegie.Adresse.telephone1@'); 
 sk.OrderBy := 'Tiers.code'; 
 // 
 AStr := 'begin ';
 if TFacadeModel.hasAccounting() then
 begin  
  AStr := AStr+ 
  ' AddAction(sapRight,satOpenPanel,_TP(Voir les pièces comptables),search,actionTiersPieces);'+ 
 end; 
 AStr := AStr+' end;';
 //
 sk.AfterCode := AStr; 

end; </source>

2. Définir une classe exécutant la recherche des pièces comptable et alimentant le panneau déplié dans l'interface utilisateur

<source lang="delphi"> unit htmlportalPackage; interface

Type

 ActionTiersPieces = Class(TitObject)
   {$O  modified="1899-12-30T00:00:00" label="Classe support recherche des pièces de compte" options=cloNoPersistent}
 public
   Function Execute(action:TjsonStruct; resp:TJson):boolean;
   Procedure Test;
 end;

{! DIR ActionTiersPieces} {$MS ActionTiersPieces.Execute soapName="MethodName"} {$MS ActionTiersPieces.Test soapName="MethodName"} {!END DIR}


{! DOC ActionTiersPieces} {!END DOC}


Implementation

{! METHODS ActionTiersPieces} Function ActionTiersPieces.Execute(action:TjsonStruct; resp:TJson):boolean; Type

 TiersPiece = viewOf(TPiece)
   numero:string = numero;
   datePiece:TDatetime = pDate;
   reference:String = reference; 
   referenceOrigine: string = referenceOrigine; 
   journalCode:string = journal.code; 
   etablissementCaption:string = etablissement.Caption; 
   compteGeneral:string = ecrituresList.compteGeneral.codeCompte; 
   roleTiers:TRoleTiers = ecrituresList.roleTiers;
   typeLot:Integer = lot.typeLot; 
 end;
function _GetTitle():string;
begin
  Result := Format(_TP('Pièces pour le tiers %s - %s'),[
    action.param.KeyValue['Tiers.code'],
    action.param.KeyValue['Tiers.caption']
  ]); 
end; 
function _FormatDate(dd:TDatetime):string;
begin
  Result := DateToStr(dd); //localized
end; 
function _FormatQuantity(q:TQuantity):string;
begin
  Result := q.AsString;
end; 
function _FormatCurrency(montant:Currency; const iDevise:string):string;
begin
  Result := FormatFloat('0.00',montant); 
end; 
function _FormatEnum(const iEnumName:String; value:Integer):string;
begin
  Result := ModelManager.GetEnumName(iEnumName,value); 
end; 
function _TypeLot(value:Integer):string;
begin
  if value=TypeLot_Simulation then Result := _TP('Simulation') else 
  if value=TypeLot_Reel then Result := _TP('Réel') else 
  Result := inttostr(value); 
end; 


var itemId,aClass,aForm:string; vSel:TSelector; inst:TiersPiece;

   idx,idv,idr,limits:Integer; SR:TjsonStruct; SA:TjsonArray;

begin

 Result := FALSE;
 // This is TRoleTiers  oid
 if action.Exists('param.itemId') 
  then itemId := action.param.itemId
  else itemId := ; 
 if itemId= then Exit; 
 SR := resp.AddStruct('panel','{panelId:"tierspieces-'+itemId+'", title:"'+_GetTitle+'"}');
 /////////////////////////////////////
 SR.addStruct('layout','{ name:"body" }');
 idx := 0; idv:=0;
 SR.facets[idx].id := idx;
 SR.facets[idx].title := ;
 SR.facets[idx].type := 'list';
 SR.facets[idx].position := 'body';
 SR.facets[idx].values[idv].id := idv;
 SR.facets[idx].values[idv].facet := idx;
 SR.facets[idx].values[idv].class := 'tabular';
 SR.facets[idx].values[idv].usingMainController := true; 
 SR.facets[idx].values[idv].title := _GetTitle;
 SR.facets[idx].values[idv].AddStruct('table','{columnDefs:[],rows:[]}');
 SA := SR.facets[idx].values[idv].table.columnDefs; 
 SA.AddStruct('{field:"a", headerName:"'+_TP('Pièce')+'", cellRenderer: "linkRenderer" }'); 
 SA.AddStruct('{field:"b", headerName:"'+_TP('Type')+'"}'); 
 SA.AddStruct('{field:"c", headerName:"'+_TP('Date')+'"}'); 
 SA.AddStruct('{field:"d", headerName:"'+_TP('Compte')+'"}'); 
 SA.AddStruct('{field:"e", headerName:"'+_TP('Journal')+'"}'); 
 SA.AddStruct('{field:"f", headerName:"'+_TP('Etablissement')+'"}'); 
 SA.AddStruct('{field:"g", headerName:"'+_TP('Référence')+'"}'); 
 SA.AddStruct('{field:"h", headerName:"'+_TP('Référence externe')+'"}'); 
  
 idr := 0; limits := 10;
 SA := SR.facets[idx].values[idv].table.rows; 
 vSel := TiersPiece.CreateSelector('(oidRoleTiers=%1)', '-datePiece', false, [itemId]);
 foreach inst in vSel.AsCursor do
  begin
    SA.AddStruct(Format('{a:{title:"%s", link:"%s", linkTitle:"%s"}, b:"%s", c:"%s", d:"%s", e:"%s", f:"%s", g:"%s", h:"%s"}',[
     inst.numero,
     Format('%s?ArgTypeEcriture=mptInteger(%d)',[TFacadeModel.GetUrlOfObject(inst.oid),inst.typeLot]),
     Format(_TP('Pièce #%s'),[inst.numero]), 
     // 
     _TypeLot(inst.typeLot), 
     _FormatDate(inst.datePiece), 
     inst.compteGeneral, 
     inst.journalCode, 
     inst.etablissementCaption, 
     inst.reference,
     inst.referenceOrigine 
    ])); 
    idr := idr+1; 
    if idr=limits then break; 
  end; 
 Result := True;

end;

Procedure ActionTiersPieces.Test; var action,resp:Tjson; SR:TjsonStruct; SS:string; begin

 action := TJson.Create('{name:"", param:{itemId:"1B28EFFFF1C30002001E0000007F0610", code:"XXX", Caption:"YYY"}}');
 resp := TJson.Create('{}'); 
 Execute(action,resp);
 resp.CopyToClipboard; 

end;

{!END METHODS}

end. </source>