dataset-serialize icon indicating copy to clipboard operation
dataset-serialize copied to clipboard

Framework não serializa datasets filhos em FPC

Open MicroprocessDev opened this issue 2 years ago • 4 comments

Pretendo utilizar o FreePascal e não há implementação de nesteddataset ou ADataSet.GetDetailDataSets(ADataSetDetails) que me retorne a lista de dataset detalhes de um dataset master.

Logo pensei, vou criar um dicionário dentro do TDataSetSerializeConfig. ''' constructor TDataSetSerializeConfig.Create; begin if not Assigned(FExport) then FExport := TDataSetSerializeConfigExport.Create; if not Assigned(FImport) then FImport := TDataSetSerializeConfigImport.Create; FChildDataset := TDictionary<TDataSet, TList<TDataSet>>.Create; <<<<<< end;

destructor TDataSetSerializeConfig.Destroy; begin ... o que já tem hj; FreeChildDatasetsDict; // isso limpa listas de childdataset, e FChildDataset.Free inherited; end; ''' e na minha aplicação Lazarus FPC eu faria algo assim: ''' class function TWhatsNewService.GetVersoes(const pAplicacao: String): TJSONArray; var vQryVersao, vQryItems: IQuery; vRepository: IRepository; vDataSetSerializeConfig: IDataSetSerializeConfig; begin vRepository := TRepository.New; if not AplicacaoExiste(pAplicacao, vRepository) then raise Exception.Create('Não é possível encontrar a Aplicação ' + pAplicacao); vQryVersao := vRepository.NewQuery(cSQLVersaoByAplicacao) .SetParam('pAplicacao', pAplicacao, ftString); vQryItems := vRepository.NewQuery(cSQLItemsByID, 'Items');

vQryVersao.Open; vQryItems.SetMaster(vQryVersao).Open;

{$IFDEF FPC} vDataSetSerializeConfig := TDataSetSerializeConfig.New .AddChildDataSet(vQryItems.DataSet, vQryVersao.DataSet); {$ENDIF}

Result := vQryVersao.DataSet.ToJSONArray(vDataSetSerializeConfig); end; '''

veja que acima já utilizaria os recursos que apontei no issue #152

O que acha desta abordagem, você mudaria algo?

MicroprocessDev avatar May 12 '22 11:05 MicroprocessDev

Legal, realmente para Lazarus não implementei o mestre detalhe. Embora eu acho que de para fazer semelhante eu fiz com o FireDAC, mas usando o Zeos.

viniciussanchez avatar May 16 '22 11:05 viniciussanchez

@viniciussanchez eu fiz algumas alterações na unit DataSet.Serialize que resolveu o problema do merge para lazarus, abaixo as modificações:

procedure TDataSetSerializeHelper.MergeFromJSONObject(const AJSONString: string); begin if Trim(AJSONString).StartsWith('{') then MergeFromJSONObject({$IF DEFINED(FPC)}GetJSON(AJSONString){$ELSE}TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(AJSONString), 0){$ENDIF} as TJSONObject) else if Trim(AJSONString).StartsWith('[') then MergeFromJSONObject({$IF DEFINED(FPC)}GetJSON(AJSONString){$ELSE}TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(AJSONString), 0){$ENDIF} as TJSONArray) end;

procedure TDataSetSerializeHelper.MergeFromJSONObject(const AJSONArray: TJSONArray; const AOwns: Boolean = True); var LJSONSerialize: TJSONSerialize; begin LJSONSerialize := TJSONSerialize.Create(AJSONArray, AOwns); try LJSONSerialize.Merge(Self); finally LJSONSerialize.Free; end; end;

ds-sampaio avatar May 19 '22 12:05 ds-sampaio

Boa tarde pessoal, eu implementei a parte de serializar dataset de forma nested para free pascal. como fazer o pull request???

MicroprocessDev avatar May 22 '22 21:05 MicroprocessDev

Opa, conseguiu já.... Assim que der vejo o seu código lá... desde já obrigado pela contribuição

viniciussanchez avatar May 23 '22 19:05 viniciussanchez