viniciussanchez / dataset-serialize

JSON to DataSet and DataSet to JSON converter for Delphi and Lazarus (FPC)
MIT License
645 stars 156 forks source link

Serializar MasterDetail em uma MemTable Runtime #178

Closed ds-sampaio closed 1 year ago

ds-sampaio commented 1 year ago

Criei uma relação MasterDetail com Memtable visual e funcionou corretamente a saída do JSON Aninhado utilizando o MemTableMaster.ToJSONObject.

Porém ao criar uma MemTable em tempo de execução: participante := TFDMemTable.Create(nil); //MemTable Master dtsMaster.DataSet := participante; participante.LoadStructure(LMinhaEstrutura); //Carrego a estrutura

part_funcionario := TFDMemTable.Create(nil); //MemTable Detail dtsFilho.DataSet := part_funcionario; part_funcionario.LoadStructure(LMinhaEstruturaDetail); //Carrego a estrutura do filho

{Faço o relacionamento MasterDetail} participante.Open;

part_funcionario.Open; part_funcionario.MasterSource := dtsMaster; part_funcionario.MasterField := 'MeuIDPai'; part_funcionario.DetailField := 'MeuIDFK'; part_funcionario.IndexFieldName := 'MeuIDFK';

{Carrego minha MemTable Principal com todo o json aninhado} participante.LoadFromJSON(LMeuDadoJSON) //Todo meu Array Participante,conforme meu json abaixo

{Problema} participante.ToJSONObect -> A saida do JSon so ta retornando o Json Pai, falta aninhar ao filho.

So por questão de conhecimento, tentei também alterar o nome da memtable para mtparticipante e mtpart_funcionario e não resolveu.

Meu JSON:

{ "data": { "participante": [ { "id_participante": 1, "id_empresa": 1, "nome": "Daiane", "cod_ref": -1, "consumidor_final": false,
"part_funcionario": { "id_participante": 1, "id_empresa": 1, "status": 1, "entrada_servico": null, "saida_servico": null, "cod_ref": 0, "id_funcionario": 2 } } ] }, "structure": { "participante": [ { "fieldName": "id_participante", "dataType": "ftInteger", "size": 0 }, { "fieldName": "id_empresa", "dataType": "ftInteger", "size": 0 }, { "fieldName": "nome", "dataType": "ftString", "size": 100 }, { "fieldName": "cod_ref", "dataType": "ftInteger", "size": 0 }, { "fieldName": "consumidor_final", "dataType": "ftBoolean", "size": 0 } ], "part_funcionario": [ { "fieldName": "id_participante", "dataType": "ftInteger", "size": 0 }, { "fieldName": "id_empresa", "dataType": "ftInteger", "size": 0 }, { "fieldName": "status", "dataType": "ftInteger", "size": 0 }, { "fieldName": "entrada_servico", "dataType": "ftDateTime", "size": 0 }, { "fieldName": "saida_servico", "dataType": "ftDateTime", "size": 0 }, { "fieldName": "cod_ref", "dataType": "ftInteger", "size": 0 }, { "fieldName": "id_funcionario", "dataType": "ftInteger", "size": 0 } ] } }

ds-sampaio commented 1 year ago

Depois de um bom tempo pesquisando e testando, descobri o problema, deixarei a solução, caso outras pessoas passem pela mesma situação.

O meu objeto json tem o nome de participante e part_funcionario, então como havia dito na postagem anterior, meu memtable estava sendo criado com o mesmo nome. [participante := TFDMemTable.Create(nil); e part_funcionario := TFDMemTable.Create(nil);] So que faltou um detalhe, é necessário definir a propriedade name do componente para o mesmo nome kkk. Então minhas memtable's ficaram assim: participante.name := 'participante' e part_funcionario.Name := 'part_funcionario'