anchor.diff:    for LIndex := 0 to ACommand.Macros.Count-1 do
     begin
       LMacro := ACommand.Macros[LIndex];
  -    LMacro.Value := GetContextValue(LMacro.Name, Activation, MacroDataTypeToFieldType(LMacro.DataType)).AsVariant;
  -  end;
  -end;
  -
  -procedure TMARSFireDAC.InjectParamValues(const ACommand: TFDCustomCommand);
  +    if ((not AOnlyIfEmpty) or LMacro.IsNull) then
  +      LMacro.Value := GetContextValue(LMacro.Name, Activation, MacroDataTypeToFieldType(LMacro.DataType)).AsVariant;
  +  end;
  +end;
  +
  +procedure TMARSFireDAC.InjectParamValues(const ACommand: TFDCustomCommand; const AOnlyIfEmpty: Boolean);
   var
     LIndex: Integer;
     LParam: TFDParam;
  
positive.code:   for LIndex := 0 to ACommand.Params.Count-1 do
    begin
      LParam := ACommand.Params[LIndex];
      LParam.Value := GetContextValue(LParam.Name, Activation, LParam.DataType).AsVariant;
    end;
  end;
  
  
negative.code:     class function GetContextValue(const AName: string; const AActivation: IMARSActivation;
        const ADesiredType: TFieldType = ftUnknown): TValue; virtual;
  
      procedure InjectParamValues(const ACommand: TFDCustomCommand;
        const AOnlyIfEmpty: Boolean = True); virtual;
      procedure InjectMacroValues(const ACommand: TFDCustomCommand;
        const AOnlyIfEmpty: Boolean = True); virtual;
  
      procedure InjectMacroAndParamValues(const ACommand: TFDCustomCommand; const AOnlyIfEmpty: Boolean = True);
  
      constructor Create(const AConnectionDefName: string;
        const AActivation: IMARSActivation = nil); virtual;
  