2012-04-04 16 views
5

Sto cercando di rendere questa domanda più chiara possibile.X ++ passando i record selezionati correnti in un modulo per il report

Fondamentalmente, ho creato un report e ora esiste come pulsante menuitem in modo che il report possa essere eseguito dal modulo.

Cosa mi piacerebbe fare, è in grado di selezionare più record, quindi quando clicco sul mio pulsante per eseguire il mio rapporto, i record selezionati vengono passati nella finestra di dialogo (schermata filtro) che appare.

Ho provato a farlo utilizzando gli stessi metodi del modulo SaleLinesEdit, ma non ha avuto successo.

Se qualcuno potesse indicarmi la giusta direzione lo apprezzerei molto.

risposta

2

Ecco la risoluzione che ho utilizzato per questo problema;

Due metodi sul report in modo che quando i campi sono multi-selezionati sui moduli, i valori vengono passati alla finestra di dialogo del filtro;

private void setQueryRange(Common _common) 
    { 
    FormDataSource    fds; 

    LogisticsControlTable  logisticsTable; 

    QueryBuildDataSource  qbdsLogisticsTable; 
    QueryBuildRange    qbrLogisticsId; 
    str       rangeLogId; 

    set       logIdSet = new Set(Types::String); 

    str addRange(str _range, str _value, QueryBuildDataSource _qbds, int _fieldNum, Set _set =  null) 
    { 
     str    ret = _range; 
     QueryBuildRange qbr; 
     ; 

     if(_set && _set.in(_Value)) 
     { 
      return ret; 
     } 

     if(strLen(ret) + strLen(_value) + 1 > 255) 
     { 
      qbr = _qbds.addRange(_fieldNum); 
      qbr.value(ret); 
      ret = ''; 
     } 

     if(ret) 
     { 
      ret += ','; 
     } 

     if(_set) 
     { 
      _set.add(_value); 
     } 

     ret += _value; 
     return ret; 
    } 
    ; 

    switch(_common.TableId) 
    { 
     case tableNum(LogisticsControlTable): 

      qbdsLogisticsTable = element.query().dataSourceTable(tableNum(LogisticsControlTable)); 
      qbrLogisticsId  = qbdsLogisticsTable.addRange(fieldNum(LogisticsControlTable, LogisticsId)); 

      fds = _common.dataSource(); 

      for(logisticsTable = fds.getFirst(true) ? fds.getFirst(true) : _common; 
       logisticsTable; 
       logisticsTable = fds.getNext()) 
      { 
       rangeLogId = addrange(rangeLogId, logisticsTable.LogisticsId, qbdsLogisticsTable, fieldNum(LogisticsControlTable, LogisticsId),logIdSet); 
      } 

      qbrLogisticsId.value(rangeLogId); 
      break; 
    } 
} 

// Questa impostare la query e ottiene i valori di passarli alla gamma cioè "SO0001, SO0002, SO000 £ ...

Il secondo metodo è il seguente;

private void setQueryEnableDS() 
{ 
    Query   queryLocal = element.query(); 
    ; 
} 

anche sul metodo init questo è necessario;

public void init() 
{ 
    ; 
    super(); 

    if(element.args() && element.args().dataset()) 
    { 
     this.setQueryRange(element.args().record()); 
    } 
} 

Spero che questo aiuti in futuro per chiunque altro che ha il problema che ho avuto.

2

Volevo solo aggiungere questo

È possibile utilizzare la classe MuliSelectionHelper di fare questo in modo molto semplice:

MultiSelectionHelper selection = MultiSelectionHelper::createFromCaller(_args.caller()); 
MyTable myTable = selection.getFirst(); 
while (myTable) 
{ 
    //do something 
    myTable = selection.getNext(); 
}