AddAction (TSearchResult)

De Wiki1000

Version1000-32x32.png

procedure AddAction(iPos:TSearchActionPosition; iType:TSearchActionType; const iTitle:string; const iICon:string; const iParameter:string);

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 :

    Function Execute(action:TjsonStruct; resp:TJson):boolean;
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 :

//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;

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

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.
Outils personnels